@betterportal/theme-bootstrap1 10.1.40 → 10.1.41
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 +2 -1
- package/lib/bp-contracts/org.betterportal.theme.bootstrap1.json +1 -1
- package/lib/plugins/service-betterportal-theme-bootstrap1/adapter.d.ts +2 -0
- package/lib/plugins/service-betterportal-theme-bootstrap1/adapter.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-theme-bootstrap1/adapter.js +114 -0
- package/lib/plugins/service-betterportal-theme-bootstrap1/adapter.js.map +1 -0
- package/lib/plugins/service-betterportal-theme-bootstrap1/assets.d.ts.map +1 -1
- package/lib/plugins/service-betterportal-theme-bootstrap1/assets.js +19 -2242
- package/lib/plugins/service-betterportal-theme-bootstrap1/assets.js.map +1 -1
- package/lib/schemas/service-betterportal-theme-bootstrap1.json +1 -1
- package/lib/schemas/service-betterportal-theme-bootstrap1.plugin.json +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -7,4 +7,5 @@ Design goals:
|
|
|
7
7
|
- modern and minimal
|
|
8
8
|
- clean light and dark modes
|
|
9
9
|
- shell-first, not app-logic-first
|
|
10
|
-
- HTMX
|
|
10
|
+
- HTMX shell behavior supplied by `@betterportal/theme-runtime`
|
|
11
|
+
- Bootstrap-specific modal, offcanvas, loading, and component presentation
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"pluginId": "org.betterportal.theme.bootstrap1",
|
|
5
5
|
"title": "Bootstrap1 Theme",
|
|
6
6
|
"description": "Bootstrap 5 + htmx theme that renders BetterPortal app shells.",
|
|
7
|
-
"version": "10.1.
|
|
7
|
+
"version": "10.1.41",
|
|
8
8
|
"category": "theme",
|
|
9
9
|
"deploymentModes": [
|
|
10
10
|
"self-hosted"
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const Bootstrap1AdapterSource = "\n(() => {\n const bootstrap = window.bootstrap;\n const teleported = new Set();\n const convertSidebars = (root) => {\n if (!root) return;\n root.querySelectorAll('[data-bp-sidebar]:not([data-bp-sidebar-ready])').forEach((element) => {\n const id = element.getAttribute('data-bp-sidebar') || ('bp-sidebar-' + Math.random().toString(36).slice(2));\n const title = element.getAttribute('data-bp-sidebar-title') || '';\n const position = element.getAttribute('data-bp-sidebar-position') || 'end';\n const width = element.getAttribute('data-bp-sidebar-width');\n const content = element.innerHTML;\n element.id = id;\n element.setAttribute('data-bp-sidebar-ready', '');\n element.className = ('offcanvas offcanvas-' + position + ' ' + element.className).trim();\n element.setAttribute('tabindex', '-1');\n if (width) element.style.width = width;\n element.innerHTML = '<div class=\"offcanvas-header\">' + (title ? '<h5 class=\"offcanvas-title\">' + title + '</h5>' : '<span></span>') + '<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"offcanvas\" aria-label=\"Close\"></button></div><div class=\"offcanvas-body\">' + content + '</div>';\n });\n root.querySelectorAll('[data-bp-sidebar-open]:not([data-bp-trigger-ready])').forEach((button) => {\n button.setAttribute('data-bp-trigger-ready', '');\n button.setAttribute('data-bs-toggle', 'offcanvas');\n button.setAttribute('data-bs-target', '#' + button.getAttribute('data-bp-sidebar-open'));\n });\n }; const initComponents = (root) => {\n if (!root || !bootstrap) return;\n convertSidebars(root);\n root.querySelectorAll('[data-bs-toggle=\"tooltip\"]').forEach((el) => {\n if (!bootstrap.Tooltip.getInstance(el)) new bootstrap.Tooltip(el);\n });\n root.querySelectorAll('[data-bs-toggle=\"popover\"]').forEach((el) => {\n if (!bootstrap.Popover.getInstance(el)) new bootstrap.Popover(el);\n });\n };\n window.BetterPortalThemeAdapter = {\n initComponents,\n disposeComponents(root) {\n if (!root || !bootstrap) return;\n root.querySelectorAll('[data-bs-toggle=\"tooltip\"],[data-bs-toggle=\"popover\"]').forEach((el) => {\n bootstrap.Tooltip.getInstance(el)?.dispose();\n bootstrap.Popover.getInstance(el)?.dispose();\n });\n },\n prepareContent(root) {\n if (!root) return;\n root.querySelectorAll(\".modal,.offcanvas\").forEach((element) => {\n element.setAttribute(\"data-bp-content-owned\", \"true\");\n const serviceId = root.closest(\"[data-bp-service]\")?.getAttribute(\"data-bp-service\")\n || document.querySelector(\"#bp-main\")?.getAttribute(\"data-bp-service\");\n if (serviceId && !element.hasAttribute(\"data-bp-service\")) element.setAttribute(\"data-bp-service\", serviceId);\n document.body.appendChild(element);\n teleported.add(element);\n });\n },\n cleanupTransientUi() {\n teleported.forEach((element) => {\n try {\n bootstrap?.Modal.getInstance(element)?.dispose();\n bootstrap?.Offcanvas.getInstance(element)?.dispose();\n } catch {}\n element.remove();\n });\n teleported.clear();\n document.querySelectorAll(\".modal-backdrop,.offcanvas-backdrop\").forEach((element) => element.remove());\n document.body.classList.remove(\"modal-open\");\n document.body.style.removeProperty(\"overflow\");\n document.body.style.removeProperty(\"padding-right\");\n },\n closeContainingOverlay(source) {\n const panel = source?.closest?.(\".offcanvas.show,.offcanvas.showing,.offcanvas.hiding\");\n if (!panel || !bootstrap) return;\n (bootstrap.Offcanvas.getInstance(panel) || new bootstrap.Offcanvas(panel)).hide();\n },\n syncOverlays() {\n if (document.querySelector(\".modal.show,.modal.showing,.offcanvas.show,.offcanvas.showing\")) return;\n document.querySelectorAll(\".modal-backdrop,.offcanvas-backdrop\").forEach((element) => element.remove());\n document.body.classList.remove(\"modal-open\");\n document.body.style.removeProperty(\"overflow\");\n document.body.style.removeProperty(\"padding-right\");\n },\n scrollToTop() {\n document.querySelectorAll(\".bp-admin__workspace,.bp-admin__content-frame,.bp-shell__main\").forEach((element) => {\n element.scrollTo?.({ top: 0, left: 0, behavior: \"auto\" });\n });\n window.scrollTo({ top: 0, left: 0, behavior: \"auto\" });\n },\n setLoading(loading) {\n document.querySelector(\".bp-admin__content-frame\")?.classList.toggle(\"is-loading\", loading);\n document.querySelector(\"#bp-topbar-progress\")?.classList.toggle(\"is-active\", loading);\n },\n showRequestError(status, content) {\n if (!bootstrap) {\n window.alert(\"Request failed (\" + status + \")\");\n return;\n }\n let modal = document.querySelector(\"#bp-request-error-modal\");\n if (!modal) {\n modal = document.createElement(\"div\");\n modal.id = \"bp-request-error-modal\";\n modal.className = \"modal fade\";\n modal.tabIndex = -1;\n modal.innerHTML = '<div class=\"modal-dialog modal-dialog-centered\"><div class=\"modal-content\"><div class=\"modal-header\"><h5 class=\"modal-title\">Request failed</h5><button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button></div><div class=\"modal-body\" data-bp-request-error-body></div><div class=\"modal-footer\"><button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Dismiss</button></div></div></div>';\n document.body.appendChild(modal);\n }\n const body = modal.querySelector(\"[data-bp-request-error-body]\");\n if (body) {\n body.innerHTML = content || '<div class=\"alert alert-danger mb-0\">Request failed. Try again.</div>';\n window.htmx.process(body);\n }\n bootstrap.Modal.getOrCreateInstance(modal).show();\n }\n };\n})();";
|
|
2
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-theme-bootstrap1/adapter.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,y7LAgH9B,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
export const Bootstrap1AdapterSource = `
|
|
2
|
+
(() => {
|
|
3
|
+
const bootstrap = window.bootstrap;
|
|
4
|
+
const teleported = new Set();
|
|
5
|
+
const convertSidebars = (root) => {
|
|
6
|
+
if (!root) return;
|
|
7
|
+
root.querySelectorAll('[data-bp-sidebar]:not([data-bp-sidebar-ready])').forEach((element) => {
|
|
8
|
+
const id = element.getAttribute('data-bp-sidebar') || ('bp-sidebar-' + Math.random().toString(36).slice(2));
|
|
9
|
+
const title = element.getAttribute('data-bp-sidebar-title') || '';
|
|
10
|
+
const position = element.getAttribute('data-bp-sidebar-position') || 'end';
|
|
11
|
+
const width = element.getAttribute('data-bp-sidebar-width');
|
|
12
|
+
const content = element.innerHTML;
|
|
13
|
+
element.id = id;
|
|
14
|
+
element.setAttribute('data-bp-sidebar-ready', '');
|
|
15
|
+
element.className = ('offcanvas offcanvas-' + position + ' ' + element.className).trim();
|
|
16
|
+
element.setAttribute('tabindex', '-1');
|
|
17
|
+
if (width) element.style.width = width;
|
|
18
|
+
element.innerHTML = '<div class="offcanvas-header">' + (title ? '<h5 class="offcanvas-title">' + title + '</h5>' : '<span></span>') + '<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button></div><div class="offcanvas-body">' + content + '</div>';
|
|
19
|
+
});
|
|
20
|
+
root.querySelectorAll('[data-bp-sidebar-open]:not([data-bp-trigger-ready])').forEach((button) => {
|
|
21
|
+
button.setAttribute('data-bp-trigger-ready', '');
|
|
22
|
+
button.setAttribute('data-bs-toggle', 'offcanvas');
|
|
23
|
+
button.setAttribute('data-bs-target', '#' + button.getAttribute('data-bp-sidebar-open'));
|
|
24
|
+
});
|
|
25
|
+
}; const initComponents = (root) => {
|
|
26
|
+
if (!root || !bootstrap) return;
|
|
27
|
+
convertSidebars(root);
|
|
28
|
+
root.querySelectorAll('[data-bs-toggle="tooltip"]').forEach((el) => {
|
|
29
|
+
if (!bootstrap.Tooltip.getInstance(el)) new bootstrap.Tooltip(el);
|
|
30
|
+
});
|
|
31
|
+
root.querySelectorAll('[data-bs-toggle="popover"]').forEach((el) => {
|
|
32
|
+
if (!bootstrap.Popover.getInstance(el)) new bootstrap.Popover(el);
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
window.BetterPortalThemeAdapter = {
|
|
36
|
+
initComponents,
|
|
37
|
+
disposeComponents(root) {
|
|
38
|
+
if (!root || !bootstrap) return;
|
|
39
|
+
root.querySelectorAll('[data-bs-toggle="tooltip"],[data-bs-toggle="popover"]').forEach((el) => {
|
|
40
|
+
bootstrap.Tooltip.getInstance(el)?.dispose();
|
|
41
|
+
bootstrap.Popover.getInstance(el)?.dispose();
|
|
42
|
+
});
|
|
43
|
+
},
|
|
44
|
+
prepareContent(root) {
|
|
45
|
+
if (!root) return;
|
|
46
|
+
root.querySelectorAll(".modal,.offcanvas").forEach((element) => {
|
|
47
|
+
element.setAttribute("data-bp-content-owned", "true");
|
|
48
|
+
const serviceId = root.closest("[data-bp-service]")?.getAttribute("data-bp-service")
|
|
49
|
+
|| document.querySelector("#bp-main")?.getAttribute("data-bp-service");
|
|
50
|
+
if (serviceId && !element.hasAttribute("data-bp-service")) element.setAttribute("data-bp-service", serviceId);
|
|
51
|
+
document.body.appendChild(element);
|
|
52
|
+
teleported.add(element);
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
cleanupTransientUi() {
|
|
56
|
+
teleported.forEach((element) => {
|
|
57
|
+
try {
|
|
58
|
+
bootstrap?.Modal.getInstance(element)?.dispose();
|
|
59
|
+
bootstrap?.Offcanvas.getInstance(element)?.dispose();
|
|
60
|
+
} catch {}
|
|
61
|
+
element.remove();
|
|
62
|
+
});
|
|
63
|
+
teleported.clear();
|
|
64
|
+
document.querySelectorAll(".modal-backdrop,.offcanvas-backdrop").forEach((element) => element.remove());
|
|
65
|
+
document.body.classList.remove("modal-open");
|
|
66
|
+
document.body.style.removeProperty("overflow");
|
|
67
|
+
document.body.style.removeProperty("padding-right");
|
|
68
|
+
},
|
|
69
|
+
closeContainingOverlay(source) {
|
|
70
|
+
const panel = source?.closest?.(".offcanvas.show,.offcanvas.showing,.offcanvas.hiding");
|
|
71
|
+
if (!panel || !bootstrap) return;
|
|
72
|
+
(bootstrap.Offcanvas.getInstance(panel) || new bootstrap.Offcanvas(panel)).hide();
|
|
73
|
+
},
|
|
74
|
+
syncOverlays() {
|
|
75
|
+
if (document.querySelector(".modal.show,.modal.showing,.offcanvas.show,.offcanvas.showing")) return;
|
|
76
|
+
document.querySelectorAll(".modal-backdrop,.offcanvas-backdrop").forEach((element) => element.remove());
|
|
77
|
+
document.body.classList.remove("modal-open");
|
|
78
|
+
document.body.style.removeProperty("overflow");
|
|
79
|
+
document.body.style.removeProperty("padding-right");
|
|
80
|
+
},
|
|
81
|
+
scrollToTop() {
|
|
82
|
+
document.querySelectorAll(".bp-admin__workspace,.bp-admin__content-frame,.bp-shell__main").forEach((element) => {
|
|
83
|
+
element.scrollTo?.({ top: 0, left: 0, behavior: "auto" });
|
|
84
|
+
});
|
|
85
|
+
window.scrollTo({ top: 0, left: 0, behavior: "auto" });
|
|
86
|
+
},
|
|
87
|
+
setLoading(loading) {
|
|
88
|
+
document.querySelector(".bp-admin__content-frame")?.classList.toggle("is-loading", loading);
|
|
89
|
+
document.querySelector("#bp-topbar-progress")?.classList.toggle("is-active", loading);
|
|
90
|
+
},
|
|
91
|
+
showRequestError(status, content) {
|
|
92
|
+
if (!bootstrap) {
|
|
93
|
+
window.alert("Request failed (" + status + ")");
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
let modal = document.querySelector("#bp-request-error-modal");
|
|
97
|
+
if (!modal) {
|
|
98
|
+
modal = document.createElement("div");
|
|
99
|
+
modal.id = "bp-request-error-modal";
|
|
100
|
+
modal.className = "modal fade";
|
|
101
|
+
modal.tabIndex = -1;
|
|
102
|
+
modal.innerHTML = '<div class="modal-dialog modal-dialog-centered"><div class="modal-content"><div class="modal-header"><h5 class="modal-title">Request failed</h5><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div><div class="modal-body" data-bp-request-error-body></div><div class="modal-footer"><button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Dismiss</button></div></div></div>';
|
|
103
|
+
document.body.appendChild(modal);
|
|
104
|
+
}
|
|
105
|
+
const body = modal.querySelector("[data-bp-request-error-body]");
|
|
106
|
+
if (body) {
|
|
107
|
+
body.innerHTML = content || '<div class="alert alert-danger mb-0">Request failed. Try again.</div>';
|
|
108
|
+
window.htmx.process(body);
|
|
109
|
+
}
|
|
110
|
+
bootstrap.Modal.getOrCreateInstance(modal).show();
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
})();`;
|
|
114
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-theme-bootstrap1/adapter.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAgHjC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-theme-bootstrap1/assets.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-theme-bootstrap1/assets.tsx"],"names":[],"mappings":"AAUA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAwBD,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAkC/F"}
|