blue-web 1.15.1 → 1.16.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.
- package/dist/js/actions.bundle.js +1 -1
- package/dist/js/actions.d.ts +1 -0
- package/dist/js/actions.js +11 -2
- package/dist/js/dialog.bundle.js +1 -1
- package/dist/js/dialog.d.ts +4 -3
- package/dist/js/dialog.js +9 -3
- package/dist/merged.scss +99 -9
- package/dist/style.css +167 -102
- package/dist/style.css.map +1 -1
- package/dist/style.min.css +4 -4
- package/dist/style.scss +3 -1
- package/dist/styles/_actions.css +4 -0
- package/dist/styles/_bootstrap-variables.scss +1 -1
- package/dist/styles/_collapse.scss +2 -1
- package/dist/styles/_scrollspy.scss +71 -0
- package/dist/styles/_utils.scss +6 -0
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{"use strict";window.blueWeb=window.blueWeb||{},window.blueWeb.actions={init:function(e){let
|
|
1
|
+
(()=>{"use strict";window.blueWeb=window.blueWeb||{},window.blueWeb.actions={init:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;function s(){for(const e of t.children)e.style.display="none";for(const e of i.children)e.style.display="",e.classList.add("BLUE-actions-collapse-visible");let s=0;for(const n of t.children){if(n.style.display="",i.children[s].style.display="none",i.children[s].classList.remove("BLUE-actions-collapse-visible"),e.scrollWidth>e.clientWidth){n.style.display="none",i.children[s].style.display="",i.children[s].classList.add("BLUE-actions-collapse-visible");break}s++}}t||(t=e.querySelector(".BLUE-actions-menu")),i||(i=e.querySelector(".BLUE-actions-collapse-menu")),s();const n=()=>{requestAnimationFrame(s)},o=new ResizeObserver(n);o.observe(e);const l=new MutationObserver(n);l.observe(e,{attributes:!1,childList:!0,subtree:!0});const c=t=>{if(!e)return;const i=e.querySelectorAll("details[open]");!i||i.length<=0||i.forEach((e=>{e.contains(t.target)||e.removeAttribute("open")}))};return document.addEventListener("click",c),{updateActions:s,resizeObserver:o,mutationObserver:l,destroy(){o.disconnect(),l.disconnect(),document.removeEventListener("click",c)}}}}})();
|
package/dist/js/actions.d.ts
CHANGED
package/dist/js/actions.js
CHANGED
|
@@ -31,10 +31,17 @@ export function init(actionsElement) {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
updateActions();
|
|
34
|
-
const
|
|
34
|
+
const callback = () => {
|
|
35
35
|
requestAnimationFrame(updateActions);
|
|
36
|
-
}
|
|
36
|
+
};
|
|
37
|
+
const resizeObserver = new ResizeObserver(callback);
|
|
37
38
|
resizeObserver.observe(actionsElement);
|
|
39
|
+
const mutationObserver = new MutationObserver(callback);
|
|
40
|
+
mutationObserver.observe(actionsElement, {
|
|
41
|
+
attributes: false,
|
|
42
|
+
childList: true,
|
|
43
|
+
subtree: true
|
|
44
|
+
});
|
|
38
45
|
const outsideClickHandler = event => {
|
|
39
46
|
if (!actionsElement) return;
|
|
40
47
|
const openDetails = actionsElement.querySelectorAll("details[open]");
|
|
@@ -49,8 +56,10 @@ export function init(actionsElement) {
|
|
|
49
56
|
return {
|
|
50
57
|
updateActions,
|
|
51
58
|
resizeObserver,
|
|
59
|
+
mutationObserver,
|
|
52
60
|
destroy() {
|
|
53
61
|
resizeObserver.disconnect();
|
|
62
|
+
mutationObserver.disconnect();
|
|
54
63
|
document.removeEventListener("click", outsideClickHandler);
|
|
55
64
|
}
|
|
56
65
|
};
|
package/dist/js/dialog.bundle.js
CHANGED
|
@@ -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
|
|
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)}}})();
|
package/dist/js/dialog.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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,12 +1,12 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Blue Web v1.
|
|
2
|
+
* Blue Web v1.16.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
|
|
|
6
6
|
// Main color theme. E.g. used for background for body and sidebar.
|
|
7
7
|
$theme: hsl(217deg 10% 94%) !default;
|
|
8
8
|
$theme-dark: hsl(217deg 10% 8%) !default;
|
|
9
|
-
$primary: hsl(
|
|
9
|
+
$primary: hsl(221, 97%, 53%) !default;
|
|
10
10
|
$white: #fff !default;
|
|
11
11
|
$gray-100: hsl(217deg 17% 98%) !default;
|
|
12
12
|
$gray-200: hsl(217deg 16% 93%) !default;
|
|
@@ -3376,17 +3376,23 @@ $rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height
|
|
|
3376
3376
|
@mixin box-shadow($shadow...) {
|
|
3377
3377
|
@if $enable-shadows {
|
|
3378
3378
|
$result: ();
|
|
3379
|
+
$has-single-value: false;
|
|
3380
|
+
$single-value: null;
|
|
3379
3381
|
|
|
3380
3382
|
@each $value in $shadow {
|
|
3381
3383
|
@if $value != null {
|
|
3382
|
-
$
|
|
3383
|
-
|
|
3384
|
-
|
|
3385
|
-
@
|
|
3384
|
+
@if $value == none or $value == initial or $value == inherit or $value == unset {
|
|
3385
|
+
$has-single-value: true;
|
|
3386
|
+
$single-value: $value;
|
|
3387
|
+
} @else {
|
|
3388
|
+
$result: append($result, $value, "comma");
|
|
3389
|
+
}
|
|
3386
3390
|
}
|
|
3387
3391
|
}
|
|
3388
3392
|
|
|
3389
|
-
@if
|
|
3393
|
+
@if $has-single-value {
|
|
3394
|
+
box-shadow: $single-value;
|
|
3395
|
+
} @else if (length($result) > 0) {
|
|
3390
3396
|
box-shadow: $result;
|
|
3391
3397
|
}
|
|
3392
3398
|
}
|
|
@@ -4167,7 +4173,7 @@ $sidebar-expanded-breakpoint: 1400px !default;
|
|
|
4167
4173
|
|
|
4168
4174
|
@mixin bsBanner($file) {
|
|
4169
4175
|
/*!
|
|
4170
|
-
* Bootstrap #{$file} v5.3.
|
|
4176
|
+
* Bootstrap #{$file} v5.3.7 (https://getbootstrap.com/)
|
|
4171
4177
|
* Copyright 2011-2025 The Bootstrap Authors
|
|
4172
4178
|
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
4173
4179
|
*/
|
|
@@ -10924,6 +10930,13 @@ body {
|
|
|
10924
10930
|
@include scroll-shadow(var(--bs-body-bg));
|
|
10925
10931
|
}
|
|
10926
10932
|
|
|
10933
|
+
// Sets `margin: 0` to last child.
|
|
10934
|
+
// Useful for creating a gap between items together with `mb-3`.
|
|
10935
|
+
// Inspired by Tailwind CSS class `last:m-0`.
|
|
10936
|
+
.m-last-0:last-child {
|
|
10937
|
+
margin: 0 !important;
|
|
10938
|
+
}
|
|
10939
|
+
|
|
10927
10940
|
.blue-loading {
|
|
10928
10941
|
background-color: $primary;
|
|
10929
10942
|
}
|
|
@@ -12189,7 +12202,8 @@ dialog.blue-modal:has(.offcanvas-start) {
|
|
|
12189
12202
|
.blue-collapse-group {
|
|
12190
12203
|
display: grid;
|
|
12191
12204
|
grid-template-rows: auto;
|
|
12192
|
-
grid-template-columns: 1fr;
|
|
12205
|
+
grid-template-columns: minmax(0, 1fr);
|
|
12206
|
+
max-width: 100%;
|
|
12193
12207
|
|
|
12194
12208
|
& > details {
|
|
12195
12209
|
display: contents;
|
|
@@ -12226,6 +12240,10 @@ dialog.blue-modal:has(.offcanvas-start) {
|
|
|
12226
12240
|
position: absolute;
|
|
12227
12241
|
}
|
|
12228
12242
|
|
|
12243
|
+
.BLUE-actions-collapse-menu:popover-open {
|
|
12244
|
+
display: var(--display);
|
|
12245
|
+
}
|
|
12246
|
+
|
|
12229
12247
|
.blue-anchor {
|
|
12230
12248
|
anchor-name: var(--blue-anchor-name, --anchor-1);
|
|
12231
12249
|
}
|
|
@@ -12263,6 +12281,78 @@ dialog.blue-modal:has(.offcanvas-start) {
|
|
|
12263
12281
|
}
|
|
12264
12282
|
}
|
|
12265
12283
|
|
|
12284
|
+
.blue-scrollspy {
|
|
12285
|
+
--#{$prefix}nav-link-padding-x: #{$nav-link-padding-x * 0.5};
|
|
12286
|
+
--#{$prefix}nav-link-padding-y: #{$nav-link-padding-y * 0.5};
|
|
12287
|
+
@include rfs(0.875rem, --#{$prefix}nav-link-font-size);
|
|
12288
|
+
--#{$prefix}nav-link-font-weight: #{$nav-link-font-weight};
|
|
12289
|
+
--#{$prefix}nav-link-color: #{$nav-link-color};
|
|
12290
|
+
--#{$prefix}nav-link-hover-color: #{$nav-link-hover-color};
|
|
12291
|
+
--#{$prefix}nav-link-disabled-color: #{$nav-link-disabled-color};
|
|
12292
|
+
|
|
12293
|
+
--#{$prefix}nav-tabs-border-width: #{$nav-tabs-border-width};
|
|
12294
|
+
--#{$prefix}nav-tabs-border-color: #{$nav-tabs-border-color};
|
|
12295
|
+
--#{$prefix}nav-tabs-border-radius: #{$nav-tabs-border-radius};
|
|
12296
|
+
--#{$prefix}nav-tabs-link-hover-border-color: #{$nav-tabs-link-hover-border-color};
|
|
12297
|
+
--#{$prefix}nav-tabs-link-active-color: #{$nav-tabs-link-active-color};
|
|
12298
|
+
--#{$prefix}nav-tabs-link-active-bg: #{$nav-tabs-link-active-bg};
|
|
12299
|
+
--#{$prefix}nav-tabs-link-active-border-color: #{$nav-tabs-link-active-border-color};
|
|
12300
|
+
|
|
12301
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
12302
|
+
scroll-behavior: smooth;
|
|
12303
|
+
}
|
|
12304
|
+
|
|
12305
|
+
overflow-y: auto;
|
|
12306
|
+
overscroll-behavior-y: contain;
|
|
12307
|
+
scroll-snap-type: y mandatory;
|
|
12308
|
+
|
|
12309
|
+
scroll-marker-group: before;
|
|
12310
|
+
|
|
12311
|
+
&::scroll-marker-group {
|
|
12312
|
+
display: flex;
|
|
12313
|
+
min-height: calc(
|
|
12314
|
+
(var(--#{$prefix}nav-link-padding-y) + var(--#{$prefix}nav-tabs-border-width)) * 2 +
|
|
12315
|
+
(var(--#{$prefix}nav-link-font-size) * var(--#{$prefix}body-line-height))
|
|
12316
|
+
);
|
|
12317
|
+
margin-bottom: 0.25rem;
|
|
12318
|
+
}
|
|
12319
|
+
|
|
12320
|
+
& > section {
|
|
12321
|
+
&::scroll-marker {
|
|
12322
|
+
content: attr(aria-label);
|
|
12323
|
+
|
|
12324
|
+
font-size: var(--#{$prefix}nav-link-font-size);
|
|
12325
|
+
box-sizing: border-box;
|
|
12326
|
+
text-decoration: none;
|
|
12327
|
+
|
|
12328
|
+
padding: var(--#{$prefix}nav-link-padding-y) var(--#{$prefix}nav-link-padding-x);
|
|
12329
|
+
border: var(--#{$prefix}nav-tabs-border-width) solid transparent;
|
|
12330
|
+
|
|
12331
|
+
border-radius: var(--#{$prefix}nav-tabs-border-radius);
|
|
12332
|
+
|
|
12333
|
+
&:is(:hover, :focus) {
|
|
12334
|
+
border-color: var(--#{$prefix}nav-tabs-link-hover-border-color);
|
|
12335
|
+
}
|
|
12336
|
+
|
|
12337
|
+
&:target-current,
|
|
12338
|
+
&:is(:active) {
|
|
12339
|
+
color: var(--#{$prefix}nav-tabs-link-active-color);
|
|
12340
|
+
background-color: var(--#{$prefix}nav-tabs-link-active-bg);
|
|
12341
|
+
border-color: var(--#{$prefix}border-color);
|
|
12342
|
+
}
|
|
12343
|
+
}
|
|
12344
|
+
}
|
|
12345
|
+
}
|
|
12346
|
+
|
|
12347
|
+
.blue-scrollspy-after {
|
|
12348
|
+
scroll-marker-group: after;
|
|
12349
|
+
|
|
12350
|
+
&::scroll-marker-group {
|
|
12351
|
+
margin-bottom: 0;
|
|
12352
|
+
margin-top: 0.25rem;
|
|
12353
|
+
}
|
|
12354
|
+
}
|
|
12355
|
+
|
|
12266
12356
|
|
|
12267
12357
|
/* Make DevExpress components look more like Bootstrap/Blue */
|
|
12268
12358
|
[class^="dxbl-"] {
|