@sbb-esta/lyne-elements-dev 5.8.0-dev.1789370784 → 5.8.0-dev.1789399474

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.
@@ -2,12 +2,25 @@ export declare function pageScrollDisabled(): boolean;
2
2
  /**
3
3
  * Handle the page scroll, allowing to disable/enable the window scroll avoiding a potential
4
4
  * content shift caused by the disappearance/appearance of the scrollbar.
5
+ *
6
+ * The body is fixed in place (instead of just using `overflow: hidden`), which reliably prevents
7
+ * scrolling of the underlying page. The current scroll position is stored before
8
+ * fixing the body and restored again once the scroll is re-enabled, so the page doesn't jump
9
+ * and content that was previously scrolled out of view isn't hidden behind the fixed body.
10
+ *
11
+ * As an additional safety net for edge cases, `touchmove` events are intercepted and prevented,
12
+ * unless they originate from within a scrollable element that is not at its scroll boundary
13
+ * (e.g. an internal scrollable content of a dialog, navigation, sidebar, etc.).
5
14
  */
6
15
  export declare class SbbScrollHandler {
7
- private _height;
16
+ private _scrollPosition;
8
17
  private _position;
18
+ private _top;
19
+ private _insetInline;
9
20
  private _overflow;
10
- private _marginInlineEnd;
21
+ private _touchStartY;
22
+ private _touchStart;
23
+ private _touchMove;
11
24
  disableScroll(): void;
12
25
  enableScroll(): void;
13
26
  }
@@ -4588,32 +4588,86 @@ function pageScrollDisabled() {
4588
4588
  return document.body.hasAttribute("data-sbb-scroll-disabled");
4589
4589
  }
4590
4590
  /**
4591
+ * Checks whether the given element can be scrolled vertically
4592
+ * (i.e. it has an overflow of `auto`/`scroll` and its content overflows its box).
4593
+ */
4594
+ function isVerticallyScrollable(element) {
4595
+ const overflowY = getComputedStyle(element).overflowY;
4596
+ return (overflowY === "auto" || overflowY === "scroll") && element.scrollHeight > element.clientHeight;
4597
+ }
4598
+ /**
4599
+ * Walks the event's composed path (to properly support shadow DOM) and returns the
4600
+ * closest scrollable ancestor, if any, stopping at `document.body`/`document.documentElement`.
4601
+ */
4602
+ function findScrollableAncestor(path) {
4603
+ for (const target of path) {
4604
+ if (target === document.body || target === document.documentElement) break;
4605
+ if (target instanceof Element && isVerticallyScrollable(target)) return target;
4606
+ }
4607
+ return null;
4608
+ }
4609
+ /**
4591
4610
  * Handle the page scroll, allowing to disable/enable the window scroll avoiding a potential
4592
4611
  * content shift caused by the disappearance/appearance of the scrollbar.
4612
+ *
4613
+ * The body is fixed in place (instead of just using `overflow: hidden`), which reliably prevents
4614
+ * scrolling of the underlying page. The current scroll position is stored before
4615
+ * fixing the body and restored again once the scroll is re-enabled, so the page doesn't jump
4616
+ * and content that was previously scrolled out of view isn't hidden behind the fixed body.
4617
+ *
4618
+ * As an additional safety net for edge cases, `touchmove` events are intercepted and prevented,
4619
+ * unless they originate from within a scrollable element that is not at its scroll boundary
4620
+ * (e.g. an internal scrollable content of a dialog, navigation, sidebar, etc.).
4593
4621
  */
