blue-web 1.21.0 → 1.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- (()=>{"use strict";var t={};t.d=(e,n)=>{for(var i in n)t.o(n,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:n[i]})},t.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);class e extends HTMLElement{static get observedAttributes(){return["value","max"]}constructor(){var t,e,n;super(),t=this,n=!1,(e=function(t){var e=function(t){if("object"!=typeof t||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==typeof e?e:e+""}(e="_initialized"))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,this.attachShadow({mode:"open"})}connectedCallback(){this._initialized||(this.setup(),this._initialized=!0,this.updateValue(this.value))}setup(){const t=document.createElement("style");t.textContent="\n :host {\n display: inline-flex;\n min-width: 1em;\n height: 1em;\n text-align: center;\n overflow: hidden;\n line-height: 1em;\n transition: background-color 0.3s;\n }\n .numbers {\n display: flex;\n flex-direction: column;\n transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n .numbers span {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 1em;\n }";const e=document.createElement("span");e.classList.add("numbers"),e.setAttribute("aria-hidden","true"),this.shadowRoot.append(t,e),this.wrapper=e,this.rebuildNumbers()}rebuildNumbers(){this.wrapper.innerHTML="";const t=this.max;for(let e=0;e<=t;e++){const t=document.createElement("span");t.textContent=String(e),this.wrapper.appendChild(t)}const e=document.createElement("span");e.textContent="".concat(t,"+"),this.wrapper.appendChild(e),this._initialized&&this.updateValue(this.value)}attributeChangedCallback(t,e,n){n!==e&&this._initialized&&("value"===t?this.updateValue(parseInt(null!=n?n:"0",10)):"max"===t&&this.rebuildNumbers())}updateValue(t){const e=this.max,n=t>e?e+1:Math.max(0,t),i=this.wrapper.getBoundingClientRect().height||16;this.wrapper.style.transform="translateY(-".concat(n*i,"px)");const a=t>e?"".concat(e,"+"):"".concat(t);this.setAttribute("aria-label",a)}set value(t){this.value!==t&&(this.setAttribute("value",String(t)),this._initialized&&(this.updateValue(t),this.dispatchEvent(new CustomEvent("change",{detail:{value:t},bubbles:!0,composed:!0}))))}get value(){return parseInt(this.getAttribute("value")||"0",10)||0}set max(t){this.setAttribute("max",String(t))}get max(){return parseInt(this.getAttribute("max")||"9",10)||9}}customElements.get("bl-odometer")||customElements.define("bl-odometer",e)})();
1
+ (()=>{"use strict";var e={};function t(e,t,i){return(t=function(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,"string");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}e.d=(t,i)=>{for(var n in i)e.o(i,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:i[n]})},e.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);class i extends HTMLElement{static get observedAttributes(){return["value","max"]}constructor(){super(),t(this,"_initialized",!1),t(this,"_resetTimer",null),this.attachShadow({mode:"open"})}connectedCallback(){this._initialized||(this.setup(),this._initialized=!0,this.updateValue(this.value))}setup(){const e=document.createElement("style");e.textContent="\n :host {\n display: inline-flex;\n min-width: 1em;\n height: 1em;\n text-align: center;\n overflow: hidden;\n line-height: 1em;\n }\n .numbers {\n display: flex;\n flex-direction: column;\n transition: transform var(--bl-odometer-duration, 0.4s) cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n .numbers span {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 1em;\n }";const t=document.createElement("span");t.classList.add("numbers"),t.setAttribute("aria-hidden","true"),this.shadowRoot.append(e,t),this.wrapper=t,this.rebuildNumbers()}rebuildNumbers(){this.wrapper.innerHTML="";const e=this.max;for(let t=0;t<=e;t++){const e=document.createElement("span");e.textContent=String(t),this.wrapper.appendChild(e)}const t=document.createElement("span");t.textContent="".concat(e,"+"),this.wrapper.appendChild(t),this._initialized&&this.updateValue(this.value)}attributeChangedCallback(e,t,i){if(i!==t&&this._initialized)if("value"===e){const e=parseInt(null!=t?t:"0",10)||0,n=parseInt(null!=i?i:"0",10)||0;this.applyChangeState(e,n),this.updateValue(n)}else"max"===e&&this.rebuildNumbers()}updateValue(e){const t=this.max,i=e>t?t+1:Math.max(0,e),n=this.wrapper.getBoundingClientRect().height||16;this.wrapper.style.transform="translateY(-".concat(i*n,"px)");const r=e>t?"".concat(t,"+"):"".concat(e);this.setAttribute("aria-label",r)}clearResetTimer(){null!==this._resetTimer&&(clearTimeout(this._resetTimer),this._resetTimer=null)}scheduleResetChange(){this.clearResetTimer(),this._resetTimer=window.setTimeout(()=>{this.removeAttribute("data-change"),this._resetTimer=null},3e3)}applyChangeState(e,t){t>e?(this.setAttribute("data-change","up"),this.scheduleResetChange()):t<e&&(this.setAttribute("data-change","down"),this.scheduleResetChange())}set value(e){this.value!==e&&(this.setAttribute("value",String(e)),this._initialized&&this.dispatchEvent(new CustomEvent("change",{detail:{value:e},bubbles:!0,composed:!0})))}get value(){return parseInt(this.getAttribute("value")||"0",10)||0}set max(e){this.setAttribute("max",String(e))}get max(){return parseInt(this.getAttribute("max")||"9",10)||9}}customElements.get("bl-odometer")||customElements.define("bl-odometer",i)})();
@@ -1,6 +1,16 @@
1
+ /**
2
+ * Odometer web component for animated number display
3
+ *
4
+ * @element bl-odometer
5
+ * @attr {number} value - Current value to display
6
+ * @attr {number} max - Maximum value before showing "+"
7
+ * @fires change - Fired when value changes
8
+ * @cssprop --bl-odometer-duration - Transition duration for number animation (default: 0.4s)
9
+ */
1
10
  declare class Odometer extends HTMLElement {
2
11
  private wrapper;
3
12
  private _initialized;
13
+ private _resetTimer;
4
14
  static get observedAttributes(): string[];
5
15
  constructor();
6
16
  connectedCallback(): void;
@@ -8,6 +18,9 @@ declare class Odometer extends HTMLElement {
8
18
  private rebuildNumbers;
9
19
  attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
10
20
  private updateValue;
21
+ private clearResetTimer;
22
+ private scheduleResetChange;
23
+ private applyChangeState;
11
24
  set value(value: number);
12
25
  get value(): number;
13
26
  set max(value: number);
@@ -1,6 +1,15 @@
1
1
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
2
2
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
3
3
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
4
+ /**
5
+ * Odometer web component for animated number display
6
+ *
7
+ * @element bl-odometer
8
+ * @attr {number} value - Current value to display
9
+ * @attr {number} max - Maximum value before showing "+"
10
+ * @fires change - Fired when value changes
11
+ * @cssprop --bl-odometer-duration - Transition duration for number animation (default: 0.4s)
12
+ */
4
13
  class Odometer extends HTMLElement {
5
14
  static get observedAttributes() {
6
15
  return ["value", "max"];
@@ -8,6 +17,7 @@ class Odometer extends HTMLElement {
8
17
  constructor() {
9
18
  super();
10
19
  _defineProperty(this, "_initialized", false);
20
+ _defineProperty(this, "_resetTimer", null);
11
21
  this.attachShadow({
12
22
  mode: "open"
13
23
  });
@@ -22,7 +32,7 @@ class Odometer extends HTMLElement {
22
32
  }
23
33
  setup() {
24
34
  const style = document.createElement("style");
25
- style.textContent = /* CSS */"\n :host {\n display: inline-flex;\n min-width: 1em;\n height: 1em;\n text-align: center;\n overflow: hidden;\n line-height: 1em;\n transition: background-color 0.3s;\n }\n .numbers {\n display: flex;\n flex-direction: column;\n transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n .numbers span {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 1em;\n }";
35
+ style.textContent = /* CSS */"\n :host {\n display: inline-flex;\n min-width: 1em;\n height: 1em;\n text-align: center;\n overflow: hidden;\n line-height: 1em;\n }\n .numbers {\n display: flex;\n flex-direction: column;\n transition: transform var(--bl-odometer-duration, 0.4s) cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n .numbers span {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 1em;\n }";
26
36
  const wrapper = document.createElement("span");
27
37
  wrapper.classList.add("numbers");
28
38
  wrapper.setAttribute("aria-hidden", "true");
@@ -50,7 +60,10 @@ class Odometer extends HTMLElement {
50
60
  attributeChangedCallback(name, oldValue, newValue) {
51
61
  if (newValue !== oldValue && this._initialized) {
52
62
  if (name === "value") {
53
- this.updateValue(parseInt(newValue !== null && newValue !== void 0 ? newValue : "0", 10));
63
+ const prev = parseInt(oldValue !== null && oldValue !== void 0 ? oldValue : "0", 10) || 0;
64
+ const next = parseInt(newValue !== null && newValue !== void 0 ? newValue : "0", 10) || 0;
65
+ this.applyChangeState(prev, next);
66
+ this.updateValue(next);
54
67
  } else if (name === "max") {
55
68
  this.rebuildNumbers();
56
69
  }
@@ -64,12 +77,34 @@ class Odometer extends HTMLElement {
64
77
  const displayValue = value > max ? "".concat(max, "+") : "".concat(value);
65
78
  this.setAttribute("aria-label", displayValue);
66
79
  }
80
+ clearResetTimer() {
81
+ if (this._resetTimer !== null) {
82
+ clearTimeout(this._resetTimer);
83
+ this._resetTimer = null;
84
+ }
85
+ }
86
+ scheduleResetChange() {
87
+ this.clearResetTimer();
88
+ const delay = 3000;
89
+ this._resetTimer = window.setTimeout(() => {
90
+ this.removeAttribute("data-change");
91
+ this._resetTimer = null;
92
+ }, delay);
93
+ }
94
+ applyChangeState(previous, next) {
95
+ if (next > previous) {
96
+ this.setAttribute("data-change", "up");
97
+ this.scheduleResetChange();
98
+ } else if (next < previous) {
99
+ this.setAttribute("data-change", "down");
100
+ this.scheduleResetChange();
101
+ }
102
+ }
67
103
  set value(value) {
68
104
  const current = this.value;
69
105
  if (current !== value) {
70
106
  this.setAttribute("value", String(value));
71
107
  if (this._initialized) {
72
- this.updateValue(value);
73
108
  this.dispatchEvent(new CustomEvent("change", {
74
109
  detail: {
75
110
  value
package/dist/merged.scss CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Blue Web v1.21.0 (https://bruegmann.github.io/blue-web)
2
+ * Blue Web v1.21.1 (https://bruegmann.github.io/blue-web)
3
3
  * Licensed under GNU General Public License v3.0 (https://github.com/bruegmann/blue-web/blob/master/LICENSE).
4
4
  */
5
5
 
@@ -3758,6 +3758,7 @@ $corner-shape: #{round} !default;
3758
3758
  --blue-sidebar-bg: #{$sidebar-bg};
3759
3759
  --blue-header-bg: #{$header-bg};
3760
3760
 
3761
+ --blue-header-height: 3.429rem;
3761
3762
  --blue-header-color: #{$header-color};
3762
3763
  --blue-action-link-bg-color: var(--blue-theme);
3763
3764
  --blue-menu-item-indicator-bg: #{$sidebar-indicator-color};
@@ -10728,12 +10729,11 @@ textarea {
10728
10729
 
10729
10730
 
10730
10731
 
10731
- // Custom added utilities for Blue Web
10732
+ // Enable responsive for position
10732
10733
  $utilities: map-merge(
10733
10734
  $utilities,
10734
10735
  (
10735
- "position":
10736
- map-merge(
10736
+ "position": map-merge(
10737
10737
  map-get($utilities, "position"),
10738
10738
  (
10739
10739
  responsive: true
@@ -10864,37 +10864,18 @@ body {
10864
10864
  }
10865
10865
  }
10866
10866
 
10867
- .sign-in-screen {
10868
- padding-top: $normal-size;
10869
-
10870
- .sign-in-container {
10871
- animation: enabledBlueAppPage 0.5s;
10872
-
10873
- @media (prefers-reduced-motion) {
10874
- animation-duration: 0s;
10875
- }
10876
- }
10877
-
10878
- @media screen and (min-width: 768px) {
10879
- .sign-in-container {
10880
- padding: var(--blue-sign-in-container-md-padding, 0 calc(50% - 18rem));
10881
- width: var(--blue-sign-in-container-md-width, auto);
10882
- }
10883
- }
10884
- }
10885
-
10886
- .blue-header-title.sidebar {
10887
- width: $bla-sidebar-width;
10888
- padding-left: calc(#{$normal-size} + #{$spacer});
10889
- transform: translateX(-100%);
10890
- transition: transform 0.4s;
10891
- background: var(--blue-sidebar-bg);
10892
- color: $sidebar-color;
10867
+ // .blue-header-title.sidebar {
10868
+ // width: $bla-sidebar-width;
10869
+ // padding-left: calc(#{$normal-size} + #{$spacer});
10870
+ // transform: translateX(-100%);
10871
+ // transition: transform 0.4s;
10872
+ // background: var(--blue-sidebar-bg);
10873
+ // color: $sidebar-color;
10893
10874
 
10894
- @media (prefers-reduced-motion) {
10895
- transition: none;
10896
- }
10897
- }
10875
+ // @media (prefers-reduced-motion) {
10876
+ // transition: none;
10877
+ // }
10878
+ // }
10898
10879
 
10899
10880
  .blue-scroll-shadow {
10900
10881
  @include scroll-shadow(var(--bs-body-bg));
@@ -11079,14 +11060,16 @@ body {
11079
11060
  }
11080
11061
 
11081
11062
  &::before {
11063
+ --visual-padding: 0.125rem;
11064
+
11082
11065
  content: "";
11083
11066
  position: absolute;
11084
- top: 0.125rem;
11085
- right: 0.125rem;
11086
- bottom: 0.125rem;
11087
- left: 0.125rem;
11067
+ top: var(--visual-padding);
11068
+ right: var(--visual-padding);
11069
+ bottom: var(--visual-padding);
11070
+ left: var(--visual-padding);
11088
11071
  background-color: currentColor;
11089
- border-radius: $border-radius;
11072
+ border-radius: var(--bs-btn-border-radius);
11090
11073
  transform: scale(0.9);
11091
11074
  opacity: 0;
11092
11075
  transition: all 0.2s;
@@ -11138,177 +11121,6 @@ body {
11138
11121
  }
11139
11122
  }
11140
11123
 
11141
- // @keyframes blue-menu-item-indicator-in-from-side {
11142
- // from {
11143
- // transform: translateX(-100%);
11144
- // }
11145
- // to {
11146
- // transform: translateX(1);
11147
- // }
11148
- // }
11149
-
11150
- // @keyframes blue-menu-item-indicator-in-from-below {
11151
- // from {
11152
- // transform: translateY(100%);
11153
- // }
11154
- // to {
11155
- // transform: translateY(1);
11156
- // }
11157
- // }
11158
-
11159
- // .blue-menu-item {
11160
- // transition:
11161
- // width 0.5s,
11162
- // background-color 0.3s,
11163
- // color 0.15s,
11164
- // box-shadow 0.3s,
11165
- // opacity 0.3s !important;
11166
-
11167
- // @media (prefers-reduced-motion) {
11168
- // transition: none !important;
11169
- // }
11170
-
11171
- // & {
11172
- // border: none;
11173
- // box-shadow: none;
11174
- // background-image: none;
11175
- // }
11176
-
11177
- // &:focus {
11178
- // box-shadow: none;
11179
- // }
11180
-
11181
- // &:focus-visible {
11182
- // &,
11183
- // &.active {
11184
- // box-shadow: inset 0 0 0 0.25rem color-mix(in srgb, currentColor 15%, transparent);
11185
- // }
11186
- // }
11187
- // }
11188
-
11189
- // .blue-menu-item-icon {
11190
- // display: inline-block;
11191
-
11192
- // & > * {
11193
- // display: block;
11194
- // width: 1.5rem;
11195
- // }
11196
- // }
11197
-
11198
- // .blue-menu-item-icon.iconForActive {
11199
- // display: none;
11200
- // }
11201
-
11202
- // .blue-menu-item.active {
11203
- // .blue-menu-item-icon.hasIconForActive {
11204
- // display: none;
11205
- // }
11206
- // .blue-menu-item-icon.iconForActive {
11207
- // display: inline-block;
11208
- // }
11209
- // }
11210
-
11211
- // .blue-menu-item-dropdown {
11212
- // margin-left: 1rem;
11213
- // animation: blue-menu-item-dropdown 0.15s;
11214
- // position: relative;
11215
-
11216
- // @media (prefers-reduced-motion) {
11217
- // animation-duration: 0s;
11218
- // }
11219
-
11220
- // &::before {
11221
- // content: "";
11222
- // position: absolute;
11223
- // top: 0.125rem;
11224
- // right: 0.125rem;
11225
- // bottom: 0.125rem;
11226
- // left: 0.125rem;
11227
- // border-radius: $border-radius;
11228
- // box-shadow: $box-shadow;
11229
- // border: 1px solid color-mix(in srgb, currentColor 15%, transparent);
11230
- // background-color: var(--blue-menu-item-dropdown-bg);
11231
- // }
11232
-
11233
- // &[popover] {
11234
- // position: fixed;
11235
- // margin: 0;
11236
- // padding: 0;
11237
- // z-index: 1000;
11238
- // border: none;
11239
- // background: transparent;
11240
- // border-radius: calc(#{$border-radius} + 0.1rem);
11241
- // box-shadow: $box-shadow;
11242
- // }
11243
- // }
11244
-
11245
- // .blue-menu-item {
11246
- // color: inherit;
11247
- // width: auto;
11248
- // height: $normal-size;
11249
- // font-size: $bla-btn-font-size;
11250
- // display: flex;
11251
- // align-items: center;
11252
- // border-color: transparent;
11253
- // --bs-btn-padding-x: 0.437rem;
11254
-
11255
- // &::before {
11256
- // @include blue-menu-item-background();
11257
- // }
11258
-
11259
- // &[draggable] {
11260
- // cursor: grab;
11261
-
11262
- // &:active {
11263
- // box-shadow: inset 0 0 0.25rem;
11264
- // }
11265
- // }
11266
-
11267
- // &:hover,
11268
- // &:active,
11269
- // &.highlighted,
11270
- // &:has(+ :popover-open) {
11271
- // color: inherit;
11272
- // border-color: transparent;
11273
-
11274
- // &::before {
11275
- // transform: scale(1);
11276
- // opacity: 0.25;
11277
- // }
11278
- // }
11279
-
11280
- // &.highlighted,
11281
- // &:has(+ :popover-open) {
11282
- // &::before {
11283
- // opacity: 0.16;
11284
- // }
11285
- // }
11286
-
11287
- // &:hover,
11288
- // &:active {
11289
- // &::before {
11290
- // opacity: 0.25;
11291
- // }
11292
- // }
11293
-
11294
- // &.active::after {
11295
- // @include blue-menu-item-indicator();
11296
- // }
11297
-
11298
- // & > * + .blue-menu-item-label {
11299
- // margin-left: 0.5rem;
11300
- // }
11301
- // }
11302
-
11303
- // .blue-menu-item-wrapper {
11304
- // display: contents;
11305
- // }
11306
-
11307
- // .blue-menu-item-dropdown > .blue-menu-item-wrapper > .blue-menu-item,
11308
- // .blue-menu-item-dropdown > .blue-menu-item {
11309
- // width: 100%;
11310
- // }
11311
-
11312
11124
  .blue-header-title {
11313
11125
  a {
11314
11126
  color: inherit;
@@ -11360,7 +11172,7 @@ body {
11360
11172
  var(--bs-btn-padding-x, 0.75rem) + var(--bs-btn-border-width, 1px)
11361
11173
  );
11362
11174
 
11363
- max-height: $normal-size;
11175
+ max-height: var(--blue-header-height);
11364
11176
  overflow: hidden;
11365
11177
 
11366
11178
  .blue-actions-menu {
@@ -11702,6 +11514,11 @@ body {
11702
11514
  $text-color: color-contrast($value);
11703
11515
  }
11704
11516
 
11517
+ // More contrast for secondary plain button
11518
+ @if $color == "secondary" {
11519
+ $text-color: shade-color($value, 60%);
11520
+ }
11521
+
11705
11522
  @include button-variant(
11706
11523
  transparent,
11707
11524
  transparent,
@@ -11728,6 +11545,11 @@ body {
11728
11545
  $text-color: color-contrast($value);
11729
11546
  }
11730
11547
 
11548
+ // More contrast for secondary plain button
11549
+ @if $color == "secondary" {
11550
+ $text-color: tint-color($value, 60%);
11551
+ }
11552
+
11731
11553
  @include button-variant(
11732
11554
  transparent,
11733
11555
  transparent,
@@ -12012,17 +11834,13 @@ dialog.blue-modal:has(.offcanvas-start) {
12012
11834
  --drawer-side-shadow:
12013
11835
  rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px,
12014
11836
  rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.25) 0px 25px 50px -12px;
12015
- --toggler-size: calc(
12016
- var(--bs-btn-border-width, 1px) + var(--bs-btn-padding-y, 0.375rem) +
12017
- (var(--bs-btn-font-size, 1rem) * var(--bs-btn-line-height, 1.5)) + var(--bs-btn-padding-y, 0.375rem) +
12018
- var(--bs-btn-border-width, 1px)
12019
- );
12020
11837
  --side-width: 18rem;
12021
11838
  --base-z-index: 0;
12022
11839
 
12023
11840
  --base-z-index: 500;
12024
11841
  --side-width: var(--blue-sidebar-width);
12025
- --toggler-size: var(--blue-menu-item-height);
11842
+ --toggler-width: 2.714rem;
11843
+ --toggler-height: var(--blue-header-height);
12026
11844
 
12027
11845
  --blue-menu-item-indicator-bg: #{color-contrast($sidebar-bg, $sidebar-indicator-color)};
12028
11846
  --bs-link-hover-color: #{color-contrast($sidebar-bg, $link-hover-color)};
@@ -12031,15 +11849,15 @@ dialog.blue-modal:has(.offcanvas-start) {
12031
11849
  position: relative;
12032
11850
  display: grid;
12033
11851
 
12034
- grid-template-rows: var(--toggler-size) auto;
11852
+ grid-template-rows: var(--toggler-height) auto;
12035
11853
  grid-template-areas: "header" "main";
12036
11854
 
12037
11855
  color: var(--blue-sidebar-color);
12038
11856
  background-color: var(--blue-sidebar-bg);
12039
11857
 
12040
11858
  &:has(> .blue-layout-toggle) {
12041
- grid-template-columns: 0 0 var(--toggler-size) calc(var(--side-width) - var(--toggler-size)) 1fr;
12042
- grid-template-rows: var(--toggler-size) auto;
11859
+ grid-template-columns: 0 0 var(--toggler-width) calc(var(--side-width) - var(--toggler-width)) 1fr;
11860
+ grid-template-rows: var(--toggler-height) auto;
12043
11861
  grid-template-areas:
12044
11862
  "state . toggle header header"
12045
11863
  ". side main main main";
@@ -12103,6 +11921,7 @@ dialog.blue-modal:has(.offcanvas-start) {
12103
11921
 
12104
11922
  display: flex;
12105
11923
  justify-content: space-between;
11924
+ align-items: center;
12106
11925
  position: relative;
12107
11926
  z-index: var(--blue-layout-header-z-index, 4);
12108
11927
  --blue-menu-item-dropdown-bg: var(--blue-sidebar-bg);
@@ -12364,6 +12183,10 @@ dialog.blue-modal:has(.offcanvas-start) {
12364
12183
 
12365
12184
  &::scroll-marker-group {
12366
12185
  display: flex;
12186
+ overflow-x: auto;
12187
+ overflow-y: hidden;
12188
+ -ms-overflow-style: none;
12189
+ scrollbar-width: none;
12367
12190
  min-height: calc(
12368
12191
  (var(--#{$prefix}nav-link-padding-y) + var(--#{$prefix}nav-tabs-border-width)) * 2 +
12369
12192
  (var(--#{$prefix}nav-link-font-size) * var(--#{$prefix}body-line-height))
@@ -12376,6 +12199,7 @@ dialog.blue-modal:has(.offcanvas-start) {
12376
12199
  & > :is(section, .blue-scrollspy-group) {
12377
12200
  &::scroll-marker {
12378
12201
  content: attr(aria-label);
12202
+ white-space: nowrap;
12379
12203
 
12380
12204
  font-size: var(--#{$prefix}nav-link-font-size);
12381
12205
  box-sizing: border-box;
@@ -12409,6 +12233,29 @@ dialog.blue-modal:has(.offcanvas-start) {
12409
12233
  }
12410
12234
  }
12411
12235
 
12236
+ .sign-in-screen {
12237
+ padding-top: var(--blue-header-height);
12238
+
12239
+ &:last-child {
12240
+ padding-bottom: var(--blue-header-height);
12241
+ }
12242
+
12243
+ .sign-in-container {
12244
+ animation: enabledBlueAppPage 0.5s;
12245
+
12246
+ @media (prefers-reduced-motion) {
12247
+ animation-duration: 0s;
12248
+ }
12249
+ }
12250
+
12251
+ @media screen and (min-width: 768px) {
12252
+ .sign-in-container {
12253
+ padding: var(--blue-sign-in-container-md-padding, 0 calc(50% - 18rem));
12254
+ width: var(--blue-sign-in-container-md-width, auto);
12255
+ }
12256
+ }
12257
+ }
12258
+
12412
12259
 
12413
12260
  /* Make DevExpress components look more like Bootstrap/Blue */
12414
12261
  [class^="dxbl-"] {
@@ -12416,7 +12263,7 @@ dialog.blue-modal:has(.offcanvas-start) {
12416
12263
  --dxbl-text-edit-padding-x: 0.75rem !important;
12417
12264
  --dxbl-text-edit-padding-y: 0.375rem !important;
12418
12265
  --dxbl-text-edit-line-height: 1.5 !important;
12419
- --dxbl-text-edit-focus-shadow-spread: 0.25rem !important;
12266
+ --dxbl-text-edit-focus-shadow-spread: #{$focus-ring-width} !important;
12420
12267
  --dxbl-listbox-border-radius: var(--bs-border-radius) !important;
12421
12268
  --dxbl-toolbar-font-size: var(--bs-body-font-size) !important;
12422
12269
  --dxbl-toolbar-btn-border-radius: var(--bs-border-radius) !important;