blue-web 1.15.1 → 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.1 (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
 
@@ -10924,6 +10924,13 @@ body {
10924
10924
  @include scroll-shadow(var(--bs-body-bg));
10925
10925
  }
10926
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
+
10927
10934
  .blue-loading {
10928
10935
  background-color: $primary;
10929
10936
  }
@@ -12189,7 +12196,8 @@ dialog.blue-modal:has(.offcanvas-start) {
12189
12196
  .blue-collapse-group {
12190
12197
  display: grid;
12191
12198
  grid-template-rows: auto;
12192
- grid-template-columns: 1fr;
12199
+ grid-template-columns: minmax(0, 1fr);
12200
+ max-width: 100%;
12193
12201
 
12194
12202
  & > details {
12195
12203
  display: contents;
@@ -12263,6 +12271,78 @@ dialog.blue-modal:has(.offcanvas-start) {
12263
12271
  }
12264
12272
  }
12265
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
+
12266
12346
 
12267
12347
  /* Make DevExpress components look more like Bootstrap/Blue */
12268
12348
  [class^="dxbl-"] {