@sbb-esta/lyne-elements 5.1.0 → 5.3.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 (91) hide show
  1. package/_index.scss +1 -0
  2. package/action-group.pure.js +1 -1
  3. package/alert.pure.js +14 -14
  4. package/breadcrumb.pure.js +3 -3
  5. package/calendar.pure.js +68 -68
  6. package/carousel/_carousel.global.scss +6 -0
  7. package/carousel.pure.js +1 -1
  8. package/chip.pure.js +1 -1
  9. package/clock.pure.js +1 -1
  10. package/core/styles/_theme.scss +6 -0
  11. package/core.js +17 -17
  12. package/custom-elements.json +1626 -221
  13. package/date-input.pure.js +1 -1
  14. package/development/action-group.pure.js +1 -1
  15. package/development/alert.pure.js +14 -14
  16. package/development/breadcrumb.pure.js +3 -3
  17. package/development/calendar.pure.js +67 -67
  18. package/development/carousel.pure.js +1 -1
  19. package/development/chip/chip-group/chip-group.component.d.ts +2 -1
  20. package/development/chip.pure.js +3 -0
  21. package/development/clock.pure.js +15 -17
  22. package/development/core/i18n/i18n.d.ts +2 -0
  23. package/development/core.js +15 -3
  24. package/development/date-input.pure.js +15 -7
  25. package/development/download/download/download.component.d.ts +51 -0
  26. package/development/download/download-info/download-info.component.d.ts +59 -0
  27. package/development/download.d.ts +1 -0
  28. package/development/download.js +10 -0
  29. package/development/download.pure.d.ts +3 -0
  30. package/development/download.pure.js +436 -0
  31. package/development/expansion-panel.pure.js +6 -6
  32. package/development/file-selector.pure.js +7 -3
  33. package/development/flip-card.pure.js +5 -4
  34. package/development/image.pure.js +8 -8
  35. package/development/map-container.pure.js +8 -8
  36. package/development/mini-calendar.pure.js +1 -1
  37. package/development/notification.pure.js +12 -9
  38. package/development/option.pure.js +11 -11
  39. package/development/overlay.pure.js +1 -1
  40. package/development/paginator.pure.js +18 -18
  41. package/development/popover.pure.js +1 -1
  42. package/development/signet.pure.js +17 -17
  43. package/development/stepper/step/step.component.d.ts +0 -2
  44. package/development/stepper/stepper/stepper.component.d.ts +2 -2
  45. package/development/stepper.pure.js +24 -17
  46. package/development/tabs.pure.js +4 -4
  47. package/development/teaser.pure.js +1 -1
  48. package/development/time-input.pure.js +10 -6
  49. package/development/timetable-form.pure.js +3 -3
  50. package/development/timetable-occupancy.pure.js +22 -22
  51. package/development/toast.pure.js +6 -6
  52. package/development/tooltip.pure.js +4 -2
  53. package/development/train.pure.js +29 -29
  54. package/development/visual-checkbox.pure.js +13 -13
  55. package/download/_download.global.scss +12 -0
  56. package/download.js +1 -0
  57. package/download.pure.js +21 -0
  58. package/expansion-panel.pure.js +6 -6
  59. package/file-selector.pure.js +2 -2
  60. package/flip-card.pure.js +1 -1
  61. package/image.pure.js +8 -8
  62. package/index.d.ts +3 -0
  63. package/index.js +3 -0
  64. package/lean-off-brand-theme.css +45 -5
  65. package/lean-safety-theme.css +45 -5
  66. package/lean-theme.css +45 -5
  67. package/map-container.pure.js +8 -8
  68. package/mini-calendar.pure.js +1 -1
  69. package/notification.pure.js +12 -9
  70. package/off-brand-theme.css +45 -5
  71. package/option.pure.js +11 -11
  72. package/overlay/_overlay.global.scss +0 -4
  73. package/overlay.pure.js +1 -1
  74. package/package.json +11 -1
  75. package/paginator.pure.js +18 -18
  76. package/popover.pure.js +2 -2
  77. package/safety-theme.css +45 -5
  78. package/signet.pure.js +17 -17
  79. package/standard-theme.css +45 -5
  80. package/stepper.pure.js +3 -3
  81. package/table/_table.global.scss +46 -1
  82. package/tabs.pure.js +4 -4
  83. package/teaser/_teaser.global.scss +4 -0
  84. package/teaser.pure.js +1 -1
  85. package/time-input.pure.js +1 -1
  86. package/timetable-form.pure.js +3 -3
  87. package/timetable-occupancy.pure.js +22 -22
  88. package/toast.pure.js +6 -6
  89. package/tooltip.pure.js +3 -3
  90. package/train.pure.js +29 -29
  91. package/visual-checkbox.pure.js +13 -13