4594
4622
  var SbbScrollHandler = class {
4623
+ constructor() {
4624
+ this._scrollPosition = 0;
4625
+ this._touchStartY = 0;
4626
+ this._touchStart = (event) => {
4627
+ this._touchStartY = event.touches[0]?.clientY ?? 0;
4628
+ };
4629
+ this._touchMove = (event) => {
4630
+ const touch = event.touches[0];
4631
+ if (!touch) return;
4632
+ const scrollable = findScrollableAncestor(event.composedPath());
4633
+ if (!scrollable) {
4634
+ event.preventDefault();
4635
+ return;
4636
+ }
4637
+ const deltaY = touch.clientY - this._touchStartY;
4638
+ const atTop = scrollable.scrollTop <= 0;
4639
+ const atBottom = scrollable.scrollTop + scrollable.clientHeight >= scrollable.scrollHeight;
4640
+ if (atTop && deltaY > 0 || atBottom && deltaY < 0) event.preventDefault();
4641
+ };
4642
+ }
4595
4643
  disableScroll() {
4596
4644
  if (pageScrollDisabled()) return;
4597
- this._height = document.body.style.height;
4645
+ this._scrollPosition = window.scrollY || document.documentElement.scrollTop;
4598
4646
  this._position = document.body.style.position;
4647
+ this._top = document.body.style.top;
4648
+ this._insetInline = document.body.style.insetInline;
4599
4649
  this._overflow = document.body.style.overflow;
4600
- this._marginInlineEnd = document.body.style.marginInlineEnd;
4601
4650
  const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
4651
+ document.body.style.position = "fixed";
4652
+ document.body.style.top = `-${this._scrollPosition}px`;
4653
+ document.body.style.insetInline = `0 ${scrollbarWidth}px`;
4602
4654
  document.body.style.overflow = "hidden";
4603
- document.body.style.height = "100dvh";
4604
- document.body.style.position = "relative";
4605
- document.body.style.marginInlineEnd = `${scrollbarWidth}px`;
4606
- document.body.style.setProperty("--sbb-scrollbar-width", `${scrollbarWidth}px`);
4655
+ document.body.style.setProperty("--sbb-scrollbar-reserved-space", `${scrollbarWidth}px`);
4656
+ document.addEventListener("touchstart", this._touchStart, { passive: true });
4657
+ document.addEventListener("touchmove", this._touchMove, { passive: false });
4607
4658
  document.body.toggleAttribute("data-sbb-scroll-disabled", true);
4608
4659
  }
4609
4660
  enableScroll() {
4610
4661
  if (!pageScrollDisabled()) return;
4611
- document.body.style.height = this._height || "";
4612
4662
  document.body.style.position = this._position || "";
4663
+ document.body.style.top = this._top || "";
4664
+ document.body.style.insetInline = this._insetInline || "";
4613
4665
  document.body.style.overflow = this._overflow || "";
4614
- document.body.style.marginInlineEnd = this._marginInlineEnd || "";
4615
- document.body.style.setProperty("--sbb-scrollbar-width", "0");
4666
+ document.body.style.removeProperty("--sbb-scrollbar-reserved-space");
4667
+ document.removeEventListener("touchstart", this._touchStart);
4668
+ document.removeEventListener("touchmove", this._touchMove);
4616
4669
  document.body.removeAttribute("data-sbb-scroll-disabled");
4670
+ window.scrollTo(0, this._scrollPosition);
4617
4671
  }
4618
4672
  };
4619
4673
 
@@ -11,7 +11,7 @@ import { html as html$1 } from "lit/static-html.js";
11
11
  import { SbbOverlayBaseElement, SbbOverlayCloseEvent, SbbOverlayCloseEvent as SbbDialogCloseEvent, assignOverlayResult as assignDialogResult, overlayRefs } from "./overlay.pure.js";
12
12
 
13
13
  //#region src/elements/dialog/dialog-actions/dialog-actions.scss?inline
14
- var dialog_actions_default = ":host {\n grid-area: actions;\n padding-inline: var(--sbb-dialog-padding-inline);\n padding-block: var(--sbb-dialog-padding-block);\n margin-block-start: auto;\n background-color: var(--sbb-dialog-background-color);\n transition: box-shadow var(--sbb-animation-easing) var(--sbb-dialog-shadow-animation-duration);\n box-shadow: var(--sbb-dialog-block-end-box-shadow, none);\n position: relative;\n}\n:host::before {\n content: \"\";\n display: block;\n position: absolute;\n align-self: start;\n border-block-start: var(--sbb-border-width-1x) solid var(--sbb-dialog-actions-border-color);\n transition: border-color var(--sbb-animation-easing) var(--sbb-dialog-shadow-animation-duration);\n inset: 0 auto auto 0;\n width: 100%;\n}\n@media (forced-colors: active) {\n :host::before {\n border-color: CanvasText;\n }\n}\n";
14
+ var dialog_actions_default = ":host {\n grid-area: actions;\n padding-inline: var(--sbb-dialog-padding-inline);\n padding-block: var(--sbb-dialog-padding-block);\n margin-block-start: auto;\n background-color: var(--sbb-dialog-background-color);\n transition: box-shadow var(--sbb-animation-easing) var(--sbb-dialog-shadow-animation-duration);\n box-shadow: var(--sbb-dialog-block-end-box-shadow, none);\n position: relative;\n clip-path: inset(-200% -200% 0 -200%);\n}\n:host::before {\n content: \"\";\n display: block;\n position: absolute;\n align-self: start;\n border-block-start: var(--sbb-border-width-1x) solid var(--sbb-dialog-actions-border-color);\n transition: border-color var(--sbb-animation-easing) var(--sbb-dialog-shadow-animation-duration);\n inset: 0 auto auto 0;\n width: 100%;\n}\n@media (forced-colors: active) {\n :host::before {\n border-color: CanvasText;\n }\n}\n";
15
15
 
16
16
  //#endregion
17
17
  //#region src/elements/dialog/dialog-actions/dialog-actions.component.ts
