haori-bootstrap 0.3.1 → 0.3.2
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.ja.md +4 -4
- package/README.md +5 -5
- package/dist/haori-bootstrap.iife.js +2 -2
- package/dist/haori-bootstrap.iife.js.map +1 -1
- package/dist/haori-bootstrap.js +254 -230
- package/dist/haori-bootstrap.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +1 -1
package/README.ja.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Haori.js Bootstrap は、Haori.js 向けの Bootstrap ベース UI 拡張ライブラリです。
|
|
4
4
|
|
|
5
|
-
Version: 0.3.
|
|
5
|
+
Version: 0.3.2
|
|
6
6
|
|
|
7
7
|
## 概要
|
|
8
8
|
|
|
@@ -43,7 +43,7 @@ npm install haori-bootstrap
|
|
|
43
43
|
/>
|
|
44
44
|
<script src="https://cdn.jsdelivr.net/npm/haori@0.1.5/dist/haori.iife.js"></script>
|
|
45
45
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js"></script>
|
|
46
|
-
<script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.3.
|
|
46
|
+
<script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.3.2/dist/haori-bootstrap.iife.js"></script>
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
IIFE 版は、window.Haori と window.bootstrap が利用可能な場合に自動で有効化されます。
|
|
@@ -139,12 +139,12 @@ push 後に、そのタグから GitHub Release を published にします。公
|
|
|
139
139
|
次回 patch リリースの例:
|
|
140
140
|
|
|
141
141
|
```bash
|
|
142
|
-
# version が 0.3.
|
|
142
|
+
# version が 0.3.3 になる
|
|
143
143
|
npm version patch
|
|
144
144
|
git push origin main --follow-tags
|
|
145
145
|
```
|
|
146
146
|
|
|
147
|
-
その後、push 済みタグの GitHub Release を作成して published にします。例として次回は `0.3.
|
|
147
|
+
その後、push 済みタグの GitHub Release を作成して published にします。例として次回は `0.3.3` タグになります。
|
|
148
148
|
|
|
149
149
|
自動公開:
|
|
150
150
|
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Haori.js Bootstrap is a Bootstrap-based UI extension library for Haori.js.
|
|
4
4
|
|
|
5
|
-
Version: 0.3.
|
|
5
|
+
Version: 0.3.2
|
|
6
6
|
|
|
7
7
|
## Overview
|
|
8
8
|
|
|
@@ -43,7 +43,7 @@ Load dependencies in this order for browser direct loading:
|
|
|
43
43
|
/>
|
|
44
44
|
<script src="https://cdn.jsdelivr.net/npm/haori@0.1.5/dist/haori.iife.js"></script>
|
|
45
45
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.bundle.min.js"></script>
|
|
46
|
-
<script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.3.
|
|
46
|
+
<script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.3.2/dist/haori-bootstrap.iife.js"></script>
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
The IIFE build auto-enables when both window.Haori and window.bootstrap are available.
|
|
@@ -136,15 +136,15 @@ git push origin main --follow-tags
|
|
|
136
136
|
|
|
137
137
|
After pushing, publish a GitHub Release from the generated version tag. The release workflow then publishes the package and uploads `dist.zip` automatically.
|
|
138
138
|
|
|
139
|
-
Example next patch release after `0.3.
|
|
139
|
+
Example next patch release after `0.3.2`:
|
|
140
140
|
|
|
141
141
|
```bash
|
|
142
|
-
# version becomes 0.3.
|
|
142
|
+
# version becomes 0.3.3
|
|
143
143
|
npm version patch
|
|
144
144
|
git push origin main --follow-tags
|
|
145
145
|
```
|
|
146
146
|
|
|
147
|
-
Create and publish the GitHub Release for the pushed tag such as `0.3.
|
|
147
|
+
Create and publish the GitHub Release for the pushed tag such as `0.3.3`.
|
|
148
148
|
|
|
149
149
|
Release automation:
|
|
150
150
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var HaoriBootstrap=(function(p){"use strict";function F(e){return typeof e=="function"}function z(e){return F(e?.Modal)?e?.Modal:void 0}function O(e){return F(e?.Toast)?e?.Toast:void 0}function k(e){return!!z(e)}function ue(e){return!!O(e)}function L(e,o,t){const n=z(t);if(n)return typeof n.getOrCreateInstance=="function"?n.getOrCreateInstance(e,o):new n(e,o)}function de(e,o,t){const n=O(t);if(n)return typeof n.getOrCreateInstance=="function"?n.getOrCreateInstance(e,o):new n(e,o)}const fe="data-haori-bootstrap-dialog",w="data-haori-bootstrap-action",me="data-haori-bootstrap-dialog-title";let be=0;function W(){return{backdrop:"static",keyboard:!1}}function G(e,o){if(o.dialogContainerSelector){const t=e.querySelector(o.dialogContainerSelector);if(t)return t}return e.body}function V(e,o,t,n){const r=e.createElement("div");r.className="modal fade",r.tabIndex=-1,r.setAttribute(fe,"true"),r.setAttribute("aria-hidden","true");const i=e.createElement("div");i.className="modal-dialog modal-dialog-centered";const c=e.createElement("div");if(c.className="modal-content",n){const u=`haori-dialog-title-${++be}`,A=e.createElement("div");A.className="modal-header";const M=e.createElement("h5");M.className="modal-title",M.id=u,M.setAttribute(me,"true"),M.textContent=n,A.appendChild(M),c.appendChild(A),r.setAttribute("aria-labelledby",u)}const a=e.createElement("div");a.className="modal-body";const d=e.createElement("p");d.className="mb-0",d.style.whiteSpace="pre-line",d.textContent=o,a.appendChild(d);const l=e.createElement("div");if(l.className="modal-footer",t){const u=e.createElement("button");u.type="button",u.className="btn btn-secondary",u.setAttribute(w,"cancel"),u.textContent="Cancel",l.appendChild(u)}const b=e.createElement("button");return b.type="button",b.className="btn btn-primary",b.setAttribute(w,"ok"),b.textContent="OK",l.appendChild(b),c.append(a,l),i.appendChild(c),r.appendChild(i),r}function pe(e,o){const t=globalThis.document,n=V(t,e,!1,o.dialogTitle);G(t,o).appendChild(n);const r=L(n,W(),o.bootstrap);return r?new Promise((i,c)=>{const a=()=>{n.removeEventListener("hidden.bs.modal",d),n.remove(),r.dispose?.(),i()},d=()=>{a()};n.querySelector(`[${w}="ok"]`)?.addEventListener("click",()=>{r.hide()},{once:!0}),n.addEventListener("hidden.bs.modal",d,{once:!0});try{r.show()}catch(b){n.removeEventListener("hidden.bs.modal",d),n.remove(),r.dispose?.(),c(b)}}):(n.remove(),Promise.reject(new Error("Bootstrap Modal is unavailable.")))}function he(e,o){const t=globalThis.document,n=V(t,e,!0,o.dialogTitle);G(t,o).appendChild(n);const r=L(n,W(),o.bootstrap);return r?new Promise((i,c)=>{let a=!1;const d=()=>{n.removeEventListener("hidden.bs.modal",l),n.remove(),r.dispose?.(),i(a)},l=()=>{d()},b=n.querySelector(`[${w}="ok"]`),u=n.querySelector(`[${w}="cancel"]`);b?.addEventListener("click",()=>{a=!0,r.hide()},{once:!0}),u?.addEventListener("click",()=>{a=!1,r.hide()},{once:!0}),n.addEventListener("hidden.bs.modal",l,{once:!0});try{r.show()}catch(A){n.removeEventListener("hidden.bs.modal",l),n.remove(),r.dispose?.(),c(A)}}):(n.remove(),Promise.reject(new Error("Bootstrap Modal is unavailable.")))}const h="data-haori-bootstrap-owned",m="data-haori-bootstrap-message-container",C="data-haori-bootstrap-invalid-target",y="data-haori-bootstrap-valid-target";function S(e){return e instanceof HTMLInputElement&&(e.type==="checkbox"||e.type==="radio")}function E(e){return e instanceof HTMLInputElement&&e.type==="radio"}function I(e){return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement}function B(e){return Array.from(e.children).find(o=>o instanceof HTMLElement&&o.getAttribute(m)==="true")}function j(e,o){const t=e.createElement("div");return t.setAttribute(h,"true"),t.textContent=o,t}function K(e){return B(e)}function N(e){if(e.name){const o=e.form??e.ownerDocument,t=typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e.name):e.name.replace(/(["\\])/g,"\\$1"),n=Array.from(o.querySelectorAll(`input[type="radio"][name="${t}"]`));if(n.length>0)return n}return[e]}function Ee(e){const[o,...t]=e;if(!o)return;let n=o;for(;n;){if(t.every(r=>n?.contains(r)))return n;n=n.parentElement}}function D(e){const t=N(e).map(n=>n.closest(".form-check")).filter(n=>n instanceof HTMLElement);if(t.length>1){const n=Ee(t);if(n&&!t.includes(n))return n}return H(e)}function H(e){const o=e.closest(".form-check");return o instanceof HTMLElement?o:void 0}function J(e){const o=e.nextElementSibling;if(o instanceof HTMLElement&&o.getAttribute(m)==="true")return o;const t=document.createElement("div");return t.className="invalid-feedback d-block",t.setAttribute(h,"true"),t.setAttribute(m,"true"),e.insertAdjacentElement("afterend",t),t}function ve(e){const o=E(e)?D(e):H(e);if(!o)return J(e);const t=B(o);if(t)return t;const n=document.createElement("div");return n.className="invalid-feedback d-block",n.setAttribute(h,"true"),n.setAttribute(m,"true"),o.appendChild(n),n}function Te(e){const o=K(e);if(o)return o;const t=document.createElement("div");return t.className="alert alert-danger",t.setAttribute("role","alert"),t.setAttribute(h,"true"),t.setAttribute(m,"true"),e.insertAdjacentElement("afterbegin",t),t}function v(e){e.getAttribute(C)==="true"&&(e.classList.remove("is-invalid"),e.removeAttribute(C))}function T(e){e.getAttribute(y)==="true"&&(e.classList.remove("is-valid"),e.removeAttribute(y))}function Q(e){switch(e){case"success":return"alert alert-success";case"warning":return"alert alert-warning";case"info":return"alert alert-info";default:return"alert alert-danger"}}function P(e){return e==="success"?"valid-feedback d-block":"invalid-feedback d-block"}function X(e){(E(e)?N(e):[e]).forEach(t=>{t.classList.add("is-invalid"),t.setAttribute(C,"true")})}function Ae(e){(E(e)?N(e):[e]).forEach(t=>{v(t)})}function Y(e,o){const t=e.nextElementSibling;if(t instanceof HTMLElement&&t.getAttribute(m)==="true")return t.className=P(o),t;const n=document.createElement("div");return n.className=P(o),n.setAttribute(h,"true"),n.setAttribute(m,"true"),e.insertAdjacentElement("afterend",n),n}function Ce(e,o){const t=E(e)?D(e):H(e);if(!t)return Y(e,o);const n=B(t);if(n)return n.className=P(o),n;const r=document.createElement("div");return r.className=P(o),r.setAttribute(h,"true"),r.setAttribute(m,"true"),t.appendChild(r),r}function ge(e,o){const t=K(e);if(t)return t.className=Q(o),t;const n=document.createElement("div");return n.className=Q(o),n.setAttribute("role","alert"),n.setAttribute(h,"true"),n.setAttribute(m,"true"),e.insertAdjacentElement("afterbegin",n),n}function we(e,o){return(S(e)?ve(e):I(e)?J(e):Te(e)).appendChild(j(document,o)),S(e)?X(e):I(e)&&(e.classList.add("is-invalid"),e.setAttribute(C,"true")),Promise.resolve()}function ye(e,o,t){if((S(e)?Ce(e,t):I(e)?Y(e,t):ge(e,t)).appendChild(j(document,o)),S(e)){const r=E(e)?N(e):[e];t==="success"?r.forEach(i=>{v(i),i.classList.add("is-valid"),i.setAttribute(y,"true")}):!t||t==="error"?(r.forEach(i=>T(i)),X(e)):r.forEach(i=>{T(i),v(i)})}else I(e)&&(t==="success"?(v(e),e.classList.add("is-valid"),e.setAttribute(y,"true")):!t||t==="error"?(T(e),e.classList.add("is-invalid"),e.setAttribute(C,"true")):(T(e),v(e)));return Promise.resolve()}function Se(e){if(S(e)){const r=E(e)?D(e):H(e);(r?B(r):void 0)?.remove(),Ae(e),(E(e)?N(e):[e]).forEach(a=>T(a))}else if(I(e)){const r=e.nextElementSibling;r instanceof HTMLElement&&r.getAttribute(m)==="true"&&r.remove(),v(e),T(e)}return e.querySelectorAll(`[${m}="true"]`).forEach(r=>{r.remove()}),e.querySelectorAll(`[${C}="true"]`).forEach(r=>{v(r)}),e.querySelectorAll(`[${y}="true"]`).forEach(r=>{T(r)}),Promise.resolve()}function Z(e){e.classList.contains("modal")||e.classList.add("modal"),e.tabIndex<0&&(e.tabIndex=-1),e.hasAttribute("aria-hidden")||e.setAttribute("aria-hidden","true")}function Ie(e,o){Z(e);const t=L(e,void 0,o.bootstrap);return t?(t.show(),Promise.resolve()):Promise.reject(new Error("Bootstrap Modal is unavailable."))}function Ne(e,o){Z(e);const t=L(e,void 0,o.bootstrap);return t?(t.hide(),Promise.resolve()):Promise.reject(new Error("Bootstrap Modal is unavailable."))}const ee="data-haori-bootstrap-toast-container",Me="data-haori-bootstrap-toast",ke="data-haori-bootstrap-toast-accent",Le="data-haori-bootstrap-toast-dismiss",te={"top-start":"top-0 start-0","top-center":"top-0 start-50 translate-middle-x","top-end":"top-0 end-0","bottom-start":"bottom-0 start-0","bottom-center":"bottom-0 start-50 translate-middle-x","bottom-end":"bottom-0 end-0"};function Be(e){switch(e){case"success":return{accentClassName:"bg-success"};case"warning":return{accentClassName:"bg-warning"};case"error":return{accentClassName:"bg-danger"};default:return{accentClassName:"bg-info"}}}function He(e,o){if(o.toastContainerSelector){const t=e.querySelector(o.toastContainerSelector);if(t)return t}return e.body}function Pe(e,o){const t=He(e,o),n=te[o.toastPosition??"bottom-end"],r=t.querySelector(`[${ee}="true"]`);if(r){const c=Object.values(te).flatMap(a=>a.split(" "));return r.classList.remove(...c),r.classList.add(...n.split(" ")),r}const i=e.createElement("div");return i.className=`toast-container position-fixed ${n} p-3`,i.setAttribute(ee,"true"),t.appendChild(i),i}function Re(e,o,t){const n=globalThis.document,r=Be(o),i=n.createElement("div");i.className="toast border bg-body text-body shadow-sm",i.setAttribute("role","status"),i.setAttribute("aria-live","polite"),i.setAttribute("aria-atomic","true"),i.setAttribute(Me,"true");const c=n.createElement("div");c.className="d-flex align-items-stretch";const a=n.createElement("div");a.className=`flex-shrink-0 rounded-start ${r.accentClassName}`,a.style.width="0.375rem",a.setAttribute(ke,"true");const d=n.createElement("div");d.className="toast-body",d.style.whiteSpace="pre-line",d.textContent=e;const l=n.createElement("button");l.type="button",l.className="btn-close me-2 m-auto flex-shrink-0",l.setAttribute("aria-label","Close"),l.setAttribute(Le,"true"),c.appendChild(a),c.appendChild(d),c.appendChild(l),i.appendChild(c),Pe(n,t).appendChild(i);const b=t.toastDelay!==void 0?{delay:t.toastDelay}:void 0,u=de(i,b,t.bootstrap);if(!u)return i.remove(),Promise.reject(new Error("Bootstrap Toast is unavailable."));l.addEventListener("click",()=>{u.hide?.()}),i.addEventListener("hidden.bs.toast",()=>{i.remove(),u.dispose?.()},{once:!0});try{return u.show(),Promise.resolve()}catch(A){return i.remove(),u.dispose?.(),Promise.reject(A)}}let f={options:{fallbackToNative:!0}};function g(e){return e.replace(/\\n/g,`
|
|
2
|
-
`)}function oe(){return globalThis.window}function $(e){return Promise.resolve(e).then(()=>{})}function
|
|
1
|
+
var HaoriBootstrap=(function(p){"use strict";function F(e){return typeof e=="function"}function O(e){return F(e?.Modal)?e?.Modal:void 0}function z(e){return F(e?.Toast)?e?.Toast:void 0}function k(e){return!!O(e)}function de(e){return!!z(e)}function L(e,t,o){const n=O(o);if(n)return typeof n.getOrCreateInstance=="function"?n.getOrCreateInstance(e,t):new n(e,t)}function fe(e,t,o){const n=z(o);if(n)return typeof n.getOrCreateInstance=="function"?n.getOrCreateInstance(e,t):new n(e,t)}const me="data-haori-bootstrap-dialog",w="data-haori-bootstrap-action",be="data-haori-bootstrap-dialog-title";let pe=0;function W(){return{backdrop:"static",keyboard:!1}}function G(e,t){if(t.dialogContainerSelector){const o=e.querySelector(t.dialogContainerSelector);if(o)return o}return e.body}function V(e,t,o,n){const r=e.createElement("div");r.className="modal fade",r.tabIndex=-1,r.setAttribute(me,"true"),r.setAttribute("aria-hidden","true");const i=e.createElement("div");i.className="modal-dialog modal-dialog-centered";const c=e.createElement("div");if(c.className="modal-content",n){const u=`haori-dialog-title-${++pe}`,A=e.createElement("div");A.className="modal-header";const N=e.createElement("h5");N.className="modal-title",N.id=u,N.setAttribute(be,"true"),N.textContent=n,A.appendChild(N),c.appendChild(A),r.setAttribute("aria-labelledby",u)}const a=e.createElement("div");a.className="modal-body";const d=e.createElement("p");d.className="mb-0",d.style.whiteSpace="pre-line",d.textContent=t,a.appendChild(d);const l=e.createElement("div");if(l.className="modal-footer",o){const u=e.createElement("button");u.type="button",u.className="btn btn-secondary",u.setAttribute(w,"cancel"),u.textContent="Cancel",l.appendChild(u)}const b=e.createElement("button");return b.type="button",b.className="btn btn-primary",b.setAttribute(w,"ok"),b.textContent="OK",l.appendChild(b),c.append(a,l),i.appendChild(c),r.appendChild(i),r}function he(e,t){const o=globalThis.document,n=V(o,e,!1,t.dialogTitle);G(o,t).appendChild(n);const r=L(n,W(),t.bootstrap);return r?new Promise((i,c)=>{const a=()=>{n.removeEventListener("hidden.bs.modal",d),n.remove(),r.dispose?.(),i()},d=()=>{a()};n.querySelector(`[${w}="ok"]`)?.addEventListener("click",()=>{r.hide()},{once:!0}),n.addEventListener("hidden.bs.modal",d,{once:!0});try{r.show()}catch(b){n.removeEventListener("hidden.bs.modal",d),n.remove(),r.dispose?.(),c(b)}}):(n.remove(),Promise.reject(new Error("Bootstrap Modal is unavailable.")))}function Ee(e,t){const o=globalThis.document,n=V(o,e,!0,t.dialogTitle);G(o,t).appendChild(n);const r=L(n,W(),t.bootstrap);return r?new Promise((i,c)=>{let a=!1;const d=()=>{n.removeEventListener("hidden.bs.modal",l),n.remove(),r.dispose?.(),i(a)},l=()=>{d()},b=n.querySelector(`[${w}="ok"]`),u=n.querySelector(`[${w}="cancel"]`);b?.addEventListener("click",()=>{a=!0,r.hide()},{once:!0}),u?.addEventListener("click",()=>{a=!1,r.hide()},{once:!0}),n.addEventListener("hidden.bs.modal",l,{once:!0});try{r.show()}catch(A){n.removeEventListener("hidden.bs.modal",l),n.remove(),r.dispose?.(),c(A)}}):(n.remove(),Promise.reject(new Error("Bootstrap Modal is unavailable.")))}const h="data-haori-bootstrap-owned",m="data-haori-bootstrap-message-container",C="data-haori-bootstrap-invalid-target",S="data-haori-bootstrap-valid-target";function M(e){return e instanceof HTMLInputElement&&(e.type==="checkbox"||e.type==="radio")}function E(e){return e instanceof HTMLInputElement&&e.type==="radio"}function y(e){return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement}function H(e){return Array.from(e.children).find(t=>t instanceof HTMLElement&&t.getAttribute(m)==="true")}function j(e,t){const o=e.createElement("div");return o.setAttribute(h,"true"),o.textContent=t,o}function K(e){return H(e)}function I(e){if(e.name){const t=e.form??e.ownerDocument,o=typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e.name):e.name.replace(/(["\\])/g,"\\$1"),n=Array.from(t.querySelectorAll(`input[type="radio"][name="${o}"]`));if(n.length>0)return n}return[e]}function ve(e){const[t,...o]=e;if(!t)return;let n=t;for(;n;){if(o.every(r=>n?.contains(r)))return n;n=n.parentElement}}function x(e){const o=I(e).map(n=>n.closest(".form-check")).filter(n=>n instanceof HTMLElement);if(o.length>1){const n=ve(o);if(n&&!o.includes(n))return n}return B(e)}function B(e){const t=e.closest(".form-check");return t instanceof HTMLElement?t:void 0}function J(e){const t=e.nextElementSibling;if(t instanceof HTMLElement&&t.getAttribute(m)==="true")return t;const o=document.createElement("div");return o.className="invalid-feedback d-block",o.setAttribute(h,"true"),o.setAttribute(m,"true"),e.insertAdjacentElement("afterend",o),o}function Te(e){const t=E(e)?x(e):B(e);if(!t)return J(e);const o=H(t);if(o)return o;const n=document.createElement("div");return n.className="invalid-feedback d-block",n.setAttribute(h,"true"),n.setAttribute(m,"true"),t.appendChild(n),n}function Ae(e){const t=K(e);if(t)return t;const o=document.createElement("div");return o.className="alert alert-danger",o.setAttribute("role","alert"),o.setAttribute(h,"true"),o.setAttribute(m,"true"),e.insertAdjacentElement("afterbegin",o),o}function v(e){e.getAttribute(C)==="true"&&(e.classList.remove("is-invalid"),e.removeAttribute(C))}function T(e){e.getAttribute(S)==="true"&&(e.classList.remove("is-valid"),e.removeAttribute(S))}function Q(e){switch(e){case"success":return"alert alert-success";case"warning":return"alert alert-warning";case"info":return"alert alert-info";default:return"alert alert-danger"}}function R(e){return e==="success"?"valid-feedback d-block":"invalid-feedback d-block"}function X(e){(E(e)?I(e):[e]).forEach(o=>{o.classList.add("is-invalid"),o.setAttribute(C,"true")})}function Ce(e){(E(e)?I(e):[e]).forEach(o=>{v(o)})}function Y(e,t){const o=e.nextElementSibling;if(o instanceof HTMLElement&&o.getAttribute(m)==="true")return o.className=R(t),o;const n=document.createElement("div");return n.className=R(t),n.setAttribute(h,"true"),n.setAttribute(m,"true"),e.insertAdjacentElement("afterend",n),n}function ge(e,t){const o=E(e)?x(e):B(e);if(!o)return Y(e,t);const n=H(o);if(n)return n.className=R(t),n;const r=document.createElement("div");return r.className=R(t),r.setAttribute(h,"true"),r.setAttribute(m,"true"),o.appendChild(r),r}function we(e,t){const o=K(e);if(o)return o.className=Q(t),o;const n=document.createElement("div");return n.className=Q(t),n.setAttribute("role","alert"),n.setAttribute(h,"true"),n.setAttribute(m,"true"),e.insertAdjacentElement("afterbegin",n),n}function Se(e,t){return(M(e)?Te(e):y(e)?J(e):Ae(e)).appendChild(j(document,t)),M(e)?X(e):y(e)&&(e.classList.add("is-invalid"),e.setAttribute(C,"true")),Promise.resolve()}function Me(e,t,o){if((M(e)?ge(e,o):y(e)?Y(e,o):we(e,o)).appendChild(j(document,t)),M(e)){const r=E(e)?I(e):[e];o==="success"?r.forEach(i=>{v(i),i.classList.add("is-valid"),i.setAttribute(S,"true")}):!o||o==="error"?(r.forEach(i=>T(i)),X(e)):r.forEach(i=>{T(i),v(i)})}else y(e)&&(o==="success"?(v(e),e.classList.add("is-valid"),e.setAttribute(S,"true")):!o||o==="error"?(T(e),e.classList.add("is-invalid"),e.setAttribute(C,"true")):(T(e),v(e)));return Promise.resolve()}function ye(e){if(M(e)){const r=E(e)?x(e):B(e);(r?H(r):void 0)?.remove(),Ce(e),(E(e)?I(e):[e]).forEach(a=>T(a))}else if(y(e)){const r=e.nextElementSibling;r instanceof HTMLElement&&r.getAttribute(m)==="true"&&r.remove(),v(e),T(e)}return e.querySelectorAll(`[${m}="true"]`).forEach(r=>{r.remove()}),e.querySelectorAll(`[${C}="true"]`).forEach(r=>{v(r)}),e.querySelectorAll(`[${S}="true"]`).forEach(r=>{T(r)}),Promise.resolve()}function Z(e){e.classList.contains("modal")||e.classList.add("modal"),e.tabIndex<0&&(e.tabIndex=-1),e.hasAttribute("aria-hidden")||e.setAttribute("aria-hidden","true")}function Ie(e,t){Z(e);const o=L(e,void 0,t.bootstrap);return o?(o.show(),Promise.resolve()):Promise.reject(new Error("Bootstrap Modal is unavailable."))}function Ne(e,t){Z(e);const o=L(e,void 0,t.bootstrap);return o?(o.hide(),Promise.resolve()):Promise.reject(new Error("Bootstrap Modal is unavailable."))}const ee="data-haori-bootstrap-toast-container",ke="data-haori-bootstrap-toast",Le="data-haori-bootstrap-toast-accent",He="data-haori-bootstrap-toast-dismiss",te={"top-start":"top-0 start-0","top-center":"top-0 start-50 translate-middle-x","top-end":"top-0 end-0","bottom-start":"bottom-0 start-0","bottom-center":"bottom-0 start-50 translate-middle-x","bottom-end":"bottom-0 end-0"};function Be(e){switch(e){case"success":return{accentClassName:"bg-success"};case"warning":return{accentClassName:"bg-warning"};case"error":return{accentClassName:"bg-danger"};default:return{accentClassName:"bg-info"}}}function Re(e,t){if(t.toastContainerSelector){const o=e.querySelector(t.toastContainerSelector);if(o)return o}return e.body}function Pe(e,t){const o=Re(e,t),n=te[t.toastPosition??"bottom-end"],r=o.querySelector(`[${ee}="true"]`);if(r){const c=Object.values(te).flatMap(a=>a.split(" "));return r.classList.remove(...c),r.classList.add(...n.split(" ")),r}const i=e.createElement("div");return i.className=`toast-container position-fixed ${n} p-3`,i.setAttribute(ee,"true"),o.appendChild(i),i}function De(e,t,o){const n=globalThis.document,r=Be(t),i=n.createElement("div");i.className="toast border bg-body text-body shadow-sm",i.setAttribute("role","status"),i.setAttribute("aria-live","polite"),i.setAttribute("aria-atomic","true"),i.setAttribute(ke,"true");const c=n.createElement("div");c.className="d-flex align-items-stretch";const a=n.createElement("div");a.className=`flex-shrink-0 rounded-start ${r.accentClassName}`,a.style.width="0.375rem",a.setAttribute(Le,"true");const d=n.createElement("div");d.className="toast-body",d.style.whiteSpace="pre-line",d.textContent=e;const l=n.createElement("button");l.type="button",l.className="btn-close me-2 m-auto flex-shrink-0",l.setAttribute("aria-label","Close"),l.setAttribute(He,"true"),c.appendChild(a),c.appendChild(d),c.appendChild(l),i.appendChild(c),Pe(n,o).appendChild(i);const b=o.toastDelay!==void 0?{delay:o.toastDelay}:void 0,u=fe(i,b,o.bootstrap);if(!u)return i.remove(),Promise.reject(new Error("Bootstrap Toast is unavailable."));l.addEventListener("click",()=>{u.hide?.()}),i.addEventListener("hidden.bs.toast",()=>{i.remove(),u.dispose?.()},{once:!0});try{return u.show(),Promise.resolve()}catch(A){return i.remove(),u.dispose?.(),Promise.reject(A)}}let f={options:{fallbackToNative:!0}};function g(e){return e.replace(/\\n/g,`
|
|
2
|
+
`)}function oe(){return globalThis.window}function $(e){return Promise.resolve(e).then(()=>{})}function P(e){const t=f.originalHaori?.[e];return typeof t=="function"?t:void 0}function D(e){console.warn(`[haori-bootstrap] ${e} skipped because Bootstrap support is unavailable.`)}function ne(e){const t=g(e),o=P("dialog");if(o)return $(o(t));const n=oe();return f.options.fallbackToNative&&typeof n?.alert=="function"?(n.alert(t),Promise.resolve()):(D("dialog"),Promise.resolve())}function re(e){const t=g(e),o=P("confirm");if(o)return Promise.resolve(o(t)).then(r=>!!r);const n=oe();return f.options.fallbackToNative&&typeof n?.confirm=="function"?Promise.resolve(n.confirm(t)):(D("confirm"),Promise.resolve(!1))}function ie(e,t){const o=g(e),n=P("toast");return n?$(n(o,t)):(D("toast"),Promise.resolve())}function _(e,t){const o=P(e);return o?$(o(t)):(D(e),Promise.resolve())}function _e(e){f=e}class se{static dialog(t){const o=g(t);return k(f.options.bootstrap)?he(o,f.options).catch(()=>ne(o)):ne(o)}static confirm(t){const o=g(t);return k(f.options.bootstrap)?Ee(o,f.options).catch(()=>re(o)):re(o)}static toast(t,o){const n=g(t);return de(f.options.bootstrap)?De(n,o,f.options).catch(()=>ie(n,o)):ie(n,o)}static openDialog(t){return k(f.options.bootstrap)?Ie(t,f.options).catch(()=>_("openDialog",t)):_("openDialog",t)}static closeDialog(t){return k(f.options.bootstrap)?Ne(t,f.options).catch(()=>_("closeDialog",t)):_("closeDialog",t)}static addErrorMessage(t,o){return Se(t,o)}static addMessage(t,o,n){return Me(t,o,n)}static clearMessages(t){return ye(t)}}const q={fallbackToNative:!0},ae=new Set(["dialog","confirm","toast","openDialog","closeDialog","addErrorMessage","addMessage","clearMessages"]);function xe(e){const t=se;return new Proxy(e,{get(o,n,r){return typeof n=="string"&&ae.has(n)?t[n]:Reflect.get(o,n,r)},has(o,n){return typeof n=="string"&&ae.has(n)?!0:Reflect.has(o,n)}})}const s={installed:!1,options:q};function U(){return globalThis.window}function $e(e,t){return{bootstrap:e.bootstrap??t?.bootstrap,fallbackToNative:e.fallbackToNative??q.fallbackToNative,runtime:e.runtime??s.options.runtime??t?.Haori?.runtime,toastContainerSelector:e.toastContainerSelector??s.options.toastContainerSelector,dialogContainerSelector:e.dialogContainerSelector??s.options.dialogContainerSelector,dialogTitle:e.dialogTitle??s.options.dialogTitle,toastPosition:e.toastPosition??s.options.toastPosition,toastDelay:e.toastDelay??s.options.toastDelay}}function ce(e=U()){return!!(e?.Haori&&e.bootstrap)}function le(e={}){const t=U();if(!t?.Haori)throw new Error("window.Haori is required before calling install().");if(s.originalHaori||(s.originalHaori=t.Haori,s.originalRuntime=t.Haori.runtime),s.options=$e(e,t),s.options.runtime){const o=s.originalHaori??t.Haori;typeof o.setRuntime=="function"?o.setRuntime(s.options.runtime):console.warn("[haori-bootstrap] Haori.setRuntime が利用できません。runtime 設定は無視されます。")}_e({originalHaori:s.originalHaori,options:s.options}),t.Haori=xe(s.originalHaori),s.installed=!0}function qe(){const e=U();if(!e||!s.originalHaori)return;const t=s.originalHaori;typeof t.setRuntime=="function"?t.setRuntime(s.originalRuntime):t.runtime=s.originalRuntime,e.Haori=s.originalHaori,s.installed=!1,s.originalHaori=void 0,s.originalRuntime=void 0,s.options=q}function Ue(){return s.installed}const ue="__haoriJsBootstrapAutoEnabled__";function Fe(){return globalThis.window}function Oe(e){return!!e[ue]}function ze(e){e[ue]=!0}function We(){const e=Fe();if(!(!e||Oe(e))){if(!ce(e)){console.warn("[haori-bootstrap] Auto-enable skipped because window.Haori or window.bootstrap is missing.");return}try{le({bootstrap:e.bootstrap}),ze(e)}catch(t){console.warn("[haori-bootstrap] Auto-enable failed.",t)}}}We();const Ge="0.3.2";return p.BootstrapHaori=se,p.hasAutoEnablePrerequisites=ce,p.install=le,p.isInstalled=Ue,p.uninstall=qe,p.version=Ge,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"}),p})({});
|
|
3
3
|
//# sourceMappingURL=haori-bootstrap.iife.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"haori-bootstrap.iife.js","sources":["../src/bootstrap_resolver.ts","../src/dialog.ts","../src/message.ts","../src/modal.ts","../src/toast.ts","../src/bootstrap_haori.ts","../src/install.ts","../src/browser.ts","../src/index.ts"],"sourcesContent":["import type {\n BootstrapModalConstructor,\n BootstrapModalInstance,\n BootstrapModalOptions,\n BootstrapNamespace,\n BootstrapToastConstructor,\n BootstrapToastInstance,\n BootstrapToastOptions,\n} from './types';\n\n/**\n * 値がコンストラクター関数かどうかを判定する。\n *\n * @param value 判定対象の値。\n * @return コンストラクター関数なら true。\n */\nfunction isConstructor<T>(value: unknown): value is new (...args: readonly unknown[]) => T {\n return typeof value === 'function';\n}\n\n/**\n * Bootstrap の Modal コンストラクターを返す。\n *\n * @param bootstrap Bootstrap 名前空間。\n * @return Modal コンストラクター。見つからない場合は undefined。\n */\nexport function resolveModalConstructor(\n bootstrap?: BootstrapNamespace,\n): BootstrapModalConstructor | undefined {\n return isConstructor<BootstrapModalInstance>(bootstrap?.Modal)\n ? (bootstrap?.Modal as BootstrapModalConstructor)\n : undefined;\n}\n\n/**\n * Bootstrap の Toast コンストラクターを返す。\n *\n * @param bootstrap Bootstrap 名前空間。\n * @return Toast コンストラクター。見つからない場合は undefined。\n */\nexport function resolveToastConstructor(\n bootstrap?: BootstrapNamespace,\n): BootstrapToastConstructor | undefined {\n return isConstructor<BootstrapToastInstance>(bootstrap?.Toast)\n ? (bootstrap?.Toast as BootstrapToastConstructor)\n : undefined;\n}\n\n/**\n * Modal が利用可能かどうかを返す。\n *\n * @param bootstrap Bootstrap 名前空間。\n * @return 利用可能なら true。\n */\nexport function hasModalSupport(bootstrap?: BootstrapNamespace): boolean {\n return Boolean(resolveModalConstructor(bootstrap));\n}\n\n/**\n * Toast が利用可能かどうかを返す。\n *\n * @param bootstrap Bootstrap 名前空間。\n * @return 利用可能なら true。\n */\nexport function hasToastSupport(bootstrap?: BootstrapNamespace): boolean {\n return Boolean(resolveToastConstructor(bootstrap));\n}\n\n/**\n * Modal インスタンスを取得または生成する。\n *\n * @param element 対象要素。\n * @param bootstrap Bootstrap 名前空間。\n * @return Modal インスタンス。生成できない場合は undefined。\n */\nexport function createModalInstance(\n element: HTMLElement,\n options?: BootstrapModalOptions,\n bootstrap?: BootstrapNamespace,\n): BootstrapModalInstance | undefined {\n const modalConstructor = resolveModalConstructor(bootstrap);\n if (!modalConstructor) {\n return undefined;\n }\n\n if (typeof modalConstructor.getOrCreateInstance === 'function') {\n return modalConstructor.getOrCreateInstance(element, options);\n }\n\n return new modalConstructor(element, options);\n}\n\n/**\n * Toast インスタンスを取得または生成する。\n *\n * @param element 対象要素。\n * @param toastOptions Toast 設定。\n * @param bootstrap Bootstrap 名前空間。\n * @return Toast インスタンス。生成できない場合は undefined。\n */\nexport function createToastInstance(\n element: HTMLElement,\n toastOptions?: BootstrapToastOptions,\n bootstrap?: BootstrapNamespace,\n): BootstrapToastInstance | undefined {\n const toastConstructor = resolveToastConstructor(bootstrap);\n if (!toastConstructor) {\n return undefined;\n }\n\n if (typeof toastConstructor.getOrCreateInstance === 'function') {\n return toastConstructor.getOrCreateInstance(element, toastOptions);\n }\n\n return new toastConstructor(element, toastOptions);\n}\n","import { createModalInstance } from './bootstrap_resolver';\nimport type { ResolvedInstallOptions } from './types';\n\nconst DIALOG_CONTAINER_ATTRIBUTE = 'data-haori-bootstrap-dialog';\nconst ACTION_ATTRIBUTE = 'data-haori-bootstrap-action';\nconst DIALOG_TITLE_ATTRIBUTE = 'data-haori-bootstrap-dialog-title';\n\nlet dialogTitleCounter = 0;\n\n/**\n * dialog 系 modal の既定オプションを返す。\n *\n * @return Bootstrap Modal の生成オプション。\n */\nfunction createDialogModalOptions() {\n return {\n backdrop: 'static' as const,\n keyboard: false,\n };\n}\n\n/**\n * dialog を挿入する親要素を解決する。\n *\n * @param documentObject 検索に使用する document。\n * @param options 解決済み導入設定。\n * @return 挿入先の要素。\n */\nfunction resolveDialogContainer(documentObject: Document, options: ResolvedInstallOptions): HTMLElement {\n if (options.dialogContainerSelector) {\n const resolvedElement = documentObject.querySelector<HTMLElement>(\n options.dialogContainerSelector,\n );\n if (resolvedElement) {\n return resolvedElement;\n }\n }\n\n return documentObject.body;\n}\n\n/**\n * dialog または confirm 用の modal 要素を組み立てる。\n *\n * @param documentObject 生成に使用する document。\n * @param message 表示するメッセージ。\n * @param isConfirm confirm 用かどうか。\n * @param title ヘッダーに表示するタイトル。未指定はヘッダーなし。\n * @return 生成した modal 要素。\n */\nfunction createModalShell(\n documentObject: Document,\n message: string,\n isConfirm: boolean,\n title?: string,\n): HTMLDivElement {\n const modalElement = documentObject.createElement('div');\n modalElement.className = 'modal fade';\n modalElement.tabIndex = -1;\n modalElement.setAttribute(DIALOG_CONTAINER_ATTRIBUTE, 'true');\n modalElement.setAttribute('aria-hidden', 'true');\n\n const dialogElement = documentObject.createElement('div');\n dialogElement.className = 'modal-dialog modal-dialog-centered';\n\n const contentElement = documentObject.createElement('div');\n contentElement.className = 'modal-content';\n\n if (title) {\n const titleId = `haori-dialog-title-${++dialogTitleCounter}`;\n const headerElement = documentObject.createElement('div');\n headerElement.className = 'modal-header';\n\n const titleElement = documentObject.createElement('h5');\n titleElement.className = 'modal-title';\n titleElement.id = titleId;\n titleElement.setAttribute(DIALOG_TITLE_ATTRIBUTE, 'true');\n titleElement.textContent = title;\n headerElement.appendChild(titleElement);\n\n contentElement.appendChild(headerElement);\n modalElement.setAttribute('aria-labelledby', titleId);\n }\n\n const bodyElement = documentObject.createElement('div');\n bodyElement.className = 'modal-body';\n\n const messageElement = documentObject.createElement('p');\n messageElement.className = 'mb-0';\n messageElement.style.whiteSpace = 'pre-line';\n messageElement.textContent = message;\n bodyElement.appendChild(messageElement);\n\n const footerElement = documentObject.createElement('div');\n footerElement.className = 'modal-footer';\n\n if (isConfirm) {\n const cancelButton = documentObject.createElement('button');\n cancelButton.type = 'button';\n cancelButton.className = 'btn btn-secondary';\n cancelButton.setAttribute(ACTION_ATTRIBUTE, 'cancel');\n cancelButton.textContent = 'Cancel';\n footerElement.appendChild(cancelButton);\n }\n\n const okButton = documentObject.createElement('button');\n okButton.type = 'button';\n okButton.className = 'btn btn-primary';\n okButton.setAttribute(ACTION_ATTRIBUTE, 'ok');\n okButton.textContent = 'OK';\n footerElement.appendChild(okButton);\n\n contentElement.append(bodyElement, footerElement);\n dialogElement.appendChild(contentElement);\n modalElement.appendChild(dialogElement);\n return modalElement;\n}\n\n/**\n * 情報表示用の Bootstrap Modal を表示する。\n *\n * @param message 表示するメッセージ。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function showDialog(message: string, options: ResolvedInstallOptions): Promise<void> {\n const documentObject = globalThis.document;\n const modalElement = createModalShell(documentObject, message, false, options.dialogTitle);\n resolveDialogContainer(documentObject, options).appendChild(modalElement);\n\n const modalInstance = createModalInstance(\n modalElement,\n createDialogModalOptions(),\n options.bootstrap,\n );\n if (!modalInstance) {\n modalElement.remove();\n return Promise.reject(new Error('Bootstrap Modal is unavailable.'));\n }\n\n return new Promise<void>((resolve, reject) => {\n const finalize = (): void => {\n modalElement.removeEventListener('hidden.bs.modal', handleHidden);\n modalElement.remove();\n modalInstance.dispose?.();\n resolve();\n };\n\n const handleHidden = (): void => {\n finalize();\n };\n\n const okButton = modalElement.querySelector<HTMLButtonElement>(`[${ACTION_ATTRIBUTE}=\"ok\"]`);\n okButton?.addEventListener(\n 'click',\n () => {\n modalInstance.hide();\n },\n { once: true },\n );\n\n modalElement.addEventListener('hidden.bs.modal', handleHidden, { once: true });\n\n try {\n modalInstance.show();\n } catch (error) {\n modalElement.removeEventListener('hidden.bs.modal', handleHidden);\n modalElement.remove();\n modalInstance.dispose?.();\n reject(error);\n }\n });\n}\n\n/**\n * 確認用の Bootstrap Modal を表示する。\n *\n * @param message 表示するメッセージ。\n * @param options 解決済み導入設定。\n * @return OK のみ true を返す Promise。\n */\nexport function showConfirm(\n message: string,\n options: ResolvedInstallOptions,\n): Promise<boolean> {\n const documentObject = globalThis.document;\n const modalElement = createModalShell(documentObject, message, true, options.dialogTitle);\n resolveDialogContainer(documentObject, options).appendChild(modalElement);\n\n const modalInstance = createModalInstance(\n modalElement,\n createDialogModalOptions(),\n options.bootstrap,\n );\n if (!modalInstance) {\n modalElement.remove();\n return Promise.reject(new Error('Bootstrap Modal is unavailable.'));\n }\n\n return new Promise<boolean>((resolve, reject) => {\n let confirmed = false;\n\n const finalize = (): void => {\n modalElement.removeEventListener('hidden.bs.modal', handleHidden);\n modalElement.remove();\n modalInstance.dispose?.();\n resolve(confirmed);\n };\n\n const handleHidden = (): void => {\n finalize();\n };\n\n const okButton = modalElement.querySelector<HTMLButtonElement>(`[${ACTION_ATTRIBUTE}=\"ok\"]`);\n const cancelButton = modalElement.querySelector<HTMLButtonElement>(\n `[${ACTION_ATTRIBUTE}=\"cancel\"]`,\n );\n\n okButton?.addEventListener(\n 'click',\n () => {\n confirmed = true;\n modalInstance.hide();\n },\n { once: true },\n );\n cancelButton?.addEventListener(\n 'click',\n () => {\n confirmed = false;\n modalInstance.hide();\n },\n { once: true },\n );\n\n modalElement.addEventListener('hidden.bs.modal', handleHidden, { once: true });\n\n try {\n modalInstance.show();\n } catch (error) {\n modalElement.removeEventListener('hidden.bs.modal', handleHidden);\n modalElement.remove();\n modalInstance.dispose?.();\n reject(error);\n }\n });\n}\n","const OWNED_ATTRIBUTE = 'data-haori-bootstrap-owned';\nconst CONTAINER_ATTRIBUTE = 'data-haori-bootstrap-message-container';\nconst INVALID_TARGET_ATTRIBUTE = 'data-haori-bootstrap-invalid-target';\nconst VALID_TARGET_ATTRIBUTE = 'data-haori-bootstrap-valid-target';\n\n/**\n * 対象要素が checkbox または radio かどうかを判定する。\n *\n * @param target 判定対象の要素。\n * @return checkbox または radio の input 要素なら true。\n */\nfunction isChoiceInput(target: HTMLElement): target is HTMLInputElement {\n return (\n target instanceof HTMLInputElement &&\n (target.type === 'checkbox' || target.type === 'radio')\n );\n}\n\n/**\n * 対象要素が radio input かどうかを判定する。\n *\n * @param target 判定対象の要素。\n * @return radio の input 要素なら true。\n */\nfunction isRadioInput(target: HTMLElement): target is HTMLInputElement {\n return target instanceof HTMLInputElement && target.type === 'radio';\n}\n\n/**\n * 対象要素が通常の invalid-feedback を直後に付与するフィールドかどうかを判定する。\n *\n * @param target 判定対象の要素。\n * @return 入力系フィールドなら true。\n */\nfunction isFieldTarget(\n target: HTMLElement,\n): target is HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement {\n return (\n target instanceof HTMLInputElement ||\n target instanceof HTMLSelectElement ||\n target instanceof HTMLTextAreaElement\n );\n}\n\n/**\n * 子要素から管理対象のメッセージコンテナを取得する。\n *\n * @param target 検索対象の要素。\n * @return 管理対象コンテナ。見つからない場合は undefined。\n */\nfunction getDirectOwnedContainer(target: HTMLElement): HTMLElement | undefined {\n return Array.from(target.children).find(\n (element): element is HTMLElement =>\n element instanceof HTMLElement && element.getAttribute(CONTAINER_ATTRIBUTE) === 'true',\n );\n}\n\n/**\n * 管理対象のメッセージ要素を生成する。\n *\n * @param documentObject 生成に使用する document。\n * @param message 表示するメッセージ。\n * @return 生成したメッセージ要素。\n */\nfunction createMessageItem(documentObject: Document, message: string): HTMLDivElement {\n const messageElement = documentObject.createElement('div');\n messageElement.setAttribute(OWNED_ATTRIBUTE, 'true');\n messageElement.textContent = message;\n return messageElement;\n}\n\n/**\n * block container 配下の既存メッセージコンテナを取得する。\n *\n * @param target 検索対象の要素。\n * @return 既存コンテナ。見つからない場合は undefined。\n */\nfunction getOwnedDirectChild(target: HTMLElement): HTMLElement | undefined {\n return getDirectOwnedContainer(target);\n}\n\n/**\n * 指定した radio と同じグループに属する radio 要素一覧を取得する。\n *\n * @param target 基準となる radio 要素。\n * @return 同じグループに属する radio 要素一覧。\n */\nfunction getRadioGroupTargets(target: HTMLInputElement): HTMLInputElement[] {\n if (target.name) {\n const rootNode = target.form ?? target.ownerDocument;\n const escapedName = typeof CSS !== 'undefined' && typeof CSS.escape === 'function'\n ? CSS.escape(target.name)\n : target.name.replace(/([\"\\\\])/g, '\\\\$1');\n const groupTargets = Array.from(\n rootNode.querySelectorAll<HTMLInputElement>(`input[type=\"radio\"][name=\"${escapedName}\"]`),\n );\n if (groupTargets.length > 0) {\n return groupTargets;\n }\n }\n\n return [target];\n}\n\n/**\n * 複数要素の最も近い共通祖先要素を返す。\n *\n * @param elements 判定対象の要素一覧。\n * @return 共通祖先要素。見つからない場合は undefined。\n */\nfunction findCommonAncestor(elements: readonly HTMLElement[]): HTMLElement | undefined {\n const [firstElement, ...restElements] = elements;\n if (!firstElement) {\n return undefined;\n }\n\n let candidate: HTMLElement | null = firstElement;\n while (candidate) {\n if (restElements.every((element) => candidate?.contains(element))) {\n return candidate;\n }\n candidate = candidate.parentElement;\n }\n\n return undefined;\n}\n\n/**\n * radio group のメッセージ挿入先を解決する。\n *\n * @param target 対象の radio 要素。\n * @return 挿入先の要素。見つからない場合は undefined。\n */\nfunction resolveRadioMessageHost(target: HTMLInputElement): HTMLElement | undefined {\n const groupTargets = getRadioGroupTargets(target);\n const wrappers = groupTargets\n .map((element) => element.closest('.form-check'))\n .filter((element): element is HTMLElement => element instanceof HTMLElement);\n\n if (wrappers.length > 1) {\n const commonAncestor = findCommonAncestor(wrappers);\n if (commonAncestor && !wrappers.includes(commonAncestor)) {\n return commonAncestor;\n }\n }\n\n return resolveChoiceMessageHost(target);\n}\n\n/**\n * checkbox と radio のメッセージ挿入先を解決する。\n *\n * @param target 対象の input 要素。\n * @return 挿入先の form-check 要素。見つからない場合は undefined。\n */\nfunction resolveChoiceMessageHost(target: HTMLInputElement): HTMLElement | undefined {\n const closestFormCheck = target.closest('.form-check');\n return closestFormCheck instanceof HTMLElement ? closestFormCheck : undefined;\n}\n\n/**\n * 通常フィールドの直後に invalid-feedback コンテナを取得または生成する。\n *\n * @param target 対象の要素。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureFieldContainer(target: HTMLElement): HTMLElement {\n const nextElement = target.nextElementSibling;\n if (\n nextElement instanceof HTMLElement &&\n nextElement.getAttribute(CONTAINER_ATTRIBUTE) === 'true'\n ) {\n return nextElement;\n }\n\n const container = document.createElement('div');\n container.className = 'invalid-feedback d-block';\n container.setAttribute(OWNED_ATTRIBUTE, 'true');\n container.setAttribute(CONTAINER_ATTRIBUTE, 'true');\n target.insertAdjacentElement('afterend', container);\n return container;\n}\n\n/**\n * checkbox と radio 用に form-check 末尾の invalid-feedback を取得または生成する。\n *\n * @param target 対象の input 要素。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureChoiceContainer(target: HTMLInputElement): HTMLElement {\n const hostElement = isRadioInput(target)\n ? resolveRadioMessageHost(target)\n : resolveChoiceMessageHost(target);\n if (!hostElement) {\n return ensureFieldContainer(target);\n }\n\n const existingContainer = getDirectOwnedContainer(hostElement);\n if (existingContainer) {\n return existingContainer;\n }\n\n const container = document.createElement('div');\n container.className = 'invalid-feedback d-block';\n container.setAttribute(OWNED_ATTRIBUTE, 'true');\n container.setAttribute(CONTAINER_ATTRIBUTE, 'true');\n hostElement.appendChild(container);\n return container;\n}\n\n/**\n * container target の先頭に alert コンテナを取得または生成する。\n *\n * @param target 対象の要素。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureBlockContainer(target: HTMLElement): HTMLElement {\n const existingContainer = getOwnedDirectChild(target);\n if (existingContainer) {\n return existingContainer;\n }\n\n const container = document.createElement('div');\n container.className = 'alert alert-danger';\n container.setAttribute('role', 'alert');\n container.setAttribute(OWNED_ATTRIBUTE, 'true');\n container.setAttribute(CONTAINER_ATTRIBUTE, 'true');\n target.insertAdjacentElement('afterbegin', container);\n return container;\n}\n\n/**\n * このライブラリが付けた is-invalid 状態だけを外す。\n *\n * @param target 状態を解除する要素。\n * @return 戻り値はない。\n */\nfunction removeOwnedInvalidState(target: HTMLElement): void {\n if (target.getAttribute(INVALID_TARGET_ATTRIBUTE) !== 'true') {\n return;\n }\n\n target.classList.remove('is-invalid');\n target.removeAttribute(INVALID_TARGET_ATTRIBUTE);\n}\n\n/**\n * このライブラリが付けた is-valid 状態だけを外す。\n *\n * @param target 状態を解除する要素。\n * @return 戻り値はない。\n */\nfunction removeOwnedValidState(target: HTMLElement): void {\n if (target.getAttribute(VALID_TARGET_ATTRIBUTE) !== 'true') {\n return;\n }\n\n target.classList.remove('is-valid');\n target.removeAttribute(VALID_TARGET_ATTRIBUTE);\n}\n\n/**\n * レベルに応じた alert クラスを返す。\n *\n * @param level メッセージレベル。\n * @return 対応する alert クラス文字列。\n */\nfunction resolveBlockAlertClass(level?: string): string {\n switch (level) {\n case 'success':\n return 'alert alert-success';\n case 'warning':\n return 'alert alert-warning';\n case 'info':\n return 'alert alert-info';\n default:\n return 'alert alert-danger';\n }\n}\n\n/**\n * レベルに応じた feedback クラスを返す。\n *\n * @param level メッセージレベル。\n * @return 対応する feedback クラス文字列。\n */\nfunction resolveFieldFeedbackClass(level?: string): string {\n return level === 'success' ? 'valid-feedback d-block' : 'invalid-feedback d-block';\n}\n\n/**\n * choice input に対して、このライブラリが付けた invalid 状態を付与する。\n *\n * @param target 対象の input 要素。\n * @return 戻り値はない。\n */\nfunction markChoiceInvalidState(target: HTMLInputElement): void {\n const targets = isRadioInput(target) ? getRadioGroupTargets(target) : [target];\n targets.forEach((element) => {\n element.classList.add('is-invalid');\n element.setAttribute(INVALID_TARGET_ATTRIBUTE, 'true');\n });\n}\n\n/**\n * choice input に対して、このライブラリが付けた invalid 状態を解除する。\n *\n * @param target 対象の input 要素。\n * @return 戻り値はない。\n */\nfunction clearChoiceInvalidState(target: HTMLInputElement): void {\n const targets = isRadioInput(target) ? getRadioGroupTargets(target) : [target];\n targets.forEach((element) => {\n removeOwnedInvalidState(element);\n });\n}\n\n/**\n * レベルに応じたフィールド用コンテナを取得または生成する。\n *\n * @param target 対象要素。\n * @param level メッセージレベル。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureFieldContainerForLevel(target: HTMLElement, level?: string): HTMLElement {\n const nextElement = target.nextElementSibling;\n if (\n nextElement instanceof HTMLElement &&\n nextElement.getAttribute(CONTAINER_ATTRIBUTE) === 'true'\n ) {\n nextElement.className = resolveFieldFeedbackClass(level);\n return nextElement;\n }\n\n const container = document.createElement('div');\n container.className = resolveFieldFeedbackClass(level);\n container.setAttribute(OWNED_ATTRIBUTE, 'true');\n container.setAttribute(CONTAINER_ATTRIBUTE, 'true');\n target.insertAdjacentElement('afterend', container);\n return container;\n}\n\n/**\n * レベルに応じた choice 用コンテナを取得または生成する。\n *\n * @param target 対象の input 要素。\n * @param level メッセージレベル。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureChoiceContainerForLevel(target: HTMLInputElement, level?: string): HTMLElement {\n const hostElement = isRadioInput(target)\n ? resolveRadioMessageHost(target)\n : resolveChoiceMessageHost(target);\n if (!hostElement) {\n return ensureFieldContainerForLevel(target, level);\n }\n\n const existingContainer = getDirectOwnedContainer(hostElement);\n if (existingContainer) {\n existingContainer.className = resolveFieldFeedbackClass(level);\n return existingContainer;\n }\n\n const container = document.createElement('div');\n container.className = resolveFieldFeedbackClass(level);\n container.setAttribute(OWNED_ATTRIBUTE, 'true');\n container.setAttribute(CONTAINER_ATTRIBUTE, 'true');\n hostElement.appendChild(container);\n return container;\n}\n\n/**\n * レベルに応じたブロック用コンテナを取得または生成する。\n *\n * @param target 対象要素。\n * @param level メッセージレベル。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureBlockContainerForLevel(target: HTMLElement, level?: string): HTMLElement {\n const existingContainer = getOwnedDirectChild(target);\n if (existingContainer) {\n existingContainer.className = resolveBlockAlertClass(level);\n return existingContainer;\n }\n\n const container = document.createElement('div');\n container.className = resolveBlockAlertClass(level);\n container.setAttribute('role', 'alert');\n container.setAttribute(OWNED_ATTRIBUTE, 'true');\n container.setAttribute(CONTAINER_ATTRIBUTE, 'true');\n target.insertAdjacentElement('afterbegin', container);\n return container;\n}\n\n/**\n * 管理対象のエラーメッセージを追加する。\n *\n * @param target 追加先の要素。\n * @param message 表示するメッセージ。\n * @return 完了時に解決される Promise。\n */\nexport function addManagedErrorMessage(target: HTMLElement, message: string): Promise<void> {\n const container = isChoiceInput(target)\n ? ensureChoiceContainer(target)\n : isFieldTarget(target)\n ? ensureFieldContainer(target)\n : ensureBlockContainer(target);\n container.appendChild(createMessageItem(document, message));\n\n if (isChoiceInput(target)) {\n markChoiceInvalidState(target);\n } else if (isFieldTarget(target)) {\n target.classList.add('is-invalid');\n target.setAttribute(INVALID_TARGET_ATTRIBUTE, 'true');\n }\n\n return Promise.resolve();\n}\n\n/**\n * 管理対象のメッセージをレベル付きで追加する。\n *\n * @param target 追加先の要素。\n * @param message 表示するメッセージ。\n * @param level メッセージレベル (error / success / warning / info)。省略時は error。\n * @return 完了時に解決される Promise。\n */\nexport function addManagedMessage(\n target: HTMLElement,\n message: string,\n level?: string,\n): Promise<void> {\n const container = isChoiceInput(target)\n ? ensureChoiceContainerForLevel(target, level)\n : isFieldTarget(target)\n ? ensureFieldContainerForLevel(target, level)\n : ensureBlockContainerForLevel(target, level);\n container.appendChild(createMessageItem(document, message));\n\n if (isChoiceInput(target)) {\n const targets = isRadioInput(target) ? getRadioGroupTargets(target) : [target];\n if (level === 'success') {\n targets.forEach((element) => {\n removeOwnedInvalidState(element);\n element.classList.add('is-valid');\n element.setAttribute(VALID_TARGET_ATTRIBUTE, 'true');\n });\n } else if (!level || level === 'error') {\n targets.forEach((element) => removeOwnedValidState(element));\n markChoiceInvalidState(target);\n } else {\n targets.forEach((element) => {\n removeOwnedValidState(element);\n removeOwnedInvalidState(element);\n });\n }\n } else if (isFieldTarget(target)) {\n if (level === 'success') {\n removeOwnedInvalidState(target);\n target.classList.add('is-valid');\n target.setAttribute(VALID_TARGET_ATTRIBUTE, 'true');\n } else if (!level || level === 'error') {\n removeOwnedValidState(target);\n target.classList.add('is-invalid');\n target.setAttribute(INVALID_TARGET_ATTRIBUTE, 'true');\n } else {\n removeOwnedValidState(target);\n removeOwnedInvalidState(target);\n }\n }\n\n return Promise.resolve();\n}\n\n/**\n * 管理対象のメッセージを削除する。\n *\n * @param parentOrTarget 削除対象の親要素または対象要素。\n * @return 完了時に解決される Promise。\n */\nexport function clearManagedMessages(parentOrTarget: HTMLElement): Promise<void> {\n if (isChoiceInput(parentOrTarget)) {\n const hostElement = isRadioInput(parentOrTarget)\n ? resolveRadioMessageHost(parentOrTarget)\n : resolveChoiceMessageHost(parentOrTarget);\n const ownedContainer = hostElement ? getDirectOwnedContainer(hostElement) : undefined;\n ownedContainer?.remove();\n clearChoiceInvalidState(parentOrTarget);\n const choiceTargets = isRadioInput(parentOrTarget)\n ? getRadioGroupTargets(parentOrTarget)\n : [parentOrTarget];\n choiceTargets.forEach((element) => removeOwnedValidState(element));\n } else if (isFieldTarget(parentOrTarget)) {\n const nextElement = parentOrTarget.nextElementSibling;\n if (\n nextElement instanceof HTMLElement &&\n nextElement.getAttribute(CONTAINER_ATTRIBUTE) === 'true'\n ) {\n nextElement.remove();\n }\n removeOwnedInvalidState(parentOrTarget);\n removeOwnedValidState(parentOrTarget);\n }\n\n const ownedContainers = parentOrTarget.querySelectorAll<HTMLElement>(\n `[${CONTAINER_ATTRIBUTE}=\"true\"]`,\n );\n ownedContainers.forEach((element) => {\n element.remove();\n });\n\n const invalidTargets = parentOrTarget.querySelectorAll<HTMLElement>(\n `[${INVALID_TARGET_ATTRIBUTE}=\"true\"]`,\n );\n invalidTargets.forEach((element) => {\n removeOwnedInvalidState(element);\n });\n\n const validTargets = parentOrTarget.querySelectorAll<HTMLElement>(\n `[${VALID_TARGET_ATTRIBUTE}=\"true\"]`,\n );\n validTargets.forEach((element) => {\n removeOwnedValidState(element);\n });\n\n return Promise.resolve();\n}\n","import { createModalInstance } from './bootstrap_resolver';\nimport type { ResolvedInstallOptions } from './types';\n\n/**\n * 既存要素を Bootstrap Modal として扱える最低限の属性へ整える。\n *\n * @param element 整形対象の要素。\n * @return 戻り値はない。\n */\nfunction prepareModalElement(element: HTMLElement): void {\n if (!element.classList.contains('modal')) {\n element.classList.add('modal');\n }\n\n if (element.tabIndex < 0) {\n element.tabIndex = -1;\n }\n\n if (!element.hasAttribute('aria-hidden')) {\n element.setAttribute('aria-hidden', 'true');\n }\n}\n\n/**\n * 任意要素を Bootstrap Modal として開く。\n *\n * @param element 開く対象の要素。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function openDialogElement(\n element: HTMLElement,\n options: ResolvedInstallOptions,\n): Promise<void> {\n prepareModalElement(element);\n const modalInstance = createModalInstance(element, undefined, options.bootstrap);\n if (!modalInstance) {\n return Promise.reject(new Error('Bootstrap Modal is unavailable.'));\n }\n\n modalInstance.show();\n return Promise.resolve();\n}\n\n/**\n * 任意要素を Bootstrap Modal として閉じる。\n *\n * @param element 閉じる対象の要素。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function closeDialogElement(\n element: HTMLElement,\n options: ResolvedInstallOptions,\n): Promise<void> {\n prepareModalElement(element);\n const modalInstance = createModalInstance(element, undefined, options.bootstrap);\n if (!modalInstance) {\n return Promise.reject(new Error('Bootstrap Modal is unavailable.'));\n }\n\n modalInstance.hide();\n return Promise.resolve();\n}\n","import { createToastInstance } from './bootstrap_resolver';\nimport type { ResolvedInstallOptions, ToastPosition } from './types';\n\nconst TOAST_CONTAINER_ATTRIBUTE = 'data-haori-bootstrap-toast-container';\nconst TOAST_ATTRIBUTE = 'data-haori-bootstrap-toast';\nconst TOAST_ACCENT_ATTRIBUTE = 'data-haori-bootstrap-toast-accent';\nconst TOAST_DISMISS_ATTRIBUTE = 'data-haori-bootstrap-toast-dismiss';\n\ninterface ToastAppearance {\n accentClassName: string;\n}\n\nconst TOAST_POSITION_CLASSES: Record<ToastPosition, string> = {\n 'top-start': 'top-0 start-0',\n 'top-center': 'top-0 start-50 translate-middle-x',\n 'top-end': 'top-0 end-0',\n 'bottom-start': 'bottom-0 start-0',\n 'bottom-center': 'bottom-0 start-50 translate-middle-x',\n 'bottom-end': 'bottom-0 end-0',\n};\n\n/**\n * 通知レベルを toast 表示用の見た目へ変換する。\n *\n * @param level 通知レベル。\n * @return 対応する見た目定義。\n */\nfunction resolveToastAppearance(level?: string): ToastAppearance {\n switch (level) {\n case 'success':\n return { accentClassName: 'bg-success' };\n case 'warning':\n return { accentClassName: 'bg-warning' };\n case 'error':\n return { accentClassName: 'bg-danger' };\n default:\n return { accentClassName: 'bg-info' };\n }\n}\n\n/**\n * toast コンテナを配置する親要素を解決する。\n *\n * @param documentObject 検索に使用する document。\n * @param options 解決済み導入設定。\n * @return 配置先の要素。\n */\nfunction resolveToastRoot(documentObject: Document, options: ResolvedInstallOptions): HTMLElement {\n if (options.toastContainerSelector) {\n const resolvedElement = documentObject.querySelector<HTMLElement>(options.toastContainerSelector);\n if (resolvedElement) {\n return resolvedElement;\n }\n }\n\n return documentObject.body;\n}\n\n/**\n * toast コンテナを取得または生成する。\n *\n * @param documentObject 生成に使用する document。\n * @param options 解決済み導入設定。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureToastContainer(documentObject: Document, options: ResolvedInstallOptions): HTMLElement {\n const rootElement = resolveToastRoot(documentObject, options);\n const positionClasses = TOAST_POSITION_CLASSES[options.toastPosition ?? 'bottom-end'];\n const existingContainer = rootElement.querySelector<HTMLElement>(\n `[${TOAST_CONTAINER_ATTRIBUTE}=\"true\"]`,\n );\n if (existingContainer) {\n const allPositionClasses = Object.values(TOAST_POSITION_CLASSES)\n .flatMap(c => c.split(' '));\n existingContainer.classList.remove(...allPositionClasses);\n existingContainer.classList.add(...positionClasses.split(' '));\n return existingContainer;\n }\n\n const container = documentObject.createElement('div');\n container.className = `toast-container position-fixed ${positionClasses} p-3`;\n container.setAttribute(TOAST_CONTAINER_ATTRIBUTE, 'true');\n rootElement.appendChild(container);\n return container;\n}\n\n/**\n * Bootstrap Toast を表示する。\n *\n * @param message 表示するメッセージ。\n * @param level 通知レベル。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function showToast(\n message: string,\n level: string | undefined,\n options: ResolvedInstallOptions,\n): Promise<void> {\n const documentObject = globalThis.document;\n const appearance = resolveToastAppearance(level);\n const toastElement = documentObject.createElement('div');\n toastElement.className = 'toast border bg-body text-body shadow-sm';\n toastElement.setAttribute('role', 'status');\n toastElement.setAttribute('aria-live', 'polite');\n toastElement.setAttribute('aria-atomic', 'true');\n toastElement.setAttribute(TOAST_ATTRIBUTE, 'true');\n\n const bodyWrapper = documentObject.createElement('div');\n bodyWrapper.className = 'd-flex align-items-stretch';\n\n const accentElement = documentObject.createElement('div');\n accentElement.className = `flex-shrink-0 rounded-start ${appearance.accentClassName}`;\n accentElement.style.width = '0.375rem';\n accentElement.setAttribute(TOAST_ACCENT_ATTRIBUTE, 'true');\n\n const bodyElement = documentObject.createElement('div');\n bodyElement.className = 'toast-body';\n bodyElement.style.whiteSpace = 'pre-line';\n bodyElement.textContent = message;\n\n const dismissButton = documentObject.createElement('button');\n dismissButton.type = 'button';\n dismissButton.className = 'btn-close me-2 m-auto flex-shrink-0';\n dismissButton.setAttribute('aria-label', 'Close');\n dismissButton.setAttribute(TOAST_DISMISS_ATTRIBUTE, 'true');\n\n bodyWrapper.appendChild(accentElement);\n bodyWrapper.appendChild(bodyElement);\n bodyWrapper.appendChild(dismissButton);\n toastElement.appendChild(bodyWrapper);\n ensureToastContainer(documentObject, options).appendChild(toastElement);\n\n const toastOptions = options.toastDelay !== undefined ? { delay: options.toastDelay } : undefined;\n const toastInstance = createToastInstance(toastElement, toastOptions, options.bootstrap);\n if (!toastInstance) {\n toastElement.remove();\n return Promise.reject(new Error('Bootstrap Toast is unavailable.'));\n }\n\n dismissButton.addEventListener('click', () => {\n toastInstance.hide?.();\n });\n\n toastElement.addEventListener(\n 'hidden.bs.toast',\n () => {\n toastElement.remove();\n toastInstance.dispose?.();\n },\n { once: true },\n );\n\n try {\n toastInstance.show();\n return Promise.resolve();\n } catch (error) {\n toastElement.remove();\n toastInstance.dispose?.();\n return Promise.reject(error);\n }\n}\n","import { hasModalSupport, hasToastSupport } from './bootstrap_resolver';\nimport { showConfirm, showDialog } from './dialog';\nimport { addManagedErrorMessage, addManagedMessage, clearManagedMessages } from './message';\nimport { closeDialogElement, openDialogElement } from './modal';\nimport { showToast } from './toast';\nimport type { HaoriGlobalObject, ResolvedInstallOptions } from './types';\n\n/**\n * BootstrapHaori が利用する内部コンテキスト。\n */\nexport interface BootstrapHaoriContext {\n /** 差し替え前の Haori 実装。 */\n originalHaori?: HaoriGlobalObject;\n /** 解決済みの導入設定。 */\n options: ResolvedInstallOptions;\n}\n\nconst defaultContext: BootstrapHaoriContext = {\n options: {\n fallbackToNative: true,\n },\n};\n\nlet context = defaultContext;\n\n/**\n * 表示用 message 中のエスケープ済み改行を実際の改行へ正規化する。\n *\n * @param message 正規化対象のメッセージ。\n * @return 正規化後のメッセージ。\n */\nfunction normalizeMessageText(message: string): string {\n return message.replace(/\\\\n/g, '\\n');\n}\n\n/**\n * 現在のブラウザ window を取得する。\n *\n * @return 現在の window。存在しない場合は undefined。\n */\nfunction getBrowserWindow(): Window | undefined {\n const scope = globalThis as typeof globalThis & { window?: Window };\n return scope.window;\n}\n\n/**\n * 値を Promise<void> 契約へ正規化する。\n *\n * @param value 正規化対象の値。\n * @return 完了時に解決される Promise。\n */\nfunction toPromiseVoid(value: Promise<void> | void | unknown): Promise<void> {\n return Promise.resolve(value).then(() => undefined);\n}\n\n/**\n * 元の Haori 実装から対象メソッドを取得する。\n *\n * @param methodName 取得対象のメソッド名。\n * @return 対象メソッド。見つからない場合は undefined。\n */\nfunction getOriginalMethod(\n methodName: keyof HaoriGlobalObject,\n): ((...args: readonly unknown[]) => unknown) | undefined {\n const method = context.originalHaori?.[methodName];\n return typeof method === 'function'\n ? (method as (...args: readonly unknown[]) => unknown)\n : undefined;\n}\n\n/**\n * no-op に正規化したことを警告する。\n *\n * @param apiName 利用できなかった API 名。\n * @return 戻り値はない。\n */\nfunction warnNoop(apiName: string): void {\n console.warn(`[haori-bootstrap] ${apiName} skipped because Bootstrap support is unavailable.`);\n}\n\n/**\n * dialog の fallback 経路を処理する。\n *\n * @param message 表示対象のメッセージ。\n * @return 完了時に解決される Promise。\n */\nfunction fallbackDialog(message: string): Promise<void> {\n const normalizedMessage = normalizeMessageText(message);\n const originalMethod = getOriginalMethod('dialog');\n if (originalMethod) {\n return toPromiseVoid(originalMethod(normalizedMessage));\n }\n\n const browserWindow = getBrowserWindow();\n if (context.options.fallbackToNative && typeof browserWindow?.alert === 'function') {\n browserWindow.alert(normalizedMessage);\n return Promise.resolve();\n }\n\n warnNoop('dialog');\n return Promise.resolve();\n}\n\n/**\n * confirm の fallback 経路を処理する。\n *\n * @param message 表示対象のメッセージ。\n * @return 確認結果を返す Promise。\n */\nfunction fallbackConfirm(message: string): Promise<boolean> {\n const normalizedMessage = normalizeMessageText(message);\n const originalMethod = getOriginalMethod('confirm');\n if (originalMethod) {\n return Promise.resolve(originalMethod(normalizedMessage) as Promise<boolean> | boolean).then(\n (value) => Boolean(value),\n );\n }\n\n const browserWindow = getBrowserWindow();\n if (context.options.fallbackToNative && typeof browserWindow?.confirm === 'function') {\n return Promise.resolve(browserWindow.confirm(normalizedMessage));\n }\n\n warnNoop('confirm');\n return Promise.resolve(false);\n}\n\n/**\n * toast の fallback 経路を処理する。\n *\n * @param message 表示対象のメッセージ。\n * @param level 通知レベル。\n * @return 完了時に解決される Promise。\n */\nfunction fallbackToast(message: string, level?: string): Promise<void> {\n const normalizedMessage = normalizeMessageText(message);\n const originalMethod = getOriginalMethod('toast');\n if (originalMethod) {\n return toPromiseVoid(originalMethod(normalizedMessage, level));\n }\n\n warnNoop('toast');\n return Promise.resolve();\n}\n\n/**\n * openDialog または closeDialog の fallback 経路を処理する。\n *\n * @param methodName 呼び出す API 名。\n * @param element 対象要素。\n * @return 完了時に解決される Promise。\n */\nfunction fallbackModal(methodName: 'openDialog' | 'closeDialog', element: HTMLElement): Promise<void> {\n const originalMethod = getOriginalMethod(methodName);\n if (originalMethod) {\n return toPromiseVoid(originalMethod(element));\n }\n\n warnNoop(methodName);\n return Promise.resolve();\n}\n\n/**\n * BootstrapHaori が参照する内部状態を更新する。\n *\n * @param nextContext 差し替え先が参照する内部コンテキスト。\n * @return 戻り値はない。\n */\nexport function setBootstrapHaoriContext(nextContext: BootstrapHaoriContext): void {\n context = nextContext;\n}\n\n/**\n * Haori の UI 系静的メソッドを差し替える最小ファサード。\n */\nexport class BootstrapHaori {\n /**\n * 情報表示ダイアログを表示する。\n *\n * @param message 表示するメッセージ。\n * @return 完了時に解決される Promise。\n */\n public static dialog(message: string): Promise<void> {\n const normalizedMessage = normalizeMessageText(message);\n if (hasModalSupport(context.options.bootstrap)) {\n return showDialog(normalizedMessage, context.options).catch(() => fallbackDialog(normalizedMessage));\n }\n\n return fallbackDialog(normalizedMessage);\n }\n\n /**\n * 確認ダイアログを表示する。\n *\n * @param message 表示するメッセージ。\n * @return OK のみ true を返す Promise。\n */\n public static confirm(message: string): Promise<boolean> {\n const normalizedMessage = normalizeMessageText(message);\n if (hasModalSupport(context.options.bootstrap)) {\n return showConfirm(normalizedMessage, context.options).catch(() => fallbackConfirm(normalizedMessage));\n }\n\n return fallbackConfirm(normalizedMessage);\n }\n\n /**\n * トースト通知を表示する。\n *\n * @param message 表示するメッセージ。\n * @param level 通知レベル。\n * @return 完了時に解決される Promise。\n */\n public static toast(message: string, level?: string): Promise<void> {\n const normalizedMessage = normalizeMessageText(message);\n if (hasToastSupport(context.options.bootstrap)) {\n return showToast(normalizedMessage, level, context.options).catch(() =>\n fallbackToast(normalizedMessage, level),\n );\n }\n\n return fallbackToast(normalizedMessage, level);\n }\n\n /**\n * 任意のダイアログ要素を開く。\n *\n * @param element 開く対象の要素。\n * @return 完了時に解決される Promise。\n */\n public static openDialog(element: HTMLElement): Promise<void> {\n if (hasModalSupport(context.options.bootstrap)) {\n return openDialogElement(element, context.options).catch(() =>\n fallbackModal('openDialog', element),\n );\n }\n\n return fallbackModal('openDialog', element);\n }\n\n /**\n * 任意のダイアログ要素を閉じる。\n *\n * @param element 閉じる対象の要素。\n * @return 完了時に解決される Promise。\n */\n public static closeDialog(element: HTMLElement): Promise<void> {\n if (hasModalSupport(context.options.bootstrap)) {\n return closeDialogElement(element, context.options).catch(() =>\n fallbackModal('closeDialog', element),\n );\n }\n\n return fallbackModal('closeDialog', element);\n }\n\n /**\n * 管理対象のエラーメッセージを追加する。\n *\n * @param target 追加先の要素。\n * @param message 表示するメッセージ。\n * @return 完了時に解決される Promise。\n */\n public static addErrorMessage(target: HTMLElement, message: string): Promise<void> {\n return addManagedErrorMessage(target, message);\n }\n\n /**\n * 管理対象のメッセージをレベル付きで追加する。\n *\n * @param target 追加先の要素。\n * @param message 表示するメッセージ。\n * @param level メッセージレベル (error / success / warning / info)。省略時は error。\n * @return 完了時に解決される Promise。\n */\n public static addMessage(target: HTMLElement, message: string, level?: string): Promise<void> {\n return addManagedMessage(target, message, level);\n }\n\n /**\n * 管理対象のメッセージを削除する。\n *\n * @param parentOrTarget 削除対象の親要素または対象要素。\n * @return 完了時に解決される Promise。\n */\n public static clearMessages(parentOrTarget: HTMLElement): Promise<void> {\n return clearManagedMessages(parentOrTarget);\n }\n}\n","import { BootstrapHaori, setBootstrapHaoriContext } from './bootstrap_haori';\nimport type {\n BrowserWindow,\n HaoriGlobalObject,\n InstallOptions,\n ResolvedInstallOptions,\n} from './types';\n\nconst DEFAULT_INSTALL_OPTIONS: ResolvedInstallOptions = {\n fallbackToNative: true,\n};\n\nconst installState: {\n installed: boolean;\n originalHaori?: HaoriGlobalObject;\n originalRuntime?: 'embedded' | 'demo';\n options: ResolvedInstallOptions;\n} = {\n installed: false,\n options: DEFAULT_INSTALL_OPTIONS,\n};\n\n/**\n * 現在のブラウザ window を取得する。\n *\n * @return 現在の window。存在しない場合は undefined。\n */\nfunction getBrowserWindow(): BrowserWindow | undefined {\n const scope = globalThis as typeof globalThis & { window?: BrowserWindow };\n return scope.window;\n}\n\n/**\n * install に渡された設定を既定値込みで解決する。\n *\n * @param options 指定された導入設定。\n * @param browserWindow 現在の window。\n * @return 解決済みの導入設定。\n */\nfunction resolveInstallOptions(\n options: InstallOptions,\n browserWindow: BrowserWindow | undefined,\n): ResolvedInstallOptions {\n return {\n bootstrap: options.bootstrap ?? browserWindow?.bootstrap,\n fallbackToNative: options.fallbackToNative ?? DEFAULT_INSTALL_OPTIONS.fallbackToNative,\n runtime:\n options.runtime ?? installState.options.runtime ?? browserWindow?.Haori?.runtime,\n toastContainerSelector:\n options.toastContainerSelector ?? installState.options.toastContainerSelector,\n dialogContainerSelector:\n options.dialogContainerSelector ?? installState.options.dialogContainerSelector,\n dialogTitle: options.dialogTitle ?? installState.options.dialogTitle,\n toastPosition: options.toastPosition ?? installState.options.toastPosition,\n toastDelay: options.toastDelay ?? installState.options.toastDelay,\n };\n}\n\n/**\n * 自動有効化に必要な前提が揃っているかを返す。\n *\n * @param browserWindow 判定対象の window。\n * @return 自動有効化可能なら true。\n */\nexport function hasAutoEnablePrerequisites(\n browserWindow: BrowserWindow | undefined = getBrowserWindow(),\n): boolean {\n return Boolean(browserWindow?.Haori && browserWindow.bootstrap);\n}\n\n/**\n * Bootstrap 対応 Haori を再適用し、必要なら設定を上書きする。\n *\n * @param options 上書きする導入設定。\n * @return 戻り値はない。\n */\nexport function install(options: InstallOptions = {}): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow?.Haori) {\n throw new Error('window.Haori is required before calling install().');\n }\n\n if (!installState.originalHaori) {\n installState.originalHaori = browserWindow.Haori;\n installState.originalRuntime = browserWindow.Haori.runtime as 'embedded' | 'demo' | undefined;\n }\n\n installState.options = resolveInstallOptions(options, browserWindow);\n if (installState.options.runtime) {\n const targetHaori = installState.originalHaori ?? browserWindow.Haori;\n if (typeof targetHaori.setRuntime === 'function') {\n targetHaori.setRuntime(installState.options.runtime);\n } else {\n console.warn(\n '[haori-bootstrap] Haori.setRuntime が利用できません。runtime 設定は無視されます。',\n );\n }\n }\n setBootstrapHaoriContext({\n originalHaori: installState.originalHaori,\n options: installState.options,\n });\n browserWindow.Haori = BootstrapHaori as unknown as HaoriGlobalObject;\n installState.installed = true;\n}\n\n/**\n * 元の Haori 実装を復元する。\n *\n * @return 戻り値はない。\n */\nexport function uninstall(): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow || !installState.originalHaori) {\n return;\n }\n\n installState.originalHaori.runtime = installState.originalRuntime;\n browserWindow.Haori = installState.originalHaori;\n installState.installed = false;\n installState.originalHaori = undefined;\n installState.originalRuntime = undefined;\n installState.options = DEFAULT_INSTALL_OPTIONS;\n}\n\n/**\n * 現在 BootstrapHaori が有効かどうかを返す。\n *\n * @return 有効なら true。\n */\nexport function isInstalled(): boolean {\n return installState.installed;\n}\n","import { hasAutoEnablePrerequisites, install } from './install';\nimport type { BrowserWindow } from './types';\n\nconst AUTO_ENABLE_MARKER = '__haoriJsBootstrapAutoEnabled__';\n\n/**\n * 現在のブラウザ window を取得する。\n *\n * @return 現在の window。存在しない場合は undefined。\n */\nfunction getBrowserWindow(): BrowserWindow | undefined {\n const scope = globalThis as typeof globalThis & { window?: BrowserWindow };\n return scope.window;\n}\n\n/**\n * 既に自動有効化済みかどうかを返す。\n *\n * @param browserWindow 判定対象の window。\n * @return 既に自動有効化済みなら true。\n */\nfunction wasAutoEnabled(browserWindow: BrowserWindow): boolean {\n return Boolean((browserWindow as unknown as Record<string, unknown>)[AUTO_ENABLE_MARKER]);\n}\n\n/**\n * 自動有効化済みの印を付ける。\n *\n * @param browserWindow 更新対象の window。\n * @return 戻り値はない。\n */\nfunction markAutoEnabled(browserWindow: BrowserWindow): void {\n (browserWindow as unknown as Record<string, unknown>)[AUTO_ENABLE_MARKER] = true;\n}\n\n/**\n * 前提が揃っていれば自動有効化を試行する。\n *\n * @return 戻り値はない。\n */\nfunction autoEnable(): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow || wasAutoEnabled(browserWindow)) {\n return;\n }\n\n if (!hasAutoEnablePrerequisites(browserWindow)) {\n console.warn(\n '[haori-bootstrap] Auto-enable skipped because window.Haori or window.bootstrap is missing.',\n );\n return;\n }\n\n try {\n install({ bootstrap: browserWindow.bootstrap });\n markAutoEnabled(browserWindow);\n } catch (error) {\n console.warn('[haori-bootstrap] Auto-enable failed.', error);\n }\n}\n\nautoEnable();\n","import './browser';\n\nexport { BootstrapHaori } from './bootstrap_haori';\nexport { hasAutoEnablePrerequisites, install, isInstalled, uninstall } from './install';\nexport type {\n BootstrapNamespace,\n BrowserWindow,\n HaoriBootstrapGlobal,\n HaoriGlobalObject,\n InstallOptions,\n ResolvedInstallOptions,\n} from './types';\n\n/**\n * パッケージの公開版数。\n */\nexport const version = '0.3.1';\n"],"names":["isConstructor","value","resolveModalConstructor","bootstrap","resolveToastConstructor","hasModalSupport","hasToastSupport","createModalInstance","element","options","modalConstructor","createToastInstance","toastOptions","toastConstructor","DIALOG_CONTAINER_ATTRIBUTE","ACTION_ATTRIBUTE","DIALOG_TITLE_ATTRIBUTE","dialogTitleCounter","createDialogModalOptions","resolveDialogContainer","documentObject","resolvedElement","createModalShell","message","isConfirm","title","modalElement","dialogElement","contentElement","titleId","headerElement","titleElement","bodyElement","messageElement","footerElement","cancelButton","okButton","showDialog","modalInstance","resolve","reject","finalize","handleHidden","error","showConfirm","confirmed","OWNED_ATTRIBUTE","CONTAINER_ATTRIBUTE","INVALID_TARGET_ATTRIBUTE","VALID_TARGET_ATTRIBUTE","isChoiceInput","target","isRadioInput","isFieldTarget","getDirectOwnedContainer","createMessageItem","getOwnedDirectChild","getRadioGroupTargets","rootNode","escapedName","groupTargets","findCommonAncestor","elements","firstElement","restElements","candidate","resolveRadioMessageHost","wrappers","commonAncestor","resolveChoiceMessageHost","closestFormCheck","ensureFieldContainer","nextElement","container","ensureChoiceContainer","hostElement","existingContainer","ensureBlockContainer","removeOwnedInvalidState","removeOwnedValidState","resolveBlockAlertClass","level","resolveFieldFeedbackClass","markChoiceInvalidState","clearChoiceInvalidState","ensureFieldContainerForLevel","ensureChoiceContainerForLevel","ensureBlockContainerForLevel","addManagedErrorMessage","addManagedMessage","targets","clearManagedMessages","parentOrTarget","prepareModalElement","openDialogElement","closeDialogElement","TOAST_CONTAINER_ATTRIBUTE","TOAST_ATTRIBUTE","TOAST_ACCENT_ATTRIBUTE","TOAST_DISMISS_ATTRIBUTE","TOAST_POSITION_CLASSES","resolveToastAppearance","resolveToastRoot","ensureToastContainer","rootElement","positionClasses","allPositionClasses","c","showToast","appearance","toastElement","bodyWrapper","accentElement","dismissButton","toastInstance","context","normalizeMessageText","getBrowserWindow","toPromiseVoid","getOriginalMethod","methodName","method","warnNoop","apiName","fallbackDialog","normalizedMessage","originalMethod","browserWindow","fallbackConfirm","fallbackToast","fallbackModal","setBootstrapHaoriContext","nextContext","BootstrapHaori","DEFAULT_INSTALL_OPTIONS","installState","resolveInstallOptions","hasAutoEnablePrerequisites","install","targetHaori","uninstall","isInstalled","AUTO_ENABLE_MARKER","wasAutoEnabled","markAutoEnabled","autoEnable","version"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"haori-bootstrap.iife.js","sources":["../src/bootstrap_resolver.ts","../src/dialog.ts","../src/message.ts","../src/modal.ts","../src/toast.ts","../src/bootstrap_haori.ts","../src/install.ts","../src/browser.ts","../src/index.ts"],"sourcesContent":["import type {\n BootstrapModalConstructor,\n BootstrapModalInstance,\n BootstrapModalOptions,\n BootstrapNamespace,\n BootstrapToastConstructor,\n BootstrapToastInstance,\n BootstrapToastOptions,\n} from './types';\n\n/**\n * 値がコンストラクター関数かどうかを判定する。\n *\n * @param value 判定対象の値。\n * @return コンストラクター関数なら true。\n */\nfunction isConstructor<T>(value: unknown): value is new (...args: readonly unknown[]) => T {\n return typeof value === 'function';\n}\n\n/**\n * Bootstrap の Modal コンストラクターを返す。\n *\n * @param bootstrap Bootstrap 名前空間。\n * @return Modal コンストラクター。見つからない場合は undefined。\n */\nexport function resolveModalConstructor(\n bootstrap?: BootstrapNamespace,\n): BootstrapModalConstructor | undefined {\n return isConstructor<BootstrapModalInstance>(bootstrap?.Modal)\n ? (bootstrap?.Modal as BootstrapModalConstructor)\n : undefined;\n}\n\n/**\n * Bootstrap の Toast コンストラクターを返す。\n *\n * @param bootstrap Bootstrap 名前空間。\n * @return Toast コンストラクター。見つからない場合は undefined。\n */\nexport function resolveToastConstructor(\n bootstrap?: BootstrapNamespace,\n): BootstrapToastConstructor | undefined {\n return isConstructor<BootstrapToastInstance>(bootstrap?.Toast)\n ? (bootstrap?.Toast as BootstrapToastConstructor)\n : undefined;\n}\n\n/**\n * Modal が利用可能かどうかを返す。\n *\n * @param bootstrap Bootstrap 名前空間。\n * @return 利用可能なら true。\n */\nexport function hasModalSupport(bootstrap?: BootstrapNamespace): boolean {\n return Boolean(resolveModalConstructor(bootstrap));\n}\n\n/**\n * Toast が利用可能かどうかを返す。\n *\n * @param bootstrap Bootstrap 名前空間。\n * @return 利用可能なら true。\n */\nexport function hasToastSupport(bootstrap?: BootstrapNamespace): boolean {\n return Boolean(resolveToastConstructor(bootstrap));\n}\n\n/**\n * Modal インスタンスを取得または生成する。\n *\n * @param element 対象要素。\n * @param bootstrap Bootstrap 名前空間。\n * @return Modal インスタンス。生成できない場合は undefined。\n */\nexport function createModalInstance(\n element: HTMLElement,\n options?: BootstrapModalOptions,\n bootstrap?: BootstrapNamespace,\n): BootstrapModalInstance | undefined {\n const modalConstructor = resolveModalConstructor(bootstrap);\n if (!modalConstructor) {\n return undefined;\n }\n\n if (typeof modalConstructor.getOrCreateInstance === 'function') {\n return modalConstructor.getOrCreateInstance(element, options);\n }\n\n return new modalConstructor(element, options);\n}\n\n/**\n * Toast インスタンスを取得または生成する。\n *\n * @param element 対象要素。\n * @param toastOptions Toast 設定。\n * @param bootstrap Bootstrap 名前空間。\n * @return Toast インスタンス。生成できない場合は undefined。\n */\nexport function createToastInstance(\n element: HTMLElement,\n toastOptions?: BootstrapToastOptions,\n bootstrap?: BootstrapNamespace,\n): BootstrapToastInstance | undefined {\n const toastConstructor = resolveToastConstructor(bootstrap);\n if (!toastConstructor) {\n return undefined;\n }\n\n if (typeof toastConstructor.getOrCreateInstance === 'function') {\n return toastConstructor.getOrCreateInstance(element, toastOptions);\n }\n\n return new toastConstructor(element, toastOptions);\n}\n","import { createModalInstance } from './bootstrap_resolver';\nimport type { ResolvedInstallOptions } from './types';\n\nconst DIALOG_CONTAINER_ATTRIBUTE = 'data-haori-bootstrap-dialog';\nconst ACTION_ATTRIBUTE = 'data-haori-bootstrap-action';\nconst DIALOG_TITLE_ATTRIBUTE = 'data-haori-bootstrap-dialog-title';\n\nlet dialogTitleCounter = 0;\n\n/**\n * dialog 系 modal の既定オプションを返す。\n *\n * @return Bootstrap Modal の生成オプション。\n */\nfunction createDialogModalOptions() {\n return {\n backdrop: 'static' as const,\n keyboard: false,\n };\n}\n\n/**\n * dialog を挿入する親要素を解決する。\n *\n * @param documentObject 検索に使用する document。\n * @param options 解決済み導入設定。\n * @return 挿入先の要素。\n */\nfunction resolveDialogContainer(documentObject: Document, options: ResolvedInstallOptions): HTMLElement {\n if (options.dialogContainerSelector) {\n const resolvedElement = documentObject.querySelector<HTMLElement>(\n options.dialogContainerSelector,\n );\n if (resolvedElement) {\n return resolvedElement;\n }\n }\n\n return documentObject.body;\n}\n\n/**\n * dialog または confirm 用の modal 要素を組み立てる。\n *\n * @param documentObject 生成に使用する document。\n * @param message 表示するメッセージ。\n * @param isConfirm confirm 用かどうか。\n * @param title ヘッダーに表示するタイトル。未指定はヘッダーなし。\n * @return 生成した modal 要素。\n */\nfunction createModalShell(\n documentObject: Document,\n message: string,\n isConfirm: boolean,\n title?: string,\n): HTMLDivElement {\n const modalElement = documentObject.createElement('div');\n modalElement.className = 'modal fade';\n modalElement.tabIndex = -1;\n modalElement.setAttribute(DIALOG_CONTAINER_ATTRIBUTE, 'true');\n modalElement.setAttribute('aria-hidden', 'true');\n\n const dialogElement = documentObject.createElement('div');\n dialogElement.className = 'modal-dialog modal-dialog-centered';\n\n const contentElement = documentObject.createElement('div');\n contentElement.className = 'modal-content';\n\n if (title) {\n const titleId = `haori-dialog-title-${++dialogTitleCounter}`;\n const headerElement = documentObject.createElement('div');\n headerElement.className = 'modal-header';\n\n const titleElement = documentObject.createElement('h5');\n titleElement.className = 'modal-title';\n titleElement.id = titleId;\n titleElement.setAttribute(DIALOG_TITLE_ATTRIBUTE, 'true');\n titleElement.textContent = title;\n headerElement.appendChild(titleElement);\n\n contentElement.appendChild(headerElement);\n modalElement.setAttribute('aria-labelledby', titleId);\n }\n\n const bodyElement = documentObject.createElement('div');\n bodyElement.className = 'modal-body';\n\n const messageElement = documentObject.createElement('p');\n messageElement.className = 'mb-0';\n messageElement.style.whiteSpace = 'pre-line';\n messageElement.textContent = message;\n bodyElement.appendChild(messageElement);\n\n const footerElement = documentObject.createElement('div');\n footerElement.className = 'modal-footer';\n\n if (isConfirm) {\n const cancelButton = documentObject.createElement('button');\n cancelButton.type = 'button';\n cancelButton.className = 'btn btn-secondary';\n cancelButton.setAttribute(ACTION_ATTRIBUTE, 'cancel');\n cancelButton.textContent = 'Cancel';\n footerElement.appendChild(cancelButton);\n }\n\n const okButton = documentObject.createElement('button');\n okButton.type = 'button';\n okButton.className = 'btn btn-primary';\n okButton.setAttribute(ACTION_ATTRIBUTE, 'ok');\n okButton.textContent = 'OK';\n footerElement.appendChild(okButton);\n\n contentElement.append(bodyElement, footerElement);\n dialogElement.appendChild(contentElement);\n modalElement.appendChild(dialogElement);\n return modalElement;\n}\n\n/**\n * 情報表示用の Bootstrap Modal を表示する。\n *\n * @param message 表示するメッセージ。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function showDialog(message: string, options: ResolvedInstallOptions): Promise<void> {\n const documentObject = globalThis.document;\n const modalElement = createModalShell(documentObject, message, false, options.dialogTitle);\n resolveDialogContainer(documentObject, options).appendChild(modalElement);\n\n const modalInstance = createModalInstance(\n modalElement,\n createDialogModalOptions(),\n options.bootstrap,\n );\n if (!modalInstance) {\n modalElement.remove();\n return Promise.reject(new Error('Bootstrap Modal is unavailable.'));\n }\n\n return new Promise<void>((resolve, reject) => {\n const finalize = (): void => {\n modalElement.removeEventListener('hidden.bs.modal', handleHidden);\n modalElement.remove();\n modalInstance.dispose?.();\n resolve();\n };\n\n const handleHidden = (): void => {\n finalize();\n };\n\n const okButton = modalElement.querySelector<HTMLButtonElement>(`[${ACTION_ATTRIBUTE}=\"ok\"]`);\n okButton?.addEventListener(\n 'click',\n () => {\n modalInstance.hide();\n },\n { once: true },\n );\n\n modalElement.addEventListener('hidden.bs.modal', handleHidden, { once: true });\n\n try {\n modalInstance.show();\n } catch (error) {\n modalElement.removeEventListener('hidden.bs.modal', handleHidden);\n modalElement.remove();\n modalInstance.dispose?.();\n reject(error);\n }\n });\n}\n\n/**\n * 確認用の Bootstrap Modal を表示する。\n *\n * @param message 表示するメッセージ。\n * @param options 解決済み導入設定。\n * @return OK のみ true を返す Promise。\n */\nexport function showConfirm(\n message: string,\n options: ResolvedInstallOptions,\n): Promise<boolean> {\n const documentObject = globalThis.document;\n const modalElement = createModalShell(documentObject, message, true, options.dialogTitle);\n resolveDialogContainer(documentObject, options).appendChild(modalElement);\n\n const modalInstance = createModalInstance(\n modalElement,\n createDialogModalOptions(),\n options.bootstrap,\n );\n if (!modalInstance) {\n modalElement.remove();\n return Promise.reject(new Error('Bootstrap Modal is unavailable.'));\n }\n\n return new Promise<boolean>((resolve, reject) => {\n let confirmed = false;\n\n const finalize = (): void => {\n modalElement.removeEventListener('hidden.bs.modal', handleHidden);\n modalElement.remove();\n modalInstance.dispose?.();\n resolve(confirmed);\n };\n\n const handleHidden = (): void => {\n finalize();\n };\n\n const okButton = modalElement.querySelector<HTMLButtonElement>(`[${ACTION_ATTRIBUTE}=\"ok\"]`);\n const cancelButton = modalElement.querySelector<HTMLButtonElement>(\n `[${ACTION_ATTRIBUTE}=\"cancel\"]`,\n );\n\n okButton?.addEventListener(\n 'click',\n () => {\n confirmed = true;\n modalInstance.hide();\n },\n { once: true },\n );\n cancelButton?.addEventListener(\n 'click',\n () => {\n confirmed = false;\n modalInstance.hide();\n },\n { once: true },\n );\n\n modalElement.addEventListener('hidden.bs.modal', handleHidden, { once: true });\n\n try {\n modalInstance.show();\n } catch (error) {\n modalElement.removeEventListener('hidden.bs.modal', handleHidden);\n modalElement.remove();\n modalInstance.dispose?.();\n reject(error);\n }\n });\n}\n","const OWNED_ATTRIBUTE = 'data-haori-bootstrap-owned';\nconst CONTAINER_ATTRIBUTE = 'data-haori-bootstrap-message-container';\nconst INVALID_TARGET_ATTRIBUTE = 'data-haori-bootstrap-invalid-target';\nconst VALID_TARGET_ATTRIBUTE = 'data-haori-bootstrap-valid-target';\n\n/**\n * 対象要素が checkbox または radio かどうかを判定する。\n *\n * @param target 判定対象の要素。\n * @return checkbox または radio の input 要素なら true。\n */\nfunction isChoiceInput(target: HTMLElement): target is HTMLInputElement {\n return (\n target instanceof HTMLInputElement &&\n (target.type === 'checkbox' || target.type === 'radio')\n );\n}\n\n/**\n * 対象要素が radio input かどうかを判定する。\n *\n * @param target 判定対象の要素。\n * @return radio の input 要素なら true。\n */\nfunction isRadioInput(target: HTMLElement): target is HTMLInputElement {\n return target instanceof HTMLInputElement && target.type === 'radio';\n}\n\n/**\n * 対象要素が通常の invalid-feedback を直後に付与するフィールドかどうかを判定する。\n *\n * @param target 判定対象の要素。\n * @return 入力系フィールドなら true。\n */\nfunction isFieldTarget(\n target: HTMLElement,\n): target is HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement {\n return (\n target instanceof HTMLInputElement ||\n target instanceof HTMLSelectElement ||\n target instanceof HTMLTextAreaElement\n );\n}\n\n/**\n * 子要素から管理対象のメッセージコンテナを取得する。\n *\n * @param target 検索対象の要素。\n * @return 管理対象コンテナ。見つからない場合は undefined。\n */\nfunction getDirectOwnedContainer(target: HTMLElement): HTMLElement | undefined {\n return Array.from(target.children).find(\n (element): element is HTMLElement =>\n element instanceof HTMLElement && element.getAttribute(CONTAINER_ATTRIBUTE) === 'true',\n );\n}\n\n/**\n * 管理対象のメッセージ要素を生成する。\n *\n * @param documentObject 生成に使用する document。\n * @param message 表示するメッセージ。\n * @return 生成したメッセージ要素。\n */\nfunction createMessageItem(documentObject: Document, message: string): HTMLDivElement {\n const messageElement = documentObject.createElement('div');\n messageElement.setAttribute(OWNED_ATTRIBUTE, 'true');\n messageElement.textContent = message;\n return messageElement;\n}\n\n/**\n * block container 配下の既存メッセージコンテナを取得する。\n *\n * @param target 検索対象の要素。\n * @return 既存コンテナ。見つからない場合は undefined。\n */\nfunction getOwnedDirectChild(target: HTMLElement): HTMLElement | undefined {\n return getDirectOwnedContainer(target);\n}\n\n/**\n * 指定した radio と同じグループに属する radio 要素一覧を取得する。\n *\n * @param target 基準となる radio 要素。\n * @return 同じグループに属する radio 要素一覧。\n */\nfunction getRadioGroupTargets(target: HTMLInputElement): HTMLInputElement[] {\n if (target.name) {\n const rootNode = target.form ?? target.ownerDocument;\n const escapedName = typeof CSS !== 'undefined' && typeof CSS.escape === 'function'\n ? CSS.escape(target.name)\n : target.name.replace(/([\"\\\\])/g, '\\\\$1');\n const groupTargets = Array.from(\n rootNode.querySelectorAll<HTMLInputElement>(`input[type=\"radio\"][name=\"${escapedName}\"]`),\n );\n if (groupTargets.length > 0) {\n return groupTargets;\n }\n }\n\n return [target];\n}\n\n/**\n * 複数要素の最も近い共通祖先要素を返す。\n *\n * @param elements 判定対象の要素一覧。\n * @return 共通祖先要素。見つからない場合は undefined。\n */\nfunction findCommonAncestor(elements: readonly HTMLElement[]): HTMLElement | undefined {\n const [firstElement, ...restElements] = elements;\n if (!firstElement) {\n return undefined;\n }\n\n let candidate: HTMLElement | null = firstElement;\n while (candidate) {\n if (restElements.every((element) => candidate?.contains(element))) {\n return candidate;\n }\n candidate = candidate.parentElement;\n }\n\n return undefined;\n}\n\n/**\n * radio group のメッセージ挿入先を解決する。\n *\n * @param target 対象の radio 要素。\n * @return 挿入先の要素。見つからない場合は undefined。\n */\nfunction resolveRadioMessageHost(target: HTMLInputElement): HTMLElement | undefined {\n const groupTargets = getRadioGroupTargets(target);\n const wrappers = groupTargets\n .map((element) => element.closest('.form-check'))\n .filter((element): element is HTMLElement => element instanceof HTMLElement);\n\n if (wrappers.length > 1) {\n const commonAncestor = findCommonAncestor(wrappers);\n if (commonAncestor && !wrappers.includes(commonAncestor)) {\n return commonAncestor;\n }\n }\n\n return resolveChoiceMessageHost(target);\n}\n\n/**\n * checkbox と radio のメッセージ挿入先を解決する。\n *\n * @param target 対象の input 要素。\n * @return 挿入先の form-check 要素。見つからない場合は undefined。\n */\nfunction resolveChoiceMessageHost(target: HTMLInputElement): HTMLElement | undefined {\n const closestFormCheck = target.closest('.form-check');\n return closestFormCheck instanceof HTMLElement ? closestFormCheck : undefined;\n}\n\n/**\n * 通常フィールドの直後に invalid-feedback コンテナを取得または生成する。\n *\n * @param target 対象の要素。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureFieldContainer(target: HTMLElement): HTMLElement {\n const nextElement = target.nextElementSibling;\n if (\n nextElement instanceof HTMLElement &&\n nextElement.getAttribute(CONTAINER_ATTRIBUTE) === 'true'\n ) {\n return nextElement;\n }\n\n const container = document.createElement('div');\n container.className = 'invalid-feedback d-block';\n container.setAttribute(OWNED_ATTRIBUTE, 'true');\n container.setAttribute(CONTAINER_ATTRIBUTE, 'true');\n target.insertAdjacentElement('afterend', container);\n return container;\n}\n\n/**\n * checkbox と radio 用に form-check 末尾の invalid-feedback を取得または生成する。\n *\n * @param target 対象の input 要素。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureChoiceContainer(target: HTMLInputElement): HTMLElement {\n const hostElement = isRadioInput(target)\n ? resolveRadioMessageHost(target)\n : resolveChoiceMessageHost(target);\n if (!hostElement) {\n return ensureFieldContainer(target);\n }\n\n const existingContainer = getDirectOwnedContainer(hostElement);\n if (existingContainer) {\n return existingContainer;\n }\n\n const container = document.createElement('div');\n container.className = 'invalid-feedback d-block';\n container.setAttribute(OWNED_ATTRIBUTE, 'true');\n container.setAttribute(CONTAINER_ATTRIBUTE, 'true');\n hostElement.appendChild(container);\n return container;\n}\n\n/**\n * container target の先頭に alert コンテナを取得または生成する。\n *\n * @param target 対象の要素。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureBlockContainer(target: HTMLElement): HTMLElement {\n const existingContainer = getOwnedDirectChild(target);\n if (existingContainer) {\n return existingContainer;\n }\n\n const container = document.createElement('div');\n container.className = 'alert alert-danger';\n container.setAttribute('role', 'alert');\n container.setAttribute(OWNED_ATTRIBUTE, 'true');\n container.setAttribute(CONTAINER_ATTRIBUTE, 'true');\n target.insertAdjacentElement('afterbegin', container);\n return container;\n}\n\n/**\n * このライブラリが付けた is-invalid 状態だけを外す。\n *\n * @param target 状態を解除する要素。\n * @return 戻り値はない。\n */\nfunction removeOwnedInvalidState(target: HTMLElement): void {\n if (target.getAttribute(INVALID_TARGET_ATTRIBUTE) !== 'true') {\n return;\n }\n\n target.classList.remove('is-invalid');\n target.removeAttribute(INVALID_TARGET_ATTRIBUTE);\n}\n\n/**\n * このライブラリが付けた is-valid 状態だけを外す。\n *\n * @param target 状態を解除する要素。\n * @return 戻り値はない。\n */\nfunction removeOwnedValidState(target: HTMLElement): void {\n if (target.getAttribute(VALID_TARGET_ATTRIBUTE) !== 'true') {\n return;\n }\n\n target.classList.remove('is-valid');\n target.removeAttribute(VALID_TARGET_ATTRIBUTE);\n}\n\n/**\n * レベルに応じた alert クラスを返す。\n *\n * @param level メッセージレベル。\n * @return 対応する alert クラス文字列。\n */\nfunction resolveBlockAlertClass(level?: string): string {\n switch (level) {\n case 'success':\n return 'alert alert-success';\n case 'warning':\n return 'alert alert-warning';\n case 'info':\n return 'alert alert-info';\n default:\n return 'alert alert-danger';\n }\n}\n\n/**\n * レベルに応じた feedback クラスを返す。\n *\n * @param level メッセージレベル。\n * @return 対応する feedback クラス文字列。\n */\nfunction resolveFieldFeedbackClass(level?: string): string {\n return level === 'success' ? 'valid-feedback d-block' : 'invalid-feedback d-block';\n}\n\n/**\n * choice input に対して、このライブラリが付けた invalid 状態を付与する。\n *\n * @param target 対象の input 要素。\n * @return 戻り値はない。\n */\nfunction markChoiceInvalidState(target: HTMLInputElement): void {\n const targets = isRadioInput(target) ? getRadioGroupTargets(target) : [target];\n targets.forEach((element) => {\n element.classList.add('is-invalid');\n element.setAttribute(INVALID_TARGET_ATTRIBUTE, 'true');\n });\n}\n\n/**\n * choice input に対して、このライブラリが付けた invalid 状態を解除する。\n *\n * @param target 対象の input 要素。\n * @return 戻り値はない。\n */\nfunction clearChoiceInvalidState(target: HTMLInputElement): void {\n const targets = isRadioInput(target) ? getRadioGroupTargets(target) : [target];\n targets.forEach((element) => {\n removeOwnedInvalidState(element);\n });\n}\n\n/**\n * レベルに応じたフィールド用コンテナを取得または生成する。\n *\n * @param target 対象要素。\n * @param level メッセージレベル。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureFieldContainerForLevel(target: HTMLElement, level?: string): HTMLElement {\n const nextElement = target.nextElementSibling;\n if (\n nextElement instanceof HTMLElement &&\n nextElement.getAttribute(CONTAINER_ATTRIBUTE) === 'true'\n ) {\n nextElement.className = resolveFieldFeedbackClass(level);\n return nextElement;\n }\n\n const container = document.createElement('div');\n container.className = resolveFieldFeedbackClass(level);\n container.setAttribute(OWNED_ATTRIBUTE, 'true');\n container.setAttribute(CONTAINER_ATTRIBUTE, 'true');\n target.insertAdjacentElement('afterend', container);\n return container;\n}\n\n/**\n * レベルに応じた choice 用コンテナを取得または生成する。\n *\n * @param target 対象の input 要素。\n * @param level メッセージレベル。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureChoiceContainerForLevel(target: HTMLInputElement, level?: string): HTMLElement {\n const hostElement = isRadioInput(target)\n ? resolveRadioMessageHost(target)\n : resolveChoiceMessageHost(target);\n if (!hostElement) {\n return ensureFieldContainerForLevel(target, level);\n }\n\n const existingContainer = getDirectOwnedContainer(hostElement);\n if (existingContainer) {\n existingContainer.className = resolveFieldFeedbackClass(level);\n return existingContainer;\n }\n\n const container = document.createElement('div');\n container.className = resolveFieldFeedbackClass(level);\n container.setAttribute(OWNED_ATTRIBUTE, 'true');\n container.setAttribute(CONTAINER_ATTRIBUTE, 'true');\n hostElement.appendChild(container);\n return container;\n}\n\n/**\n * レベルに応じたブロック用コンテナを取得または生成する。\n *\n * @param target 対象要素。\n * @param level メッセージレベル。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureBlockContainerForLevel(target: HTMLElement, level?: string): HTMLElement {\n const existingContainer = getOwnedDirectChild(target);\n if (existingContainer) {\n existingContainer.className = resolveBlockAlertClass(level);\n return existingContainer;\n }\n\n const container = document.createElement('div');\n container.className = resolveBlockAlertClass(level);\n container.setAttribute('role', 'alert');\n container.setAttribute(OWNED_ATTRIBUTE, 'true');\n container.setAttribute(CONTAINER_ATTRIBUTE, 'true');\n target.insertAdjacentElement('afterbegin', container);\n return container;\n}\n\n/**\n * 管理対象のエラーメッセージを追加する。\n *\n * @param target 追加先の要素。\n * @param message 表示するメッセージ。\n * @return 完了時に解決される Promise。\n */\nexport function addManagedErrorMessage(target: HTMLElement, message: string): Promise<void> {\n const container = isChoiceInput(target)\n ? ensureChoiceContainer(target)\n : isFieldTarget(target)\n ? ensureFieldContainer(target)\n : ensureBlockContainer(target);\n container.appendChild(createMessageItem(document, message));\n\n if (isChoiceInput(target)) {\n markChoiceInvalidState(target);\n } else if (isFieldTarget(target)) {\n target.classList.add('is-invalid');\n target.setAttribute(INVALID_TARGET_ATTRIBUTE, 'true');\n }\n\n return Promise.resolve();\n}\n\n/**\n * 管理対象のメッセージをレベル付きで追加する。\n *\n * @param target 追加先の要素。\n * @param message 表示するメッセージ。\n * @param level メッセージレベル (error / success / warning / info)。省略時は error。\n * @return 完了時に解決される Promise。\n */\nexport function addManagedMessage(\n target: HTMLElement,\n message: string,\n level?: string,\n): Promise<void> {\n const container = isChoiceInput(target)\n ? ensureChoiceContainerForLevel(target, level)\n : isFieldTarget(target)\n ? ensureFieldContainerForLevel(target, level)\n : ensureBlockContainerForLevel(target, level);\n container.appendChild(createMessageItem(document, message));\n\n if (isChoiceInput(target)) {\n const targets = isRadioInput(target) ? getRadioGroupTargets(target) : [target];\n if (level === 'success') {\n targets.forEach((element) => {\n removeOwnedInvalidState(element);\n element.classList.add('is-valid');\n element.setAttribute(VALID_TARGET_ATTRIBUTE, 'true');\n });\n } else if (!level || level === 'error') {\n targets.forEach((element) => removeOwnedValidState(element));\n markChoiceInvalidState(target);\n } else {\n targets.forEach((element) => {\n removeOwnedValidState(element);\n removeOwnedInvalidState(element);\n });\n }\n } else if (isFieldTarget(target)) {\n if (level === 'success') {\n removeOwnedInvalidState(target);\n target.classList.add('is-valid');\n target.setAttribute(VALID_TARGET_ATTRIBUTE, 'true');\n } else if (!level || level === 'error') {\n removeOwnedValidState(target);\n target.classList.add('is-invalid');\n target.setAttribute(INVALID_TARGET_ATTRIBUTE, 'true');\n } else {\n removeOwnedValidState(target);\n removeOwnedInvalidState(target);\n }\n }\n\n return Promise.resolve();\n}\n\n/**\n * 管理対象のメッセージを削除する。\n *\n * @param parentOrTarget 削除対象の親要素または対象要素。\n * @return 完了時に解決される Promise。\n */\nexport function clearManagedMessages(parentOrTarget: HTMLElement): Promise<void> {\n if (isChoiceInput(parentOrTarget)) {\n const hostElement = isRadioInput(parentOrTarget)\n ? resolveRadioMessageHost(parentOrTarget)\n : resolveChoiceMessageHost(parentOrTarget);\n const ownedContainer = hostElement ? getDirectOwnedContainer(hostElement) : undefined;\n ownedContainer?.remove();\n clearChoiceInvalidState(parentOrTarget);\n const choiceTargets = isRadioInput(parentOrTarget)\n ? getRadioGroupTargets(parentOrTarget)\n : [parentOrTarget];\n choiceTargets.forEach((element) => removeOwnedValidState(element));\n } else if (isFieldTarget(parentOrTarget)) {\n const nextElement = parentOrTarget.nextElementSibling;\n if (\n nextElement instanceof HTMLElement &&\n nextElement.getAttribute(CONTAINER_ATTRIBUTE) === 'true'\n ) {\n nextElement.remove();\n }\n removeOwnedInvalidState(parentOrTarget);\n removeOwnedValidState(parentOrTarget);\n }\n\n const ownedContainers = parentOrTarget.querySelectorAll<HTMLElement>(\n `[${CONTAINER_ATTRIBUTE}=\"true\"]`,\n );\n ownedContainers.forEach((element) => {\n element.remove();\n });\n\n const invalidTargets = parentOrTarget.querySelectorAll<HTMLElement>(\n `[${INVALID_TARGET_ATTRIBUTE}=\"true\"]`,\n );\n invalidTargets.forEach((element) => {\n removeOwnedInvalidState(element);\n });\n\n const validTargets = parentOrTarget.querySelectorAll<HTMLElement>(\n `[${VALID_TARGET_ATTRIBUTE}=\"true\"]`,\n );\n validTargets.forEach((element) => {\n removeOwnedValidState(element);\n });\n\n return Promise.resolve();\n}\n","import { createModalInstance } from './bootstrap_resolver';\nimport type { ResolvedInstallOptions } from './types';\n\n/**\n * 既存要素を Bootstrap Modal として扱える最低限の属性へ整える。\n *\n * @param element 整形対象の要素。\n * @return 戻り値はない。\n */\nfunction prepareModalElement(element: HTMLElement): void {\n if (!element.classList.contains('modal')) {\n element.classList.add('modal');\n }\n\n if (element.tabIndex < 0) {\n element.tabIndex = -1;\n }\n\n if (!element.hasAttribute('aria-hidden')) {\n element.setAttribute('aria-hidden', 'true');\n }\n}\n\n/**\n * 任意要素を Bootstrap Modal として開く。\n *\n * @param element 開く対象の要素。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function openDialogElement(\n element: HTMLElement,\n options: ResolvedInstallOptions,\n): Promise<void> {\n prepareModalElement(element);\n const modalInstance = createModalInstance(element, undefined, options.bootstrap);\n if (!modalInstance) {\n return Promise.reject(new Error('Bootstrap Modal is unavailable.'));\n }\n\n modalInstance.show();\n return Promise.resolve();\n}\n\n/**\n * 任意要素を Bootstrap Modal として閉じる。\n *\n * @param element 閉じる対象の要素。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function closeDialogElement(\n element: HTMLElement,\n options: ResolvedInstallOptions,\n): Promise<void> {\n prepareModalElement(element);\n const modalInstance = createModalInstance(element, undefined, options.bootstrap);\n if (!modalInstance) {\n return Promise.reject(new Error('Bootstrap Modal is unavailable.'));\n }\n\n modalInstance.hide();\n return Promise.resolve();\n}\n","import { createToastInstance } from './bootstrap_resolver';\nimport type { ResolvedInstallOptions, ToastPosition } from './types';\n\nconst TOAST_CONTAINER_ATTRIBUTE = 'data-haori-bootstrap-toast-container';\nconst TOAST_ATTRIBUTE = 'data-haori-bootstrap-toast';\nconst TOAST_ACCENT_ATTRIBUTE = 'data-haori-bootstrap-toast-accent';\nconst TOAST_DISMISS_ATTRIBUTE = 'data-haori-bootstrap-toast-dismiss';\n\ninterface ToastAppearance {\n accentClassName: string;\n}\n\nconst TOAST_POSITION_CLASSES: Record<ToastPosition, string> = {\n 'top-start': 'top-0 start-0',\n 'top-center': 'top-0 start-50 translate-middle-x',\n 'top-end': 'top-0 end-0',\n 'bottom-start': 'bottom-0 start-0',\n 'bottom-center': 'bottom-0 start-50 translate-middle-x',\n 'bottom-end': 'bottom-0 end-0',\n};\n\n/**\n * 通知レベルを toast 表示用の見た目へ変換する。\n *\n * @param level 通知レベル。\n * @return 対応する見た目定義。\n */\nfunction resolveToastAppearance(level?: string): ToastAppearance {\n switch (level) {\n case 'success':\n return { accentClassName: 'bg-success' };\n case 'warning':\n return { accentClassName: 'bg-warning' };\n case 'error':\n return { accentClassName: 'bg-danger' };\n default:\n return { accentClassName: 'bg-info' };\n }\n}\n\n/**\n * toast コンテナを配置する親要素を解決する。\n *\n * @param documentObject 検索に使用する document。\n * @param options 解決済み導入設定。\n * @return 配置先の要素。\n */\nfunction resolveToastRoot(documentObject: Document, options: ResolvedInstallOptions): HTMLElement {\n if (options.toastContainerSelector) {\n const resolvedElement = documentObject.querySelector<HTMLElement>(options.toastContainerSelector);\n if (resolvedElement) {\n return resolvedElement;\n }\n }\n\n return documentObject.body;\n}\n\n/**\n * toast コンテナを取得または生成する。\n *\n * @param documentObject 生成に使用する document。\n * @param options 解決済み導入設定。\n * @return 取得または生成したコンテナ。\n */\nfunction ensureToastContainer(documentObject: Document, options: ResolvedInstallOptions): HTMLElement {\n const rootElement = resolveToastRoot(documentObject, options);\n const positionClasses = TOAST_POSITION_CLASSES[options.toastPosition ?? 'bottom-end'];\n const existingContainer = rootElement.querySelector<HTMLElement>(\n `[${TOAST_CONTAINER_ATTRIBUTE}=\"true\"]`,\n );\n if (existingContainer) {\n const allPositionClasses = Object.values(TOAST_POSITION_CLASSES)\n .flatMap(c => c.split(' '));\n existingContainer.classList.remove(...allPositionClasses);\n existingContainer.classList.add(...positionClasses.split(' '));\n return existingContainer;\n }\n\n const container = documentObject.createElement('div');\n container.className = `toast-container position-fixed ${positionClasses} p-3`;\n container.setAttribute(TOAST_CONTAINER_ATTRIBUTE, 'true');\n rootElement.appendChild(container);\n return container;\n}\n\n/**\n * Bootstrap Toast を表示する。\n *\n * @param message 表示するメッセージ。\n * @param level 通知レベル。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function showToast(\n message: string,\n level: string | undefined,\n options: ResolvedInstallOptions,\n): Promise<void> {\n const documentObject = globalThis.document;\n const appearance = resolveToastAppearance(level);\n const toastElement = documentObject.createElement('div');\n toastElement.className = 'toast border bg-body text-body shadow-sm';\n toastElement.setAttribute('role', 'status');\n toastElement.setAttribute('aria-live', 'polite');\n toastElement.setAttribute('aria-atomic', 'true');\n toastElement.setAttribute(TOAST_ATTRIBUTE, 'true');\n\n const bodyWrapper = documentObject.createElement('div');\n bodyWrapper.className = 'd-flex align-items-stretch';\n\n const accentElement = documentObject.createElement('div');\n accentElement.className = `flex-shrink-0 rounded-start ${appearance.accentClassName}`;\n accentElement.style.width = '0.375rem';\n accentElement.setAttribute(TOAST_ACCENT_ATTRIBUTE, 'true');\n\n const bodyElement = documentObject.createElement('div');\n bodyElement.className = 'toast-body';\n bodyElement.style.whiteSpace = 'pre-line';\n bodyElement.textContent = message;\n\n const dismissButton = documentObject.createElement('button');\n dismissButton.type = 'button';\n dismissButton.className = 'btn-close me-2 m-auto flex-shrink-0';\n dismissButton.setAttribute('aria-label', 'Close');\n dismissButton.setAttribute(TOAST_DISMISS_ATTRIBUTE, 'true');\n\n bodyWrapper.appendChild(accentElement);\n bodyWrapper.appendChild(bodyElement);\n bodyWrapper.appendChild(dismissButton);\n toastElement.appendChild(bodyWrapper);\n ensureToastContainer(documentObject, options).appendChild(toastElement);\n\n const toastOptions = options.toastDelay !== undefined ? { delay: options.toastDelay } : undefined;\n const toastInstance = createToastInstance(toastElement, toastOptions, options.bootstrap);\n if (!toastInstance) {\n toastElement.remove();\n return Promise.reject(new Error('Bootstrap Toast is unavailable.'));\n }\n\n dismissButton.addEventListener('click', () => {\n toastInstance.hide?.();\n });\n\n toastElement.addEventListener(\n 'hidden.bs.toast',\n () => {\n toastElement.remove();\n toastInstance.dispose?.();\n },\n { once: true },\n );\n\n try {\n toastInstance.show();\n return Promise.resolve();\n } catch (error) {\n toastElement.remove();\n toastInstance.dispose?.();\n return Promise.reject(error);\n }\n}\n","import { hasModalSupport, hasToastSupport } from './bootstrap_resolver';\nimport { showConfirm, showDialog } from './dialog';\nimport { addManagedErrorMessage, addManagedMessage, clearManagedMessages } from './message';\nimport { closeDialogElement, openDialogElement } from './modal';\nimport { showToast } from './toast';\nimport type { HaoriGlobalObject, ResolvedInstallOptions } from './types';\n\n/**\n * BootstrapHaori が利用する内部コンテキスト。\n */\nexport interface BootstrapHaoriContext {\n /** 差し替え前の Haori 実装。 */\n originalHaori?: HaoriGlobalObject;\n /** 解決済みの導入設定。 */\n options: ResolvedInstallOptions;\n}\n\nconst defaultContext: BootstrapHaoriContext = {\n options: {\n fallbackToNative: true,\n },\n};\n\nlet context = defaultContext;\n\n/**\n * 表示用 message 中のエスケープ済み改行を実際の改行へ正規化する。\n *\n * @param message 正規化対象のメッセージ。\n * @return 正規化後のメッセージ。\n */\nfunction normalizeMessageText(message: string): string {\n return message.replace(/\\\\n/g, '\\n');\n}\n\n/**\n * 現在のブラウザ window を取得する。\n *\n * @return 現在の window。存在しない場合は undefined。\n */\nfunction getBrowserWindow(): Window | undefined {\n const scope = globalThis as typeof globalThis & { window?: Window };\n return scope.window;\n}\n\n/**\n * 値を Promise<void> 契約へ正規化する。\n *\n * @param value 正規化対象の値。\n * @return 完了時に解決される Promise。\n */\nfunction toPromiseVoid(value: Promise<void> | void | unknown): Promise<void> {\n return Promise.resolve(value).then(() => undefined);\n}\n\n/**\n * 元の Haori 実装から対象メソッドを取得する。\n *\n * @param methodName 取得対象のメソッド名。\n * @return 対象メソッド。見つからない場合は undefined。\n */\nfunction getOriginalMethod(\n methodName: keyof HaoriGlobalObject,\n): ((...args: readonly unknown[]) => unknown) | undefined {\n const method = context.originalHaori?.[methodName];\n return typeof method === 'function'\n ? (method as (...args: readonly unknown[]) => unknown)\n : undefined;\n}\n\n/**\n * no-op に正規化したことを警告する。\n *\n * @param apiName 利用できなかった API 名。\n * @return 戻り値はない。\n */\nfunction warnNoop(apiName: string): void {\n console.warn(`[haori-bootstrap] ${apiName} skipped because Bootstrap support is unavailable.`);\n}\n\n/**\n * dialog の fallback 経路を処理する。\n *\n * @param message 表示対象のメッセージ。\n * @return 完了時に解決される Promise。\n */\nfunction fallbackDialog(message: string): Promise<void> {\n const normalizedMessage = normalizeMessageText(message);\n const originalMethod = getOriginalMethod('dialog');\n if (originalMethod) {\n return toPromiseVoid(originalMethod(normalizedMessage));\n }\n\n const browserWindow = getBrowserWindow();\n if (context.options.fallbackToNative && typeof browserWindow?.alert === 'function') {\n browserWindow.alert(normalizedMessage);\n return Promise.resolve();\n }\n\n warnNoop('dialog');\n return Promise.resolve();\n}\n\n/**\n * confirm の fallback 経路を処理する。\n *\n * @param message 表示対象のメッセージ。\n * @return 確認結果を返す Promise。\n */\nfunction fallbackConfirm(message: string): Promise<boolean> {\n const normalizedMessage = normalizeMessageText(message);\n const originalMethod = getOriginalMethod('confirm');\n if (originalMethod) {\n return Promise.resolve(originalMethod(normalizedMessage) as Promise<boolean> | boolean).then(\n (value) => Boolean(value),\n );\n }\n\n const browserWindow = getBrowserWindow();\n if (context.options.fallbackToNative && typeof browserWindow?.confirm === 'function') {\n return Promise.resolve(browserWindow.confirm(normalizedMessage));\n }\n\n warnNoop('confirm');\n return Promise.resolve(false);\n}\n\n/**\n * toast の fallback 経路を処理する。\n *\n * @param message 表示対象のメッセージ。\n * @param level 通知レベル。\n * @return 完了時に解決される Promise。\n */\nfunction fallbackToast(message: string, level?: string): Promise<void> {\n const normalizedMessage = normalizeMessageText(message);\n const originalMethod = getOriginalMethod('toast');\n if (originalMethod) {\n return toPromiseVoid(originalMethod(normalizedMessage, level));\n }\n\n warnNoop('toast');\n return Promise.resolve();\n}\n\n/**\n * openDialog または closeDialog の fallback 経路を処理する。\n *\n * @param methodName 呼び出す API 名。\n * @param element 対象要素。\n * @return 完了時に解決される Promise。\n */\nfunction fallbackModal(methodName: 'openDialog' | 'closeDialog', element: HTMLElement): Promise<void> {\n const originalMethod = getOriginalMethod(methodName);\n if (originalMethod) {\n return toPromiseVoid(originalMethod(element));\n }\n\n warnNoop(methodName);\n return Promise.resolve();\n}\n\n/**\n * BootstrapHaori が参照する内部状態を更新する。\n *\n * @param nextContext 差し替え先が参照する内部コンテキスト。\n * @return 戻り値はない。\n */\nexport function setBootstrapHaoriContext(nextContext: BootstrapHaoriContext): void {\n context = nextContext;\n}\n\n/**\n * Haori の UI 系静的メソッドを差し替える最小ファサード。\n */\nexport class BootstrapHaori {\n /**\n * 情報表示ダイアログを表示する。\n *\n * @param message 表示するメッセージ。\n * @return 完了時に解決される Promise。\n */\n public static dialog(message: string): Promise<void> {\n const normalizedMessage = normalizeMessageText(message);\n if (hasModalSupport(context.options.bootstrap)) {\n return showDialog(normalizedMessage, context.options).catch(() => fallbackDialog(normalizedMessage));\n }\n\n return fallbackDialog(normalizedMessage);\n }\n\n /**\n * 確認ダイアログを表示する。\n *\n * @param message 表示するメッセージ。\n * @return OK のみ true を返す Promise。\n */\n public static confirm(message: string): Promise<boolean> {\n const normalizedMessage = normalizeMessageText(message);\n if (hasModalSupport(context.options.bootstrap)) {\n return showConfirm(normalizedMessage, context.options).catch(() => fallbackConfirm(normalizedMessage));\n }\n\n return fallbackConfirm(normalizedMessage);\n }\n\n /**\n * トースト通知を表示する。\n *\n * @param message 表示するメッセージ。\n * @param level 通知レベル。\n * @return 完了時に解決される Promise。\n */\n public static toast(message: string, level?: string): Promise<void> {\n const normalizedMessage = normalizeMessageText(message);\n if (hasToastSupport(context.options.bootstrap)) {\n return showToast(normalizedMessage, level, context.options).catch(() =>\n fallbackToast(normalizedMessage, level),\n );\n }\n\n return fallbackToast(normalizedMessage, level);\n }\n\n /**\n * 任意のダイアログ要素を開く。\n *\n * @param element 開く対象の要素。\n * @return 完了時に解決される Promise。\n */\n public static openDialog(element: HTMLElement): Promise<void> {\n if (hasModalSupport(context.options.bootstrap)) {\n return openDialogElement(element, context.options).catch(() =>\n fallbackModal('openDialog', element),\n );\n }\n\n return fallbackModal('openDialog', element);\n }\n\n /**\n * 任意のダイアログ要素を閉じる。\n *\n * @param element 閉じる対象の要素。\n * @return 完了時に解決される Promise。\n */\n public static closeDialog(element: HTMLElement): Promise<void> {\n if (hasModalSupport(context.options.bootstrap)) {\n return closeDialogElement(element, context.options).catch(() =>\n fallbackModal('closeDialog', element),\n );\n }\n\n return fallbackModal('closeDialog', element);\n }\n\n /**\n * 管理対象のエラーメッセージを追加する。\n *\n * @param target 追加先の要素。\n * @param message 表示するメッセージ。\n * @return 完了時に解決される Promise。\n */\n public static addErrorMessage(target: HTMLElement, message: string): Promise<void> {\n return addManagedErrorMessage(target, message);\n }\n\n /**\n * 管理対象のメッセージをレベル付きで追加する。\n *\n * @param target 追加先の要素。\n * @param message 表示するメッセージ。\n * @param level メッセージレベル (error / success / warning / info)。省略時は error。\n * @return 完了時に解決される Promise。\n */\n public static addMessage(target: HTMLElement, message: string, level?: string): Promise<void> {\n return addManagedMessage(target, message, level);\n }\n\n /**\n * 管理対象のメッセージを削除する。\n *\n * @param parentOrTarget 削除対象の親要素または対象要素。\n * @return 完了時に解決される Promise。\n */\n public static clearMessages(parentOrTarget: HTMLElement): Promise<void> {\n return clearManagedMessages(parentOrTarget);\n }\n}\n","import { BootstrapHaori, setBootstrapHaoriContext } from './bootstrap_haori';\nimport type {\n BrowserWindow,\n HaoriGlobalObject,\n InstallOptions,\n ResolvedInstallOptions,\n} from './types';\n\nconst DEFAULT_INSTALL_OPTIONS: ResolvedInstallOptions = {\n fallbackToNative: true,\n};\n\n/**\n * BootstrapHaori が差し替える UI 系静的メソッド名。\n * これら以外(`Core` / `waitForRenders` / `version` / `setBindingData` などの\n * コア API)は元の Haori 実装へそのまま委譲する。\n */\nconst OVERRIDDEN_METHOD_NAMES: ReadonlySet<string> = new Set<string>([\n 'dialog',\n 'confirm',\n 'toast',\n 'openDialog',\n 'closeDialog',\n 'addErrorMessage',\n 'addMessage',\n 'clearMessages',\n]);\n\n/**\n * UI 系メソッドだけを BootstrapHaori に差し替え、それ以外のプロパティ\n * (コア API・名前付きエクスポート等)は元の Haori 実装へ委譲する\n * グローバル Haori を生成する。\n *\n * これにより `Haori.Core` / `Haori.waitForRenders` / `Haori.version` などが\n * 導入後も引き続き利用できる(従来は最小ファサードで上書きされ消失していた)。\n *\n * @param originalHaori 差し替え前の Haori 実装。\n * @return UI メソッドを差し替えた Haori グローバル。\n */\nfunction createInstalledHaori(originalHaori: HaoriGlobalObject): HaoriGlobalObject {\n const overrides = BootstrapHaori as unknown as Record<string, unknown>;\n return new Proxy(originalHaori, {\n get(target, property, receiver): unknown {\n if (typeof property === 'string' && OVERRIDDEN_METHOD_NAMES.has(property)) {\n return overrides[property];\n }\n return Reflect.get(target, property, receiver);\n },\n has(target, property): boolean {\n // 元の Haori が UI メソッドを持たない最小実装でも、get では BootstrapHaori\n // の実装を返すため、`in` 判定も常に true にして get と一貫させる。\n if (typeof property === 'string' && OVERRIDDEN_METHOD_NAMES.has(property)) {\n return true;\n }\n return Reflect.has(target, property);\n },\n });\n}\n\nconst installState: {\n installed: boolean;\n originalHaori?: HaoriGlobalObject;\n originalRuntime?: 'embedded' | 'demo';\n options: ResolvedInstallOptions;\n} = {\n installed: false,\n options: DEFAULT_INSTALL_OPTIONS,\n};\n\n/**\n * 現在のブラウザ window を取得する。\n *\n * @return 現在の window。存在しない場合は undefined。\n */\nfunction getBrowserWindow(): BrowserWindow | undefined {\n const scope = globalThis as typeof globalThis & { window?: BrowserWindow };\n return scope.window;\n}\n\n/**\n * install に渡された設定を既定値込みで解決する。\n *\n * @param options 指定された導入設定。\n * @param browserWindow 現在の window。\n * @return 解決済みの導入設定。\n */\nfunction resolveInstallOptions(\n options: InstallOptions,\n browserWindow: BrowserWindow | undefined,\n): ResolvedInstallOptions {\n return {\n bootstrap: options.bootstrap ?? browserWindow?.bootstrap,\n fallbackToNative: options.fallbackToNative ?? DEFAULT_INSTALL_OPTIONS.fallbackToNative,\n runtime:\n options.runtime ?? installState.options.runtime ?? browserWindow?.Haori?.runtime,\n toastContainerSelector:\n options.toastContainerSelector ?? installState.options.toastContainerSelector,\n dialogContainerSelector:\n options.dialogContainerSelector ?? installState.options.dialogContainerSelector,\n dialogTitle: options.dialogTitle ?? installState.options.dialogTitle,\n toastPosition: options.toastPosition ?? installState.options.toastPosition,\n toastDelay: options.toastDelay ?? installState.options.toastDelay,\n };\n}\n\n/**\n * 自動有効化に必要な前提が揃っているかを返す。\n *\n * @param browserWindow 判定対象の window。\n * @return 自動有効化可能なら true。\n */\nexport function hasAutoEnablePrerequisites(\n browserWindow: BrowserWindow | undefined = getBrowserWindow(),\n): boolean {\n return Boolean(browserWindow?.Haori && browserWindow.bootstrap);\n}\n\n/**\n * Bootstrap 対応 Haori を再適用し、必要なら設定を上書きする。\n *\n * @param options 上書きする導入設定。\n * @return 戻り値はない。\n */\nexport function install(options: InstallOptions = {}): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow?.Haori) {\n throw new Error('window.Haori is required before calling install().');\n }\n\n if (!installState.originalHaori) {\n installState.originalHaori = browserWindow.Haori;\n installState.originalRuntime = browserWindow.Haori.runtime as 'embedded' | 'demo' | undefined;\n }\n\n installState.options = resolveInstallOptions(options, browserWindow);\n if (installState.options.runtime) {\n const targetHaori = installState.originalHaori ?? browserWindow.Haori;\n if (typeof targetHaori.setRuntime === 'function') {\n targetHaori.setRuntime(installState.options.runtime);\n } else {\n console.warn(\n '[haori-bootstrap] Haori.setRuntime が利用できません。runtime 設定は無視されます。',\n );\n }\n }\n setBootstrapHaoriContext({\n originalHaori: installState.originalHaori,\n options: installState.options,\n });\n browserWindow.Haori = createInstalledHaori(installState.originalHaori);\n installState.installed = true;\n}\n\n/**\n * 元の Haori 実装を復元する。\n *\n * @return 戻り値はない。\n */\nexport function uninstall(): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow || !installState.originalHaori) {\n return;\n }\n\n // runtime は getter のみの実装(core Haori)があり、直接代入すると strict mode で\n // TypeError になる。setRuntime があればそれ経由で復元し、無い実装(プレーンな\n // スタブ等)にのみ直接代入でフォールバックする。\n const original = installState.originalHaori;\n if (typeof original.setRuntime === 'function') {\n original.setRuntime(installState.originalRuntime as 'embedded' | 'demo');\n } else {\n original.runtime = installState.originalRuntime;\n }\n browserWindow.Haori = installState.originalHaori;\n installState.installed = false;\n installState.originalHaori = undefined;\n installState.originalRuntime = undefined;\n installState.options = DEFAULT_INSTALL_OPTIONS;\n}\n\n/**\n * 現在 BootstrapHaori が有効かどうかを返す。\n *\n * @return 有効なら true。\n */\nexport function isInstalled(): boolean {\n return installState.installed;\n}\n","import { hasAutoEnablePrerequisites, install } from './install';\nimport type { BrowserWindow } from './types';\n\nconst AUTO_ENABLE_MARKER = '__haoriJsBootstrapAutoEnabled__';\n\n/**\n * 現在のブラウザ window を取得する。\n *\n * @return 現在の window。存在しない場合は undefined。\n */\nfunction getBrowserWindow(): BrowserWindow | undefined {\n const scope = globalThis as typeof globalThis & { window?: BrowserWindow };\n return scope.window;\n}\n\n/**\n * 既に自動有効化済みかどうかを返す。\n *\n * @param browserWindow 判定対象の window。\n * @return 既に自動有効化済みなら true。\n */\nfunction wasAutoEnabled(browserWindow: BrowserWindow): boolean {\n return Boolean((browserWindow as unknown as Record<string, unknown>)[AUTO_ENABLE_MARKER]);\n}\n\n/**\n * 自動有効化済みの印を付ける。\n *\n * @param browserWindow 更新対象の window。\n * @return 戻り値はない。\n */\nfunction markAutoEnabled(browserWindow: BrowserWindow): void {\n (browserWindow as unknown as Record<string, unknown>)[AUTO_ENABLE_MARKER] = true;\n}\n\n/**\n * 前提が揃っていれば自動有効化を試行する。\n *\n * @return 戻り値はない。\n */\nfunction autoEnable(): void {\n const browserWindow = getBrowserWindow();\n if (!browserWindow || wasAutoEnabled(browserWindow)) {\n return;\n }\n\n if (!hasAutoEnablePrerequisites(browserWindow)) {\n console.warn(\n '[haori-bootstrap] Auto-enable skipped because window.Haori or window.bootstrap is missing.',\n );\n return;\n }\n\n try {\n install({ bootstrap: browserWindow.bootstrap });\n markAutoEnabled(browserWindow);\n } catch (error) {\n console.warn('[haori-bootstrap] Auto-enable failed.', error);\n }\n}\n\nautoEnable();\n","import './browser';\n\nexport { BootstrapHaori } from './bootstrap_haori';\nexport { hasAutoEnablePrerequisites, install, isInstalled, uninstall } from './install';\nexport type {\n BootstrapNamespace,\n BrowserWindow,\n HaoriBootstrapGlobal,\n HaoriGlobalObject,\n InstallOptions,\n ResolvedInstallOptions,\n} from './types';\n\n/**\n * パッケージの公開版数。\n */\nexport const version = '0.3.2';\n"],"names":["isConstructor","value","resolveModalConstructor","bootstrap","resolveToastConstructor","hasModalSupport","hasToastSupport","createModalInstance","element","options","modalConstructor","createToastInstance","toastOptions","toastConstructor","DIALOG_CONTAINER_ATTRIBUTE","ACTION_ATTRIBUTE","DIALOG_TITLE_ATTRIBUTE","dialogTitleCounter","createDialogModalOptions","resolveDialogContainer","documentObject","resolvedElement","createModalShell","message","isConfirm","title","modalElement","dialogElement","contentElement","titleId","headerElement","titleElement","bodyElement","messageElement","footerElement","cancelButton","okButton","showDialog","modalInstance","resolve","reject","finalize","handleHidden","error","showConfirm","confirmed","OWNED_ATTRIBUTE","CONTAINER_ATTRIBUTE","INVALID_TARGET_ATTRIBUTE","VALID_TARGET_ATTRIBUTE","isChoiceInput","target","isRadioInput","isFieldTarget","getDirectOwnedContainer","createMessageItem","getOwnedDirectChild","getRadioGroupTargets","rootNode","escapedName","groupTargets","findCommonAncestor","elements","firstElement","restElements","candidate","resolveRadioMessageHost","wrappers","commonAncestor","resolveChoiceMessageHost","closestFormCheck","ensureFieldContainer","nextElement","container","ensureChoiceContainer","hostElement","existingContainer","ensureBlockContainer","removeOwnedInvalidState","removeOwnedValidState","resolveBlockAlertClass","level","resolveFieldFeedbackClass","markChoiceInvalidState","clearChoiceInvalidState","ensureFieldContainerForLevel","ensureChoiceContainerForLevel","ensureBlockContainerForLevel","addManagedErrorMessage","addManagedMessage","targets","clearManagedMessages","parentOrTarget","prepareModalElement","openDialogElement","closeDialogElement","TOAST_CONTAINER_ATTRIBUTE","TOAST_ATTRIBUTE","TOAST_ACCENT_ATTRIBUTE","TOAST_DISMISS_ATTRIBUTE","TOAST_POSITION_CLASSES","resolveToastAppearance","resolveToastRoot","ensureToastContainer","rootElement","positionClasses","allPositionClasses","c","showToast","appearance","toastElement","bodyWrapper","accentElement","dismissButton","toastInstance","context","normalizeMessageText","getBrowserWindow","toPromiseVoid","getOriginalMethod","methodName","method","warnNoop","apiName","fallbackDialog","normalizedMessage","originalMethod","browserWindow","fallbackConfirm","fallbackToast","fallbackModal","setBootstrapHaoriContext","nextContext","BootstrapHaori","DEFAULT_INSTALL_OPTIONS","OVERRIDDEN_METHOD_NAMES","createInstalledHaori","originalHaori","overrides","property","receiver","installState","resolveInstallOptions","hasAutoEnablePrerequisites","install","targetHaori","uninstall","original","isInstalled","AUTO_ENABLE_MARKER","wasAutoEnabled","markAutoEnabled","autoEnable","version"],"mappings":"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"}
|