blue-web 1.13.0 → 1.14.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/README.md +13 -2
- package/dist/js/actions.bundle.js +1 -0
- package/dist/js/actions.d.ts +5 -0
- package/dist/js/actions.js +61 -0
- package/dist/js/color-mode.js +4 -14
- package/dist/js/dialog.js +9 -17
- package/dist/js/edit-view.js +1 -8
- package/dist/js/progress.js +1 -7
- package/dist/js/read-view.js +1 -8
- package/dist/js/shared.js +1 -7
- package/dist/js/side-layout.js +1 -8
- package/dist/js/utils.js +9 -24
- package/dist/merged.scss +138 -21
- package/dist/style.css +128 -21
- package/dist/style.css.map +1 -1
- package/dist/style.min.css +3 -3
- package/dist/style.scss +4 -1
- package/dist/styles/_action-menu.scss +3 -15
- package/dist/styles/_actions.css +21 -0
- package/dist/styles/_anchor.scss +36 -0
- package/dist/styles/_collapse.scss +26 -3
- package/dist/styles/_devexpress.css +33 -0
- package/dist/styles/_menu-item.scss +15 -2
- package/package.json +5 -4
- package/dist/js/all.bundle.js +0 -2
- package/dist/js/all.bundle.js.LICENSE.txt +0 -5
- package/dist/js/all.js +0 -3
- package/dist/js/button.bundle.js +0 -1
- package/dist/js/button.d.ts +0 -1
- package/dist/js/button.js +0 -21
- package/dist/js/dialog.bundle.js.LICENSE.txt +0 -5
- package/dist/legacy-styles/_grid-layout.scss +0 -42
- package/dist/legacy-styles/_layout.scss +0 -211
- package/dist/legacy-styles/_router.scss +0 -19
- package/dist/legacy-styles/_sidebar.scss +0 -54
- package/dist/legacy-styles/mixins/_sidebar.scss +0 -209
package/README.md
CHANGED
|
@@ -24,14 +24,25 @@ import "blue-web/dist/js/progress.js"
|
|
|
24
24
|
// ...
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
+
**Important:** Since 1.14.0 JavaScript files are compiled as ES modules. When you embed them in HTML using the `<script>` don't forget the `type="module"` attribute.
|
|
28
|
+
|
|
27
29
|
You can also use a CDN like unpkg.com. Only recommended for testing, not for production.
|
|
28
30
|
|
|
29
31
|
```html
|
|
30
|
-
<script src="https://unpkg.com/blue-web@latest/dist/js/dialog.js"></script>
|
|
31
|
-
<script src="https://unpkg.com/blue-web@latest/dist/js/progress.js"></script>
|
|
32
|
+
<script type="module" src="https://unpkg.com/blue-web@latest/dist/js/dialog.js"></script>
|
|
33
|
+
<script type="module" src="https://unpkg.com/blue-web@latest/dist/js/progress.js"></script>
|
|
32
34
|
<!-- ... -->
|
|
33
35
|
```
|
|
34
36
|
|
|
37
|
+
JavaScript files are compiled as ES modules. This allows you to use import functions like this:
|
|
38
|
+
|
|
39
|
+
```html
|
|
40
|
+
<script type="module">
|
|
41
|
+
import { tell } from "https://unpkg.com/blue-web@latest/dist/js/dialog.js"
|
|
42
|
+
tell("You are awesome!")
|
|
43
|
+
</script>
|
|
44
|
+
```
|
|
45
|
+
|
|
35
46
|
## Customization and theming
|
|
36
47
|
|
|
37
48
|
Since Blue Web is based on Bootstrap, you can customize many things by overriding Sass or CSS variables. For more information, see the [Bootstrap documentation](https://getbootstrap.com/docs/5.3/customize/overview/). Blue Web also provides some additional variables that you can use and override. Take a look at [dist/styles/\_variables.scss](https://github.com/bruegmann/blue-web/blob/main/dist/styles/_variables.scss) to see all of them.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
(()=>{"use strict";window.blueWeb=window.blueWeb||{},window.blueWeb.actions={init:function(e){let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;function n(){for(const e of i.children)e.style.display="none";for(const e of t.children)e.style.display="",e.classList.add("BLUE-actions-collapse-visible");let n=0;for(const s of i.children){if(s.style.display="",t.children[n].style.display="none",t.children[n].classList.remove("BLUE-actions-collapse-visible"),e.scrollWidth>e.clientWidth){s.style.display="none",t.children[n].style.display="",t.children[n].classList.add("BLUE-actions-collapse-visible");break}n++}}i||(i=e.querySelector(".BLUE-actions-menu")),t||(t=e.querySelector(".BLUE-actions-collapse-menu")),n();const s=new ResizeObserver((()=>{requestAnimationFrame(n)}));s.observe(e);const l=i=>{if(!e)return;const t=e.querySelectorAll("details[open]");!t||t.length<=0||t.forEach((e=>{e.contains(i.target)||e.removeAttribute("open")}))};return document.addEventListener("click",l),{updateActions:n,resizeObserver:s,destroy(){s.disconnect(),document.removeEventListener("click",l)}}}}})();
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export function init(actionsElement) {
|
|
2
|
+
let menu = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
|
|
3
|
+
let collapseMenu = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
|
|
4
|
+
if (!menu) menu = actionsElement.querySelector(".BLUE-actions-menu");
|
|
5
|
+
if (!collapseMenu) collapseMenu = actionsElement.querySelector(".BLUE-actions-collapse-menu");
|
|
6
|
+
function updateActions() {
|
|
7
|
+
// reset
|
|
8
|
+
for (const item of menu.children) {
|
|
9
|
+
;
|
|
10
|
+
item.style.display = "none";
|
|
11
|
+
}
|
|
12
|
+
for (const item of collapseMenu.children) {
|
|
13
|
+
;
|
|
14
|
+
item.style.display = "";
|
|
15
|
+
item.classList.add("BLUE-actions-collapse-visible");
|
|
16
|
+
}
|
|
17
|
+
let i = 0;
|
|
18
|
+
for (const item of menu.children) {
|
|
19
|
+
;
|
|
20
|
+
item.style.display = "";
|
|
21
|
+
collapseMenu.children[i].style.display = "none";
|
|
22
|
+
collapseMenu.children[i].classList.remove("BLUE-actions-collapse-visible");
|
|
23
|
+
if (actionsElement.scrollWidth > actionsElement.clientWidth) {
|
|
24
|
+
;
|
|
25
|
+
item.style.display = "none";
|
|
26
|
+
collapseMenu.children[i].style.display = "";
|
|
27
|
+
collapseMenu.children[i].classList.add("BLUE-actions-collapse-visible");
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
i++;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
updateActions();
|
|
34
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
35
|
+
requestAnimationFrame(updateActions);
|
|
36
|
+
});
|
|
37
|
+
resizeObserver.observe(actionsElement);
|
|
38
|
+
const outsideClickHandler = event => {
|
|
39
|
+
if (!actionsElement) return;
|
|
40
|
+
const openDetails = actionsElement.querySelectorAll("details[open]");
|
|
41
|
+
if (!openDetails || openDetails.length <= 0) return;
|
|
42
|
+
openDetails.forEach(details => {
|
|
43
|
+
if (!details.contains(event.target)) {
|
|
44
|
+
details.removeAttribute("open");
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
document.addEventListener("click", outsideClickHandler);
|
|
49
|
+
return {
|
|
50
|
+
updateActions,
|
|
51
|
+
resizeObserver,
|
|
52
|
+
destroy() {
|
|
53
|
+
resizeObserver.disconnect();
|
|
54
|
+
document.removeEventListener("click", outsideClickHandler);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
window.blueWeb = window.blueWeb || {};
|
|
59
|
+
window.blueWeb.actions = {
|
|
60
|
+
init
|
|
61
|
+
};
|
package/dist/js/color-mode.js
CHANGED
|
@@ -1,20 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.set = exports.init = exports.getStored = exports.getPreferred = void 0;
|
|
7
|
-
const getStored = () => localStorage.getItem("blue-web-color-mode");
|
|
8
|
-
exports.getStored = getStored;
|
|
9
|
-
const getPreferred = () => {
|
|
1
|
+
export const getStored = () => localStorage.getItem("blue-web-color-mode");
|
|
2
|
+
export const getPreferred = () => {
|
|
10
3
|
const stored = getStored();
|
|
11
4
|
if (stored) {
|
|
12
5
|
return stored;
|
|
13
6
|
}
|
|
14
7
|
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
15
8
|
};
|
|
16
|
-
|
|
17
|
-
const set = colorMode => {
|
|
9
|
+
export const set = colorMode => {
|
|
18
10
|
if (colorMode === "auto") {
|
|
19
11
|
localStorage.removeItem("blue-web-color-mode");
|
|
20
12
|
} else {
|
|
@@ -22,8 +14,7 @@ const set = colorMode => {
|
|
|
22
14
|
}
|
|
23
15
|
init();
|
|
24
16
|
};
|
|
25
|
-
|
|
26
|
-
const init = () => {
|
|
17
|
+
export const init = () => {
|
|
27
18
|
const colorMode = getPreferred();
|
|
28
19
|
if (colorMode === "auto" && window.matchMedia("(prefers-color-scheme: dark)").matches) {
|
|
29
20
|
document.documentElement.setAttribute("data-bs-theme", "dark");
|
|
@@ -31,7 +22,6 @@ const init = () => {
|
|
|
31
22
|
document.documentElement.setAttribute("data-bs-theme", colorMode);
|
|
32
23
|
}
|
|
33
24
|
};
|
|
34
|
-
exports.init = init;
|
|
35
25
|
const onMatchMediaChange = () => {
|
|
36
26
|
localStorage.removeItem("blue-web-color-mode");
|
|
37
27
|
init();
|
package/dist/js/dialog.js
CHANGED
|
@@ -1,36 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.ask = ask;
|
|
7
|
-
exports.tell = tell;
|
|
8
|
-
exports.verify = verify;
|
|
9
|
-
var _utils = require("./utils");
|
|
10
|
-
var _shared = require("./shared");
|
|
11
|
-
async function ask(text) {
|
|
1
|
+
import { guid } from "./utils";
|
|
2
|
+
import { getPhrase } from "./shared";
|
|
3
|
+
export async function ask(text) {
|
|
12
4
|
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
13
5
|
return await dialog("ask", text, options);
|
|
14
6
|
}
|
|
15
|
-
async function tell(text) {
|
|
7
|
+
export async function tell(text) {
|
|
16
8
|
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
17
9
|
await dialog("tell", text, options);
|
|
18
10
|
}
|
|
19
|
-
async function verify(text) {
|
|
11
|
+
export async function verify(text) {
|
|
20
12
|
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
21
13
|
return (await dialog("verify", text, options)) === true;
|
|
22
14
|
}
|
|
23
15
|
async function dialog(dialogType, text) {
|
|
24
16
|
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
25
17
|
let {
|
|
26
|
-
title =
|
|
18
|
+
title = getPhrase("Message"),
|
|
27
19
|
icon = undefined,
|
|
28
20
|
switchPrimaryBtn = false,
|
|
29
|
-
acceptBtnText = dialogType === "verify" ?
|
|
30
|
-
cancelBtnText = dialogType === "verify" ?
|
|
21
|
+
acceptBtnText = dialogType === "verify" ? getPhrase("Yes") : "OK",
|
|
22
|
+
cancelBtnText = dialogType === "verify" ? getPhrase("No") : getPhrase("Cancel"),
|
|
31
23
|
inputType = "text"
|
|
32
24
|
} = options;
|
|
33
|
-
const id =
|
|
25
|
+
const id = guid();
|
|
34
26
|
const addToDom = () => {
|
|
35
27
|
document.body.insertAdjacentHTML("beforeend", /* HTML */`<dialog class="blue-modal modal" id="${id}" aria-labelledby="${id}-label">
|
|
36
28
|
<div class="modal-dialog">
|
package/dist/js/edit-view.js
CHANGED
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.EditView = void 0;
|
|
7
1
|
/**
|
|
8
2
|
* EditView is a Custom Element that displays a edit view of its content and allows the user to confirm or dismiss the changes.
|
|
9
3
|
*/
|
|
10
|
-
class EditView extends HTMLElement {
|
|
4
|
+
export class EditView extends HTMLElement {
|
|
11
5
|
connectedCallback() {
|
|
12
6
|
this.render();
|
|
13
7
|
}
|
|
@@ -59,5 +53,4 @@ class EditView extends HTMLElement {
|
|
|
59
53
|
}));
|
|
60
54
|
}
|
|
61
55
|
}
|
|
62
|
-
exports.EditView = EditView;
|
|
63
56
|
customElements.define("edit-view", EditView);
|
package/dist/js/progress.js
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
1
|
window.blueWeb = window.blueWeb || {};
|
|
8
2
|
window.blueWeb.progress = {
|
|
9
3
|
progress: 0
|
|
@@ -58,4 +52,4 @@ window.blueWeb.progress = {
|
|
|
58
52
|
}, 500);
|
|
59
53
|
}
|
|
60
54
|
};
|
|
61
|
-
|
|
55
|
+
export default window.blueWeb.progress;
|
package/dist/js/read-view.js
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.ReadView = void 0;
|
|
7
1
|
const DRAG_THRESHOLD = 5;
|
|
8
2
|
|
|
9
3
|
/**
|
|
@@ -25,7 +19,7 @@ const DRAG_THRESHOLD = 5;
|
|
|
25
19
|
* setEditing(true)
|
|
26
20
|
* })
|
|
27
21
|
*/
|
|
28
|
-
class ReadView extends HTMLElement {
|
|
22
|
+
export class ReadView extends HTMLElement {
|
|
29
23
|
startX = 0;
|
|
30
24
|
startY = 0;
|
|
31
25
|
constructor() {
|
|
@@ -126,5 +120,4 @@ class ReadView extends HTMLElement {
|
|
|
126
120
|
}
|
|
127
121
|
}
|
|
128
122
|
}
|
|
129
|
-
exports.ReadView = ReadView;
|
|
130
123
|
customElements.define("read-view", ReadView);
|
package/dist/js/shared.js
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.getPhrase = getPhrase;
|
|
7
1
|
const phrases = {
|
|
8
2
|
Cancel: ["Cancel", "Abbrechen"],
|
|
9
3
|
Yes: ["Yes", "Ja"],
|
|
@@ -14,7 +8,7 @@ const phrases = {
|
|
|
14
8
|
Error: ["Error", "Fehler"],
|
|
15
9
|
Information: ["Information", "Information"]
|
|
16
10
|
};
|
|
17
|
-
function getPhrase(keyword) {
|
|
11
|
+
export function getPhrase(keyword) {
|
|
18
12
|
let countryCode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
|
|
19
13
|
let _phrases = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
|
|
20
14
|
countryCode = countryCode || navigator.language.toLowerCase().indexOf("de") > -1 ? "de-DE" : "en-US";
|
package/dist/js/side-layout.js
CHANGED
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.SideLayout = void 0;
|
|
7
|
-
class SideLayout extends HTMLElement {
|
|
1
|
+
export class SideLayout extends HTMLElement {
|
|
8
2
|
constructor() {
|
|
9
3
|
super();
|
|
10
4
|
this.attachShadow({
|
|
@@ -173,5 +167,4 @@ class SideLayout extends HTMLElement {
|
|
|
173
167
|
}
|
|
174
168
|
}
|
|
175
169
|
}
|
|
176
|
-
exports.SideLayout = SideLayout;
|
|
177
170
|
customElements.define("side-layout", SideLayout);
|
package/dist/js/utils.js
CHANGED
|
@@ -1,30 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.fetchData = fetchData;
|
|
7
|
-
exports.finishLoading = finishLoading;
|
|
8
|
-
exports.guid = void 0;
|
|
9
|
-
exports.hideSuccess = hideSuccess;
|
|
10
|
-
exports.resetAlertMessage = resetAlertMessage;
|
|
11
|
-
exports.scrollToTop = scrollToTop;
|
|
12
|
-
exports.setAlertMessage = setAlertMessage;
|
|
13
|
-
exports.showSuccess = showSuccess;
|
|
14
|
-
exports.startLoading = startLoading;
|
|
15
|
-
function startLoading() {
|
|
1
|
+
export function startLoading() {
|
|
16
2
|
;
|
|
17
3
|
document.querySelector(".blue-loading").style.display = "block";
|
|
18
4
|
}
|
|
19
|
-
function finishLoading() {
|
|
5
|
+
export function finishLoading() {
|
|
20
6
|
;
|
|
21
7
|
document.querySelector(".blue-loading").style.display = "";
|
|
22
8
|
}
|
|
23
|
-
function showSuccess() {
|
|
9
|
+
export function showSuccess() {
|
|
24
10
|
;
|
|
25
11
|
document.querySelector(".blue-status-success").style.display = "flex";
|
|
26
12
|
}
|
|
27
|
-
function hideSuccess() {
|
|
13
|
+
export function hideSuccess() {
|
|
28
14
|
;
|
|
29
15
|
document.querySelector(".blue-status-success").style.display = "";
|
|
30
16
|
}
|
|
@@ -34,7 +20,7 @@ function hideSuccess() {
|
|
|
34
20
|
* When using React, you should use `StatusProvider` instead: https://bruegmann.github.io/blue-react/v9/component/StatusProvider
|
|
35
21
|
* @param alertClassName Leave empty to reset messages of any status type
|
|
36
22
|
*/
|
|
37
|
-
function resetAlertMessage(alertClassName) {
|
|
23
|
+
export function resetAlertMessage(alertClassName) {
|
|
38
24
|
if (!alertClassName) {
|
|
39
25
|
;
|
|
40
26
|
["loading", "success", "info", "warning", "danger"].forEach(status => {
|
|
@@ -54,7 +40,7 @@ function resetAlertMessage(alertClassName) {
|
|
|
54
40
|
/**
|
|
55
41
|
* When using React, you should use `StatusProvider` instead: https://bruegmann.github.io/blue-react/v9/component/StatusProvider
|
|
56
42
|
*/
|
|
57
|
-
function setAlertMessage(message) {
|
|
43
|
+
export function setAlertMessage(message) {
|
|
58
44
|
let alertClassName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "info";
|
|
59
45
|
let close = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
60
46
|
let detailText = arguments.length > 3 ? arguments[3] : undefined;
|
|
@@ -82,9 +68,8 @@ function setAlertMessage(message) {
|
|
|
82
68
|
function s4() {
|
|
83
69
|
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
|
|
84
70
|
}
|
|
85
|
-
const guid = () => s4() + s4() + "-" + s4() + "-" + s4() + "-" + s4() + "-" + s4() + s4() + s4();
|
|
86
|
-
|
|
87
|
-
function scrollToTop() {
|
|
71
|
+
export const guid = () => s4() + s4() + "-" + s4() + "-" + s4() + "-" + s4() + "-" + s4() + s4() + s4();
|
|
72
|
+
export function scrollToTop() {
|
|
88
73
|
const routerPage = document.querySelector(".router-page.active");
|
|
89
74
|
routerPage.scroll({
|
|
90
75
|
behavior: "smooth",
|
|
@@ -103,7 +88,7 @@ const httpStatusCodes = {
|
|
|
103
88
|
500: "Internal Server Error",
|
|
104
89
|
502: "Bad Gateway"
|
|
105
90
|
};
|
|
106
|
-
function fetchData(input, init) {
|
|
91
|
+
export function fetchData(input, init) {
|
|
107
92
|
let showErrorDetail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
108
93
|
let onError = arguments.length > 3 ? arguments[3] : undefined;
|
|
109
94
|
return fetch(input, init).then(response => {
|
package/dist/merged.scss
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Blue Web v1.
|
|
2
|
+
* Blue Web v1.14.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
|
|
|
@@ -11150,6 +11150,17 @@ body {
|
|
|
11150
11150
|
border: 1px solid color-mix(in srgb, currentColor 15%, transparent);
|
|
11151
11151
|
background-color: var(--blue-menu-item-dropdown-bg);
|
|
11152
11152
|
}
|
|
11153
|
+
|
|
11154
|
+
&[popover] {
|
|
11155
|
+
position: fixed;
|
|
11156
|
+
margin: 0;
|
|
11157
|
+
padding: 0;
|
|
11158
|
+
z-index: 1000;
|
|
11159
|
+
border: none;
|
|
11160
|
+
background: transparent;
|
|
11161
|
+
border-radius: calc(#{$border-radius} + 0.1rem);
|
|
11162
|
+
box-shadow: $box-shadow;
|
|
11163
|
+
}
|
|
11153
11164
|
}
|
|
11154
11165
|
|
|
11155
11166
|
.blue-menu-item-dropdown-caret.blue-caret {
|
|
@@ -11200,7 +11211,8 @@ body {
|
|
|
11200
11211
|
|
|
11201
11212
|
&:hover,
|
|
11202
11213
|
&:active,
|
|
11203
|
-
&.highlighted
|
|
11214
|
+
&.highlighted,
|
|
11215
|
+
&:has(+ :popover-open) {
|
|
11204
11216
|
color: inherit;
|
|
11205
11217
|
border-color: transparent;
|
|
11206
11218
|
|
|
@@ -11210,7 +11222,8 @@ body {
|
|
|
11210
11222
|
}
|
|
11211
11223
|
}
|
|
11212
11224
|
|
|
11213
|
-
&.highlighted
|
|
11225
|
+
&.highlighted,
|
|
11226
|
+
&:has(+ :popover-open) {
|
|
11214
11227
|
&::before {
|
|
11215
11228
|
opacity: 0.16;
|
|
11216
11229
|
}
|
|
@@ -11378,11 +11391,6 @@ body {
|
|
|
11378
11391
|
var(--bs-btn-padding-x, 0.75rem) + var(--bs-btn-border-width, 1px)
|
|
11379
11392
|
);
|
|
11380
11393
|
|
|
11381
|
-
display: inline;
|
|
11382
|
-
left: 0;
|
|
11383
|
-
right: 0;
|
|
11384
|
-
top: 0;
|
|
11385
|
-
padding: 0;
|
|
11386
11394
|
max-height: $normal-size;
|
|
11387
11395
|
overflow: hidden;
|
|
11388
11396
|
|
|
@@ -11395,6 +11403,9 @@ body {
|
|
|
11395
11403
|
}
|
|
11396
11404
|
|
|
11397
11405
|
&.open {
|
|
11406
|
+
left: 0;
|
|
11407
|
+
right: 0;
|
|
11408
|
+
top: 0;
|
|
11398
11409
|
background-color: var(--blue-menu-item-dropdown-bg);
|
|
11399
11410
|
}
|
|
11400
11411
|
|
|
@@ -11433,16 +11444,6 @@ body {
|
|
|
11433
11444
|
}
|
|
11434
11445
|
}
|
|
11435
11446
|
|
|
11436
|
-
.blue-actions-menu-toggle > span:first-child {
|
|
11437
|
-
transform: rotate(90deg);
|
|
11438
|
-
}
|
|
11439
|
-
|
|
11440
|
-
.blue-actions-menu-item {
|
|
11441
|
-
display: flex;
|
|
11442
|
-
align-items: center;
|
|
11443
|
-
color: inherit;
|
|
11444
|
-
}
|
|
11445
|
-
|
|
11446
11447
|
.blue-caret {
|
|
11447
11448
|
/* treat like a font icon */
|
|
11448
11449
|
font-family: "blueicon" !important;
|
|
@@ -12186,8 +12187,6 @@ dialog.blue-modal:has(.offcanvas-start) {
|
|
|
12186
12187
|
}
|
|
12187
12188
|
|
|
12188
12189
|
// Collapse with details and animated
|
|
12189
|
-
// Right now not part of Blue Web, but could become one
|
|
12190
|
-
|
|
12191
12190
|
.blue-collapse {
|
|
12192
12191
|
interpolate-size: allow-keywords;
|
|
12193
12192
|
|
|
@@ -12221,14 +12220,20 @@ dialog.blue-modal:has(.offcanvas-start) {
|
|
|
12221
12220
|
|
|
12222
12221
|
&::details-content {
|
|
12223
12222
|
block-size: 0;
|
|
12223
|
+
opacity: 0;
|
|
12224
|
+
translate: 0 -100%;
|
|
12224
12225
|
transition:
|
|
12225
12226
|
block-size 0.2s,
|
|
12226
|
-
content-visibility 0.2s
|
|
12227
|
+
content-visibility 0.2s,
|
|
12228
|
+
opacity 0.2s,
|
|
12229
|
+
translate 0.2s;
|
|
12227
12230
|
transition-behavior: allow-discrete;
|
|
12228
12231
|
}
|
|
12229
12232
|
|
|
12230
12233
|
&[open]::details-content {
|
|
12231
12234
|
block-size: auto;
|
|
12235
|
+
opacity: 1;
|
|
12236
|
+
translate: 0;
|
|
12232
12237
|
}
|
|
12233
12238
|
}
|
|
12234
12239
|
|
|
@@ -12239,6 +12244,118 @@ dialog.blue-modal:has(.offcanvas-start) {
|
|
|
12239
12244
|
}
|
|
12240
12245
|
}
|
|
12241
12246
|
|
|
12247
|
+
// Let's you group a collapse together with another UI element like a button that should come before the collapse summary.
|
|
12248
|
+
.blue-collapse-group {
|
|
12249
|
+
display: grid;
|
|
12250
|
+
grid-template-rows: auto;
|
|
12251
|
+
grid-template-columns: 1fr;
|
|
12252
|
+
|
|
12253
|
+
& > details {
|
|
12254
|
+
display: contents;
|
|
12255
|
+
|
|
12256
|
+
& > summary {
|
|
12257
|
+
grid-column: 2;
|
|
12258
|
+
|
|
12259
|
+
& + * {
|
|
12260
|
+
width: calc(100% + 1rem - 2px);
|
|
12261
|
+
}
|
|
12262
|
+
}
|
|
12263
|
+
}
|
|
12264
|
+
}
|
|
12265
|
+
|
|
12266
|
+
.BLUE-actions {
|
|
12267
|
+
display: flex;
|
|
12268
|
+
white-space: nowrap;
|
|
12269
|
+
}
|
|
12270
|
+
|
|
12271
|
+
.BLUE-actions-menu {
|
|
12272
|
+
display: flex;
|
|
12273
|
+
max-width: 100%;
|
|
12274
|
+
}
|
|
12275
|
+
|
|
12276
|
+
.BLUE-actions-collapse {
|
|
12277
|
+
position: relative;
|
|
12278
|
+
}
|
|
12279
|
+
|
|
12280
|
+
.BLUE-actions-collapse:not(:has(.BLUE-actions-collapse-visible)) {
|
|
12281
|
+
display: none;
|
|
12282
|
+
}
|
|
12283
|
+
|
|
12284
|
+
.BLUE-actions-collapse-menu {
|
|
12285
|
+
position: absolute;
|
|
12286
|
+
}
|
|
12287
|
+
|
|
12288
|
+
.blue-anchor {
|
|
12289
|
+
anchor-name: var(--blue-anchor-name, --anchor-1);
|
|
12290
|
+
}
|
|
12291
|
+
|
|
12292
|
+
.blue-anchored {
|
|
12293
|
+
top: anchor(var(--blue-anchor-name, --anchor-1) bottom);
|
|
12294
|
+
}
|
|
12295
|
+
|
|
12296
|
+
.blue-anchored-start {
|
|
12297
|
+
left: anchor(var(--blue-anchor-name, --anchor-1) left);
|
|
12298
|
+
}
|
|
12299
|
+
|
|
12300
|
+
.blue-anchored-end {
|
|
12301
|
+
left: anchor(var(--blue-anchor-name, --anchor-1) right);
|
|
12302
|
+
translate: -100%;
|
|
12303
|
+
}
|
|
12304
|
+
|
|
12305
|
+
@supports not (anchor-name: --anchor-1) {
|
|
12306
|
+
.blue-anchored-end {
|
|
12307
|
+
translate: none;
|
|
12308
|
+
}
|
|
12309
|
+
|
|
12310
|
+
.blue-anchored-fallback {
|
|
12311
|
+
left: 50%;
|
|
12312
|
+
top: 50%;
|
|
12313
|
+
translate: -50% -50%;
|
|
12314
|
+
|
|
12315
|
+
&::backdrop {
|
|
12316
|
+
--bs-backdrop-bg: #000;
|
|
12317
|
+
--bs-backdrop-opacity: 0.5;
|
|
12318
|
+
background-color: var(--bs-backdrop-bg);
|
|
12319
|
+
transition: opacity 0.2s;
|
|
12320
|
+
opacity: var(--bs-backdrop-opacity);
|
|
12321
|
+
}
|
|
12322
|
+
}
|
|
12323
|
+
}
|
|
12324
|
+
|
|
12325
|
+
|
|
12326
|
+
/* Make DevExpress components look more like Bootstrap/Blue */
|
|
12327
|
+
[class^="dxbl-"] {
|
|
12328
|
+
--dxbl-text-edit-border-radius: var(--bs-border-radius) !important;
|
|
12329
|
+
--dxbl-text-edit-padding-x: 0.75rem !important;
|
|
12330
|
+
--dxbl-text-edit-padding-y: 0.375rem !important;
|
|
12331
|
+
--dxbl-text-edit-line-height: 1.5 !important;
|
|
12332
|
+
--dxbl-text-edit-focus-shadow-spread: 0.25rem !important;
|
|
12333
|
+
--dxbl-listbox-border-radius: var(--bs-border-radius) !important;
|
|
12334
|
+
--dxbl-toolbar-font-size: var(--bs-body-font-size) !important;
|
|
12335
|
+
--dxbl-toolbar-btn-border-radius: var(--bs-border-radius) !important;
|
|
12336
|
+
--dxbl-dropdown-border-radius: var(--bs-border-radius) !important;
|
|
12337
|
+
--dxbl-btn-border-radius: var(--bs-border-radius) !important;
|
|
12338
|
+
--dxbl-btn-padding-x: 0.75rem !important;
|
|
12339
|
+
--dxbl-btn-padding-y: 0.375rem !important;
|
|
12340
|
+
}
|
|
12341
|
+
|
|
12342
|
+
.dxbl-grid {
|
|
12343
|
+
--dxbl-grid-font-size: 1rem;
|
|
12344
|
+
border: none;
|
|
12345
|
+
}
|
|
12346
|
+
|
|
12347
|
+
.dxbl-text-edit {
|
|
12348
|
+
font-size: 1rem;
|
|
12349
|
+
}
|
|
12350
|
+
|
|
12351
|
+
.dxbl-toolbar {
|
|
12352
|
+
--dxbl-toolbar-font-size: var(--bs-body-font-size) !important;
|
|
12353
|
+
font-size: var(--dxbl-toolbar-font-size);
|
|
12354
|
+
}
|
|
12355
|
+
|
|
12356
|
+
body.modal-open .dxbl-popup-cell[style="z-index: 1050;"] {
|
|
12357
|
+
z-index: 1056 !important;
|
|
12358
|
+
}
|
|
12242
12359
|
|
|
12243
12360
|
:root {
|
|
12244
12361
|
--bs-font-sans-serif: Inter, #{$font-family-sans-serif};
|