blue-web 1.15.0 → 1.16.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.
@@ -1 +1 @@
1
- (()=>{"use strict";var e={786:(e,n,t)=>{t.d(n,{k:()=>l});const o={Cancel:["Cancel","Abbrechen"],Yes:["Yes","Ja"],No:["No","Nein"],Message:["Message","Nachricht"],"Toggle menu":["Toggle menu","Menü umschalten"],"Close all":["Close all","Alle schließen"],Error:["Error","Fehler"],Information:["Information","Information"]};function l(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;return n=n||navigator.language.toLowerCase().indexOf("de")>-1?"de-DE":"en-US",t=t||o,t[e]?n.indexOf("de-")>-1?t[e][1]:t[e][0]:e}},762:(e,n,t)=>{function o(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}t.d(n,{Os:()=>l});const l=()=>o()+o()+"-"+o()+"-"+o()+"-"+o()+"-"+o()+o()+o()}},n={};function t(o){var l=n[o];if(void 0!==l)return l.exports;var a=n[o]={exports:{}};return e[o](a,a.exports,t),a.exports}t.d=(e,n)=>{for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})},t.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n);var o=t(762),l=t(786);async function a(e,n){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},{title:a=(0,l.k)("Message"),icon:i,switchPrimaryBtn:r=!1,acceptBtnText:s=("verify"===e?(0,l.k)("Yes"):"OK"),cancelBtnText:d=("verify"===e?(0,l.k)("No"):(0,l.k)("Cancel")),inputType:c="text"}=t;const u=(0,o.Os)();return document.getElementById(u)||document.body.insertAdjacentHTML("beforeend",`<dialog class="blue-modal modal" id="${u}" aria-labelledby="${u}-label">\n <div class="modal-dialog">\n <div class="modal-content">\n <form>\n <div class="modal-header">\n ${i?`<div class="me-2">${i}</div>`:""}\n <h1 class="modal-title fs-5" id="${u}-label">${a}</h1>\n <button\n type="button"\n class="btn-close"\n aria-label="${d}"\n onclick="document.getElementById('${u}').close()"\n ></button>\n </div>\n <div class="modal-body">\n ${"ask"===e?`<label for="${u}-input">${n}</label>\n <input type="${c}" id="${u}-input" class="form-control mt-3" />`:n}\n </div>\n <div class="modal-footer">\n ${"verify"===e||"ask"===e?`<button\n type="button"\n class="btn ${r?"btn-primary":"blue-btn-plain-primary"}"\n onclick="document.getElementById('${u}').close()"\n >\n ${d}\n </button>`:""}\n <button\n type="submit"\n class="btn ${r?"blue-btn-plain-primary":"btn-primary"}"\n >\n ${s}\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <form method="dialog" class="blue-modal-backdrop">\n <button>${d}</button>\n </form>\n </dialog>`),new Promise((n=>{const t=document.getElementById(u),o=()=>{const e=document.getElementById(u);e&&e.remove()};t?.showModal(),t?.addEventListener("close",(()=>{o(),n(!1)})),t?.querySelector(".modal-content > form")?.addEventListener("submit",(l=>{l.preventDefault(),"ask"===e&&(t.close(),o(),n((t?.querySelector("input")).value||"")),t.close(),o(),n(!0)}))}))}window.blueWeb=window.blueWeb||{},window.blueWeb.dialog={ask:async function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return await a("ask",e,n)},tell:async function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};await a("tell",e,n)},verify:async function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return!0===await a("verify",e,n)}}})();
1
+ (()=>{"use strict";var e={786:(e,n,t)=>{t.d(n,{k:()=>l});const o={Cancel:["Cancel","Abbrechen"],Yes:["Yes","Ja"],No:["No","Nein"],Message:["Message","Nachricht"],"Toggle menu":["Toggle menu","Menü umschalten"],"Close all":["Close all","Alle schließen"],Error:["Error","Fehler"],Information:["Information","Information"]};function l(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;return n=n||navigator.language.toLowerCase().indexOf("de")>-1?"de-DE":"en-US",t=t||o,t[e]?n.indexOf("de-")>-1?t[e][1]:t[e][0]:e}},762:(e,n,t)=>{function o(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}t.d(n,{Os:()=>l});const l=()=>o()+o()+"-"+o()+"-"+o()+"-"+o()+"-"+o()+o()+o()}},n={};function t(o){var l=n[o];if(void 0!==l)return l.exports;var a=n[o]={exports:{}};return e[o](a,a.exports,t),a.exports}t.d=(e,n)=>{for(var o in n)t.o(n,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:n[o]})},t.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n);var o=t(762),l=t(786);async function a(e,n){let t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},{title:a=(0,l.k)("Message"),icon:i,switchPrimaryBtn:r=!1,acceptBtnText:s=("verify"===e?(0,l.k)("Yes"):"OK"),cancelBtnText:d=("verify"===e?(0,l.k)("No"):(0,l.k)("Cancel")),inputType:c="text",defaultValue:u}="string"==typeof t?JSON.parse(t):t;const m=(0,o.Os)();return document.getElementById(m)||document.body.insertAdjacentHTML("beforeend",`<dialog class="blue-modal modal" id="${m}" aria-labelledby="${m}-label">\n <div class="modal-dialog">\n <div class="modal-content">\n <form>\n <div class="modal-header">\n ${i?`<div class="me-2">${i}</div>`:""}\n <h1 class="modal-title fs-5" id="${m}-label">${a}</h1>\n <button\n type="button"\n class="btn-close"\n aria-label="${d}"\n onclick="document.getElementById('${m}').close()"\n ></button>\n </div>\n <div class="modal-body">\n ${"ask"===e?`<label for="${m}-input">${n}</label>\n <input\n type="${c}"\n ${void 0!==u?` value="${u}"`:""}\n id="${m}-input"\n class="form-control mt-3"\n />`:n}\n </div>\n <div class="modal-footer">\n ${"verify"===e||"ask"===e?`<button\n type="button"\n class="btn ${r?"btn-primary":"blue-btn-plain-primary"}"\n onclick="document.getElementById('${m}').close()"\n >\n ${d}\n </button>`:""}\n <button\n type="submit"\n class="btn ${r?"blue-btn-plain-primary":"btn-primary"}"\n >\n ${s}\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <form method="dialog" class="blue-modal-backdrop">\n <button>${d}</button>\n </form>\n </dialog>`),new Promise((n=>{const t=document.getElementById(m),o=()=>{const e=document.getElementById(m);e&&e.remove()};t?.showModal(),t?.addEventListener("close",(()=>{o(),n(!1)})),t?.querySelector(".modal-content > form")?.addEventListener("submit",(l=>{l.preventDefault(),"ask"===e&&(t.close(),o(),n((t?.querySelector("input")).value||"")),t.close(),o(),n(!0)}))}))}window.blueWeb=window.blueWeb||{},window.blueWeb.dialog={ask:async function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return await a("ask",e,n)},tell:async function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};await a("tell",e,n)},verify:async function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return!0===await a("verify",e,n)}}})();
@@ -6,10 +6,11 @@ export interface DialogOptions {
6
6
  acceptBtnText?: string;
7
7
  cancelBtnText?: string;
8
8
  inputType?: string;
9
+ defaultValue?: string;
9
10
  }