@@ -240,7 +240,7 @@ let SbbOverlayBaseElement = (() => {
240
240
 
241
241
  //#endregion
242
242
  //#region src/elements/overlay/overlay.scss?inline
243
- var overlay_default = ":host {\n --_sbb-overlay-padding-block: calc(\n var(--sbb-spacing-fixed-14x) + var(--sbb-spacing-responsive-l)\n );\n --sbb-overlay-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n display: var(--sbb-overlay-display);\n position: fixed;\n inset: var(--sbb-overlay-inset);\n z-index: var(--sbb-overlay-z-index, var(--sbb-overlay-default-z-index));\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) {\n --sbb-overlay-display: block;\n --sbb-overlay-container-display: flex;\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]))) {\n --sbb-overlay-pointer-events: all;\n}\n\n:host([negative]) {\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-dark);\n --sbb-overlay-color: var(--sbb-color-1-negative);\n --sbb-overlay-background-color: var(--sbb-background-color-3-negative);\n}\n\n:host(:not(:is(:state(state-closed),[state--state-closed]))) {\n --sbb-overlay-inset: 0;\n}\n\n.sbb-overlay__container {\n background-color: var(--sbb-overlay-background-color);\n pointer-events: var(--sbb-overlay-pointer-events);\n display: var(--sbb-overlay-container-display);\n align-items: center;\n position: fixed;\n inset: var(--sbb-overlay-inset);\n}\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) .sbb-overlay__container {\n animation-name: open;\n animation-duration: var(--sbb-overlay-animation-duration);\n animation-timing-function: var(--sbb-overlay-animation-easing);\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-overlay__container {\n pointer-events: none;\n animation-name: close;\n}\n\n.sbb-overlay {\n position: absolute;\n inset-inline: 0;\n margin: auto;\n padding: 0;\n border: none;\n height: var(--sbb-overlay-height);\n color: var(--sbb-overlay-color);\n}\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) .sbb-overlay {\n animation-name: open-move-in;\n animation-duration: var(--sbb-overlay-animation-duration);\n animation-timing-function: var(--sbb-overlay-animation-easing);\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-overlay {\n animation-name: close-move-out;\n}\n\n.sbb-overlay__wrapper {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: var(--sbb-overlay-height);\n outline: none;\n position: fixed;\n}\n@media (min-width: calc(64rem)) {\n .sbb-overlay__wrapper {\n position: sticky;\n inset-block-start: 0;\n height: auto;\n }\n}\n\n.sbb-overlay__header {\n position: absolute;\n inset-inline-start: 0;\n display: flex;\n pointer-events: none;\n align-items: start;\n justify-content: space-between;\n width: 100%;\n padding: var(--sbb-spacing-responsive-xs);\n padding-block-end: 0;\n z-index: 1;\n}\n.sbb-overlay__header * {\n pointer-events: all;\n}\n\n.sbb-overlay__close {\n margin-inline-start: auto;\n}\n\n.sbb-overlay__content {\n height: 100vh;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.sbb-overlay__content-container {\n padding-block: var(--_sbb-overlay-padding-block);\n}\n\n@keyframes open {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes open-move-in {\n from {\n transform: translateY(var(--sbb-spacing-fixed-4x));\n }\n to {\n transform: translateY(0%);\n }\n}\n@keyframes close {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n@keyframes close-move-out {\n from {\n transform: translateY(0%);\n }\n to {\n transform: translateY(var(--sbb-spacing-fixed-4x));\n }\n}\n";
243
+ var overlay_default = ":host {\n --sbb-overlay-display: none;\n --sbb-overlay-inset: 0 auto auto 0;\n --sbb-overlay-pointer-events: none;\n --sbb-overlay-container-display: none;\n --_sbb-overlay-padding-block: calc(\n var(--sbb-spacing-fixed-14x) + var(--sbb-spacing-responsive-l)\n );\n --sbb-overlay-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n display: var(--sbb-overlay-display);\n position: fixed;\n inset: var(--sbb-overlay-inset);\n z-index: var(--sbb-overlay-z-index, var(--sbb-overlay-default-z-index));\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) {\n --sbb-overlay-display: block;\n --sbb-overlay-container-display: flex;\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]))) {\n --sbb-overlay-pointer-events: all;\n}\n\n:host(:not([negative])) {\n --sbb-overlay-color: var(--sbb-color-1);\n --sbb-overlay-background-color: var(--sbb-background-color-3);\n}\n\n:host([negative]) {\n --sbb-overlay-color: var(--sbb-color-1-negative);\n --sbb-overlay-background-color: var(--sbb-background-color-3-negative);\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-dark);\n}\n\n:host(:not(:is(:state(state-closed),[state--state-closed]))) {\n --sbb-overlay-inset: 0;\n}\n\n.sbb-overlay__container {\n background-color: var(--sbb-overlay-background-color);\n pointer-events: var(--sbb-overlay-pointer-events);\n display: var(--sbb-overlay-container-display);\n align-items: center;\n position: fixed;\n inset: var(--sbb-overlay-inset);\n}\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) .sbb-overlay__container {\n animation-name: open;\n animation-duration: var(--sbb-overlay-animation-duration);\n animation-timing-function: var(--sbb-overlay-animation-easing);\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-overlay__container {\n pointer-events: none;\n animation-name: close;\n}\n\n.sbb-overlay {\n position: absolute;\n inset-inline: 0;\n margin: auto;\n padding: 0;\n border: none;\n height: var(--sbb-overlay-height);\n color: var(--sbb-overlay-color);\n}\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) .sbb-overlay {\n animation-name: open-move-in;\n animation-duration: var(--sbb-overlay-animation-duration);\n animation-timing-function: var(--sbb-overlay-animation-easing);\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-overlay {\n animation-name: close-move-out;\n}\n\n.sbb-overlay__wrapper {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: var(--sbb-overlay-height);\n outline: none;\n position: fixed;\n}\n@media (min-width: calc(64rem)) {\n .sbb-overlay__wrapper {\n position: sticky;\n inset-block-start: 0;\n height: auto;\n }\n}\n\n.sbb-overlay__header {\n position: absolute;\n inset-inline-start: 0;\n display: flex;\n pointer-events: none;\n align-items: start;\n justify-content: space-between;\n width: 100%;\n padding: var(--sbb-spacing-responsive-xs);\n padding-block-end: 0;\n z-index: 1;\n}\n.sbb-overlay__header * {\n pointer-events: all;\n}\n\n.sbb-overlay__close {\n margin-inline-start: auto;\n}\n\n.sbb-overlay__content {\n height: 100vh;\n overflow: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n.sbb-overlay__content-container {\n padding-block: var(--_sbb-overlay-padding-block);\n}\n\n@keyframes open {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes open-move-in {\n from {\n transform: translateY(var(--sbb-spacing-fixed-4x));\n }\n to {\n transform: translateY(0%);\n }\n}\n@keyframes close {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n@keyframes close-move-out {\n from {\n transform: translateY(0%);\n }\n to {\n transform: translateY(var(--sbb-spacing-fixed-4x));\n }\n}\n";
244
244
 
245
245
  //#endregion
246
246
  //#region src/elements/overlay/overlay.component.ts
@@ -695,24 +695,24 @@ let SbbPaginatorElement = (() => {
695
695
  return html`
696
696
  <ul class="sbb-paginator__pages">
697
697
  ${repeat(this._getVisiblePagesIndex(), (item) => item === "ellipsis" ? html`
698
- <li class="sbb-paginator__page--ellipsis">
699
- <span class="sbb-paginator__page--ellipsis-item">…</span>
700
- </li>
701
- ` : html`
702
- <li class="sbb-paginator__page--number">
703
- <button
704
- ?data-selected=${this.pageIndex === item}
705
- ?disabled=${this.disabled}
706
- class="sbb-paginator__page--number-item"
707
- data-index=${item}
708
- aria-label="${this.accessibilityPageLabel ? this.accessibilityPageLabel : i18nPage[this.language.current]} ${item + 1}"
709
- aria-current=${this.pageIndex === item ? "true" : nothing}
710
- @click=${() => this._onPageNumberClick(item)}
711
- >
712
- <span class="sbb-paginator__page--number-item-label">${item + 1}</span>
713
- </button>
714
- </li>
715
- `)}
698
+ <li class="sbb-paginator__page--ellipsis">
699
+ <span class="sbb-paginator__page--ellipsis-item">…</span>
700
+ </li>
701
+ ` : html`
702
+ <li class="sbb-paginator__page--number">
703
+ <button
704
+ ?data-selected=${this.pageIndex === item}
705
+ ?disabled=${this.disabled}
706
+ class="sbb-paginator__page--number-item"
707
+ data-index=${item}
708
+ aria-label="${this.accessibilityPageLabel ? this.accessibilityPageLabel : i18nPage[this.language.current]} ${item + 1}"
709
+ aria-current=${this.pageIndex === item ? "true" : nothing}
710
+ @click=${() => this._onPageNumberClick(item)}
711
+ >
712
+ <span class="sbb-paginator__page--number-item-label">${item + 1}</span>
713
+ </button>
714
+ </li>
715
+ `)}
716
716
  </ul>
717
717
  `;
718
718
  }
@@ -213,7 +213,7 @@ let SbbPopoverBaseElement = (() => {
213
213
  _setPopoverFocus() {
214
214
  if (!this._focusTrapController.focusInitialElement() && this._openStateController) {
215
215
  this.setAttribute("tabindex", "0");
216
- this.focus();
216
+ this.focus({ preventScroll: true });
217
217
  this.addEventListener("blur", (e) => {
218
218
  this._blurTimeout = setTimeout(() => {
219
219
  if (document.visibilityState !== "hidden") {
@@ -90,23 +90,23 @@ let SbbSignetElement = (() => {
90
90
  return html`
91
91
  <span class="sbb-signet__svg-container">
92
92
  ${this.protectiveRoom === "panel" ? html`
93
- <svg focusable="false" viewBox="0 0 143 48" xmlns="http://www.w3.org/2000/svg">
94
- <title .textContent=${this.accessibilityLabel}></title>
95
- <path id="sbb-signet__panel" stroke-width="1" d="M1 47h141V1H1v46z"></path>
96
- <path
97
- id="sbb-signet__icon"
98
- d="M87 40h9.3L83.8 27.7h15.5V40h7.4V27.7h15.6L109.7 40h9.3l16-16-15.9-16h-9.3l12.5 12.3h-15.6V8h-7.4v12.3H83.8L96.3 8H87L71 24l16 16z"
99
- ></path>
100
- </svg>
101
- ` : html`
102
- <svg focusable="false" viewBox="0 0 80 40" xmlns="http://www.w3.org/2000/svg">
103
- <title .textContent=${this.accessibilityLabel}></title>
104
- <path
105
- id="sbb-signet__icon"
106
- d="M20.0265 40H31.6821L16 24.6154H35.3907V40H44.6093V24.6154H64.106L48.4238 40H60.0795L80 20.0531L60.0795 0H48.4238L64.106 15.3846H44.6093V0H35.3907V15.3846H16L31.6821 0H20.0265L0 20.0531L20.0265 40Z"
107
- ></path>
108
- </svg>
109
- `}
93
+ <svg focusable="false" viewBox="0 0 143 48" xmlns="http://www.w3.org/2000/svg">
94
+ <title .textContent=${this.accessibilityLabel}></title>
95
+ <path id="sbb-signet__panel" stroke-width="1" d="M1 47h141V1H1v46z"></path>
96
+ <path
97
+ id="sbb-signet__icon"
98
+ d="M87 40h9.3L83.8 27.7h15.5V40h7.4V27.7h15.6L109.7 40h9.3l16-16-15.9-16h-9.3l12.5 12.3h-15.6V8h-7.4v12.3H83.8L96.3 8H87L71 24l16 16z"
99
+ ></path>
100
+ </svg>
101
+ ` : html`
102
+ <svg focusable="false" viewBox="0 0 80 40" xmlns="http://www.w3.org/2000/svg">
103
+ <title .textContent=${this.accessibilityLabel}></title>
104
+ <path
105
+ id="sbb-signet__icon"
106
+ d="M20.0265 40H31.6821L16 24.6154H35.3907V40H44.6093V24.6154H64.106L48.4238 40H60.0795L80 20.0531L60.0795 0H48.4238L64.106 15.3846H44.6093V0H35.3907V15.3846H16L31.6821 0H20.0265L0 20.0531L20.0265 40Z"
107
+ ></path>
108
+ </svg>
109
+ `}
110
110
  </span>
111
111
  `;
112
112
  }
@@ -58,8 +58,6 @@ export declare class SbbStepElement extends SbbElement {
58
58
  protected configure(stepperLoaded: boolean): void;
59
59
  /** Watches for clicked elements with `sbb-stepper-next` or `sbb-stepper-previous` attributes. */
60
60
  private _handleClick;
61
- private _isGoNextElement;
62
- private _isGoPreviousElement;
63
61
  private _onStepElementResize;
64
62
  connectedCallback(): void;
65
63
  protected firstUpdated(changedProperties: PropertyValues<this>): void;
@@ -64,9 +64,9 @@ export declare class SbbStepperElement extends SbbElement {
64
64
  private _resizeObserverTimeout;
65
65
  private _mediaMatcher;
66
66
  constructor();
67
- /** Selects the next step. */
67
+ /** Selects the next enabled step. If no available step is found, it simply exits. */
68
68
  next(): void;
69
- /** Selects the previous step. */
69
+ /** Selects the previous enabled step. If no available step is found, it simply exits. */
70
70
  previous(): void;
71
71
  /** Resets the form in which the stepper is nested or every form of each step, if any. */
72
72
  reset(): void;
@@ -47,7 +47,7 @@ var SbbStepLabelElement = class extends SbbIconNameMixin(SbbDisabledMixin(SbbBut
47
47
  this._previousSize = null;
48
48
  this.addEventListener?.("click", () => {
49
49
  const stepper = this.stepper;
50
- if (stepper && this.step && this._isNotDeactivatedByLinearMode(this.step)) stepper.selected = this.step;
50
+ if (stepper && this.step && this._isNotDeactivatedByLinearMode(this.step) && !this.disabled) stepper.selected = this.step;
51
51
  });
52
52
  this.addController(new SbbPropertyWatcherController(this, () => this.stepper, {
53
53
  orientation: (s) => {
@@ -246,14 +246,8 @@ var SbbStepElement = class extends SbbElement {
246
246
  /** Watches for clicked elements with `sbb-stepper-next` or `sbb-stepper-previous` attributes. */
247
247
  _handleClick(event) {
248
248
  const composedPathElements = event.composedPath().filter((el) => el instanceof window.HTMLElement);
249
- if (composedPathElements.some((el) => this._isGoNextElement(el))) this.stepper?.next();
250
- else if (composedPathElements.some((el) => this._isGoPreviousElement(el))) this.stepper?.previous();
251
- }
252
- _isGoNextElement(element) {
253
- return element.hasAttribute("sbb-stepper-next") && !element.hasAttribute("disabled");
254
- }
255
- _isGoPreviousElement(element) {
256
- return element.hasAttribute("sbb-stepper-previous") && !element.hasAttribute("disabled");
249
+ if (composedPathElements.some((el) => el.hasAttribute("sbb-stepper-next"))) this.stepper?.next();
250
+ else if (composedPathElements.some((el) => el.hasAttribute("sbb-stepper-previous"))) this.stepper?.previous();
257
251
  }
258
252
  _onStepElementResize() {
259
253
  if (!this.matches(":is(:state(selected),[state--selected])")) return;
@@ -572,13 +566,25 @@ let SbbStepperElement = (() => {
572
566
  this.addEventListener?.("keydown", (e) => this._handleKeyDown(e));
573
567
  this.addEventListener?.("resizechange", (e) => this._onSelectedStepResize(e));
574
568
  }
575
- /** Selects the next step. */
569
+ /** Selects the next enabled step. If no available step is found, it simply exits. */
576
570
  next() {
577
- if (this.selectedIndex !== null) this._select(this.steps[this.selectedIndex + 1]);
571
+ if (this.selectedIndex !== null) for (let i = this.selectedIndex + 1; i < this.steps.length; i++) {
572
+ const step = this.steps[i];
573
+ if (this._isSelectable(step)) {
574
+ this._select(step);
575
+ return;
576
+ }
577
+ }
578
578
  }
579
- /** Selects the previous step. */
579
+ /** Selects the previous enabled step. If no available step is found, it simply exits. */
580
580
  previous() {
581
- if (this.selectedIndex !== null) this._select(this.steps[this.selectedIndex - 1]);
581
+ if (this.selectedIndex !== null) for (let i = this.selectedIndex - 1; i >= 0; i--) {
582
+ const step = this.steps[i];
583
+ if (this._isSelectable(step)) {
584
+ this._select(step);
585
+ return;
586
+ }
587
+ }
582
588
  }
583
589
  /** Resets the form in which the stepper is nested or every form of each step, if any. */
584
590
  reset() {
@@ -599,17 +605,18 @@ let SbbStepperElement = (() => {
599
605
  } else return false;
600
606
  }
601
607
  _select(step) {
602
- if (!this._isSelectable(step) || step === this.selected) return;
608
+ if (!step || step === this.selected) return;
603
609
  const currentIndex = this.selectedIndex;
604
610
  const currentStep = this.selected;
611
+ const stepIndex = this.steps.indexOf(step);
605
612
  const validatePayload = {
606
613
  currentIndex,
607
614
  currentStep,
608
- nextIndex: this.selectedIndex !== null ? this.selectedIndex + 1 : null,
609
- nextStep: this.selectedIndex !== null ? this.steps[this.selectedIndex + 1] : null
615
+ nextIndex: stepIndex >= 0 ? stepIndex : null,
616
+ nextStep: step
610
617
  };
611
618
  if (this.selected && !this.selected["validate"](validatePayload)) return;
612
- this.selected?.["deselect"]();
619
+ currentStep?.["deselect"]();
613
620
  step["select"]();
614
621
  /** @internal only to provide double entry in docs. It is a public event! */
615
622
  this.dispatchEvent(new SbbStepChangeEvent({
@@ -299,10 +299,10 @@ let SbbTabGroupElement = (() => {
299
299
  <slot name="tab-bar" @slotchange=${this._onLabelSlotChange}></slot>
300
300
  </div>
301
301
  ${!this.fixedHeight ? html`
302
- <div class="sbb-tab-group-content">
303
- <slot @slotchange=${this._onContentSlotChange}></slot>
304
- </div>
305
- ` : html`<slot @slotchange=${this._onContentSlotChange}></slot>`}
302
+ <div class="sbb-tab-group-content">
303
+ <slot @slotchange=${this._onContentSlotChange}></slot>
304
+ </div>
305
+ ` : html`<slot @slotchange=${this._onContentSlotChange}></slot>`}
306
306
  `;
307
307
  }
308
308
  };
@@ -5,7 +5,7 @@ import { html } from "lit/static-html.js";
5
5
  import { SbbLinkBaseElement, screenReaderOnlyStyles } from "./core.js";
6
6
 
7
7
  //#region src/elements/teaser/teaser.scss?inline
8
- var teaser_default = "@charset \"UTF-8\";\n:host {\n --_sbb-teaser-forced-colors-inset: calc(-1 * var(--sbb-focus-outline-offset));\n --_sbb-teaser-forced-colors-outline-offset: calc(2 * var(--sbb-focus-outline-offset));\n --_sbb-teaser-forced-colors-border-radius: calc(\n var(--sbb-teaser-border-radius) + var(--sbb-focus-outline-offset)\n );\n display: inline-block;\n outline: none !important;\n}\n@media (forced-colors: active) {\n :host {\n --sbb-teaser-description-color: LinkText;\n --sbb-title-color: LinkText !important;\n }\n}\n\n:host([alignment=after]) {\n --sbb-teaser-align-items: start;\n}\n\n:host([alignment=below]) {\n --sbb-teaser-flex-direction: column;\n --sbb-teaser-align-items: baseline;\n --sbb-teaser-gap: var(--sbb-spacing-fixed-3x);\n}\n\n@media (any-hover: hover) {\n :host(:hover) {\n --sbb-teaser-scale: var(--sbb-teaser-scale-hover);\n }\n}\n.sbb-teaser__wrapper {\n display: flex;\n position: relative;\n cursor: var(--sbb-cursor-pointer);\n}\n.sbb-teaser__wrapper::before {\n content: \"​\";\n user-select: none;\n width: 0;\n height: 0;\n}\n\n.sbb-teaser {\n text-decoration: none;\n position: absolute;\n inset: 0;\n}\n.sbb-teaser:focus-visible {\n outline-offset: var(--sbb-focus-outline-offset);\n outline: var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);\n border-radius: var(--sbb-teaser-border-radius);\n}\n@media (forced-colors: active) {\n .sbb-teaser:focus-visible {\n outline-offset: var(--_sbb-teaser-forced-colors-outline-offset);\n }\n}\n@media (forced-colors: active) {\n .sbb-teaser::before {\n content: \"\";\n position: absolute;\n inset: var(--_sbb-teaser-forced-colors-inset);\n pointer-events: none;\n border-radius: var(--_sbb-teaser-forced-colors-border-radius);\n border: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n\n.sbb-teaser__container {\n display: flex;\n flex-flow: var(--sbb-teaser-flex-direction) nowrap;\n align-items: var(--sbb-teaser-align-items);\n gap: var(--sbb-teaser-gap);\n max-width: 100%;\n width: 100%;\n pointer-events: none;\n}\n\n.sbb-teaser__text {\n color: var(--sbb-teaser-description-color);\n font-size: var(--sbb-teaser-font-size);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n overflow: hidden;\n max-width: 100%;\n}\n\n::slotted([slot=image]) {\n display: block;\n width: var(--sbb-teaser-image-width);\n}\n\n.sbb-teaser__image-wrapper {\n flex-shrink: 0;\n overflow: hidden;\n border-radius: var(--sbb-teaser-border-radius);\n transition: box-shadow var(--sbb-teaser-image-animation-duration) var(--sbb-animation-easing);\n}\n:host(:not(:is(:state(slotted-image),[state--slotted-image]))) .sbb-teaser__image-wrapper {\n display: none;\n}\n@media (any-hover: hover) {\n :host(:hover) .sbb-teaser__image-wrapper {\n box-shadow: var(--sbb-box-shadow-level-9-hard);\n }\n}\n\n.sbb-teaser__description {\n display: inline-block;\n margin: 0;\n padding: 0;\n}\n\n::slotted(sbb-chip-label) {\n display: flex;\n width: fit-content;\n max-width: 100%;\n margin-block-end: var(--sbb-spacing-fixed-1x);\n}\n\n::slotted(sbb-title) {\n margin-block: 0;\n}\n";
8
+ var teaser_default = "@charset \"UTF-8\";\n:host {\n --_sbb-teaser-forced-colors-inset: calc(-1 * var(--sbb-focus-outline-offset));\n --_sbb-teaser-forced-colors-outline-offset: calc(2 * var(--sbb-focus-outline-offset));\n --_sbb-teaser-forced-colors-border-radius: calc(\n var(--sbb-teaser-border-radius) + var(--sbb-focus-outline-offset)\n );\n display: inline-block;\n outline: none !important;\n}\n@media (forced-colors: active) {\n :host {\n --sbb-teaser-description-color: LinkText;\n --sbb-title-color: LinkText !important;\n }\n}\n\n:host([alignment=after]) {\n --sbb-teaser-align-items: start;\n}\n\n:host([alignment=below]) {\n --sbb-teaser-flex-direction: column;\n --sbb-teaser-align-items: baseline;\n --sbb-teaser-gap: var(--sbb-spacing-fixed-3x);\n}\n\n@media (any-hover: hover) {\n :host(:hover) {\n --sbb-teaser-scale: var(--sbb-teaser-scale-hover);\n }\n}\n.sbb-teaser__wrapper {\n display: flex;\n position: relative;\n cursor: var(--sbb-cursor-pointer);\n}\n.sbb-teaser__wrapper::before {\n content: \"​\";\n user-select: none;\n width: 0;\n height: 0;\n}\n\n.sbb-teaser {\n text-decoration: none;\n position: absolute;\n inset: 0;\n}\n.sbb-teaser:focus-visible {\n outline-offset: var(--sbb-focus-outline-offset);\n outline: var(--sbb-focus-outline-color) var(--sbb-focus-outline-style, solid) var(--sbb-focus-outline-width);\n border-radius: var(--sbb-teaser-border-radius);\n}\n@media (forced-colors: active) {\n .sbb-teaser:focus-visible {\n outline-offset: var(--_sbb-teaser-forced-colors-outline-offset);\n }\n}\n@media (forced-colors: active) {\n .sbb-teaser::before {\n content: \"\";\n position: absolute;\n inset: var(--_sbb-teaser-forced-colors-inset);\n pointer-events: none;\n border-radius: var(--_sbb-teaser-forced-colors-border-radius);\n border: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n\n.sbb-teaser__container {\n display: flex;\n flex-flow: var(--sbb-teaser-flex-direction) nowrap;\n align-items: var(--sbb-teaser-align-items);\n gap: var(--sbb-teaser-gap);\n max-width: 100%;\n width: 100%;\n pointer-events: none;\n}\n\n.sbb-teaser__text {\n color: var(--sbb-teaser-description-color);\n font-size: var(--sbb-teaser-font-size);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n overflow: hidden;\n max-width: 100%;\n}\n\n::slotted([slot=image]) {\n display: block;\n width: var(--sbb-teaser-image-width);\n}\n\n.sbb-teaser__image-wrapper {\n flex-shrink: 0;\n overflow: hidden;\n border-radius: var(--sbb-teaser-border-radius);\n transition: box-shadow var(--sbb-teaser-image-animation-duration) var(--sbb-animation-easing);\n max-width: 100%;\n}\n:host(:not(:is(:state(slotted-image),[state--slotted-image]))) .sbb-teaser__image-wrapper {\n display: none;\n}\n@media (any-hover: hover) {\n :host(:hover) .sbb-teaser__image-wrapper {\n box-shadow: var(--sbb-box-shadow-level-9-hard);\n }\n}\n\n.sbb-teaser__description {\n display: inline-block;\n margin: 0;\n padding: 0;\n}\n\n::slotted(sbb-chip-label) {\n display: flex;\n width: fit-content;\n max-width: 100%;\n margin-block-end: var(--sbb-spacing-fixed-1x);\n}\n\n::slotted(sbb-title) {\n margin-block: 0;\n}\n";
9
9
 
10
10
  //#endregion
11
11
  //#region src/elements/teaser/teaser.component.ts
@@ -154,12 +154,16 @@ let SbbTimeInputElement = (() => {
154
154
  validate() {
155
155
  super.validate();
156
156
  if (!this.value) this._removeValidityErrors();
157
- else if (!this._valueAsTime) this.setValidityFlag("badInput", i18nTimeInvalid[this.language.current]);
158
- else if (!this._isTimeValid(this._valueAsTime)) this.setValidityFlag("rangeOverflow", i18nTimeMax[this.language.current]);
159
- else this._removeValidityErrors();
160
- }
161
- _removeValidityErrors() {
162
- ["badInput", "rangeOverflow"].forEach((f) => this.removeValidityFlag(f));
157
+ else if (!this._valueAsTime) {
158
+ this._removeValidityErrors("badInput");
159
+ this.setValidityFlag("badInput", i18nTimeInvalid[this.language.current]);
160
+ } else if (!this._isTimeValid(this._valueAsTime)) {
161
+ this._removeValidityErrors("rangeOverflow");
162
+ this.setValidityFlag("rangeOverflow", i18nTimeMax[this.language.current]);
163
+ } else this._removeValidityErrors();
164
+ }
165
+ _removeValidityErrors(except) {
166
+ ["badInput", "rangeOverflow"].filter((v) => v !== except).forEach((f) => this.removeValidityFlag(f));
163
167
  }
164
168
  /** Checks if values of hours and minutes are possible, to avoid non-existent times. */
165
169
  _isTimeValid(time) {
@@ -60,9 +60,9 @@ var SbbTimetableFormFieldElement = class extends SbbFormFieldElement {
60
60
  render() {
61
61
  return html`
62
62
  ${this._routeIcon ? html` <sbb-icon
63
- name="route-circle-start-small"
64
- class="sbb-timetable-form-field__start-route-icon"
65
- ></sbb-icon>` : html` <span class="sbb-timetable-form-field__via-route-icon"></span> `}
63
+ name="route-circle-start-small"
64
+ class="sbb-timetable-form-field__start-route-icon"
65
+ ></sbb-icon>` : html` <span class="sbb-timetable-form-field__via-route-icon"></span> `}
66
66
  ${super.render()}
67
67
  `;
68
68
  }
@@ -97,28 +97,28 @@ let SbbTimetableOccupancyElement = (() => {
97
97
  }
98
98
  render() {
99
99
  return html` ${(this.firstClassOccupancy || this.secondClassOccupancy) && html`
100
- <ul
101
- class="sbb-timetable-occupancy__list"
102
- role=${!this.firstClassOccupancy || !this.secondClassOccupancy ? "presentation" : nothing}
103
- >
104
- ${[this.firstClassOccupancy, this.secondClassOccupancy].map((occupancy, index) => occupancy && html`
105
- <li class="sbb-timetable-occupancy__list-item">
106
- <span class="sbb-timetable-occupancy__list-item-class" aria-hidden="true">
107
- ${this.firstClassOccupancy && index === 0 ? "1" : "2"}.
108
- </span>
109
- <span class="sbb-screen-reader-only">
110
- ${`${i18nClass[this.firstClassOccupancy && index === 0 ? "first" : "second"][this._language.current]}.`}
111
- </span>
112
- <sbb-timetable-occupancy-icon
113
- class="sbb-timetable-occupancy__list-item-icon"
114
- ?negative=${this.negative}
115
- .occupancy=${occupancy}
116
- >
117
- </sbb-timetable-occupancy-icon>
118
- </li>
119
- `)}
120
- </ul>
121
- `}`;
100
+ <ul
101
+ class="sbb-timetable-occupancy__list"
102
+ role=${!this.firstClassOccupancy || !this.secondClassOccupancy ? "presentation" : nothing}
103
+ >
104
+ ${[this.firstClassOccupancy, this.secondClassOccupancy].map((occupancy, index) => occupancy && html`
105
+ <li class="sbb-timetable-occupancy__list-item">
106
+ <span class="sbb-timetable-occupancy__list-item-class" aria-hidden="true">
107
+ ${this.firstClassOccupancy && index === 0 ? "1" : "2"}.
108
+ </span>
109
+ <span class="sbb-screen-reader-only">
110
+ ${`${i18nClass[this.firstClassOccupancy && index === 0 ? "first" : "second"][this._language.current]}.`}
111
+ </span>
112
+ <sbb-timetable-occupancy-icon
113
+ class="sbb-timetable-occupancy__list-item-icon"
114
+ ?negative=${this.negative}
115
+ .occupancy=${occupancy}
116
+ >
117
+ </sbb-timetable-occupancy-icon>
118
+ </li>
119
+ `)}
120
+ </ul>
121
+ `}`;
122
122
  }
123
123
  };
124
124
  })();
@@ -250,12 +250,12 @@ let SbbToastElement = (() => {
250
250
  ?negative=${this._isLightMode()}
251
251
  ></sbb-divider>
252
252
  ${!this.readOnly ? html`<sbb-transparent-button
253
- class="sbb-toast__close-button"
254
- icon-name="cross-small"
255
- ?negative=${this._isLightMode()}
256
- aria-label=${i18nCloseAlert[this._language.current]}
257
- sbb-toast-close
258
- ></sbb-transparent-button>` : nothing}
253
+ class="sbb-toast__close-button"
254
+ icon-name="cross-small"
255
+ ?negative=${this._isLightMode()}
256
+ aria-label=${i18nCloseAlert[this._language.current]}
257
+ sbb-toast-close
258
+ ></sbb-transparent-button>` : nothing}
259
259
  </div>
260
260
  </div>
261
261
  </div>
@@ -1,7 +1,7 @@
1
1
  import { __esDecorate, __runInitializers } from "tslib";
2
2
  import { html, isServer, unsafeCSS } from "lit";
3
3
  import { property } from "lit/decorators.js";
4
- import { SbbDisabledMixin, SbbEscapableOverlayController, SbbOpenCloseBaseElement, SbbOverlayPositionController, appendAriaElements, idReference, isAndroid, isIOS, isZeroAnimationDuration, popoverResetStyles, queueDomContentLoaded, readConfig, removeAriaElements, sbbOverlayOutsidePointerEventListener } from "./core.js";
4
+ import { SbbDisabledMixin, SbbEscapableOverlayController, SbbOpenCloseBaseElement, SbbOverlayPositionController, appendAriaElements, idReference, isAndroid, isIOS, isZeroAnimationDuration, popoverResetStyles, queueDomContentLoaded, readConfig, removeAriaElements, sbbInputModalityDetector, sbbOverlayOutsidePointerEventListener } from "./core.js";
5
5
 
6
6
  //#region src/elements/tooltip/tooltip.scss?inline
7
7
  var tooltip_default = ":host {\n --sbb-tooltip-max-width: min(\n 25rem,\n calc(100vw - var(--sbb-spacing-fixed-2x))\n );\n --sbb-tooltip-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-4x)\n );\n position-area: var(--sbb-overlay-position-area);\n position-try-fallbacks: var(--sbb-overlay-position-try-fallbacks);\n display: none;\n position: fixed;\n pointer-events: var(--sbb-tooltip-pointer-events, all);\n z-index: var(--sbb-tooltip-z-index, var(--sbb-overlay-default-z-index));\n animation-name: var(--sbb-tooltip-animation-name);\n animation-duration: var(--sbb-tooltip-animation-duration);\n animation-timing-function: var(--sbb-tooltip-animation-easing);\n font-size: var(--sbb-tooltip-font-size);\n letter-spacing: var(--sbb-typo-letter-spacing-text);\n line-height: var(--sbb-typo-line-height-text);\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]), :is(:state(state-closing),[state--state-closing]))) {\n --sbb-tooltip-animation-name: open;\n display: block;\n}\n\n:host(:is(:state(state-closing),[state--state-closing])) {\n --sbb-tooltip-animation-name: close;\n --sbb-tooltip-pointer-events: none;\n}\n\n:host(:is([data-position~=block-end], [data-position~=bottom], [data-position^=end])) {\n padding-block-start: var(--sbb-tooltip-gap);\n}\n\n:host(:is([data-position~=block-start], [data-position~=top], [data-position^=start])) {\n padding-block-end: var(--sbb-tooltip-gap);\n}\n\n:host(:is([data-position~=inline-start],\n[data-position~=inline-end],\n[data-position~=left],\n[data-position~=right],\n[data-position$=\" start\"],\n[data-position$=\" end\"])) {\n padding-inline: var(--sbb-tooltip-gap);\n}\n\n.sbb-tooltip {\n box-shadow: var(--sbb-box-shadow-level-5-soft);\n border: var(--sbb-border-width-1x) solid var(--sbb-tooltip-border-color);\n border-radius: var(--sbb-tooltip-border-radius);\n padding: var(--sbb-tooltip-padding);\n color: var(--sbb-tooltip-color);\n background-color: var(--sbb-tooltip-background-color);\n min-width: var(--sbb-tooltip-min-width);\n max-width: var(--sbb-tooltip-max-width);\n}\n\n@keyframes open {\n from {\n opacity: 0;\n translate: var(--sbb-tooltip-animation-translate);\n }\n to {\n opacity: 1;\n translate: 0;\n }\n}\n@keyframes close {\n from {\n opacity: 1;\n translate: 0;\n }\n to {\n opacity: 0;\n translate: var(--sbb-tooltip-animation-translate);\n }\n}\n";
@@ -334,7 +334,9 @@ let SbbTooltipElement = (() => {
334
334
  if (!newTarget || newTarget !== this) this._delayedClose();
335
335
  }, options);
336
336
  trigger.addEventListener("blur", () => this.close(), options);
337
- trigger.addEventListener("focus", () => this._delayedOpen(), options);
337
+ trigger.addEventListener("focus", () => {
338
+ if (sbbInputModalityDetector.mostRecentModality === "keyboard") this._delayedOpen();
339
+ }, options);
338
340
  }
339
341
  trigger.addEventListener("touchstart", () => {
340
342
  clearTimeout(this._longPressOpenTimeout);
@@ -243,18 +243,18 @@ let SbbTrainFormationElement = (() => {
243
243
  render() {
244
244
  return html`
245
245
  ${this._sectors.length && this._sectors[0].label !== void 0 ? html`<div class="sbb-train-formation__sectors" aria-hidden="true">
246
- ${this._sectors.map((aggregatedSector) => html`<span
247
- class="sbb-train-formation__sector"
248
- style=${styleMap({
246
+ ${this._sectors.map((aggregatedSector) => html`<span
247
+ class="sbb-train-formation__sector"
248
+ style=${styleMap({
249
249
  "--sbb-train-formation-wagon-count": aggregatedSector.wagonCount,
250
250
  "--sbb-train-formation-wagon-blocked-passage-count": aggregatedSector.blockedPassageCount
251
251
  })}
252
- >
253
- <span class="sbb-train-formation__sector-sticky-wrapper">
254
- ${`${aggregatedSector.wagonCount === 1 && aggregatedSector.label ? i18nSectorShort[this._language.current] : i18nSector[this._language.current]} ${aggregatedSector.label ? aggregatedSector.label : ""}`}
255
- </span>
256
- </span>`)}
257
- </div>` : nothing}
252
+ >
253
+ <span class="sbb-train-formation__sector-sticky-wrapper">
254
+ ${`${aggregatedSector.wagonCount === 1 && aggregatedSector.label ? i18nSectorShort[this._language.current] : i18nSector[this._language.current]} ${aggregatedSector.label ? aggregatedSector.label : ""}`}
255
+ </span>
256
+ </span>`)}
257
+ </div>` : nothing}
258
258
 
259
259
  <div class="sbb-train-formation__trains">
260
260
  ${this.renderList({
@@ -636,13 +636,13 @@ const SbbTrainWagonMixin = (superClass) => {
636
636
  ${this.label ? html$1`<li class="sbb-screen-reader-only">${labelString}</li>` : nothing}
637
637
  ${this.wagonClass && this.wagonType !== "closed" ? html$1`<li class="sbb-train-wagon__class">${wagonClassContent}</li>` : nothing}
638
638
  ${this.occupancy && this.wagonType !== "closed" ? html$1`<sbb-timetable-occupancy-icon
639
- class="sbb-train-wagon__occupancy"
640
- role="listitem"
641
- occupancy=${this.occupancy}
642
- ></sbb-timetable-occupancy-icon>` : nothing}
639
+ class="sbb-train-wagon__occupancy"
640
+ role="listitem"
641
+ occupancy=${this.occupancy}
642
+ ></sbb-timetable-occupancy-icon>` : nothing}
643
643
  ${hasBlockedPassageEntry ? html$1`<li class="sbb-screen-reader-only">
644
- ${i18nBlockedPassage[blockedPassage][this._language.current]}
645
- </li>` : nothing}
644
+ ${i18nBlockedPassage[blockedPassage][this._language.current]}
645
+ </li>` : nothing}
646
646
  </ul>`, () => html$1`<div class="sbb-train-wagon__compartment">
647
647
  <span class="sbb-screen-reader-only">
648
648
  ${`${this._wagonTypeLabel()}${this.sector ? `, ${sectorString}` : ""}`}
@@ -650,17 +650,17 @@ const SbbTrainWagonMixin = (superClass) => {
650
650
  ${this.label ? html$1`<span class="sbb-screen-reader-only">${labelString}</span>` : nothing}
651
651
  ${this.wagonClass && this.wagonType !== "closed" ? html$1`<span class="sbb-train-wagon__class">${wagonClassContent}</span>` : nothing}
652
652
  ${this.occupancy && this.wagonType !== "closed" ? html$1`<sbb-timetable-occupancy-icon
653
- class="sbb-train-wagon__occupancy"
654
- occupancy=${this.occupancy}
655
- ></sbb-timetable-occupancy-icon>` : nothing}
653
+ class="sbb-train-wagon__occupancy"
654
+ occupancy=${this.occupancy}
655
+ ></sbb-timetable-occupancy-icon>` : nothing}
656
656
  ${hasBlockedPassageEntry ? html$1`<span class="sbb-screen-reader-only">
657
- ${i18nBlockedPassage[blockedPassage][this._language.current]}
658
- </span>` : nothing}
657
+ ${i18nBlockedPassage[blockedPassage][this._language.current]}
658
+ </span>` : nothing}
659
659
  </div> `)}
660
660
  ${wagonTypeToIconMap[this.wagonType] ? html$1`<sbb-icon
661
- name=${wagonTypeToIconMap[this.wagonType]}
662
- class="sbb-train-wagon__main-icon"
663
- ></sbb-icon>` : nothing}
661
+ name=${wagonTypeToIconMap[this.wagonType]}
662
+ class="sbb-train-wagon__main-icon"
663
+ ></sbb-icon>` : nothing}
664
664
  <svg class="sbb-train-wagon__shape" viewBox="0 0 84 36" aria-hidden="true">
665
665
  <path d=${path}></path>
666
666
  <path
@@ -673,18 +673,18 @@ const SbbTrainWagonMixin = (superClass) => {
673
673
  ></path>
674
674
  </svg>
675
675
  ${this.additionalAccessibilityText ? html$1`<span class="sbb-screen-reader-only"
676
- >, ${this.additionalAccessibilityText}</span
677
- >` : nothing}
676
+ >, ${this.additionalAccessibilityText}</span
677
+ >` : nothing}
678
678
  <span
679
679
  class="sbb-train-wagon__information-wrapper"
680
680
  ?hidden=${!this.listChildren.length && !this.label}
681
681
  >
682
682
  ${this.label ? html$1`<span aria-hidden="true" class="sbb-train-wagon__label">${this.label}</span>` : nothing}
683
683
  ${this.label && this.listChildren.length ? html$1`<sbb-divider
684
- orientation=${this.orientation === "vertical" ? "horizontal" : "vertical"}
685
- aria-hidden="true"
686
- class="sbb-train-wagon__label-divider"
687
- ></sbb-divider>` : nothing}
684
+ orientation=${this.orientation === "vertical" ? "horizontal" : "vertical"}
685
+ aria-hidden="true"
686
+ class="sbb-train-wagon__label-divider"
687
+ ></sbb-divider>` : nothing}
688
688
  ${this.renderList({
689
689
  class: "sbb-train-wagon__attribute-icon-list",
690
690
  ariaLabel: i18nAdditionalWagonInformationHeading[this._language.current]
@@ -118,19 +118,19 @@ let SbbVisualCheckboxElement = (() => {
118
118
  render() {
119
119
  return html`
120
120
  ${this.checked || this.indeterminate ? html`<svg
121
- viewBox="0 0 24 24"
122
- xmlns="http://www.w3.org/2000/svg"
123
- width="100%"
124
- height="100%"
125
- >
126
- <path
127
- fill="none"
128
- d=${this.indeterminate ? "M9 12H15" : "M8 12.3304L10.4615 15L16 9"}
129
- stroke-width="2"
130
- stroke-linecap="round"
131
- stroke-linejoin="round"
132
- />
133
- </svg>` : nothing}
121
+ viewBox="0 0 24 24"
122
+ xmlns="http://www.w3.org/2000/svg"
123
+ width="100%"
124
+ height="100%"
125
+ >
126
+ <path
127
+ fill="none"
128
+ d=${this.indeterminate ? "M9 12H15" : "M8 12.3304L10.4615 15L16 9"}
129
+ stroke-width="2"
130
+ stroke-linecap="round"
131
+ stroke-linejoin="round"
132
+ />
133
+ </svg>` : nothing}
134
134
  `;
135
135
  }
136
136
  constructor() {
@@ -0,0 +1,12 @@
1
+ $theme: 'standard' !default;
2
+
3
+ @mixin base {
4
+ --sbb-download-gap: var(--sbb-spacing-fixed-3x);
5
+ --sbb-download-label-color: var(--sbb-color-3);
6
+ --sbb-download-info-color: light-dark(var(--sbb-color-granite), var(--sbb-color-aluminium));
7
+ }
8
+
9
+ @mixin forced-colors {
10
+ --sbb-download-label-color: CanvasText;
11
+ --sbb-download-info-color: CanvasText;
12
+ }
package/download.js ADDED
@@ -0,0 +1 @@
1
+ import{SbbDownloadElement as e,SbbDownloadInfoElement as t}from"./download.pure.js";export*from"./download.pure.js";e.define(),t.define();
@@ -0,0 +1,21 @@
1
+ import{__esDecorate as e,__runInitializers as t}from"tslib";import{html as n,nothing as r,unsafeCSS as i}from"lit";import{property as a}from"lit/decorators.js";import{SbbSecondaryButtonStaticElement as o}from"./button.pure.js";import{SbbElement as s,SbbLanguageController as c,SbbLinkBaseElement as l,SbbPropertyWatcherController as u,defaultDateAdapter as d,forceType as f,i18nDownload as p,i18nNonAccessible as m,omitEmptyConverter as h,readConfig as g,screenReaderOnlyStyles as _}from"./core.js";import{SbbIconNameMixin as v}from"./icon.pure.js";var y=`:host{--sbb-card-background-color:var(--sbb-background-color-1);--sbb-card-border-color:transparent;--sbb-card-border-radius:var(--sbb-border-radius-4x);--sbb-card-animation-easing:var(--sbb-animation-easing);--sbb-card-border-style:solid;--sbb-card-padding-inline-default:var(--sbb-spacing-responsive-s);--sbb-card-padding-block-default:var(--sbb-spacing-responsive-xxxs);--sbb-card-with-badge-padding-block-default:var(--sbb-spacing-fixed-6x) var(--sbb-spacing-responsive-xxxs);--sbb-card-padding-block:var(--sbb-card-padding-block-default);--sbb-card-with-badge-padding-block:var(--sbb-card-with-badge-padding-block-default);--sbb-card-padding-inline:var(--sbb-card-padding-inline-default);display:block}:host(:where([color=white])){--sbb-card-background-color:var(--sbb-background-color-1);--sbb-card-border-color:transparent}:host(:where([color=milk])){--sbb-card-background-color:var(--sbb-background-color-3);--sbb-card-border-color:transparent}.sbb-download{--sbb-focus-outline-color:light-dark(var(--sbb-focus-outline-color-default),var(--sbb-focus-outline-color-dark));--sbb-card-animation-duration:var(--sbb-disable-animation-duration,var(--sbb-animation-duration-1x));padding-inline:var(--sbb-card-padding-inline);padding-block:var(--sbb-card-padding-block);border-radius:var(--sbb-card-border-radius);background-color:var(--sbb-card-background-color);box-shadow:none;transition:box-shadow var(--sbb-card-animation-duration) var(--sbb-card-animation-easing);color:var(--sbb-card-color);display:block;position:relative}.sbb-download:after{content:"";border:var(--sbb-card-border-width) var(--sbb-card-border-style) var(--sbb-card-border-color);border-radius:var(--sbb-card-border-radius);pointer-events:none;background-color:#0000;position:absolute;inset:0}@media (forced-colors:active){.sbb-download{--sbb-title-color:var(--sbb-card-color)}}.sbb-download{align-items:center;gap:var(--sbb-download-gap);translate:0 var(--sbb-card-hover-shift,0);transition:box-shadow var(--sbb-card-animation-duration) var(--sbb-card-animation-easing), translate var(--sbb-card-animation-duration) var(--sbb-card-animation-easing);text-decoration:none;display:flex}.sbb-download:focus-visible{outline-offset:var(--sbb-focus-outline-offset);outline:var(--sbb-focus-outline-color) var(--sbb-focus-outline-style,solid) var(--sbb-focus-outline-width)}@media (any-hover:hover){:host(:hover) .sbb-download{--sbb-card-hover-shift:-.125rem;box-shadow:var(--sbb-box-shadow-level-9-hard)}}@media (any-hover:hover) and (forced-colors:active){:host(:hover) .sbb-download{--sbb-card-border-color:Highlight}}.sbb-download__icon{flex:none}.sbb-download__content{flex-direction:column;flex:auto;min-width:0;display:flex}.sbb-download__label{overflow-wrap:break-word;color:var(--sbb-download-label-color);font-weight:700}.sbb-download__custom-content,.sbb-download__info{line-height:var(--sbb-typo-line-height-text);letter-spacing:var(--sbb-typo-letter-spacing-text);font-size:var(--sbb-text-font-size-xxs);color:var(--sbb-download-info-color)}.sbb-download__button{flex:none;margin-inline-start:auto}
2
+ `;const b=new Map([[`pdf`,`document-pdf-small`],[`xls`,`document-xls-small`],[`xlsx`,`document-xls-small`],[`ppt`,`document-ppt-small`],[`pptx`,`document-ppt-small`],[`doc`,`document-doc-small`],[`docx`,`document-doc-small`],[`zip`,`document-zip-small`],[`jpg`,`document-image-small`],[`jpeg`,`document-image-small`],[`png`,`document-image-small`],[`gif`,`document-image-small`],[`svg`,`document-image-small`],[`webp`,`document-image-small`]]);let x=(()=>{let s=v(l),u=[],d,m=[],g=[],x,S=[],C=[],w;return class extends s{constructor(){super(...arguments),this.#e=(t(this,u),t(this,m,`white`)),this.#t=(t(this,g),t(this,S,``)),this._languageController=(t(this,C),new c(this))}static{let t=typeof Symbol==`function`&&Symbol.metadata?Object.create(s[Symbol.metadata]??null):void 0;d=[a({reflect:!0})],x=[f(),a({converter:h})],w=[a({type:Boolean,reflect:!1})],e(this,null,d,{kind:`accessor`,name:`color`,static:!1,private:!1,access:{has:e=>`color`in e,get:e=>e.color,set:(e,t)=>{e.color=t}},metadata:t},m,g),e(this,null,x,{kind:`accessor`,name:`label`,static:!1,private:!1,access:{has:e=>`label`in e,get:e=>e.label,set:(e,t)=>{e.label=t}},metadata:t},S,C),e(this,null,w,{kind:`setter`,name:`download`,static:!1,private:!1,access:{has:e=>`download`in e,set:(e,t)=>{e.download=t}},metadata:t},null,u),t&&Object.defineProperty(this,Symbol.metadata,{enumerable:!0,configurable:!0,writable:!0,value:t})}static{this.elementName=`sbb-download`}static{this.elementDependencies=[o]}static{this.styles=[_,i(y)]}#e;get color(){return this.#e}set color(e){this.#e=e}#t;get label(){return this.#t}set label(e){this.#t=e}set download(e){}get download(){return!0}get fileName(){return this.href.split(/[?#]/)[0].split(`/`).filter(Boolean).at(-1)??``}get fileExtension(){let e=this.fileName;return e.includes(`.`)?e.split(`.`).at(-1)?.toLowerCase()??``:``}renderIconName(){if(this.iconName)return this.iconName;if(!this.href)return``;let e=this.fileExtension;return e&&b.get(e)||`document-standard-small`}firstUpdated(e){super.firstUpdated(e),this._updateDescribedByElements()}_updateDescribedByElements(){let e=this.shadowRoot?.querySelector?.(`a`);if(e){let t=this.shadowRoot?.querySelector?.(`.sbb-download__custom-content`);e.ariaDescribedByElements=[...t?[t]:[],...this._downloadInfoElements()]}}_downloadInfoElements(){return this.querySelectorAll?.(`sbb-download-info`)??[]}renderTemplate(){return n`
3
+ ${this.renderIconSlot(`sbb-download__icon`)}
4
+ <span class="sbb-download__content">
5
+ <span class="sbb-download__label">${this.label||this.fileName}</span>
6
+ <span class="sbb-screen-reader-only">
7
+ ${this._downloadInfoElements().length?r:n`&nbsp;${this.fileExtension}`}&nbsp;${p[this._languageController.current]}
8
+ </span>
9
+ <span class="sbb-download__custom-content" aria-hidden="true">
10
+ <slot></slot>
11
+ </span>
12
+ <span class="sbb-download__info">
13
+ <slot name="info" @slotchange="${()=>this._updateDescribedByElements()}"></slot>
14
+ </span>
15
+ </span>
16
+ <sbb-secondary-button-static
17
+ class="sbb-download__button"
18
+ icon-name="download-small"
19
+ ></sbb-secondary-button-static>
20
+ `}}})();var S=`:host{display:block}
21
+ `;const C=[`B`,`KB`,`MB`,`GB`,`TB`];let w=(()=>{let r=s,o,l=[],p=[],_,v=[],y=[],b,x=[],w=[],T,E=[],D=[];return class extends r{static{let t=typeof Symbol==`function`&&Symbol.metadata?Object.create(r[Symbol.metadata]??null):void 0;o=[f(),a({converter:h})],_=[f(),a({converter:h})],b=[f(),a({converter:h})],T=[f(),a({attribute:`non-accessible`,type:Boolean})],e(this,null,o,{kind:`accessor`,name:`type`,static:!1,private:!1,access:{has:e=>`type`in e,get:e=>e.type,set:(e,t)=>{e.type=t}},metadata:t},l,p),e(this,null,_,{kind:`accessor`,name:`size`,static:!1,private:!1,access:{has:e=>`size`in e,get:e=>e.size,set:(e,t)=>{e.size=t}},metadata:t},v,y),e(this,null,b,{kind:`accessor`,name:`changed`,static:!1,private:!1,access:{has:e=>`changed`in e,get:e=>e.changed,set:(e,t)=>{e.changed=t}},metadata:t},x,w),e(this,null,T,{kind:`accessor`,name:`nonAccessible`,static:!1,private:!1,access:{has:e=>`nonAccessible`in e,get:e=>e.nonAccessible,set:(e,t)=>{e.nonAccessible=t}},metadata:t},E,D),t&&Object.defineProperty(this,Symbol.metadata,{enumerable:!0,configurable:!0,writable:!0,value:t})}static{this.elementName=`sbb-download-info`}static{this.styles=[i(S)]}#e;get type(){return this.#e}set type(e){this.#e=e}#t;get size(){return this.#t}set size(e){this.#t=e}#n;get changed(){return this.#n}set changed(e){this.#n=e}#r;get nonAccessible(){return this.#r}set nonAccessible(e){this.#r=e}constructor(){super(),this.#e=t(this,l,``),this.#t=(t(this,p),t(this,v,``)),this.#n=(t(this,y),t(this,x,``)),this.#r=(t(this,w),t(this,E,!1)),this._language=(t(this,D),new c(this)),this._dateAdapter=g().datetime?.dateAdapter??d,this._resolvedType=``,this._typeRedundant=!1,this._resolvedSize=``,this._resolvedChanged=``,this.internals.ariaHidden=`true`,this.addController(new u(this,()=>this.closest(`sbb-download`),{href:()=>this.requestUpdate(),label:()=>this.requestUpdate()}))}connectedCallback(){super.connectedCallback(),this.slot||=`info`,this.requestUpdate()}willUpdate(e){super.willUpdate(e),this._resolvedType=this._resolveType(),this._typeRedundant=this._isTypeRedundant(),e.has(`size`)&&(this._resolvedSize=this._resolveSize()),e.has(`changed`)&&(this._resolvedChanged=this._resolveChanged())}_resolveType(){return this.type||(this.closest?.(`sbb-download`)?.fileExtension.toUpperCase()??``)}_isTypeRedundant(){let e=this.closest?.(`sbb-download`);return!!e&&!e.label&&!!e.fileExtension}_resolveSize(){let e=this.size.trim();if(!e||!/^\d+$/.test(e))return e;let t=Number(e);if(t<=0)return`0 ${C[0]}`;let n=Math.min(Math.floor(Math.log(t)/Math.log(1024)),C.length-1);return`${(t/1024**n).toFixed(0)} ${C[n]}`}_resolveChanged(){if(!this.changed)return``;let e=this._dateAdapter.deserialize(this.changed);return this._dateAdapter.isValid(e)?this._dateAdapter.format(e,{weekdayStyle:`none`}):this.changed}render(){let e=[this._resolvedType,this._resolvedSize,this.nonAccessible?m[this._language.current]:``,this._resolvedChanged].filter(Boolean);return this.internals.ariaLabel=e.slice(this._typeRedundant&&this._resolvedType?1:0).join(`, `),n`${e.join(`, `)}`}}})();export{x as SbbDownloadElement,w as SbbDownloadInfoElement};