@@ -105,7 +105,7 @@ var SbbDialogContentElement = class extends SbbElement {
105
105
 
106
106
  //#endregion
107
107
  //#region src/elements/dialog/dialog-title/dialog-title.scss?inline
108
- var dialog_title_default = ":host {\n padding-block: var(--sbb-dialog-padding-block);\n padding-inline: var(--sbb-dialog-padding-inline);\n hyphens: auto;\n grid-area: title;\n position: relative;\n}\n\n:host([negative]) {\n --sbb-title-color: var(--sbb-color-3-negative);\n}\n\n:host::after {\n content: \"\";\n display: block;\n position: absolute;\n pointer-events: none;\n inset: 0 -10rem 0 0;\n transition: box-shadow var(--sbb-animation-easing) var(--sbb-dialog-shadow-animation-duration);\n box-shadow: var(--sbb-dialog-block-start-box-shadow, none);\n}\n";
108
+ var dialog_title_default = ":host {\n padding-block: var(--sbb-dialog-padding-block);\n padding-inline: var(--sbb-dialog-padding-inline);\n hyphens: auto;\n grid-area: title;\n position: relative;\n}\n\n:host([negative]) {\n --sbb-title-color: var(--sbb-color-3-negative);\n}\n\n:host::after {\n content: \"\";\n display: block;\n position: absolute;\n pointer-events: none;\n inset: 0 -10rem 0 0;\n transition: box-shadow var(--sbb-animation-easing) var(--sbb-dialog-shadow-animation-duration);\n box-shadow: var(--sbb-dialog-block-start-box-shadow, none);\n clip-path: polygon(0% 50%, 0% 200%, 100% 200%, 100% 50%);\n}\n";
109
109
 
110
110
  //#endregion
111
111
  //#region src/elements/dialog/dialog-title/dialog-title.component.ts
@@ -130,7 +130,7 @@ var SbbDialogTitleElement = class extends SbbNegativeMixin(SbbTitleBase) {
130
130
 
131
131
  //#endregion
132
132
  //#region src/elements/dialog/dialog/dialog.scss?inline
133
- var dialog_default = ":host {\n --sbb-dialog-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n --sbb-dialog-padding-block: var(--sbb-spacing-responsive-xs);\n --sbb-dialog-shadow-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-4x)\n );\n display: none;\n position: fixed;\n inset-block: var(--sbb-dialog-inset-block);\n inset-inline: var(--sbb-dialog-inset-inline);\n z-index: var(--sbb-dialog-z-index, var(--sbb-overlay-default-z-index));\n}\n\n:host(:is(:state(top-shadow),[state--top-shadow])) {\n --sbb-dialog-block-start-box-shadow: var(--_sbb-dialog-block-shadow);\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 display: block;\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]))) {\n --sbb-dialog-pointer-events: all;\n --sbb-dialog-backdrop-color: var(--sbb-background-color-3);\n --sbb-dialog-backdrop-visibility: visible;\n --sbb-dialog-backdrop-pointer-events: all;\n}\n\n:host([backdrop=translucent]:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]))) {\n --sbb-dialog-backdrop-color: color-mix(in srgb, var(--sbb-color-black) 50%, transparent);\n}\n\n:host([backdrop=opaque]:not([negative]):is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]))) {\n --sbb-dialog-backdrop-color: var(--sbb-background-color-3);\n}\n\n:host(:not([negative])) {\n --_sbb-dialog-color: var(--sbb-dialog-color);\n --_sbb-dialog-block-shadow: var(--sbb-dialog-block-shadow);\n --sbb-dialog-actions-border-color: var(--sbb-background-color-4);\n --sbb-dialog-background-color: var(--sbb-background-color-1);\n}\n\n:host([negative]) {\n --_sbb-dialog-color: var(--sbb-dialog-color-negative);\n --_sbb-dialog-block-shadow: var(--sbb-dialog-block-shadow-negative);\n --sbb-dialog-background-color: var(--sbb-background-color-1-negative);\n --sbb-dialog-actions-border-color: var(--sbb-background-color-4-negative);\n --sbb-dialog-backdrop-color: var(--sbb-background-color-3-negative);\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-dark);\n}\n\n:host(:is(:state(bottom-shadow),[state--bottom-shadow])) {\n --sbb-dialog-block-end-box-shadow: var(--_sbb-dialog-block-shadow);\n --sbb-dialog-actions-border-color: transparent;\n}\n\n:host(:not(:is(:state(state-closed),[state--state-closed]))) {\n --sbb-dialog-inset-block: 0;\n --sbb-dialog-inset-inline: 0;\n}\n\n.sbb-dialog__container {\n pointer-events: var(--sbb-dialog-pointer-events);\n display: flex;\n justify-content: center;\n align-items: center;\n position: fixed;\n inset-block: var(--sbb-dialog-inset-block);\n inset-inline: var(--sbb-dialog-inset-inline);\n}\n.sbb-dialog__container::before {\n content: \"\";\n visibility: var(--sbb-dialog-backdrop-visibility);\n pointer-events: var(--sbb-dialog-backdrop-pointer-events);\n position: fixed;\n inset-block: var(--sbb-dialog-inset-block);\n inset-inline: var(--sbb-dialog-inset-inline);\n background-color: var(--sbb-dialog-backdrop-color);\n transition-duration: var(--sbb-dialog-animation-duration);\n transition-timing-function: var(--sbb-dialog-animation-easing);\n transition-property: background-color, visibility;\n}\n\n.sbb-dialog {\n display: none;\n position: absolute;\n inset-inline: 0;\n inset-block: auto 0;\n border: none;\n border-radius: var(--sbb-dialog-border-radius) var(--sbb-dialog-border-radius) 0 0;\n max-width: var(--_sbb-dialog-max-width);\n max-height: var(--_sbb-dialog-max-height);\n color: var(--_sbb-dialog-color);\n background-color: var(--sbb-dialog-background-color);\n flex-direction: column;\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-dialog {\n display: flex;\n animation-name: open;\n animation-duration: var(--sbb-dialog-animation-duration);\n animation-timing-function: ease;\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-dialog {\n pointer-events: none;\n animation-name: close;\n}\n@media (forced-colors: active) {\n .sbb-dialog {\n outline: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n@media (min-width: calc(37.5rem)) {\n .sbb-dialog {\n width: var(--sbb-dialog-width);\n height: var(--sbb-dialog-height);\n max-width: var(--sbb-dialog-max-width, var(--_sbb-dialog-max-width));\n max-height: var(--sbb-dialog-max-height, var(--_sbb-dialog-max-height));\n inset: unset;\n border-radius: var(--sbb-dialog-border-radius);\n overflow: hidden;\n }\n}\n\n:host(:is(:state(has-intermediate-element),[state--has-intermediate-element])) ::slotted(:first-child),\n.sbb-dialog__wrapper {\n display: flex;\n flex-direction: column;\n min-height: 0;\n max-height: 100%;\n}\n\n:host(:is(:state(has-intermediate-element),[state--has-intermediate-element])) ::slotted(:first-child),\n:host(:not(:is(:state(has-intermediate-element),[state--has-intermediate-element]))) .sbb-dialog__wrapper {\n display: grid;\n grid-template: \"title close-button\" auto \"content content\" 1fr \"actions actions\" auto/1fr auto;\n gap: 0;\n}\n\n@keyframes open {\n from {\n opacity: 0;\n translate: 0 var(--sbb-dialog-translate-y, 100%);\n }\n to {\n opacity: 1;\n translate: 0 0;\n }\n}\n@keyframes close {\n from {\n opacity: 1;\n translate: 0 0;\n }\n to {\n opacity: 0;\n translate: 0 var(--sbb-dialog-translate-y, 100%);\n }\n}\n";
133
+ var dialog_default = ":host {\n --sbb-dialog-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n --sbb-dialog-padding-block: var(--sbb-spacing-responsive-xs);\n --sbb-dialog-shadow-animation-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-4x)\n );\n display: none;\n position: fixed;\n inset: 0;\n z-index: var(--sbb-dialog-z-index, var(--sbb-overlay-default-z-index));\n}\n\n:host(:is(:state(top-shadow),[state--top-shadow])) {\n --sbb-dialog-block-start-box-shadow: var(--_sbb-dialog-block-shadow);\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 display: block;\n}\n\n:host(:is(:is(:state(state-opening),[state--state-opening]), :is(:state(state-opened),[state--state-opened]))) {\n --sbb-dialog-pointer-events: all;\n --sbb-dialog-backdrop-pointer-events: all;\n}\n\n:host(:not([negative])) {\n --_sbb-dialog-color: var(--sbb-dialog-color);\n --_sbb-dialog-block-shadow: var(--sbb-dialog-block-shadow);\n --sbb-dialog-actions-border-color: var(--sbb-background-color-4);\n --sbb-dialog-background-color: var(--sbb-background-color-1);\n}\n\n:host([negative]) {\n --_sbb-dialog-color: var(--sbb-dialog-color-negative);\n --_sbb-dialog-block-shadow: var(--sbb-dialog-block-shadow-negative);\n --sbb-dialog-background-color: var(--sbb-background-color-1-negative);\n --sbb-dialog-actions-border-color: var(--sbb-background-color-4-negative);\n --sbb-dialog-backdrop-color: var(--sbb-background-color-3-negative);\n --sbb-focus-outline-color: var(--sbb-focus-outline-color-dark);\n}\n\n:host([backdrop=translucent]) {\n --sbb-dialog-backdrop-color: color-mix(in srgb, var(--sbb-color-black) 50%, transparent);\n}\n\n:host(:is(:state(bottom-shadow),[state--bottom-shadow])) {\n --sbb-dialog-block-end-box-shadow: var(--_sbb-dialog-block-shadow);\n --sbb-dialog-actions-border-color: transparent;\n}\n\n:host(:is(:state(state-closing),[state--state-closing])) {\n --sbb-dialog-backdrop-animation-name: backdrop-close;\n}\n\n.sbb-dialog__container {\n pointer-events: var(--sbb-dialog-pointer-events);\n display: flex;\n justify-content: center;\n align-items: center;\n position: fixed;\n inset: 0;\n}\n.sbb-dialog__container::before {\n content: \"\";\n pointer-events: var(--sbb-dialog-backdrop-pointer-events);\n position: absolute;\n inset: 0;\n background-color: var(--sbb-dialog-backdrop-color, transparent);\n animation-name: var(--sbb-dialog-backdrop-animation-name, backdrop-open);\n animation-duration: var(--sbb-dialog-animation-duration);\n animation-timing-function: var(--sbb-dialog-animation-easing);\n animation-fill-mode: forwards;\n}\n\n.sbb-dialog {\n display: none;\n position: absolute;\n inset-inline: 0;\n inset-block: auto 0;\n border: none;\n border-radius: var(--sbb-dialog-border-radius) var(--sbb-dialog-border-radius) 0 0;\n max-width: var(--_sbb-dialog-max-width);\n max-height: var(--_sbb-dialog-max-height);\n color: var(--_sbb-dialog-color);\n background-color: var(--sbb-dialog-background-color);\n flex-direction: column;\n padding-block-end: env(safe-area-inset-bottom, 0);\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-dialog {\n display: flex;\n animation-name: open;\n animation-duration: var(--sbb-dialog-animation-duration);\n animation-timing-function: ease;\n}\n:host(:is(:state(state-closing),[state--state-closing])) .sbb-dialog {\n pointer-events: none;\n animation-name: close;\n}\n@media (forced-colors: active) {\n .sbb-dialog {\n outline: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n@media (min-width: calc(37.5rem)) {\n .sbb-dialog {\n width: var(--sbb-dialog-width);\n height: var(--sbb-dialog-height);\n max-width: var(--sbb-dialog-max-width, var(--_sbb-dialog-max-width));\n max-height: var(--sbb-dialog-max-height, var(--_sbb-dialog-max-height));\n inset: unset;\n border-radius: var(--sbb-dialog-border-radius);\n overflow: hidden;\n }\n}\n\n:host(:is(:state(has-intermediate-element),[state--has-intermediate-element])) ::slotted(:first-child),\n.sbb-dialog__wrapper {\n display: flex;\n flex-direction: column;\n min-height: 0;\n max-height: 100%;\n}\n\n:host(:is(:state(has-intermediate-element),[state--has-intermediate-element])) ::slotted(:first-child),\n:host(:not(:is(:state(has-intermediate-element),[state--has-intermediate-element]))) .sbb-dialog__wrapper {\n display: grid;\n grid-template: \"title close-button\" auto \"content content\" 1fr \"actions actions\" auto/1fr auto;\n gap: 0;\n}\n\n@keyframes open {\n from {\n opacity: 0;\n translate: 0 var(--sbb-dialog-translate-y, 100%);\n }\n to {\n opacity: 1;\n translate: 0 0;\n }\n}\n@keyframes close {\n from {\n opacity: 1;\n translate: 0 0;\n }\n to {\n opacity: 0;\n translate: 0 var(--sbb-dialog-translate-y, 100%);\n }\n}\n@keyframes backdrop-open {\n from {\n background-color: transparent;\n visibility: visible;\n }\n}\n@keyframes backdrop-close {\n to {\n background-color: transparent;\n visibility: hidden;\n }\n}\n";
134
134
 
135
135
  //#endregion
136
136
  //#region src/elements/dialog/dialog/dialog.component.ts
@@ -162,7 +162,7 @@ var SbbHeaderLinkElement = class extends SbbHeaderActionCommonElementMixin(SbbLi
162
162
 
163
163
  //#endregion
164
164
  //#region src/elements/header/header/header.scss?inline
165
- var header_default = ":host {\n --sbb-logo-height: 1rem;\n --sbb-signet-height: 1rem;\n --sbb-header-transition-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n}\n@media (min-width: calc(64rem)) {\n :host {\n --sbb-logo-height: 1.25rem;\n --sbb-signet-height: 1.25rem;\n }\n}\n:host {\n display: block;\n height: var(--sbb-header-height);\n line-height: var(--sbb-typo-line-height-text);\n padding-block-start: calc(var(--sbb-header-height) + var(--sbb-header-padding-block-start));\n}\n\n:host([size=s]) {\n --sbb-header-height: var(--sbb-header-height-s);\n}\n\n:host([size=m]) {\n --sbb-header-height: var(--sbb-header-height-m);\n}\n\n:host([hide-on-scroll]) {\n --sbb-header-position: absolute;\n}\n\n:host([hide-on-scroll]:is(:state(fixed),[state--fixed])) {\n --sbb-header-position: fixed;\n --sbb-header-animation-name: hide;\n --sbb-header-transform: translate3d(0, -100%, 0);\n --sbb-header-inset-inline-end: var(--sbb-scrollbar-width, 0);\n}\n\n:host([hide-on-scroll]:is(:state(fixed),[state--fixed]):is(:state(animated),[state--animated])) {\n --sbb-header-transition-timing: cubic-bezier(0.4, 0, 1, 1);\n}\n\n:host([hide-on-scroll]:is(:state(fixed),[state--fixed]):is(:state(visible),[state--visible])) {\n --sbb-header-animation-name: show;\n --sbb-header-transform: translate3d(0, 0, 0);\n --sbb-header-transition-timing: cubic-bezier(0, 0, 0.2, 1);\n}\n\n:host([hide-on-scroll]:is(:state(fixed),[state--fixed]):is(:state(has-visible-focus-within),[state--has-visible-focus-within])) {\n --sbb-header-transition-duration: 0;\n --sbb-header-transform: translate3d(0, 0, 0);\n}\n\n.sbb-header {\n position: var(--sbb-header-position);\n inset: 0 var(--sbb-header-inset-inline-end) auto 0;\n padding-block-start: var(--sbb-header-padding-block-start);\n background: var(--sbb-header-background);\n z-index: var(--sbb-header-z-index, 10);\n transform: var(--sbb-header-transform);\n transition-property: box-shadow;\n transition-duration: var(--sbb-header-transition-duration);\n transition-timing-function: var(--sbb-header-transition-timing);\n animation-name: var(--sbb-header-animation-name);\n animation-duration: var(--sbb-header-transition-duration);\n animation-timing-function: var(--sbb-header-transition-timing);\n}\n:host(:is(:is(:state(shadow),[state--shadow]), :is(:state(has-visible-focus-within),[state--has-visible-focus-within]):is(:state(fixed),[state--fixed]))) .sbb-header {\n box-shadow: var(--sbb-header-box-shadow);\n}\n@media (forced-colors: active) {\n .sbb-header {\n border-block-end: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n\n.sbb-header__wrapper {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n height: var(--sbb-header-height);\n}\n:host(:not([expanded])) .sbb-header__wrapper {\n padding-inline: var(--sbb-page-spacing-padding, var(--sbb-layout-base-offset-responsive));\n margin-inline: auto;\n width: 100%;\n}\n@media (min-width: calc(90rem)) {\n :host(:not([expanded])) .sbb-header__wrapper {\n max-width: var(--sbb-spacing-max-width, calc(var(--sbb-layout-base-page-max-width) + 2 * var(--sbb-layout-base-offset-responsive)));\n }\n}\n:host([expanded]) .sbb-header__wrapper {\n padding-inline: var(--sbb-page-spacing-padding, var(--sbb-spacing-responsive-xxs));\n}\n\n::slotted(:is(sbb-header-button, sbb-header-link):first-child) {\n margin-inline-start: var(--sbb-header-first-item-margin-inline-start);\n}\n\n::slotted(*) {\n flex: 0 0 auto;\n}\n\n::slotted(.sbb-header-shrinkable) {\n flex-shrink: 1;\n min-width: 0;\n}\n\n::slotted(.sbb-header-spacer) {\n flex-grow: 1;\n}\n\n::slotted(.sbb-header-logo) {\n margin-inline-start: var(--sbb-spacing-responsive-s);\n}\n\n::slotted(a.sbb-header-logo) {\n display: block;\n padding-block: var(--sbb-spacing-fixed-3x);\n position: relative;\n flex-basis: 0;\n outline: none !important;\n}\n\n::slotted(a.sbb-header-logo)::before {\n content: \"\";\n display: block;\n position: absolute;\n inset: var(--sbb-spacing-fixed-3x) 0;\n}\n\n::slotted(a.sbb-header-logo:focus-visible)::before {\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 outline-offset: var(--sbb-spacing-fixed-3x);\n border-radius: 1px;\n}\n\n@keyframes show {\n from {\n transform: translate3d(0, -100%, 0);\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes hide {\n from {\n transform: translate3d(0, 0, 0);\n }\n to {\n transform: translate3d(0, -100%, 0);\n }\n}\n";
165
+ var header_default = ":host {\n --sbb-logo-height: 1rem;\n --sbb-signet-height: 1rem;\n --sbb-header-transition-duration: var(\n --sbb-disable-animation-duration,\n var(--sbb-animation-duration-6x)\n );\n}\n@media (min-width: calc(64rem)) {\n :host {\n --sbb-logo-height: 1.25rem;\n --sbb-signet-height: 1.25rem;\n }\n}\n:host {\n display: block;\n height: var(--sbb-header-height);\n line-height: var(--sbb-typo-line-height-text);\n padding-block-start: calc(var(--sbb-header-height) + var(--sbb-header-padding-block-start));\n}\n\n:host([size=s]) {\n --sbb-header-height: var(--sbb-header-height-s);\n}\n\n:host([size=m]) {\n --sbb-header-height: var(--sbb-header-height-m);\n}\n\n:host([hide-on-scroll]) {\n --sbb-header-position: absolute;\n}\n\n:host([hide-on-scroll]:is(:state(fixed),[state--fixed])) {\n --sbb-header-position: fixed;\n --sbb-header-animation-name: hide;\n --sbb-header-transform: translate3d(0, -100%, 0);\n --sbb-header-inset-inline-end: var(--sbb-scrollbar-reserved-space, 0);\n}\n\n:host([hide-on-scroll]:is(:state(fixed),[state--fixed]):is(:state(animated),[state--animated])) {\n --sbb-header-transition-timing: cubic-bezier(0.4, 0, 1, 1);\n}\n\n:host([hide-on-scroll]:is(:state(fixed),[state--fixed]):is(:state(visible),[state--visible])) {\n --sbb-header-animation-name: show;\n --sbb-header-transform: translate3d(0, 0, 0);\n --sbb-header-transition-timing: cubic-bezier(0, 0, 0.2, 1);\n}\n\n:host([hide-on-scroll]:is(:state(fixed),[state--fixed]):is(:state(has-visible-focus-within),[state--has-visible-focus-within])) {\n --sbb-header-transition-duration: 0;\n --sbb-header-transform: translate3d(0, 0, 0);\n}\n\n.sbb-header {\n position: var(--sbb-header-position);\n inset: 0 var(--sbb-header-inset-inline-end) auto 0;\n padding-block-start: var(--sbb-header-padding-block-start);\n background: var(--sbb-header-background);\n z-index: var(--sbb-header-z-index, 10);\n transform: var(--sbb-header-transform);\n transition-property: box-shadow;\n transition-duration: var(--sbb-header-transition-duration);\n transition-timing-function: var(--sbb-header-transition-timing);\n animation-name: var(--sbb-header-animation-name);\n animation-duration: var(--sbb-header-transition-duration);\n animation-timing-function: var(--sbb-header-transition-timing);\n}\n:host(:is(:is(:state(shadow),[state--shadow]), :is(:state(has-visible-focus-within),[state--has-visible-focus-within]):is(:state(fixed),[state--fixed]))) .sbb-header {\n box-shadow: var(--sbb-header-box-shadow);\n}\n@media (forced-colors: active) {\n .sbb-header {\n border-block-end: var(--sbb-border-width-1x) solid CanvasText;\n }\n}\n\n.sbb-header__wrapper {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n height: var(--sbb-header-height);\n}\n:host(:not([expanded])) .sbb-header__wrapper {\n padding-inline: var(--sbb-page-spacing-padding, var(--sbb-layout-base-offset-responsive));\n margin-inline: auto;\n width: 100%;\n}\n@media (min-width: calc(90rem)) {\n :host(:not([expanded])) .sbb-header__wrapper {\n max-width: var(--sbb-spacing-max-width, calc(var(--sbb-layout-base-page-max-width) + 2 * var(--sbb-layout-base-offset-responsive)));\n }\n}\n:host([expanded]) .sbb-header__wrapper {\n padding-inline: var(--sbb-page-spacing-padding, var(--sbb-spacing-responsive-xxs));\n}\n\n::slotted(:is(sbb-header-button, sbb-header-link):first-child) {\n margin-inline-start: var(--sbb-header-first-item-margin-inline-start);\n}\n\n::slotted(*) {\n flex: 0 0 auto;\n}\n\n::slotted(.sbb-header-shrinkable) {\n flex-shrink: 1;\n min-width: 0;\n}\n\n::slotted(.sbb-header-spacer) {\n flex-grow: 1;\n}\n\n::slotted(.sbb-header-logo) {\n margin-inline-start: var(--sbb-spacing-responsive-s);\n}\n\n::slotted(a.sbb-header-logo) {\n display: block;\n padding-block: var(--sbb-spacing-fixed-3x);\n position: relative;\n flex-basis: 0;\n outline: none !important;\n}\n\n::slotted(a.sbb-header-logo)::before {\n content: \"\";\n display: block;\n position: absolute;\n inset: var(--sbb-spacing-fixed-3x) 0;\n}\n\n::slotted(a.sbb-header-logo:focus-visible)::before {\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 outline-offset: var(--sbb-spacing-fixed-3x);\n border-radius: 1px;\n}\n\n@keyframes show {\n from {\n transform: translate3d(0, -100%, 0);\n }\n to {\n transform: translate3d(0, 0, 0);\n }\n}\n@keyframes hide {\n from {\n transform: translate3d(0, 0, 0);\n }\n to {\n transform: translate3d(0, -100%, 0);\n }\n}\n";
166
166
 
167
167
  //#endregion
168
168
  //#region src/elements/header/header/header.component.ts
@@ -0,0 +1,7 @@
1
+ import { SbbElement, type SbbElementConstructor } from '../../core/base-elements/element.ts';
2
+ import type { AbstractConstructor } from '../../core/mixins/constructor.ts';
3
+ export declare abstract class SbbLogoCommonElementMixinType extends SbbElement {
4
+ accessor protectiveRoom: 'none' | 'minimal' | 'ideal';
5
+ accessor accessibilityLabel: string;
6
+ }
7
+ export declare const SbbLogoCommonElementMixin: <T extends AbstractConstructor<SbbElement> & SbbElementConstructor>(superclass: T) => AbstractConstructor<SbbLogoCommonElementMixinType> & T;
@@ -1,6 +1,6 @@
1
1
  import { type CSSResultGroup, type TemplateResult } from 'lit';
2
- import { SbbElement } from '../core.ts';
3
- declare const SbbLogoElement_base: import("../core.ts").AbstractConstructor<import("../core.ts").SbbNegativeMixinType> & typeof SbbElement;
2
+ import { SbbElement } from '../../core.ts';
3
+ declare const SbbLogoElement_base: import("../../core.ts").AbstractConstructor<import("../common/logo-common.ts").SbbLogoCommonElementMixinType> & typeof SbbElement;
4
4
  /**
5
5
  * It displays the SBB logo.
6
6
  *
@@ -9,10 +9,7 @@ declare const SbbLogoElement_base: import("../core.ts").AbstractConstructor<impo
9
9
  export declare class SbbLogoElement extends SbbLogoElement_base {
10
10
  static readonly elementName: string;
11
11
  static styles: CSSResultGroup;
12
- /** Visual protective room around logo. */
13
- accessor protectiveRoom: 'none' | 'minimal' | 'ideal';
14
- /** Accessibility label which will be forwarded to the SVG logo. */
15
- accessor accessibilityLabel: string;
12
+ constructor();
16
13
  protected render(): TemplateResult;
17
14
  }
18
15
  declare global {
@@ -0,0 +1,20 @@
1
+ import { type CSSResultGroup, type TemplateResult } from 'lit';
2
+ import { SbbElement } from '../../core.ts';
3
+ declare const SbbLogoCargoElement_base: import("../../core.ts").AbstractConstructor<import("../common/logo-common.ts").SbbLogoCommonElementMixinType> & typeof SbbElement;
4
+ /**
5
+ * It displays the SBB Cargo logo.
6
+ *
7
+ * @cssprop [--sbb-logo-height=auto] - Can be used to set the height of the logo.
8
+ */
9
+ export declare class SbbLogoCargoElement extends SbbLogoCargoElement_base {
10
+ static readonly elementName: string;
11
+ static styles: CSSResultGroup;
12
+ constructor();
13
+ protected render(): TemplateResult;
14
+ }
15
+ declare global {
16
+ interface HTMLElementTagNameMap {
17
+ 'sbb-logo-cargo': SbbLogoCargoElement;
18
+ }
19
+ }
20
+ export {};
@@ -0,0 +1,20 @@
1
+ import { type CSSResultGroup, type TemplateResult } from 'lit';
2
+ import { SbbElement } from '../../core.ts';
3
+ declare const SbbLogoCargoInternationalElement_base: import("../../core.ts").AbstractConstructor<import("../common/logo-common.ts").SbbLogoCommonElementMixinType> & typeof SbbElement;
4
+ /**
5
+ * It displays the SBB Cargo International logo.
6
+ *
7
+ * @cssprop [--sbb-logo-height=auto] - Can be used to set the height of the logo.
8
+ */
9
+ export declare class SbbLogoCargoInternationalElement extends SbbLogoCargoInternationalElement_base {
10
+ static readonly elementName: string;
11
+ static styles: CSSResultGroup;
12
+ constructor();
13
+ protected render(): TemplateResult;
14
+ }
15
+ declare global {
16
+ interface HTMLElementTagNameMap {
17
+ 'sbb-logo-cargo-international': SbbLogoCargoInternationalElement;
18
+ }
19
+ }
20
+ export {};
@@ -0,0 +1,20 @@
1
+ import { type CSSResultGroup, type TemplateResult } from 'lit';
2
+ import { SbbElement } from '../../core.ts';
3
+ declare const SbbLogoElvetinoElement_base: import("../../core.ts").AbstractConstructor<import("../common/logo-common.ts").SbbLogoCommonElementMixinType> & typeof SbbElement;
4
+ /**
5
+ * It displays the SBB Elvetino logo.
6
+ *
7
+ * @cssprop [--sbb-logo-height=auto] - Can be used to set the height of the logo.
8
+ */
9
+ export declare class SbbLogoElvetinoElement extends SbbLogoElvetinoElement_base {
10
+ static readonly elementName: string;
11
+ static styles: CSSResultGroup;
12
+ constructor();
13
+ protected render(): TemplateResult;
14
+ }
15
+ declare global {
16
+ interface HTMLElementTagNameMap {
17
+ 'sbb-logo-elvetino': SbbLogoElvetinoElement;
18
+ }
19
+ }
20
+ export {};
@@ -1,9 +1,12 @@
1
- import { SbbLogoElement } from "./logo.pure.js";
1
+ import { SbbLogoCargoElement, SbbLogoCargoInternationalElement, SbbLogoElement, SbbLogoElvetinoElement } from "./logo.pure.js";
2
2
 
3
3
  export * from "./logo.pure.js"
4
4
 
5
5
  //#region src/elements/logo.ts
6
6
  /** @entrypoint */
7
7
  SbbLogoElement.define();
8
+ SbbLogoCargoElement.define();
9
+ SbbLogoCargoInternationalElement.define();
10
+ SbbLogoElvetinoElement.define();
8
11
 
9
12
  //#endregion
@@ -1,2 +1,5 @@
1
1
  /** @entrypoint */
2
- export * from './logo/logo.component.ts';
2
+ export * from './logo/logo/logo.component.ts';
3
+ export * from './logo/logo-cargo-international/logo-cargo-international.component.ts';
4
+ export * from './logo/logo-cargo/logo-cargo.component.ts';
5
+ export * from './logo/logo-elvetino/logo-elvetino.component.ts';