10
- export declare function ask(text: string, options?: DialogOptions): Promise<string | boolean>;
11
- export declare function tell(text: string, options?: DialogOptions): Promise<void>;
12
- export declare function verify(text: string, options?: DialogOptions): Promise<boolean>;
11
+ export declare function ask(text: string, options?: DialogOptions | string): Promise<string | boolean>;
12
+ export declare function tell(text: string, options?: DialogOptions | string): Promise<void>;
13
+ export declare function verify(text: string, options?: DialogOptions | string): Promise<boolean>;
13
14
  declare global {
14
15
  interface Window {
15
16
  blueWeb: any;
package/dist/js/dialog.js CHANGED
@@ -20,8 +20,9 @@ async function dialog(dialogType, text) {
20
20
  switchPrimaryBtn = false,
21
21
  acceptBtnText = dialogType === "verify" ? getPhrase("Yes") : "OK",
22
22
  cancelBtnText = dialogType === "verify" ? getPhrase("No") : getPhrase("Cancel"),
23
- inputType = "text"
24
- } = options;
23
+ inputType = "text",
24
+ defaultValue
25
+ } = typeof options === "string" ? JSON.parse(options) : options;
25
26
  const id = guid();
26
27
  const addToDom = () => {
27
28
  document.body.insertAdjacentHTML("beforeend", /* HTML */`<dialog class="blue-modal modal" id="${id}" aria-labelledby="${id}-label">
@@ -40,7 +41,12 @@ async function dialog(dialogType, text) {
40
41
  </div>
41
42
  <div class="modal-body">
42
43
  ${dialogType === "ask" ? /* HTML */`<label for="${id}-input">${text}</label>
43
- <input type="${inputType}" id="${id}-input" class="form-control mt-3" />` : text}
44
+ <input
45
+ type="${inputType}"
46
+ ${defaultValue !== undefined ? ` value="${defaultValue}"` : ""}
47
+ id="${id}-input"
48
+ class="form-control mt-3"
49
+ />` : text}
44
50
  </div>
45
51
  <div class="modal-footer">
46
52
  ${dialogType === "verify" || dialogType === "ask" ? /* HTML */`<button
package/dist/merged.scss CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Blue Web v1.15.0 (https://bruegmann.github.io/blue-web)
2
+ * Blue Web v1.16.0 (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
 
@@ -47,6 +47,8 @@ $link-hover-decoration: underline !default;
47
47
  $focus-ring-color: #{rgba(var(--bs-primary-rgb), 25%)} !default;
48
48
  $input-focus-border-color: #{rgba(var(--bs-primary-rgb), 50%)} !default;
49
49
 
50
+ $enable-button-pointers: false !default;
51
+
50
52
 
51
53
  // Bootstrap functions
52
54
  //
@@ -10771,13 +10773,21 @@ $utilities: map-merge(
10771
10773
  // scss-docs-end import-stack
10772
10774
 
10773
10775
 
10774
- // Per CSS-Variablen überschreibbar machen, da es von Bootstrap aus noch nicht möglich ist.
10775
- // Bei neuer Bootstrap-Version prüfen, ob es noch nötig ist.
10776
+ // Make it overridable via CSS variables, as it is not yet possible in Bootstrap.
10777
+ // Check with a newer Bootstrap version to see if it is still necessary.
10776
10778
  .form-check-input:checked {
10777
10779
  background-color: var(--bs-primary, #{$form-check-input-checked-bg-color});
10778
10780
  border-color: var(--bs-primary, #{$form-check-input-checked-border-color});
10779
10781
  }
10780
10782
 
10783
+ // Resets cursor from Bootstrap' _reboot.scss based on option.
10784
+ @if ($enable-button-pointers: false) {
10785
+ summary,
10786
+ [role="button"] {
10787
+ cursor: unset;
10788
+ }
10789
+ }
10790
+
10781
10791
  // In previous versions of Bootstrap, `.page-header` was a class that could be used to add a border to the bottom of a page header.
10782
10792
  // Unfortunately his class was removed in Bootstrap 5, so it's now part of Blue Web CSS.
10783
10793
  .blue-page-header,
@@ -10914,6 +10924,13 @@ body {
10914
10924
  @include scroll-shadow(var(--bs-body-bg));
10915
10925
  }
10916
10926
 
10927
+ // Sets `margin: 0` to last child.
10928
+ // Useful for creating a gap between items together with `mb-3`.
10929
+ // Inspired by Tailwind CSS class `last:m-0`.
10930
+ .m-last-0:last-child {
10931
+ margin: 0 !important;
10932
+ }
10933
+
10917
10934
  .blue-loading {
10918
10935
  background-color: $primary;
10919
10936
  }
@@ -11294,73 +11311,36 @@ body {
11294
11311
  height: var(--blue-header-title-image-height, var(--blue-header-title-image-size, 2rem));
11295
11312
  }
11296
11313
 
11297
- .blue-search {
11298
- display: flex;
11299
- align-items: center;
11314
+ .blue-input-group {
11300
11315
  border: $input-border-width solid $input-border-color;
11301
11316
  border-radius: $input-border-radius;
11302
11317
  background-color: $input-bg;
11303
11318
 
11304
- &.blue-search-body {
11305
- border: 1px solid $input-border-color;
11319
+ &.focus,
11320
+ &:has(input:focus) {
11321
+ box-shadow: $input-btn-focus-box-shadow;
11322
+ border-color: $input-focus-border-color;
11306
11323
 
11307
- .blue-search-input-group {
11308
- display: flex;
11324
+ .input-group-text {
11325
+ color: #{var(--bs-primary-text-emphasis)};
11309
11326
  }
11310
-
11311
- &.focus {
11312
- box-shadow: $input-btn-focus-box-shadow;
11313
- }
11314
- }
11315
-
11316
- &.focus {
11317
- box-shadow: inset $input-btn-focus-box-shadow;
11318
11327
  }
11319
- }
11320
-
11321
- .blue-sidebar .blue-search:not(.blue-search-body) {
11322
- margin-left: map-get($spacers, 1);
11323
- margin-right: map-get($spacers, 1);
11324
- }
11325
-
11326
- .blue-search-input-group {
11327
- display: none;
11328
11328
 
11329
11329
  .input-group-text {
11330
11330
  border-color: transparent;
11331
11331
  background-color: transparent;
11332
11332
  }
11333
- }
11334
-
11335
- .blue-search-control {
11336
- border: none;
11337
- background-color: transparent !important;
11338
-
11339
- &:focus {
11340
- box-shadow: none;
11341
- }
11342
- }
11343
-
11344
- .blue-search-reset-btn {
11345
- color: rgba($input-color, 0.7);
11346
11333
 
11347
- &:hover {
11348
- color: $input-color;
11349
- }
11350
- }
11351
-
11352
- .blue-search.blue-search-sidebar {
11353
- transition: opacity 0.2s ease-in-out;
11334
+ .form-control {
11335
+ border: none;
11336
+ background-color: transparent !important;
11354
11337
 
11355
- @media (prefers-reduced-motion) {
11356
- transition: none;
11338
+ &:focus {
11339
+ box-shadow: none;
11340
+ }
11357
11341
  }
11358
11342
  }
11359
11343
 
11360
- .blue-search.blue-search-sidebar:not(:hover):not(.focus) {
11361
- opacity: 0.7;
11362
- }
11363
-
11364
11344
  .blue-actions {
11365
11345
  --max-width: calc(
11366
11346
  var(--bs-btn-border-width, 1px) + var(--bs-btn-padding-x, 0.75rem) + var(--bs-btn-font-size, 1rem) +
@@ -11867,10 +11847,13 @@ body {
11867
11847
 
11868
11848
  position: relative;
11869
11849
  order: 0;
11870
- cursor: pointer;
11871
11850
  user-select: none;
11872
11851
  -webkit-appearance: none;
11873
11852
  appearance: none;
11853
+
11854
+ @if ($enable-button-pointers) {
11855
+ cursor: pointer;
11856
+ }
11874
11857
  }
11875
11858
 
11876
11859
  .blue-tab::before {
@@ -12213,7 +12196,8 @@ dialog.blue-modal:has(.offcanvas-start) {
12213
12196
  .blue-collapse-group {
12214
12197
  display: grid;
12215
12198
  grid-template-rows: auto;
12216
- grid-template-columns: 1fr;
12199
+ grid-template-columns: minmax(0, 1fr);
12200
+ max-width: 100%;
12217
12201
 
12218
12202
  & > details {
12219
12203
  display: contents;
@@ -12287,6 +12271,78 @@ dialog.blue-modal:has(.offcanvas-start) {
12287
12271
  }
12288
12272
  }
12289
12273
 
12274
+ .blue-scrollspy {
12275
+ --#{$prefix}nav-link-padding-x: #{$nav-link-padding-x * 0.5};
12276
+ --#{$prefix}nav-link-padding-y: #{$nav-link-padding-y * 0.5};
12277
+ @include rfs(0.875rem, --#{$prefix}nav-link-font-size);
12278
+ --#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};
12279
+ --#{$prefix}nav-link-color: #{$nav-link-color};
12280
+ --#{$prefix}nav-link-hover-color: #{$nav-link-hover-color};
12281
+ --#{$prefix}nav-link-disabled-color: #{$nav-link-disabled-color};
12282
+
12283
+ --#{$prefix}nav-tabs-border-width: #{$nav-tabs-border-width};
12284
+ --#{$prefix}nav-tabs-border-color: #{$nav-tabs-border-color};
12285
+ --#{$prefix}nav-tabs-border-radius: #{$nav-tabs-border-radius};
12286
+ --#{$prefix}nav-tabs-link-hover-border-color: #{$nav-tabs-link-hover-border-color};
12287
+ --#{$prefix}nav-tabs-link-active-color: #{$nav-tabs-link-active-color};
12288
+ --#{$prefix}nav-tabs-link-active-bg: #{$nav-tabs-link-active-bg};
12289
+ --#{$prefix}nav-tabs-link-active-border-color: #{$nav-tabs-link-active-border-color};
12290
+
12291
+ @media (prefers-reduced-motion: no-preference) {
12292
+ scroll-behavior: smooth;
12293
+ }
12294
+
12295
+ overflow-y: auto;
12296
+ overscroll-behavior-y: contain;
12297
+ scroll-snap-type: y mandatory;
12298
+
12299
+ scroll-marker-group: before;
12300
+
12301
+ &::scroll-marker-group {
12302
+ display: flex;
12303
+ min-height: calc(
12304
+ (var(--#{$prefix}nav-link-padding-y) + var(--#{$prefix}nav-tabs-border-width)) * 2 +
12305
+ (var(--#{$prefix}nav-link-font-size) * var(--#{$prefix}body-line-height))
12306
+ );
12307
+ margin-bottom: 0.25rem;
12308
+ }
12309
+
12310
+ & > section {
12311
+ &::scroll-marker {
12312
+ content: attr(aria-label);
12313
+
12314
+ font-size: var(--#{$prefix}nav-link-font-size);
12315
+ box-sizing: border-box;
12316
+ text-decoration: none;
12317
+
12318
+ padding: var(--#{$prefix}nav-link-padding-y) var(--#{$prefix}nav-link-padding-x);
12319
+ border: var(--#{$prefix}nav-tabs-border-width) solid transparent;
12320
+
12321
+ border-radius: var(--#{$prefix}nav-tabs-border-radius);
12322
+
12323
+ &:is(:hover, :focus) {
12324
+ border-color: var(--#{$prefix}nav-tabs-link-hover-border-color);
12325
+ }
12326
+
12327
+ &:target-current,
12328
+ &:is(:active) {
12329
+ color: var(--#{$prefix}nav-tabs-link-active-color);
12330
+ background-color: var(--#{$prefix}nav-tabs-link-active-bg);
12331
+ border-color: var(--#{$prefix}border-color);
12332
+ }
12333
+ }
12334
+ }
12335
+ }
12336
+
12337
+ .blue-scrollspy-after {
12338
+ scroll-marker-group: after;
12339
+
12340
+ &::scroll-marker-group {
12341
+ margin-bottom: 0;
12342
+ margin-top: 0.25rem;
12343
+ }
12344
+ }
12345
+
12290
12346
 
12291
12347
  /* Make DevExpress components look more like Bootstrap/Blue */
12292
12348
  [class^="dxbl-"] {
@@ -12313,6 +12369,10 @@ dialog.blue-modal:has(.offcanvas-start) {
12313
12369
  font-size: 1rem;
12314
12370
  }
12315
12371
 
12372
+ .dxbl-pager-page-edit {
12373
+ min-width: 2.5em;
12374
+ }
12375
+
12316
12376
  .dxbl-toolbar {
12317
12377
  --dxbl-toolbar-font-size: var(--bs-body-font-size) !important;
12318
12378
  font-size: var(--dxbl-toolbar-font-size);