haori-bootstrap 0.5.21 → 0.5.22
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
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Haori.js Bootstrap は、Haori.js 向けの Bootstrap ベース UI 拡張ライブラリです。
|
|
4
4
|
|
|
5
|
-
Version: 0.5.
|
|
5
|
+
Version: 0.5.22
|
|
6
6
|
|
|
7
7
|
## 概要
|
|
8
8
|
|
|
@@ -41,9 +41,9 @@ npm install haori-bootstrap
|
|
|
41
41
|
rel="stylesheet"
|
|
42
42
|
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
|
|
43
43
|
/>
|
|
44
|
-
<script src="https://cdn.jsdelivr.net/npm/haori@0.41.
|
|
44
|
+
<script src="https://cdn.jsdelivr.net/npm/haori@0.41.1/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.5.
|
|
46
|
+
<script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.5.22/dist/haori-bootstrap.iife.js"></script>
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
IIFE 版は、window.Haori と window.bootstrap が利用可能な場合に自動で有効化されます。
|
|
@@ -215,12 +215,12 @@ push 後に、そのタグから GitHub Release を published にします。公
|
|
|
215
215
|
次回 patch リリースの例:
|
|
216
216
|
|
|
217
217
|
```bash
|
|
218
|
-
# version が 0.5.
|
|
218
|
+
# version が 0.5.23 になる
|
|
219
219
|
npm version patch
|
|
220
220
|
git push origin main --follow-tags
|
|
221
221
|
```
|
|
222
222
|
|
|
223
|
-
その後、push 済みタグの GitHub Release を作成して published にします。例として次回は `0.5.
|
|
223
|
+
その後、push 済みタグの GitHub Release を作成して published にします。例として次回は `0.5.23` タグになります。
|
|
224
224
|
|
|
225
225
|
自動公開:
|
|
226
226
|
|
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.5.
|
|
5
|
+
Version: 0.5.22
|
|
6
6
|
|
|
7
7
|
## Overview
|
|
8
8
|
|
|
@@ -41,9 +41,9 @@ Load dependencies in this order for browser direct loading:
|
|
|
41
41
|
rel="stylesheet"
|
|
42
42
|
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css"
|
|
43
43
|
/>
|
|
44
|
-
<script src="https://cdn.jsdelivr.net/npm/haori@0.41.
|
|
44
|
+
<script src="https://cdn.jsdelivr.net/npm/haori@0.41.1/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.5.
|
|
46
|
+
<script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.5.22/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.
|
|
@@ -212,15 +212,15 @@ git push origin main --follow-tags
|
|
|
212
212
|
|
|
213
213
|
After pushing, publish a GitHub Release from the generated version tag. The release workflow then publishes the package and uploads `dist.zip` automatically.
|
|
214
214
|
|
|
215
|
-
Example next patch release after `0.5.
|
|
215
|
+
Example next patch release after `0.5.22`:
|
|
216
216
|
|
|
217
217
|
```bash
|
|
218
|
-
# version becomes 0.5.
|
|
218
|
+
# version becomes 0.5.23
|
|
219
219
|
npm version patch
|
|
220
220
|
git push origin main --follow-tags
|
|
221
221
|
```
|
|
222
222
|
|
|
223
|
-
Create and publish the GitHub Release for the pushed tag such as `0.5.
|
|
223
|
+
Create and publish the GitHub Release for the pushed tag such as `0.5.23`.
|
|
224
224
|
|
|
225
225
|
Release automation:
|
|
226
226
|
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
var HaoriBootstrap=(function(h){"use strict";function W(e){return typeof e=="function"}function G(e){return W(e?.Modal)?e?.Modal:void 0}function j(e){return W(e?.Toast)?e?.Toast:void 0}function L(e){return!!G(e)}function Ie(e){return!!j(e)}function N(e,n,t){const o=G(t);if(o)return typeof o.getOrCreateInstance=="function"?o.getOrCreateInstance(e,n):new o(e,n)}function Me(e,n,t){const o=j(t);if(o)return typeof o.getOrCreateInstance=="function"?o.getOrCreateInstance(e,n):new o(e,n)}const Le="data-haori-dialog",Ne="data-haori-confirm",He="data-haori-dialog-title",V="data-haori-dialog-ok",K="data-haori-confirm-ok",J="data-haori-confirm-cancel";let ke=0;function X(){return{backdrop:"static",keyboard:!1}}function Q(e,n){if(n.dialogContainerSelector){const t=e.querySelector(n.dialogContainerSelector);if(t)return t}return e.body}function Y(e,n,t,o){const r=e.createElement("div");r.className="modal fade",r.tabIndex=-1,r.setAttribute(t?Ne:Le,"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",o){const u=`haori-dialog-title-${++ke}`,A=e.createElement("div");A.className="modal-header";const M=e.createElement("h5");M.className="modal-title",M.id=u,M.setAttribute(He,"true"),M.textContent=o,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=n,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(J,"true"),u.textContent="Cancel",l.appendChild(u)}const b=e.createElement("button");return b.type="button",b.className="btn btn-primary",b.setAttribute(t?K:V,"true"),b.textContent="OK",l.appendChild(b),c.append(a,l),i.appendChild(c),r.appendChild(i),r}function Be(e,n){const t=globalThis.document,o=Y(t,e,!1,n.dialogTitle);Q(t,n).appendChild(o);const r=N(o,X(),n.bootstrap);return r?new Promise((i,c)=>{const a=()=>{o.removeEventListener("hidden.bs.modal",d),o.remove(),r.dispose?.(),i()},d=()=>{a()};o.querySelector(`[${V}]`)?.addEventListener("click",()=>{r.hide()},{once:!0}),o.addEventListener("hidden.bs.modal",d,{once:!0});try{r.show()}catch(b){o.removeEventListener("hidden.bs.modal",d),o.remove(),r.dispose?.(),c(b)}}):(o.remove(),Promise.reject(new Error("Bootstrap Modal is unavailable.")))}function Re(e,n){const t=globalThis.document,o=Y(t,e,!0,n.dialogTitle);Q(t,n).appendChild(o);const r=N(o,X(),n.bootstrap);return r?new Promise((i,c)=>{let a=!1;const d=()=>{o.removeEventListener("hidden.bs.modal",l),o.remove(),r.dispose?.(),i(a)},l=()=>{d()},b=o.querySelector(`[${K}]`),u=o.querySelector(`[${J}]`);b?.addEventListener("click",()=>{a=!0,r.hide()},{once:!0}),u?.addEventListener("click",()=>{a=!1,r.hide()},{once:!0}),o.addEventListener("hidden.bs.modal",l,{once:!0});try{r.show()}catch(A){o.removeEventListener("hidden.bs.modal",l),o.remove(),r.dispose?.(),c(A)}}):(o.remove(),Promise.reject(new Error("Bootstrap Modal is unavailable.")))}const p="data-haori-owned",m="data-haori-message-container",g="data-haori-invalid-target",w="data-haori-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 y(e){return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement}function H(e){return Array.from(e.children).find(n=>n instanceof HTMLElement&&n.getAttribute(m)==="true")}function Z(e,n){const t=e.createElement("div");return t.setAttribute(p,"true"),t.textContent=n,t}function ee(e){return H(e)}function I(e){if(e.name){const n=e.form??e.ownerDocument,t=typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e.name):e.name.replace(/(["\\])/g,"\\$1"),o=Array.from(n.querySelectorAll(`input[type="radio"][name="${t}"]`));if(o.length>0)return o}return[e]}function Pe(e){const[n,...t]=e;if(!n)return;let o=n;for(;o;){if(t.every(r=>o?.contains(r)))return o;o=o.parentElement}}function $(e){const t=I(e).map(o=>o.closest(".form-check")).filter(o=>o instanceof HTMLElement);if(t.length>1){const o=Pe(t);if(o&&!t.includes(o))return o}return k(e)}function k(e){const n=e.closest(".form-check");return n instanceof HTMLElement?n:void 0}function te(e){const n=e.nextElementSibling;if(n instanceof HTMLElement&&n.getAttribute(m)==="true")return n;const t=document.createElement("div");return t.className="invalid-feedback d-block",t.setAttribute(p,"true"),t.setAttribute(m,"true"),e.insertAdjacentElement("afterend",t),t}function _e(e){const n=E(e)?$(e):k(e);if(!n)return te(e);const t=H(n);if(t)return t;const o=document.createElement("div");return o.className="invalid-feedback d-block",o.setAttribute(p,"true"),o.setAttribute(m,"true"),n.appendChild(o),o}function De(e){const n=ee(e);if(n)return n;const t=document.createElement("div");return t.className="alert alert-danger",t.setAttribute("role","alert"),t.setAttribute(p,"true"),t.setAttribute(m,"true"),e.insertAdjacentElement("afterbegin",t),t}function v(e){e.getAttribute(g)==="true"&&(e.classList.remove("is-invalid"),e.removeAttribute(g))}function T(e){e.getAttribute(w)==="true"&&(e.classList.remove("is-valid"),e.removeAttribute(w))}function ne(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 B(e){return e==="success"?"valid-feedback d-block":"invalid-feedback d-block"}function oe(e){(E(e)?I(e):[e]).forEach(t=>{t.classList.add("is-invalid"),t.setAttribute(g,"true")})}function xe(e){(E(e)?I(e):[e]).forEach(t=>{v(t)})}function re(e,n){const t=e.nextElementSibling;if(t instanceof HTMLElement&&t.getAttribute(m)==="true")return t.className=B(n),t;const o=document.createElement("div");return o.className=B(n),o.setAttribute(p,"true"),o.setAttribute(m,"true"),e.insertAdjacentElement("afterend",o),o}function Oe(e,n){const t=E(e)?$(e):k(e);if(!t)return re(e,n);const o=H(t);if(o)return o.className=B(n),o;const r=document.createElement("div");return r.className=B(n),r.setAttribute(p,"true"),r.setAttribute(m,"true"),t.appendChild(r),r}function $e(e,n){const t=ee(e);if(t)return t.className=ne(n),t;const o=document.createElement("div");return o.className=ne(n),o.setAttribute("role","alert"),o.setAttribute(p,"true"),o.setAttribute(m,"true"),e.insertAdjacentElement("afterbegin",o),o}function Ue(e,n){return(S(e)?_e(e):y(e)?te(e):De(e)).appendChild(Z(document,n)),S(e)?oe(e):y(e)&&(e.classList.add("is-invalid"),e.setAttribute(g,"true")),Promise.resolve()}function qe(e,n,t){if((S(e)?Oe(e,t):y(e)?re(e,t):$e(e,t)).appendChild(Z(document,n)),S(e)){const r=E(e)?I(e):[e];t==="success"?r.forEach(i=>{v(i),i.classList.add("is-valid"),i.setAttribute(w,"true")}):!t||t==="error"?(r.forEach(i=>T(i)),oe(e)):r.forEach(i=>{T(i),v(i)})}else y(e)&&(t==="success"?(v(e),e.classList.add("is-valid"),e.setAttribute(w,"true")):!t||t==="error"?(T(e),e.classList.add("is-invalid"),e.setAttribute(g,"true")):(T(e),v(e)));return Promise.resolve()}function ie(e){if(S(e)){const r=E(e)?$(e):k(e);(r?H(r):void 0)?.remove(),xe(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(`[${g}="true"]`).forEach(r=>{v(r)}),e.querySelectorAll(`[${w}="true"]`).forEach(r=>{T(r)}),Promise.resolve()}function se(e){return e.classList.contains("modal")?e:e.closest(".modal")}function ae(e){e.tabIndex<0&&(e.tabIndex=-1),e.hasAttribute("aria-hidden")||e.setAttribute("aria-hidden","true")}function Fe(e,n){const t=se(e);if(!t)return Promise.reject(new Error('No ancestor ".modal" element was found for the target.'));ae(t),ie(t);const o=N(t,void 0,n.bootstrap);return o?(o.show(),Promise.resolve()):Promise.reject(new Error("Bootstrap Modal is unavailable."))}function ze(e,n){const t=se(e);if(!t)return Promise.reject(new Error('No ancestor ".modal" element was found for the target.'));ae(t);const o=N(t,void 0,n.bootstrap);return o?(o.hide(),Promise.resolve()):Promise.reject(new Error("Bootstrap Modal is unavailable."))}const ce="data-haori-toast-container",We="data-haori-toast",Ge="data-haori-toast-level",je="data-haori-toast-accent",Ve="data-haori-toast-dismiss",le={"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 Ke(e){switch(e){case"success":return{accentClassName:"bg-success",level:"success"};case"warning":return{accentClassName:"bg-warning",level:"warning"};case"error":return{accentClassName:"bg-danger",level:"error"};default:return{accentClassName:"bg-info",level:"info"}}}function Je(e,n){if(n.toastContainerSelector){const t=e.querySelector(n.toastContainerSelector);if(t)return t}return e.body}function Xe(e,n){const t=Je(e,n),o=le[n.toastPosition??"bottom-end"],r=t.querySelector(`[${ce}="true"]`);if(r){const c=Object.values(le).flatMap(a=>a.split(" "));return r.classList.remove(...c),r.classList.add(...o.split(" ")),r}const i=e.createElement("div");return i.className=`toast-container position-fixed ${o} p-3`,i.setAttribute(ce,"true"),t.appendChild(i),i}function Qe(e,n,t){const o=globalThis.document,r=Ke(n),i=o.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(We,"true"),i.setAttribute(Ge,r.level);const c=o.createElement("div");c.className="d-flex align-items-stretch";const a=o.createElement("div");a.className=`flex-shrink-0 rounded-start ${r.accentClassName}`,a.style.width="0.375rem",a.setAttribute(je,"true");const d=o.createElement("div");d.className="toast-body",d.style.whiteSpace="pre-line",d.textContent=e;const l=o.createElement("button");l.type="button",l.className="btn-close me-2 m-auto flex-shrink-0",l.setAttribute("aria-label","Close"),l.setAttribute(Ve,"true"),c.appendChild(a),c.appendChild(d),c.appendChild(l),i.appendChild(c),Xe(o,t).appendChild(i);const b=t.toastDelay!==void 0?{delay:t.toastDelay}:void 0,u=Me(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 C(e){return e.replace(/\\n/g,`
|
|
2
|
-
`)}function ue(){return globalThis.window}function U(e){return Promise.resolve(e).then(()=>{})}function R(e){const n=f.originalHaori?.[e];return typeof n=="function"?n:void 0}function P(e){console.warn(`[haori-bootstrap] ${e} skipped because Bootstrap support is unavailable.`)}function de(e){const n=C(e),t=R("dialog");if(t)return U(t(n));const o=ue();return f.options.fallbackToNative&&typeof o?.alert=="function"?(o.alert(n),Promise.resolve()):(P("dialog"),Promise.resolve())}function fe(e){const n=C(e),t=R("confirm");if(t)return Promise.resolve(t(n)).then(r=>!!r);const o=ue();return f.options.fallbackToNative&&typeof o?.confirm=="function"?Promise.resolve(o.confirm(n)):(P("confirm"),Promise.resolve(!1))}function me(e,n){const t=C(e),o=R("toast");return o?U(o(t,n)):(P("toast"),Promise.resolve())}function _(e,n){const t=R(e);return t?U(t(n)):(P(e),Promise.resolve())}function Ye(e){f=e}class be{static dialog(n){const t=C(n);return L(f.options.bootstrap)?Be(t,f.options).catch(()=>de(t)):de(t)}static confirm(n){const t=C(n);return L(f.options.bootstrap)?Re(t,f.options).catch(()=>fe(t)):fe(t)}static toast(n,t){const o=C(n);return Ie(f.options.bootstrap)?Qe(o,t,f.options).catch(()=>me(o,t)):me(o,t)}static openDialog(n){return L(f.options.bootstrap)?Fe(n,f.options).catch(()=>_("openDialog",n)):_("openDialog",n)}static closeDialog(n){return L(f.options.bootstrap)?ze(n,f.options).catch(()=>_("closeDialog",n)):_("closeDialog",n)}static addErrorMessage(n,t){return Ue(n,t)}static addMessage(n,t,o){return qe(n,t,o)}static clearMessages(n){return ie(n)}}const Ze="haori-bootstrap:collapse:",D="data-haori-persist";let x=!1,O,q;function he(e){return Ze+e}function et(e){try{const n=window.sessionStorage.getItem(he(e));return n==="shown"||n==="hidden"?n:void 0}catch{return}}function tt(e,n){try{window.sessionStorage.setItem(he(e),n)}catch{}}function pe(e,n){const t=e.id,o=[`[data-bs-toggle="collapse"][data-bs-target="#${t}"]`];if(t&&o.push(`[data-bs-toggle="collapse"][href="#${t}"]`),!t)return;e.ownerDocument.querySelectorAll(o.join(",")).forEach(i=>{i.setAttribute("aria-expanded",n?"true":"false"),i.classList.toggle("collapsed",!n)})}function Ee(e){const n=e.getAttribute(D);if(!n)return;const t=et(n);if(!t)return;const o=e.classList.contains("show");t==="shown"&&!o?(e.classList.add("show"),pe(e,!0)):t==="hidden"&&o&&(e.classList.remove("show"),pe(e,!1))}function ve(e){e instanceof HTMLElement&&e.hasAttribute(D)&&Ee(e),e.querySelectorAll(`[${D}]`).forEach(Ee)}function Te(e,n){const t=e.target;if(!(t instanceof HTMLElement))return;const o=t.getAttribute(D);o&&tt(o,n)}const Ae=e=>Te(e,"shown"),ge=e=>Te(e,"hidden");function nt(e=document){if(x)return;x=!0,q=e,e.addEventListener("shown.bs.collapse",Ae),e.addEventListener("hidden.bs.collapse",ge);const n=()=>{ve(e),O=new MutationObserver(t=>{for(const o of t)o.addedNodes.forEach(r=>{r instanceof HTMLElement&&ve(r)})}),e.body&&O.observe(e.body,{childList:!0,subtree:!0})};e.body?n():e.addEventListener("DOMContentLoaded",n,{once:!0})}function ot(e=q??document){x&&(x=!1,e.removeEventListener("shown.bs.collapse",Ae),e.removeEventListener("hidden.bs.collapse",ge),O?.disconnect(),O=void 0,q=void 0)}const F={fallbackToNative:!0},Ce=new Set(["dialog","confirm","toast","openDialog","closeDialog","addErrorMessage","addMessage","clearMessages"]);function rt(e){const n=be;return new Proxy(e,{get(t,o,r){return typeof o=="string"&&Ce.has(o)?n[o]:Reflect.get(t,o,r)},has(t,o){return typeof o=="string"&&Ce.has(o)?!0:Reflect.has(t,o)}})}const s={installed:!1,options:F};function z(){return globalThis.window}function it(e,n){return{bootstrap:e.bootstrap??n?.bootstrap,fallbackToNative:e.fallbackToNative??F.fallbackToNative,runtime:e.runtime??s.options.runtime??n?.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 we(e=z()){return!!(e?.Haori&&e.bootstrap)}function Se(e={}){const n=z();if(!n?.Haori)throw new Error("window.Haori is required before calling install().");if(s.originalHaori||(s.originalHaori=n.Haori,s.originalRuntime=n.Haori.runtime),s.options=it(e,n),s.options.runtime){const t=s.originalHaori??n.Haori;typeof t.setRuntime=="function"?t.setRuntime(s.options.runtime):console.warn("[haori-bootstrap] Haori.setRuntime が利用できません。runtime 設定は無視されます。")}Ye({originalHaori:s.originalHaori,options:s.options}),n.Haori=rt(s.originalHaori),nt(),s.installed=!0}function st(){const e=z();if(!e||!s.originalHaori)return;const n=s.originalHaori;typeof n.setRuntime=="function"?n.setRuntime(s.originalRuntime):n.runtime=s.originalRuntime,e.Haori=s.originalHaori,ot(),s.installed=!1,s.originalHaori=void 0,s.originalRuntime=void 0,s.options=F}function at(){return s.installed}const ye="__haoriJsBootstrapAutoEnabled__";function ct(){return globalThis.window}function lt(e){return!!e[ye]}function ut(e){e[ye]=!0}function dt(){const e=ct();if(!(!e||lt(e))){if(!we(e)){console.warn("[haori-bootstrap] Auto-enable skipped because window.Haori or window.bootstrap is missing.");return}try{Se({bootstrap:e.bootstrap}),ut(e)}catch(n){console.warn("[haori-bootstrap] Auto-enable failed.",n)}}}dt();const ft="0.5.
|
|
2
|
+
`)}function ue(){return globalThis.window}function U(e){return Promise.resolve(e).then(()=>{})}function R(e){const n=f.originalHaori?.[e];return typeof n=="function"?n:void 0}function P(e){console.warn(`[haori-bootstrap] ${e} skipped because Bootstrap support is unavailable.`)}function de(e){const n=C(e),t=R("dialog");if(t)return U(t(n));const o=ue();return f.options.fallbackToNative&&typeof o?.alert=="function"?(o.alert(n),Promise.resolve()):(P("dialog"),Promise.resolve())}function fe(e){const n=C(e),t=R("confirm");if(t)return Promise.resolve(t(n)).then(r=>!!r);const o=ue();return f.options.fallbackToNative&&typeof o?.confirm=="function"?Promise.resolve(o.confirm(n)):(P("confirm"),Promise.resolve(!1))}function me(e,n){const t=C(e),o=R("toast");return o?U(o(t,n)):(P("toast"),Promise.resolve())}function _(e,n){const t=R(e);return t?U(t(n)):(P(e),Promise.resolve())}function Ye(e){f=e}class be{static dialog(n){const t=C(n);return L(f.options.bootstrap)?Be(t,f.options).catch(()=>de(t)):de(t)}static confirm(n){const t=C(n);return L(f.options.bootstrap)?Re(t,f.options).catch(()=>fe(t)):fe(t)}static toast(n,t){const o=C(n);return Ie(f.options.bootstrap)?Qe(o,t,f.options).catch(()=>me(o,t)):me(o,t)}static openDialog(n){return L(f.options.bootstrap)?Fe(n,f.options).catch(()=>_("openDialog",n)):_("openDialog",n)}static closeDialog(n){return L(f.options.bootstrap)?ze(n,f.options).catch(()=>_("closeDialog",n)):_("closeDialog",n)}static addErrorMessage(n,t){return Ue(n,t)}static addMessage(n,t,o){return qe(n,t,o)}static clearMessages(n){return ie(n)}}const Ze="haori-bootstrap:collapse:",D="data-haori-persist";let x=!1,O,q;function he(e){return Ze+e}function et(e){try{const n=window.sessionStorage.getItem(he(e));return n==="shown"||n==="hidden"?n:void 0}catch{return}}function tt(e,n){try{window.sessionStorage.setItem(he(e),n)}catch{}}function pe(e,n){const t=e.id,o=[`[data-bs-toggle="collapse"][data-bs-target="#${t}"]`];if(t&&o.push(`[data-bs-toggle="collapse"][href="#${t}"]`),!t)return;e.ownerDocument.querySelectorAll(o.join(",")).forEach(i=>{i.setAttribute("aria-expanded",n?"true":"false"),i.classList.toggle("collapsed",!n)})}function Ee(e){const n=e.getAttribute(D);if(!n)return;const t=et(n);if(!t)return;const o=e.classList.contains("show");t==="shown"&&!o?(e.classList.add("show"),pe(e,!0)):t==="hidden"&&o&&(e.classList.remove("show"),pe(e,!1))}function ve(e){e instanceof HTMLElement&&e.hasAttribute(D)&&Ee(e),e.querySelectorAll(`[${D}]`).forEach(Ee)}function Te(e,n){const t=e.target;if(!(t instanceof HTMLElement))return;const o=t.getAttribute(D);o&&tt(o,n)}const Ae=e=>Te(e,"shown"),ge=e=>Te(e,"hidden");function nt(e=document){if(x)return;x=!0,q=e,e.addEventListener("shown.bs.collapse",Ae),e.addEventListener("hidden.bs.collapse",ge);const n=()=>{ve(e),O=new MutationObserver(t=>{for(const o of t)o.addedNodes.forEach(r=>{r instanceof HTMLElement&&ve(r)})}),e.body&&O.observe(e.body,{childList:!0,subtree:!0})};e.body?n():e.addEventListener("DOMContentLoaded",n,{once:!0})}function ot(e=q??document){x&&(x=!1,e.removeEventListener("shown.bs.collapse",Ae),e.removeEventListener("hidden.bs.collapse",ge),O?.disconnect(),O=void 0,q=void 0)}const F={fallbackToNative:!0},Ce=new Set(["dialog","confirm","toast","openDialog","closeDialog","addErrorMessage","addMessage","clearMessages"]);function rt(e){const n=be;return new Proxy(e,{get(t,o,r){return typeof o=="string"&&Ce.has(o)?n[o]:Reflect.get(t,o,r)},has(t,o){return typeof o=="string"&&Ce.has(o)?!0:Reflect.has(t,o)}})}const s={installed:!1,options:F};function z(){return globalThis.window}function it(e,n){return{bootstrap:e.bootstrap??n?.bootstrap,fallbackToNative:e.fallbackToNative??F.fallbackToNative,runtime:e.runtime??s.options.runtime??n?.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 we(e=z()){return!!(e?.Haori&&e.bootstrap)}function Se(e={}){const n=z();if(!n?.Haori)throw new Error("window.Haori is required before calling install().");if(s.originalHaori||(s.originalHaori=n.Haori,s.originalRuntime=n.Haori.runtime),s.options=it(e,n),s.options.runtime){const t=s.originalHaori??n.Haori;typeof t.setRuntime=="function"?t.setRuntime(s.options.runtime):console.warn("[haori-bootstrap] Haori.setRuntime が利用できません。runtime 設定は無視されます。")}Ye({originalHaori:s.originalHaori,options:s.options}),n.Haori=rt(s.originalHaori),nt(),s.installed=!0}function st(){const e=z();if(!e||!s.originalHaori)return;const n=s.originalHaori;typeof n.setRuntime=="function"?n.setRuntime(s.originalRuntime):n.runtime=s.originalRuntime,e.Haori=s.originalHaori,ot(),s.installed=!1,s.originalHaori=void 0,s.originalRuntime=void 0,s.options=F}function at(){return s.installed}const ye="__haoriJsBootstrapAutoEnabled__";function ct(){return globalThis.window}function lt(e){return!!e[ye]}function ut(e){e[ye]=!0}function dt(){const e=ct();if(!(!e||lt(e))){if(!we(e)){console.warn("[haori-bootstrap] Auto-enable skipped because window.Haori or window.bootstrap is missing.");return}try{Se({bootstrap:e.bootstrap}),ut(e)}catch(n){console.warn("[haori-bootstrap] Auto-enable failed.",n)}}}dt();const ft="0.5.22";return h.BootstrapHaori=be,h.hasAutoEnablePrerequisites=we,h.install=Se,h.isInstalled=at,h.uninstall=st,h.version=ft,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"}),h})({});
|
|
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/collapse_persist.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_ATTRIBUTE = 'data-haori-dialog';\nconst CONFIRM_ATTRIBUTE = 'data-haori-confirm';\nconst DIALOG_TITLE_ATTRIBUTE = 'data-haori-dialog-title';\nconst DIALOG_OK_ATTRIBUTE = 'data-haori-dialog-ok';\nconst CONFIRM_OK_ATTRIBUTE = 'data-haori-confirm-ok';\nconst CONFIRM_CANCEL_ATTRIBUTE = 'data-haori-confirm-cancel';\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(\n documentObject: Document,\n options: ResolvedInstallOptions,\n): 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(isConfirm ? CONFIRM_ATTRIBUTE : DIALOG_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(CONFIRM_CANCEL_ATTRIBUTE, 'true');\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(isConfirm ? CONFIRM_OK_ATTRIBUTE : DIALOG_OK_ATTRIBUTE, 'true');\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>(`[${DIALOG_OK_ATTRIBUTE}]`);\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(message: string, options: ResolvedInstallOptions): 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>(`[${CONFIRM_OK_ATTRIBUTE}]`);\n const cancelButton = modalElement.querySelector<HTMLButtonElement>(\n `[${CONFIRM_CANCEL_ATTRIBUTE}]`,\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-owned';\nconst CONTAINER_ATTRIBUTE = 'data-haori-message-container';\nconst INVALID_TARGET_ATTRIBUTE = 'data-haori-invalid-target';\nconst VALID_TARGET_ATTRIBUTE = 'data-haori-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 && (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 =\n 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 { clearManagedMessages } from './message';\nimport type { ResolvedInstallOptions } from './types';\n\n/**\n * 操作対象の Bootstrap Modal 要素を解決する。\n *\n * <p>渡された要素が `.modal` の場合はその要素を、そうでない場合は祖先方向で\n * 最も近い `.modal` を返す。値を省略した `data-{event}-close` などで対象が\n * トリガー要素自身(例: モーダル内の閉じるボタン)に解決された場合でも、\n * 本来のモーダルへ正しく辿れるようにするための関数。任意要素を `.modal`\n * 化する破壊的処理は行わない。\n *\n * @param element 操作対象として渡された要素。\n * @return 解決された `.modal` 要素。見つからない場合は null。\n */\nfunction resolveModalElement(element: HTMLElement): HTMLElement | null {\n if (element.classList.contains('modal')) {\n return element;\n }\n\n return element.closest('.modal');\n}\n\n/**\n * 解決済みの Bootstrap Modal 要素へ最低限の属性を補う。\n *\n * <p>対象は必ず `.modal` 要素であることを前提とし、`.modal` クラスの付与は\n * 行わない(非 modal 要素を破壊的に modal 化しない)。\n *\n * @param element 整形対象の `.modal` 要素。\n * @return 戻り値はない。\n */\nfunction prepareModalElement(element: HTMLElement): void {\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 * <p>渡された要素が `.modal` でない場合は祖先方向で最も近い `.modal` を\n * 対象に解決する。解決できない場合は要素を modal 化せず reject する。\n *\n * <p>再表示時に前回の管理メッセージ(`is-invalid` / `is-valid` 状態や\n * `invalid-feedback` / `alert` コンテナ)が残らないよう、表示前に対象\n * `.modal` 配下の管理メッセージをクリアする。\n *\n * @param element 開く対象の要素(`.modal` 自身またはその子孫)。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function openDialogElement(\n element: HTMLElement,\n options: ResolvedInstallOptions,\n): Promise<void> {\n const modalElement = resolveModalElement(element);\n if (!modalElement) {\n return Promise.reject(new Error('No ancestor \".modal\" element was found for the target.'));\n }\n\n prepareModalElement(modalElement);\n // 再表示時に前回のメッセージが残らないよう、開く前にクリアする。\n void clearManagedMessages(modalElement);\n const modalInstance = createModalInstance(modalElement, 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 * <p>渡された要素が `.modal` でない場合は祖先方向で最も近い `.modal` を\n * 対象に解決する。解決できない場合は要素を modal 化せず reject する。\n *\n * @param element 閉じる対象の要素(`.modal` 自身またはその子孫)。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function closeDialogElement(\n element: HTMLElement,\n options: ResolvedInstallOptions,\n): Promise<void> {\n const modalElement = resolveModalElement(element);\n if (!modalElement) {\n return Promise.reject(new Error('No ancestor \".modal\" element was found for the target.'));\n }\n\n prepareModalElement(modalElement);\n const modalInstance = createModalInstance(modalElement, 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-toast-container';\nconst TOAST_ATTRIBUTE = 'data-haori-toast';\nconst TOAST_LEVEL_ATTRIBUTE = 'data-haori-toast-level';\nconst TOAST_ACCENT_ATTRIBUTE = 'data-haori-toast-accent';\nconst TOAST_DISMISS_ATTRIBUTE = 'data-haori-toast-dismiss';\n\ninterface ToastAppearance {\n /** アクセント帯へ適用する Bootstrap 背景クラス。 */\n accentClassName: string;\n /** 文言非依存の識別子として付与する正規化済みレベル。 */\n level: 'success' | 'warning' | 'error' | 'info';\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', level: 'success' };\n case 'warning':\n return { accentClassName: 'bg-warning', level: 'warning' };\n case 'error':\n return { accentClassName: 'bg-danger', level: 'error' };\n default:\n return { accentClassName: 'bg-info', level: '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>(\n options.toastContainerSelector,\n );\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(\n documentObject: Document,\n options: ResolvedInstallOptions,\n): 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).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 toastElement.setAttribute(TOAST_LEVEL_ATTRIBUTE, appearance.level);\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(\n methodName: 'openDialog' | 'closeDialog',\n element: HTMLElement,\n): 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(() =>\n fallbackDialog(normalizedMessage),\n );\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(() =>\n fallbackConfirm(normalizedMessage),\n );\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","/**\n * @fileoverview Bootstrap collapse の開閉状態を sessionStorage へ永続化する。\n *\n * `data-haori-persist=\"キー名\"` を collapse 要素(`.collapse`)に付与すると、\n * `shown.bs.collapse` / `hidden.bs.collapse` を監視して開閉状態を保存し、ページ再訪時や\n * `data-import` で後から挿入されたフラグメントにも保存済みの状態を復元する。\n *\n * Haori 本体の式サンドボックスはストレージ操作を禁止しているため、ストレージを使う\n * 永続化は Bootstrap 連携の責務として本パッケージ側に置く。\n */\n\n/** sessionStorage キーの接頭辞。 */\nconst STORAGE_PREFIX = 'haori-bootstrap:collapse:';\n\n/** 永続化対象を示す属性名。属性値が保存キーになる。 */\nconst PERSIST_ATTR = 'data-haori-persist';\n\n/** 開閉状態。 */\ntype CollapseState = 'shown' | 'hidden';\n\n/** 多重 setup を防ぐフラグ。 */\nlet started = false;\n\n/** 挿入監視用の MutationObserver。 */\nlet observer: MutationObserver | undefined;\n\n/** setup 時に監視対象とした document。 */\nlet observedDocument: Document | undefined;\n\n/**\n * 保存キーから sessionStorage のキーを生成する。\n *\n * @param key 永続化キー。\n * @return sessionStorage のキー。\n */\nfunction storageKey(key: string): string {\n return STORAGE_PREFIX + key;\n}\n\n/**\n * 保存済みの開閉状態を読み出す。\n *\n * @param key 永続化キー。\n * @return 保存済み状態。未保存・取得不可なら undefined。\n */\nfunction readState(key: string): CollapseState | undefined {\n try {\n const value = window.sessionStorage.getItem(storageKey(key));\n return value === 'shown' || value === 'hidden' ? value : undefined;\n } catch {\n // プライベートモードやストレージ無効時は黙って諦める。\n return undefined;\n }\n}\n\n/**\n * 開閉状態を保存する。\n *\n * @param key 永続化キー。\n * @param state 保存する開閉状態。\n * @return 戻り値はない。\n */\nfunction writeState(key: string, state: CollapseState): void {\n try {\n window.sessionStorage.setItem(storageKey(key), state);\n } catch {\n // 保存できない環境では永続化を諦める(機能は無効化するだけで例外は伝播させない)。\n }\n}\n\n/**\n * collapse に紐づくトグル要素(`data-bs-toggle=\"collapse\"`)の aria-expanded と\n * `collapsed` クラスを開閉状態へ同期する。直接クラスを操作して復元するため、\n * Bootstrap が次回トグルするまでの間もトグル表示が状態と一致するようにする。\n *\n * @param collapseElement 対象の collapse 要素。\n * @param shown 展開状態なら true。\n * @return 戻り値はない。\n */\nfunction syncToggles(collapseElement: HTMLElement, shown: boolean): void {\n const id = collapseElement.id;\n const selectors = [`[data-bs-toggle=\"collapse\"][data-bs-target=\"#${id}\"]`];\n if (id) {\n selectors.push(`[data-bs-toggle=\"collapse\"][href=\"#${id}\"]`);\n }\n if (!id) {\n return;\n }\n const doc = collapseElement.ownerDocument;\n doc.querySelectorAll<HTMLElement>(selectors.join(',')).forEach((toggle) => {\n toggle.setAttribute('aria-expanded', shown ? 'true' : 'false');\n toggle.classList.toggle('collapsed', !shown);\n });\n}\n\n/**\n * 1 つの collapse 要素へ保存済み状態を復元する。\n *\n * @param element 対象要素。\n * @return 戻り値はない。\n */\nfunction restoreElement(element: HTMLElement): void {\n const key = element.getAttribute(PERSIST_ATTR);\n if (!key) {\n return;\n }\n const state = readState(key);\n if (!state) {\n return;\n }\n const isShown = element.classList.contains('show');\n if (state === 'shown' && !isShown) {\n element.classList.add('show');\n syncToggles(element, true);\n } else if (state === 'hidden' && isShown) {\n element.classList.remove('show');\n syncToggles(element, false);\n }\n}\n\n/**\n * ルート配下(およびルート自身)のすべての永続化対象を復元する。\n *\n * @param root 探索の起点。\n * @return 戻り値はない。\n */\nfunction restoreWithin(root: ParentNode | HTMLElement): void {\n if (root instanceof HTMLElement && root.hasAttribute(PERSIST_ATTR)) {\n restoreElement(root);\n }\n root.querySelectorAll<HTMLElement>(`[${PERSIST_ATTR}]`).forEach(restoreElement);\n}\n\n/**\n * Bootstrap collapse の開閉イベントを受けて状態を保存する。\n *\n * @param event collapse イベント。\n * @param state 保存する開閉状態。\n * @return 戻り値はない。\n */\nfunction handleToggle(event: Event, state: CollapseState): void {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n const key = target.getAttribute(PERSIST_ATTR);\n if (key) {\n writeState(key, state);\n }\n}\n\n/** `shown.bs.collapse` ハンドラ。 */\nconst onShown = (event: Event): void => handleToggle(event, 'shown');\n\n/** `hidden.bs.collapse` ハンドラ。 */\nconst onHidden = (event: Event): void => handleToggle(event, 'hidden');\n\n/**\n * collapse 永続化を有効化する。多重呼び出しは無視する。\n *\n * body が未生成の場合は DOMContentLoaded を待ってから初期化する。\n *\n * @param doc 対象 document。既定は現在の document。\n * @return 戻り値はない。\n */\nexport function setupCollapsePersistence(doc: Document = document): void {\n if (started) {\n return;\n }\n started = true;\n observedDocument = doc;\n\n // Bootstrap 5 の collapse イベントはバブリングするため document 委譲で受ける。\n doc.addEventListener('shown.bs.collapse', onShown);\n doc.addEventListener('hidden.bs.collapse', onHidden);\n\n const initialize = (): void => {\n restoreWithin(doc);\n // data-import などで後から挿入されるフラグメントにも復元を適用する。\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n mutation.addedNodes.forEach((node) => {\n if (node instanceof HTMLElement) {\n restoreWithin(node);\n }\n });\n }\n });\n if (doc.body) {\n observer.observe(doc.body, { childList: true, subtree: true });\n }\n };\n\n if (doc.body) {\n initialize();\n } else {\n doc.addEventListener('DOMContentLoaded', initialize, { once: true });\n }\n}\n\n/**\n * collapse 永続化を無効化し、監視を解除する。\n *\n * @param doc 対象 document。既定は setup 時の document。\n * @return 戻り値はない。\n */\nexport function teardownCollapsePersistence(doc: Document = observedDocument ?? document): void {\n if (!started) {\n return;\n }\n started = false;\n doc.removeEventListener('shown.bs.collapse', onShown);\n doc.removeEventListener('hidden.bs.collapse', onHidden);\n observer?.disconnect();\n observer = undefined;\n observedDocument = undefined;\n}\n","import { BootstrapHaori, setBootstrapHaoriContext } from './bootstrap_haori';\nimport { setupCollapsePersistence, teardownCollapsePersistence } from './collapse_persist';\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: 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 // collapse の開閉状態を sessionStorage へ永続化する(多重呼び出しは内部で無視)。\n setupCollapsePersistence();\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 teardownCollapsePersistence();\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.5.21';\n"],"names":["isConstructor","value","resolveModalConstructor","bootstrap","resolveToastConstructor","hasModalSupport","hasToastSupport","createModalInstance","element","options","modalConstructor","createToastInstance","toastOptions","toastConstructor","DIALOG_ATTRIBUTE","CONFIRM_ATTRIBUTE","DIALOG_TITLE_ATTRIBUTE","DIALOG_OK_ATTRIBUTE","CONFIRM_OK_ATTRIBUTE","CONFIRM_CANCEL_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","resolveModalElement","prepareModalElement","openDialogElement","closeDialogElement","TOAST_CONTAINER_ATTRIBUTE","TOAST_ATTRIBUTE","TOAST_LEVEL_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","STORAGE_PREFIX","PERSIST_ATTR","started","observer","observedDocument","storageKey","key","readState","writeState","state","syncToggles","collapseElement","shown","id","selectors","toggle","restoreElement","isShown","restoreWithin","root","handleToggle","event","onShown","onHidden","setupCollapsePersistence","doc","initialize","mutations","mutation","node","teardownCollapsePersistence","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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"}
|
|
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/collapse_persist.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_ATTRIBUTE = 'data-haori-dialog';\nconst CONFIRM_ATTRIBUTE = 'data-haori-confirm';\nconst DIALOG_TITLE_ATTRIBUTE = 'data-haori-dialog-title';\nconst DIALOG_OK_ATTRIBUTE = 'data-haori-dialog-ok';\nconst CONFIRM_OK_ATTRIBUTE = 'data-haori-confirm-ok';\nconst CONFIRM_CANCEL_ATTRIBUTE = 'data-haori-confirm-cancel';\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(\n documentObject: Document,\n options: ResolvedInstallOptions,\n): 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(isConfirm ? CONFIRM_ATTRIBUTE : DIALOG_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(CONFIRM_CANCEL_ATTRIBUTE, 'true');\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(isConfirm ? CONFIRM_OK_ATTRIBUTE : DIALOG_OK_ATTRIBUTE, 'true');\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>(`[${DIALOG_OK_ATTRIBUTE}]`);\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(message: string, options: ResolvedInstallOptions): 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>(`[${CONFIRM_OK_ATTRIBUTE}]`);\n const cancelButton = modalElement.querySelector<HTMLButtonElement>(\n `[${CONFIRM_CANCEL_ATTRIBUTE}]`,\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-owned';\nconst CONTAINER_ATTRIBUTE = 'data-haori-message-container';\nconst INVALID_TARGET_ATTRIBUTE = 'data-haori-invalid-target';\nconst VALID_TARGET_ATTRIBUTE = 'data-haori-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 && (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 =\n 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 { clearManagedMessages } from './message';\nimport type { ResolvedInstallOptions } from './types';\n\n/**\n * 操作対象の Bootstrap Modal 要素を解決する。\n *\n * <p>渡された要素が `.modal` の場合はその要素を、そうでない場合は祖先方向で\n * 最も近い `.modal` を返す。値を省略した `data-{event}-close` などで対象が\n * トリガー要素自身(例: モーダル内の閉じるボタン)に解決された場合でも、\n * 本来のモーダルへ正しく辿れるようにするための関数。任意要素を `.modal`\n * 化する破壊的処理は行わない。\n *\n * @param element 操作対象として渡された要素。\n * @return 解決された `.modal` 要素。見つからない場合は null。\n */\nfunction resolveModalElement(element: HTMLElement): HTMLElement | null {\n if (element.classList.contains('modal')) {\n return element;\n }\n\n return element.closest('.modal');\n}\n\n/**\n * 解決済みの Bootstrap Modal 要素へ最低限の属性を補う。\n *\n * <p>対象は必ず `.modal` 要素であることを前提とし、`.modal` クラスの付与は\n * 行わない(非 modal 要素を破壊的に modal 化しない)。\n *\n * @param element 整形対象の `.modal` 要素。\n * @return 戻り値はない。\n */\nfunction prepareModalElement(element: HTMLElement): void {\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 * <p>渡された要素が `.modal` でない場合は祖先方向で最も近い `.modal` を\n * 対象に解決する。解決できない場合は要素を modal 化せず reject する。\n *\n * <p>再表示時に前回の管理メッセージ(`is-invalid` / `is-valid` 状態や\n * `invalid-feedback` / `alert` コンテナ)が残らないよう、表示前に対象\n * `.modal` 配下の管理メッセージをクリアする。\n *\n * @param element 開く対象の要素(`.modal` 自身またはその子孫)。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function openDialogElement(\n element: HTMLElement,\n options: ResolvedInstallOptions,\n): Promise<void> {\n const modalElement = resolveModalElement(element);\n if (!modalElement) {\n return Promise.reject(new Error('No ancestor \".modal\" element was found for the target.'));\n }\n\n prepareModalElement(modalElement);\n // 再表示時に前回のメッセージが残らないよう、開く前にクリアする。\n void clearManagedMessages(modalElement);\n const modalInstance = createModalInstance(modalElement, 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 * <p>渡された要素が `.modal` でない場合は祖先方向で最も近い `.modal` を\n * 対象に解決する。解決できない場合は要素を modal 化せず reject する。\n *\n * @param element 閉じる対象の要素(`.modal` 自身またはその子孫)。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function closeDialogElement(\n element: HTMLElement,\n options: ResolvedInstallOptions,\n): Promise<void> {\n const modalElement = resolveModalElement(element);\n if (!modalElement) {\n return Promise.reject(new Error('No ancestor \".modal\" element was found for the target.'));\n }\n\n prepareModalElement(modalElement);\n const modalInstance = createModalInstance(modalElement, 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-toast-container';\nconst TOAST_ATTRIBUTE = 'data-haori-toast';\nconst TOAST_LEVEL_ATTRIBUTE = 'data-haori-toast-level';\nconst TOAST_ACCENT_ATTRIBUTE = 'data-haori-toast-accent';\nconst TOAST_DISMISS_ATTRIBUTE = 'data-haori-toast-dismiss';\n\ninterface ToastAppearance {\n /** アクセント帯へ適用する Bootstrap 背景クラス。 */\n accentClassName: string;\n /** 文言非依存の識別子として付与する正規化済みレベル。 */\n level: 'success' | 'warning' | 'error' | 'info';\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', level: 'success' };\n case 'warning':\n return { accentClassName: 'bg-warning', level: 'warning' };\n case 'error':\n return { accentClassName: 'bg-danger', level: 'error' };\n default:\n return { accentClassName: 'bg-info', level: '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>(\n options.toastContainerSelector,\n );\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(\n documentObject: Document,\n options: ResolvedInstallOptions,\n): 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).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 toastElement.setAttribute(TOAST_LEVEL_ATTRIBUTE, appearance.level);\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(\n methodName: 'openDialog' | 'closeDialog',\n element: HTMLElement,\n): 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(() =>\n fallbackDialog(normalizedMessage),\n );\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(() =>\n fallbackConfirm(normalizedMessage),\n );\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","/**\n * @fileoverview Bootstrap collapse の開閉状態を sessionStorage へ永続化する。\n *\n * `data-haori-persist=\"キー名\"` を collapse 要素(`.collapse`)に付与すると、\n * `shown.bs.collapse` / `hidden.bs.collapse` を監視して開閉状態を保存し、ページ再訪時や\n * `data-import` で後から挿入されたフラグメントにも保存済みの状態を復元する。\n *\n * Haori 本体の式サンドボックスはストレージ操作を禁止しているため、ストレージを使う\n * 永続化は Bootstrap 連携の責務として本パッケージ側に置く。\n */\n\n/** sessionStorage キーの接頭辞。 */\nconst STORAGE_PREFIX = 'haori-bootstrap:collapse:';\n\n/** 永続化対象を示す属性名。属性値が保存キーになる。 */\nconst PERSIST_ATTR = 'data-haori-persist';\n\n/** 開閉状態。 */\ntype CollapseState = 'shown' | 'hidden';\n\n/** 多重 setup を防ぐフラグ。 */\nlet started = false;\n\n/** 挿入監視用の MutationObserver。 */\nlet observer: MutationObserver | undefined;\n\n/** setup 時に監視対象とした document。 */\nlet observedDocument: Document | undefined;\n\n/**\n * 保存キーから sessionStorage のキーを生成する。\n *\n * @param key 永続化キー。\n * @return sessionStorage のキー。\n */\nfunction storageKey(key: string): string {\n return STORAGE_PREFIX + key;\n}\n\n/**\n * 保存済みの開閉状態を読み出す。\n *\n * @param key 永続化キー。\n * @return 保存済み状態。未保存・取得不可なら undefined。\n */\nfunction readState(key: string): CollapseState | undefined {\n try {\n const value = window.sessionStorage.getItem(storageKey(key));\n return value === 'shown' || value === 'hidden' ? value : undefined;\n } catch {\n // プライベートモードやストレージ無効時は黙って諦める。\n return undefined;\n }\n}\n\n/**\n * 開閉状態を保存する。\n *\n * @param key 永続化キー。\n * @param state 保存する開閉状態。\n * @return 戻り値はない。\n */\nfunction writeState(key: string, state: CollapseState): void {\n try {\n window.sessionStorage.setItem(storageKey(key), state);\n } catch {\n // 保存できない環境では永続化を諦める(機能は無効化するだけで例外は伝播させない)。\n }\n}\n\n/**\n * collapse に紐づくトグル要素(`data-bs-toggle=\"collapse\"`)の aria-expanded と\n * `collapsed` クラスを開閉状態へ同期する。直接クラスを操作して復元するため、\n * Bootstrap が次回トグルするまでの間もトグル表示が状態と一致するようにする。\n *\n * @param collapseElement 対象の collapse 要素。\n * @param shown 展開状態なら true。\n * @return 戻り値はない。\n */\nfunction syncToggles(collapseElement: HTMLElement, shown: boolean): void {\n const id = collapseElement.id;\n const selectors = [`[data-bs-toggle=\"collapse\"][data-bs-target=\"#${id}\"]`];\n if (id) {\n selectors.push(`[data-bs-toggle=\"collapse\"][href=\"#${id}\"]`);\n }\n if (!id) {\n return;\n }\n const doc = collapseElement.ownerDocument;\n doc.querySelectorAll<HTMLElement>(selectors.join(',')).forEach((toggle) => {\n toggle.setAttribute('aria-expanded', shown ? 'true' : 'false');\n toggle.classList.toggle('collapsed', !shown);\n });\n}\n\n/**\n * 1 つの collapse 要素へ保存済み状態を復元する。\n *\n * @param element 対象要素。\n * @return 戻り値はない。\n */\nfunction restoreElement(element: HTMLElement): void {\n const key = element.getAttribute(PERSIST_ATTR);\n if (!key) {\n return;\n }\n const state = readState(key);\n if (!state) {\n return;\n }\n const isShown = element.classList.contains('show');\n if (state === 'shown' && !isShown) {\n element.classList.add('show');\n syncToggles(element, true);\n } else if (state === 'hidden' && isShown) {\n element.classList.remove('show');\n syncToggles(element, false);\n }\n}\n\n/**\n * ルート配下(およびルート自身)のすべての永続化対象を復元する。\n *\n * @param root 探索の起点。\n * @return 戻り値はない。\n */\nfunction restoreWithin(root: ParentNode | HTMLElement): void {\n if (root instanceof HTMLElement && root.hasAttribute(PERSIST_ATTR)) {\n restoreElement(root);\n }\n root.querySelectorAll<HTMLElement>(`[${PERSIST_ATTR}]`).forEach(restoreElement);\n}\n\n/**\n * Bootstrap collapse の開閉イベントを受けて状態を保存する。\n *\n * @param event collapse イベント。\n * @param state 保存する開閉状態。\n * @return 戻り値はない。\n */\nfunction handleToggle(event: Event, state: CollapseState): void {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n const key = target.getAttribute(PERSIST_ATTR);\n if (key) {\n writeState(key, state);\n }\n}\n\n/** `shown.bs.collapse` ハンドラ。 */\nconst onShown = (event: Event): void => handleToggle(event, 'shown');\n\n/** `hidden.bs.collapse` ハンドラ。 */\nconst onHidden = (event: Event): void => handleToggle(event, 'hidden');\n\n/**\n * collapse 永続化を有効化する。多重呼び出しは無視する。\n *\n * body が未生成の場合は DOMContentLoaded を待ってから初期化する。\n *\n * @param doc 対象 document。既定は現在の document。\n * @return 戻り値はない。\n */\nexport function setupCollapsePersistence(doc: Document = document): void {\n if (started) {\n return;\n }\n started = true;\n observedDocument = doc;\n\n // Bootstrap 5 の collapse イベントはバブリングするため document 委譲で受ける。\n doc.addEventListener('shown.bs.collapse', onShown);\n doc.addEventListener('hidden.bs.collapse', onHidden);\n\n const initialize = (): void => {\n restoreWithin(doc);\n // data-import などで後から挿入されるフラグメントにも復元を適用する。\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n mutation.addedNodes.forEach((node) => {\n if (node instanceof HTMLElement) {\n restoreWithin(node);\n }\n });\n }\n });\n if (doc.body) {\n observer.observe(doc.body, { childList: true, subtree: true });\n }\n };\n\n if (doc.body) {\n initialize();\n } else {\n doc.addEventListener('DOMContentLoaded', initialize, { once: true });\n }\n}\n\n/**\n * collapse 永続化を無効化し、監視を解除する。\n *\n * @param doc 対象 document。既定は setup 時の document。\n * @return 戻り値はない。\n */\nexport function teardownCollapsePersistence(doc: Document = observedDocument ?? document): void {\n if (!started) {\n return;\n }\n started = false;\n doc.removeEventListener('shown.bs.collapse', onShown);\n doc.removeEventListener('hidden.bs.collapse', onHidden);\n observer?.disconnect();\n observer = undefined;\n observedDocument = undefined;\n}\n","import { BootstrapHaori, setBootstrapHaoriContext } from './bootstrap_haori';\nimport { setupCollapsePersistence, teardownCollapsePersistence } from './collapse_persist';\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: 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 // collapse の開閉状態を sessionStorage へ永続化する(多重呼び出しは内部で無視)。\n setupCollapsePersistence();\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 teardownCollapsePersistence();\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.5.22';\n"],"names":["isConstructor","value","resolveModalConstructor","bootstrap","resolveToastConstructor","hasModalSupport","hasToastSupport","createModalInstance","element","options","modalConstructor","createToastInstance","toastOptions","toastConstructor","DIALOG_ATTRIBUTE","CONFIRM_ATTRIBUTE","DIALOG_TITLE_ATTRIBUTE","DIALOG_OK_ATTRIBUTE","CONFIRM_OK_ATTRIBUTE","CONFIRM_CANCEL_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","resolveModalElement","prepareModalElement","openDialogElement","closeDialogElement","TOAST_CONTAINER_ATTRIBUTE","TOAST_ATTRIBUTE","TOAST_LEVEL_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","STORAGE_PREFIX","PERSIST_ATTR","started","observer","observedDocument","storageKey","key","readState","writeState","state","syncToggles","collapseElement","shown","id","selectors","toggle","restoreElement","isShown","restoreWithin","root","handleToggle","event","onShown","onHidden","setupCollapsePersistence","doc","initialize","mutations","mutation","node","teardownCollapsePersistence","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":"6CAgBA,SAASA,EAAiBC,EAAiE,CACzF,OAAO,OAAOA,GAAU,UAC1B,CAQO,SAASC,EACdC,EACuC,CACvC,OAAOH,EAAsCG,GAAW,KAAK,EACxDA,GAAW,MACZ,MACN,CAQO,SAASC,EACdD,EACuC,CACvC,OAAOH,EAAsCG,GAAW,KAAK,EACxDA,GAAW,MACZ,MACN,CAQO,SAASE,EAAgBF,EAAyC,CACvE,MAAO,EAAQD,EAAwBC,CAAS,CAClD,CAQO,SAASG,GAAgBH,EAAyC,CACvE,MAAO,EAAQC,EAAwBD,CAAS,CAClD,CASO,SAASI,EACdC,EACAC,EACAN,EACoC,CACpC,MAAMO,EAAmBR,EAAwBC,CAAS,EAC1D,GAAKO,EAIL,OAAI,OAAOA,EAAiB,qBAAwB,WAC3CA,EAAiB,oBAAoBF,EAASC,CAAO,EAGvD,IAAIC,EAAiBF,EAASC,CAAO,CAC9C,CAUO,SAASE,GACdH,EACAI,EACAT,EACoC,CACpC,MAAMU,EAAmBT,EAAwBD,CAAS,EAC1D,GAAKU,EAIL,OAAI,OAAOA,EAAiB,qBAAwB,WAC3CA,EAAiB,oBAAoBL,EAASI,CAAY,EAG5D,IAAIC,EAAiBL,EAASI,CAAY,CACnD,CChHA,MAAME,GAAmB,oBACnBC,GAAoB,qBACpBC,GAAyB,0BACzBC,EAAsB,uBACtBC,EAAuB,wBACvBC,EAA2B,4BAEjC,IAAIC,GAAqB,EAOzB,SAASC,GAA2B,CAClC,MAAO,CACL,SAAU,SACV,SAAU,EAAA,CAEd,CASA,SAASC,EACPC,EACAd,EACa,CACb,GAAIA,EAAQ,wBAAyB,CACnC,MAAMe,EAAkBD,EAAe,cACrCd,EAAQ,uBAAA,EAEV,GAAIe,EACF,OAAOA,CAEX,CAEA,OAAOD,EAAe,IACxB,CAWA,SAASE,EACPF,EACAG,EACAC,EACAC,EACgB,CAChB,MAAMC,EAAeN,EAAe,cAAc,KAAK,EACvDM,EAAa,UAAY,aACzBA,EAAa,SAAW,GACxBA,EAAa,aAAaF,EAAYZ,GAAoBD,GAAkB,MAAM,EAClFe,EAAa,aAAa,cAAe,MAAM,EAE/C,MAAMC,EAAgBP,EAAe,cAAc,KAAK,EACxDO,EAAc,UAAY,qCAE1B,MAAMC,EAAiBR,EAAe,cAAc,KAAK,EAGzD,GAFAQ,EAAe,UAAY,gBAEvBH,EAAO,CACT,MAAMI,EAAU,sBAAsB,EAAEZ,EAAkB,GACpDa,EAAgBV,EAAe,cAAc,KAAK,EACxDU,EAAc,UAAY,eAE1B,MAAMC,EAAeX,EAAe,cAAc,IAAI,EACtDW,EAAa,UAAY,cACzBA,EAAa,GAAKF,EAClBE,EAAa,aAAalB,GAAwB,MAAM,EACxDkB,EAAa,YAAcN,EAC3BK,EAAc,YAAYC,CAAY,EAEtCH,EAAe,YAAYE,CAAa,EACxCJ,EAAa,aAAa,kBAAmBG,CAAO,CACtD,CAEA,MAAMG,EAAcZ,EAAe,cAAc,KAAK,EACtDY,EAAY,UAAY,aAExB,MAAMC,EAAiBb,EAAe,cAAc,GAAG,EACvDa,EAAe,UAAY,OAC3BA,EAAe,MAAM,WAAa,WAClCA,EAAe,YAAcV,EAC7BS,EAAY,YAAYC,CAAc,EAEtC,MAAMC,EAAgBd,EAAe,cAAc,KAAK,EAGxD,GAFAc,EAAc,UAAY,eAEtBV,EAAW,CACb,MAAMW,EAAef,EAAe,cAAc,QAAQ,EAC1De,EAAa,KAAO,SACpBA,EAAa,UAAY,oBACzBA,EAAa,aAAanB,EAA0B,MAAM,EAC1DmB,EAAa,YAAc,SAC3BD,EAAc,YAAYC,CAAY,CACxC,CAEA,MAAMC,EAAWhB,EAAe,cAAc,QAAQ,EACtD,OAAAgB,EAAS,KAAO,SAChBA,EAAS,UAAY,kBACrBA,EAAS,aAAaZ,EAAYT,EAAuBD,EAAqB,MAAM,EACpFsB,EAAS,YAAc,KACvBF,EAAc,YAAYE,CAAQ,EAElCR,EAAe,OAAOI,EAAaE,CAAa,EAChDP,EAAc,YAAYC,CAAc,EACxCF,EAAa,YAAYC,CAAa,EAC/BD,CACT,CASO,SAASW,GAAWd,EAAiBjB,EAAgD,CAC1F,MAAMc,EAAiB,WAAW,SAC5BM,EAAeJ,EAAiBF,EAAgBG,EAAS,GAAOjB,EAAQ,WAAW,EACzFa,EAAuBC,EAAgBd,CAAO,EAAE,YAAYoB,CAAY,EAExE,MAAMY,EAAgBlC,EACpBsB,EACAR,EAAA,EACAZ,EAAQ,SAAA,EAEV,OAAKgC,EAKE,IAAI,QAAc,CAACC,EAASC,IAAW,CAC5C,MAAMC,EAAW,IAAY,CAC3Bf,EAAa,oBAAoB,kBAAmBgB,CAAY,EAChEhB,EAAa,OAAA,EACbY,EAAc,UAAA,EACdC,EAAA,CACF,EAEMG,EAAe,IAAY,CAC/BD,EAAA,CACF,EAEiBf,EAAa,cAAiC,IAAIZ,CAAmB,GAAG,GAC/E,iBACR,QACA,IAAM,CACJwB,EAAc,KAAA,CAChB,EACA,CAAE,KAAM,EAAA,CAAK,EAGfZ,EAAa,iBAAiB,kBAAmBgB,EAAc,CAAE,KAAM,GAAM,EAE7E,GAAI,CACFJ,EAAc,KAAA,CAChB,OAASK,EAAO,CACdjB,EAAa,oBAAoB,kBAAmBgB,CAAY,EAChEhB,EAAa,OAAA,EACbY,EAAc,UAAA,EACdE,EAAOG,CAAK,CACd,CACF,CAAC,GAnCCjB,EAAa,OAAA,EACN,QAAQ,OAAO,IAAI,MAAM,iCAAiC,CAAC,EAmCtE,CASO,SAASkB,GAAYrB,EAAiBjB,EAAmD,CAC9F,MAAMc,EAAiB,WAAW,SAC5BM,EAAeJ,EAAiBF,EAAgBG,EAAS,GAAMjB,EAAQ,WAAW,EACxFa,EAAuBC,EAAgBd,CAAO,EAAE,YAAYoB,CAAY,EAExE,MAAMY,EAAgBlC,EACpBsB,EACAR,EAAA,EACAZ,EAAQ,SAAA,EAEV,OAAKgC,EAKE,IAAI,QAAiB,CAACC,EAASC,IAAW,CAC/C,IAAIK,EAAY,GAEhB,MAAMJ,EAAW,IAAY,CAC3Bf,EAAa,oBAAoB,kBAAmBgB,CAAY,EAChEhB,EAAa,OAAA,EACbY,EAAc,UAAA,EACdC,EAAQM,CAAS,CACnB,EAEMH,EAAe,IAAY,CAC/BD,EAAA,CACF,EAEML,EAAWV,EAAa,cAAiC,IAAIX,CAAoB,GAAG,EACpFoB,EAAeT,EAAa,cAChC,IAAIV,CAAwB,GAAA,EAG9BoB,GAAU,iBACR,QACA,IAAM,CACJS,EAAY,GACZP,EAAc,KAAA,CAChB,EACA,CAAE,KAAM,EAAA,CAAK,EAEfH,GAAc,iBACZ,QACA,IAAM,CACJU,EAAY,GACZP,EAAc,KAAA,CAChB,EACA,CAAE,KAAM,EAAA,CAAK,EAGfZ,EAAa,iBAAiB,kBAAmBgB,EAAc,CAAE,KAAM,GAAM,EAE7E,GAAI,CACFJ,EAAc,KAAA,CAChB,OAASK,EAAO,CACdjB,EAAa,oBAAoB,kBAAmBgB,CAAY,EAChEhB,EAAa,OAAA,EACbY,EAAc,UAAA,EACdE,EAAOG,CAAK,CACd,CACF,CAAC,GAlDCjB,EAAa,OAAA,EACN,QAAQ,OAAO,IAAI,MAAM,iCAAiC,CAAC,EAkDtE,CCzPA,MAAMoB,EAAkB,mBAClBC,EAAsB,+BACtBC,EAA2B,4BAC3BC,EAAyB,0BAQ/B,SAASC,EAAcC,EAAiD,CACtE,OACEA,aAAkB,mBAAqBA,EAAO,OAAS,YAAcA,EAAO,OAAS,QAEzF,CAQA,SAASC,EAAaD,EAAiD,CACrE,OAAOA,aAAkB,kBAAoBA,EAAO,OAAS,OAC/D,CAQA,SAASE,EACPF,EACsE,CACtE,OACEA,aAAkB,kBAClBA,aAAkB,mBAClBA,aAAkB,mBAEtB,CAQA,SAASG,EAAwBH,EAA8C,CAC7E,OAAO,MAAM,KAAKA,EAAO,QAAQ,EAAE,KAChC9C,GACCA,aAAmB,aAAeA,EAAQ,aAAa0C,CAAmB,IAAM,MAAA,CAEtF,CASA,SAASQ,EAAkBnC,EAA0BG,EAAiC,CACpF,MAAMU,EAAiBb,EAAe,cAAc,KAAK,EACzD,OAAAa,EAAe,aAAaa,EAAiB,MAAM,EACnDb,EAAe,YAAcV,EACtBU,CACT,CAQA,SAASuB,GAAoBL,EAA8C,CACzE,OAAOG,EAAwBH,CAAM,CACvC,CAQA,SAASM,EAAqBN,EAA8C,CAC1E,GAAIA,EAAO,KAAM,CACf,MAAMO,EAAWP,EAAO,MAAQA,EAAO,cACjCQ,EACJ,OAAO,IAAQ,KAAe,OAAO,IAAI,QAAW,WAChD,IAAI,OAAOR,EAAO,IAAI,EACtBA,EAAO,KAAK,QAAQ,WAAY,MAAM,EACtCS,EAAe,MAAM,KACzBF,EAAS,iBAAmC,6BAA6BC,CAAW,IAAI,CAAA,EAE1F,GAAIC,EAAa,OAAS,EACxB,OAAOA,CAEX,CAEA,MAAO,CAACT,CAAM,CAChB,CAQA,SAASU,GAAmBC,EAA2D,CACrF,KAAM,CAACC,EAAc,GAAGC,CAAY,EAAIF,EACxC,GAAI,CAACC,EACH,OAGF,IAAIE,EAAgCF,EACpC,KAAOE,GAAW,CAChB,GAAID,EAAa,MAAO3D,GAAY4D,GAAW,SAAS5D,CAAO,CAAC,EAC9D,OAAO4D,EAETA,EAAYA,EAAU,aACxB,CAGF,CAQA,SAASC,EAAwBf,EAAmD,CAElF,MAAMgB,EADeV,EAAqBN,CAAM,EAE7C,IAAK9C,GAAYA,EAAQ,QAAQ,aAAa,CAAC,EAC/C,OAAQA,GAAoCA,aAAmB,WAAW,EAE7E,GAAI8D,EAAS,OAAS,EAAG,CACvB,MAAMC,EAAiBP,GAAmBM,CAAQ,EAClD,GAAIC,GAAkB,CAACD,EAAS,SAASC,CAAc,EACrD,OAAOA,CAEX,CAEA,OAAOC,EAAyBlB,CAAM,CACxC,CAQA,SAASkB,EAAyBlB,EAAmD,CACnF,MAAMmB,EAAmBnB,EAAO,QAAQ,aAAa,EACrD,OAAOmB,aAA4B,YAAcA,EAAmB,MACtE,CAQA,SAASC,GAAqBpB,EAAkC,CAC9D,MAAMqB,EAAcrB,EAAO,mBAC3B,GACEqB,aAAuB,aACvBA,EAAY,aAAazB,CAAmB,IAAM,OAElD,OAAOyB,EAGT,MAAMC,EAAY,SAAS,cAAc,KAAK,EAC9C,OAAAA,EAAU,UAAY,2BACtBA,EAAU,aAAa3B,EAAiB,MAAM,EAC9C2B,EAAU,aAAa1B,EAAqB,MAAM,EAClDI,EAAO,sBAAsB,WAAYsB,CAAS,EAC3CA,CACT,CAQA,SAASC,GAAsBvB,EAAuC,CACpE,MAAMwB,EAAcvB,EAAaD,CAAM,EACnCe,EAAwBf,CAAM,EAC9BkB,EAAyBlB,CAAM,EACnC,GAAI,CAACwB,EACH,OAAOJ,GAAqBpB,CAAM,EAGpC,MAAMyB,EAAoBtB,EAAwBqB,CAAW,EAC7D,GAAIC,EACF,OAAOA,EAGT,MAAMH,EAAY,SAAS,cAAc,KAAK,EAC9C,OAAAA,EAAU,UAAY,2BACtBA,EAAU,aAAa3B,EAAiB,MAAM,EAC9C2B,EAAU,aAAa1B,EAAqB,MAAM,EAClD4B,EAAY,YAAYF,CAAS,EAC1BA,CACT,CAQA,SAASI,GAAqB1B,EAAkC,CAC9D,MAAMyB,EAAoBpB,GAAoBL,CAAM,EACpD,GAAIyB,EACF,OAAOA,EAGT,MAAMH,EAAY,SAAS,cAAc,KAAK,EAC9C,OAAAA,EAAU,UAAY,qBACtBA,EAAU,aAAa,OAAQ,OAAO,EACtCA,EAAU,aAAa3B,EAAiB,MAAM,EAC9C2B,EAAU,aAAa1B,EAAqB,MAAM,EAClDI,EAAO,sBAAsB,aAAcsB,CAAS,EAC7CA,CACT,CAQA,SAASK,EAAwB3B,EAA2B,CACtDA,EAAO,aAAaH,CAAwB,IAAM,SAItDG,EAAO,UAAU,OAAO,YAAY,EACpCA,EAAO,gBAAgBH,CAAwB,EACjD,CAQA,SAAS+B,EAAsB5B,EAA2B,CACpDA,EAAO,aAAaF,CAAsB,IAAM,SAIpDE,EAAO,UAAU,OAAO,UAAU,EAClCA,EAAO,gBAAgBF,CAAsB,EAC/C,CAQA,SAAS+B,GAAuBC,EAAwB,CACtD,OAAQA,EAAA,CACN,IAAK,UACH,MAAO,sBACT,IAAK,UACH,MAAO,sBACT,IAAK,OACH,MAAO,mBACT,QACE,MAAO,oBAAA,CAEb,CAQA,SAASC,EAA0BD,EAAwB,CACzD,OAAOA,IAAU,UAAY,yBAA2B,0BAC1D,CAQA,SAASE,GAAuBhC,EAAgC,EAC9CC,EAAaD,CAAM,EAAIM,EAAqBN,CAAM,EAAI,CAACA,CAAM,GACrE,QAAS9C,GAAY,CAC3BA,EAAQ,UAAU,IAAI,YAAY,EAClCA,EAAQ,aAAa2C,EAA0B,MAAM,CACvD,CAAC,CACH,CAQA,SAASoC,GAAwBjC,EAAgC,EAC/CC,EAAaD,CAAM,EAAIM,EAAqBN,CAAM,EAAI,CAACA,CAAM,GACrE,QAAS9C,GAAY,CAC3ByE,EAAwBzE,CAAO,CACjC,CAAC,CACH,CASA,SAASgF,GAA6BlC,EAAqB8B,EAA6B,CACtF,MAAMT,EAAcrB,EAAO,mBAC3B,GACEqB,aAAuB,aACvBA,EAAY,aAAazB,CAAmB,IAAM,OAElD,OAAAyB,EAAY,UAAYU,EAA0BD,CAAK,EAChDT,EAGT,MAAMC,EAAY,SAAS,cAAc,KAAK,EAC9C,OAAAA,EAAU,UAAYS,EAA0BD,CAAK,EACrDR,EAAU,aAAa3B,EAAiB,MAAM,EAC9C2B,EAAU,aAAa1B,EAAqB,MAAM,EAClDI,EAAO,sBAAsB,WAAYsB,CAAS,EAC3CA,CACT,CASA,SAASa,GAA8BnC,EAA0B8B,EAA6B,CAC5F,MAAMN,EAAcvB,EAAaD,CAAM,EACnCe,EAAwBf,CAAM,EAC9BkB,EAAyBlB,CAAM,EACnC,GAAI,CAACwB,EACH,OAAOU,GAA6BlC,EAAQ8B,CAAK,EAGnD,MAAML,EAAoBtB,EAAwBqB,CAAW,EAC7D,GAAIC,EACF,OAAAA,EAAkB,UAAYM,EAA0BD,CAAK,EACtDL,EAGT,MAAMH,EAAY,SAAS,cAAc,KAAK,EAC9C,OAAAA,EAAU,UAAYS,EAA0BD,CAAK,EACrDR,EAAU,aAAa3B,EAAiB,MAAM,EAC9C2B,EAAU,aAAa1B,EAAqB,MAAM,EAClD4B,EAAY,YAAYF,CAAS,EAC1BA,CACT,CASA,SAASc,GAA6BpC,EAAqB8B,EAA6B,CACtF,MAAML,EAAoBpB,GAAoBL,CAAM,EACpD,GAAIyB,EACF,OAAAA,EAAkB,UAAYI,GAAuBC,CAAK,EACnDL,EAGT,MAAMH,EAAY,SAAS,cAAc,KAAK,EAC9C,OAAAA,EAAU,UAAYO,GAAuBC,CAAK,EAClDR,EAAU,aAAa,OAAQ,OAAO,EACtCA,EAAU,aAAa3B,EAAiB,MAAM,EAC9C2B,EAAU,aAAa1B,EAAqB,MAAM,EAClDI,EAAO,sBAAsB,aAAcsB,CAAS,EAC7CA,CACT,CASO,SAASe,GAAuBrC,EAAqB5B,EAAgC,CAM1F,OALkB2B,EAAcC,CAAM,EAClCuB,GAAsBvB,CAAM,EAC5BE,EAAcF,CAAM,EAClBoB,GAAqBpB,CAAM,EAC3B0B,GAAqB1B,CAAM,GACvB,YAAYI,EAAkB,SAAUhC,CAAO,CAAC,EAEtD2B,EAAcC,CAAM,EACtBgC,GAAuBhC,CAAM,EACpBE,EAAcF,CAAM,IAC7BA,EAAO,UAAU,IAAI,YAAY,EACjCA,EAAO,aAAaH,EAA0B,MAAM,GAG/C,QAAQ,QAAA,CACjB,CAUO,SAASyC,GACdtC,EACA5B,EACA0D,EACe,CAQf,IAPkB/B,EAAcC,CAAM,EAClCmC,GAA8BnC,EAAQ8B,CAAK,EAC3C5B,EAAcF,CAAM,EAClBkC,GAA6BlC,EAAQ8B,CAAK,EAC1CM,GAA6BpC,EAAQ8B,CAAK,GACtC,YAAY1B,EAAkB,SAAUhC,CAAO,CAAC,EAEtD2B,EAAcC,CAAM,EAAG,CACzB,MAAMuC,EAAUtC,EAAaD,CAAM,EAAIM,EAAqBN,CAAM,EAAI,CAACA,CAAM,EACzE8B,IAAU,UACZS,EAAQ,QAASrF,GAAY,CAC3ByE,EAAwBzE,CAAO,EAC/BA,EAAQ,UAAU,IAAI,UAAU,EAChCA,EAAQ,aAAa4C,EAAwB,MAAM,CACrD,CAAC,EACQ,CAACgC,GAASA,IAAU,SAC7BS,EAAQ,QAASrF,GAAY0E,EAAsB1E,CAAO,CAAC,EAC3D8E,GAAuBhC,CAAM,GAE7BuC,EAAQ,QAASrF,GAAY,CAC3B0E,EAAsB1E,CAAO,EAC7ByE,EAAwBzE,CAAO,CACjC,CAAC,CAEL,MAAWgD,EAAcF,CAAM,IACzB8B,IAAU,WACZH,EAAwB3B,CAAM,EAC9BA,EAAO,UAAU,IAAI,UAAU,EAC/BA,EAAO,aAAaF,EAAwB,MAAM,GACzC,CAACgC,GAASA,IAAU,SAC7BF,EAAsB5B,CAAM,EAC5BA,EAAO,UAAU,IAAI,YAAY,EACjCA,EAAO,aAAaH,EAA0B,MAAM,IAEpD+B,EAAsB5B,CAAM,EAC5B2B,EAAwB3B,CAAM,IAIlC,OAAO,QAAQ,QAAA,CACjB,CAQO,SAASwC,GAAqBC,EAA4C,CAC/E,GAAI1C,EAAc0C,CAAc,EAAG,CACjC,MAAMjB,EAAcvB,EAAawC,CAAc,EAC3C1B,EAAwB0B,CAAc,EACtCvB,EAAyBuB,CAAc,GACpBjB,EAAcrB,EAAwBqB,CAAW,EAAI,SAC5D,OAAA,EAChBS,GAAwBQ,CAAc,GAChBxC,EAAawC,CAAc,EAC7CnC,EAAqBmC,CAAc,EACnC,CAACA,CAAc,GACL,QAASvF,GAAY0E,EAAsB1E,CAAO,CAAC,CACnE,SAAWgD,EAAcuC,CAAc,EAAG,CACxC,MAAMpB,EAAcoB,EAAe,mBAEjCpB,aAAuB,aACvBA,EAAY,aAAazB,CAAmB,IAAM,QAElDyB,EAAY,OAAA,EAEdM,EAAwBc,CAAc,EACtCb,EAAsBa,CAAc,CACtC,CAKA,OAHwBA,EAAe,iBACrC,IAAI7C,CAAmB,UAAA,EAET,QAAS1C,GAAY,CACnCA,EAAQ,OAAA,CACV,CAAC,EAEsBuF,EAAe,iBACpC,IAAI5C,CAAwB,UAAA,EAEf,QAAS3C,GAAY,CAClCyE,EAAwBzE,CAAO,CACjC,CAAC,EAEoBuF,EAAe,iBAClC,IAAI3C,CAAsB,UAAA,EAEf,QAAS5C,GAAY,CAChC0E,EAAsB1E,CAAO,CAC/B,CAAC,EAEM,QAAQ,QAAA,CACjB,CC9fA,SAASwF,GAAoBxF,EAA0C,CACrE,OAAIA,EAAQ,UAAU,SAAS,OAAO,EAC7BA,EAGFA,EAAQ,QAAQ,QAAQ,CACjC,CAWA,SAASyF,GAAoBzF,EAA4B,CACnDA,EAAQ,SAAW,IACrBA,EAAQ,SAAW,IAGhBA,EAAQ,aAAa,aAAa,GACrCA,EAAQ,aAAa,cAAe,MAAM,CAE9C,CAgBO,SAAS0F,GACd1F,EACAC,EACe,CACf,MAAMoB,EAAemE,GAAoBxF,CAAO,EAChD,GAAI,CAACqB,EACH,OAAO,QAAQ,OAAO,IAAI,MAAM,wDAAwD,CAAC,EAG3FoE,GAAoBpE,CAAY,EAE3BiE,GAAqBjE,CAAY,EACtC,MAAMY,EAAgBlC,EAAoBsB,EAAc,OAAWpB,EAAQ,SAAS,EACpF,OAAKgC,GAILA,EAAc,KAAA,EACP,QAAQ,QAAA,GAJN,QAAQ,OAAO,IAAI,MAAM,iCAAiC,CAAC,CAKtE,CAYO,SAAS0D,GACd3F,EACAC,EACe,CACf,MAAMoB,EAAemE,GAAoBxF,CAAO,EAChD,GAAI,CAACqB,EACH,OAAO,QAAQ,OAAO,IAAI,MAAM,wDAAwD,CAAC,EAG3FoE,GAAoBpE,CAAY,EAChC,MAAMY,EAAgBlC,EAAoBsB,EAAc,OAAWpB,EAAQ,SAAS,EACpF,OAAKgC,GAILA,EAAc,KAAA,EACP,QAAQ,QAAA,GAJN,QAAQ,OAAO,IAAI,MAAM,iCAAiC,CAAC,CAKtE,CCtGA,MAAM2D,GAA4B,6BAC5BC,GAAkB,mBAClBC,GAAwB,yBACxBC,GAAyB,0BACzBC,GAA0B,2BAS1BC,GAAwD,CAC5D,YAAa,gBACb,aAAc,oCACd,UAAW,cACX,eAAgB,mBAChB,gBAAiB,uCACjB,aAAc,gBAChB,EAQA,SAASC,GAAuBtB,EAAiC,CAC/D,OAAQA,EAAA,CACN,IAAK,UACH,MAAO,CAAE,gBAAiB,aAAc,MAAO,SAAA,EACjD,IAAK,UACH,MAAO,CAAE,gBAAiB,aAAc,MAAO,SAAA,EACjD,IAAK,QACH,MAAO,CAAE,gBAAiB,YAAa,MAAO,OAAA,EAChD,QACE,MAAO,CAAE,gBAAiB,UAAW,MAAO,MAAA,CAAO,CAEzD,CASA,SAASuB,GAAiBpF,EAA0Bd,EAA8C,CAChG,GAAIA,EAAQ,uBAAwB,CAClC,MAAMe,EAAkBD,EAAe,cACrCd,EAAQ,sBAAA,EAEV,GAAIe,EACF,OAAOA,CAEX,CAEA,OAAOD,EAAe,IACxB,CASA,SAASqF,GACPrF,EACAd,EACa,CACb,MAAMoG,EAAcF,GAAiBpF,EAAgBd,CAAO,EACtDqG,EAAkBL,GAAuBhG,EAAQ,eAAiB,YAAY,EAC9EsE,EAAoB8B,EAAY,cACpC,IAAIT,EAAyB,UAAA,EAE/B,GAAIrB,EAAmB,CACrB,MAAMgC,EAAqB,OAAO,OAAON,EAAsB,EAAE,QAASO,GAAMA,EAAE,MAAM,GAAG,CAAC,EAC5F,OAAAjC,EAAkB,UAAU,OAAO,GAAGgC,CAAkB,EACxDhC,EAAkB,UAAU,IAAI,GAAG+B,EAAgB,MAAM,GAAG,CAAC,EACtD/B,CACT,CAEA,MAAMH,EAAYrD,EAAe,cAAc,KAAK,EACpD,OAAAqD,EAAU,UAAY,kCAAkCkC,CAAe,OACvElC,EAAU,aAAawB,GAA2B,MAAM,EACxDS,EAAY,YAAYjC,CAAS,EAC1BA,CACT,CAUO,SAASqC,GACdvF,EACA0D,EACA3E,EACe,CACf,MAAMc,EAAiB,WAAW,SAC5B2F,EAAaR,GAAuBtB,CAAK,EACzC+B,EAAe5F,EAAe,cAAc,KAAK,EACvD4F,EAAa,UAAY,2CACzBA,EAAa,aAAa,OAAQ,QAAQ,EAC1CA,EAAa,aAAa,YAAa,QAAQ,EAC/CA,EAAa,aAAa,cAAe,MAAM,EAC/CA,EAAa,aAAad,GAAiB,MAAM,EACjDc,EAAa,aAAab,GAAuBY,EAAW,KAAK,EAEjE,MAAME,EAAc7F,EAAe,cAAc,KAAK,EACtD6F,EAAY,UAAY,6BAExB,MAAMC,EAAgB9F,EAAe,cAAc,KAAK,EACxD8F,EAAc,UAAY,+BAA+BH,EAAW,eAAe,GACnFG,EAAc,MAAM,MAAQ,WAC5BA,EAAc,aAAad,GAAwB,MAAM,EAEzD,MAAMpE,EAAcZ,EAAe,cAAc,KAAK,EACtDY,EAAY,UAAY,aACxBA,EAAY,MAAM,WAAa,WAC/BA,EAAY,YAAcT,EAE1B,MAAM4F,EAAgB/F,EAAe,cAAc,QAAQ,EAC3D+F,EAAc,KAAO,SACrBA,EAAc,UAAY,sCAC1BA,EAAc,aAAa,aAAc,OAAO,EAChDA,EAAc,aAAad,GAAyB,MAAM,EAE1DY,EAAY,YAAYC,CAAa,EACrCD,EAAY,YAAYjF,CAAW,EACnCiF,EAAY,YAAYE,CAAa,EACrCH,EAAa,YAAYC,CAAW,EACpCR,GAAqBrF,EAAgBd,CAAO,EAAE,YAAY0G,CAAY,EAEtE,MAAMvG,EAAeH,EAAQ,aAAe,OAAY,CAAE,MAAOA,EAAQ,YAAe,OAClF8G,EAAgB5G,GAAoBwG,EAAcvG,EAAcH,EAAQ,SAAS,EACvF,GAAI,CAAC8G,EACH,OAAAJ,EAAa,OAAA,EACN,QAAQ,OAAO,IAAI,MAAM,iCAAiC,CAAC,EAGpEG,EAAc,iBAAiB,QAAS,IAAM,CAC5CC,EAAc,OAAA,CAChB,CAAC,EAEDJ,EAAa,iBACX,kBACA,IAAM,CACJA,EAAa,OAAA,EACbI,EAAc,UAAA,CAChB,EACA,CAAE,KAAM,EAAA,CAAK,EAGf,GAAI,CACF,OAAAA,EAAc,KAAA,EACP,QAAQ,QAAA,CACjB,OAASzE,EAAO,CACd,OAAAqE,EAAa,OAAA,EACbI,EAAc,UAAA,EACP,QAAQ,OAAOzE,CAAK,CAC7B,CACF,CCnJA,IAAI0E,EAN0C,CAC5C,QAAS,CACP,iBAAkB,EAAA,CAEtB,EAUA,SAASC,EAAqB/F,EAAyB,CACrD,OAAOA,EAAQ,QAAQ,OAAQ;AAAA,CAAI,CACrC,CAOA,SAASgG,IAAuC,CAE9C,OADc,WACD,MACf,CAQA,SAASC,EAAc1H,EAAsD,CAC3E,OAAO,QAAQ,QAAQA,CAAK,EAAE,KAAK,IAAA,EAAe,CACpD,CAQA,SAAS2H,EACPC,EACwD,CACxD,MAAMC,EAASN,EAAQ,gBAAgBK,CAAU,EACjD,OAAO,OAAOC,GAAW,WACpBA,EACD,MACN,CAQA,SAASC,EAASC,EAAuB,CACvC,QAAQ,KAAK,qBAAqBA,CAAO,oDAAoD,CAC/F,CAQA,SAASC,GAAevG,EAAgC,CACtD,MAAMwG,EAAoBT,EAAqB/F,CAAO,EAChDyG,EAAiBP,EAAkB,QAAQ,EACjD,GAAIO,EACF,OAAOR,EAAcQ,EAAeD,CAAiB,CAAC,EAGxD,MAAME,EAAgBV,GAAA,EACtB,OAAIF,EAAQ,QAAQ,kBAAoB,OAAOY,GAAe,OAAU,YACtEA,EAAc,MAAMF,CAAiB,EAC9B,QAAQ,QAAA,IAGjBH,EAAS,QAAQ,EACV,QAAQ,QAAA,EACjB,CAQA,SAASM,GAAgB3G,EAAmC,CAC1D,MAAMwG,EAAoBT,EAAqB/F,CAAO,EAChDyG,EAAiBP,EAAkB,SAAS,EAClD,GAAIO,EACF,OAAO,QAAQ,QAAQA,EAAeD,CAAiB,CAA+B,EAAE,KACrFjI,GAAU,EAAQA,CAAK,EAI5B,MAAMmI,EAAgBV,GAAA,EACtB,OAAIF,EAAQ,QAAQ,kBAAoB,OAAOY,GAAe,SAAY,WACjE,QAAQ,QAAQA,EAAc,QAAQF,CAAiB,CAAC,GAGjEH,EAAS,SAAS,EACX,QAAQ,QAAQ,EAAK,EAC9B,CASA,SAASO,GAAc5G,EAAiB0D,EAA+B,CACrE,MAAM8C,EAAoBT,EAAqB/F,CAAO,EAChDyG,EAAiBP,EAAkB,OAAO,EAChD,OAAIO,EACKR,EAAcQ,EAAeD,EAAmB9C,CAAK,CAAC,GAG/D2C,EAAS,OAAO,EACT,QAAQ,QAAA,EACjB,CASA,SAASQ,EACPV,EACArH,EACe,CACf,MAAM2H,EAAiBP,EAAkBC,CAAU,EACnD,OAAIM,EACKR,EAAcQ,EAAe3H,CAAO,CAAC,GAG9CuH,EAASF,CAAU,EACZ,QAAQ,QAAA,EACjB,CAQO,SAASW,GAAyBC,EAA0C,CACjFjB,EAAUiB,CACZ,CAKO,MAAMC,EAAe,CAO1B,OAAc,OAAOhH,EAAgC,CACnD,MAAMwG,EAAoBT,EAAqB/F,CAAO,EACtD,OAAIrB,EAAgBmH,EAAQ,QAAQ,SAAS,EACpChF,GAAW0F,EAAmBV,EAAQ,OAAO,EAAE,MAAM,IAC1DS,GAAeC,CAAiB,CAAA,EAI7BD,GAAeC,CAAiB,CACzC,CAQA,OAAc,QAAQxG,EAAmC,CACvD,MAAMwG,EAAoBT,EAAqB/F,CAAO,EACtD,OAAIrB,EAAgBmH,EAAQ,QAAQ,SAAS,EACpCzE,GAAYmF,EAAmBV,EAAQ,OAAO,EAAE,MAAM,IAC3Da,GAAgBH,CAAiB,CAAA,EAI9BG,GAAgBH,CAAiB,CAC1C,CASA,OAAc,MAAMxG,EAAiB0D,EAA+B,CAClE,MAAM8C,EAAoBT,EAAqB/F,CAAO,EACtD,OAAIpB,GAAgBkH,EAAQ,QAAQ,SAAS,EACpCP,GAAUiB,EAAmB9C,EAAOoC,EAAQ,OAAO,EAAE,MAAM,IAChEc,GAAcJ,EAAmB9C,CAAK,CAAA,EAInCkD,GAAcJ,EAAmB9C,CAAK,CAC/C,CAQA,OAAc,WAAW5E,EAAqC,CAC5D,OAAIH,EAAgBmH,EAAQ,QAAQ,SAAS,EACpCtB,GAAkB1F,EAASgH,EAAQ,OAAO,EAAE,MAAM,IACvDe,EAAc,aAAc/H,CAAO,CAAA,EAIhC+H,EAAc,aAAc/H,CAAO,CAC5C,CAQA,OAAc,YAAYA,EAAqC,CAC7D,OAAIH,EAAgBmH,EAAQ,QAAQ,SAAS,EACpCrB,GAAmB3F,EAASgH,EAAQ,OAAO,EAAE,MAAM,IACxDe,EAAc,cAAe/H,CAAO,CAAA,EAIjC+H,EAAc,cAAe/H,CAAO,CAC7C,CASA,OAAc,gBAAgB8C,EAAqB5B,EAAgC,CACjF,OAAOiE,GAAuBrC,EAAQ5B,CAAO,CAC/C,CAUA,OAAc,WAAW4B,EAAqB5B,EAAiB0D,EAA+B,CAC5F,OAAOQ,GAAkBtC,EAAQ5B,EAAS0D,CAAK,CACjD,CAQA,OAAc,cAAcW,EAA4C,CACtE,OAAOD,GAAqBC,CAAc,CAC5C,CACF,CC3RA,MAAM4C,GAAiB,4BAGjBC,EAAe,qBAMrB,IAAIC,EAAU,GAGVC,EAGAC,EAQJ,SAASC,GAAWC,EAAqB,CACvC,OAAON,GAAiBM,CAC1B,CAQA,SAASC,GAAUD,EAAwC,CACzD,GAAI,CACF,MAAMhJ,EAAQ,OAAO,eAAe,QAAQ+I,GAAWC,CAAG,CAAC,EAC3D,OAAOhJ,IAAU,SAAWA,IAAU,SAAWA,EAAQ,MAC3D,MAAQ,CAEN,MACF,CACF,CASA,SAASkJ,GAAWF,EAAaG,EAA4B,CAC3D,GAAI,CACF,OAAO,eAAe,QAAQJ,GAAWC,CAAG,EAAGG,CAAK,CACtD,MAAQ,CAER,CACF,CAWA,SAASC,GAAYC,EAA8BC,EAAsB,CACvE,MAAMC,EAAKF,EAAgB,GACrBG,EAAY,CAAC,gDAAgDD,CAAE,IAAI,EAIzE,GAHIA,GACFC,EAAU,KAAK,sCAAsCD,CAAE,IAAI,EAEzD,CAACA,EACH,OAEUF,EAAgB,cACxB,iBAA8BG,EAAU,KAAK,GAAG,CAAC,EAAE,QAASC,GAAW,CACzEA,EAAO,aAAa,gBAAiBH,EAAQ,OAAS,OAAO,EAC7DG,EAAO,UAAU,OAAO,YAAa,CAACH,CAAK,CAC7C,CAAC,CACH,CAQA,SAASI,GAAenJ,EAA4B,CAClD,MAAMyI,EAAMzI,EAAQ,aAAaoI,CAAY,EAC7C,GAAI,CAACK,EACH,OAEF,MAAMG,EAAQF,GAAUD,CAAG,EAC3B,GAAI,CAACG,EACH,OAEF,MAAMQ,EAAUpJ,EAAQ,UAAU,SAAS,MAAM,EAC7C4I,IAAU,SAAW,CAACQ,GACxBpJ,EAAQ,UAAU,IAAI,MAAM,EAC5B6I,GAAY7I,EAAS,EAAI,GAChB4I,IAAU,UAAYQ,IAC/BpJ,EAAQ,UAAU,OAAO,MAAM,EAC/B6I,GAAY7I,EAAS,EAAK,EAE9B,CAQA,SAASqJ,GAAcC,EAAsC,CACvDA,aAAgB,aAAeA,EAAK,aAAalB,CAAY,GAC/De,GAAeG,CAAI,EAErBA,EAAK,iBAA8B,IAAIlB,CAAY,GAAG,EAAE,QAAQe,EAAc,CAChF,CASA,SAASI,GAAaC,EAAcZ,EAA4B,CAC9D,MAAM9F,EAAS0G,EAAM,OACrB,GAAI,EAAE1G,aAAkB,aACtB,OAEF,MAAM2F,EAAM3F,EAAO,aAAasF,CAAY,EACxCK,GACFE,GAAWF,EAAKG,CAAK,CAEzB,CAGA,MAAMa,GAAWD,GAAuBD,GAAaC,EAAO,OAAO,EAG7DE,GAAYF,GAAuBD,GAAaC,EAAO,QAAQ,EAU9D,SAASG,GAAyBC,EAAgB,SAAgB,CACvE,GAAIvB,EACF,OAEFA,EAAU,GACVE,EAAmBqB,EAGnBA,EAAI,iBAAiB,oBAAqBH,EAAO,EACjDG,EAAI,iBAAiB,qBAAsBF,EAAQ,EAEnD,MAAMG,EAAa,IAAY,CAC7BR,GAAcO,CAAG,EAEjBtB,EAAW,IAAI,iBAAkBwB,GAAc,CAC7C,UAAWC,KAAYD,EACrBC,EAAS,WAAW,QAASC,GAAS,CAChCA,aAAgB,aAClBX,GAAcW,CAAI,CAEtB,CAAC,CAEL,CAAC,EACGJ,EAAI,MACNtB,EAAS,QAAQsB,EAAI,KAAM,CAAE,UAAW,GAAM,QAAS,GAAM,CAEjE,EAEIA,EAAI,KACNC,EAAA,EAEAD,EAAI,iBAAiB,mBAAoBC,EAAY,CAAE,KAAM,GAAM,CAEvE,CAQO,SAASI,GAA4BL,EAAgBrB,GAAoB,SAAgB,CACzFF,IAGLA,EAAU,GACVuB,EAAI,oBAAoB,oBAAqBH,EAAO,EACpDG,EAAI,oBAAoB,qBAAsBF,EAAQ,EACtDpB,GAAU,WAAA,EACVA,EAAW,OACXC,EAAmB,OACrB,CC/MA,MAAM2B,EAAkD,CACtD,iBAAkB,EACpB,EAOMC,OAAmD,IAAY,CACnE,SACA,UACA,QACA,aACA,cACA,kBACA,aACA,eACF,CAAC,EAaD,SAASC,GAAqBC,EAAqD,CACjF,MAAMC,EAAYpC,GAClB,OAAO,IAAI,MAAMmC,EAAe,CAC9B,IAAIvH,EAAQyH,EAAUC,EAAmB,CACvC,OAAI,OAAOD,GAAa,UAAYJ,GAAwB,IAAII,CAAQ,EAC/DD,EAAUC,CAAQ,EAEpB,QAAQ,IAAIzH,EAAQyH,EAAUC,CAAQ,CAC/C,EACA,IAAI1H,EAAQyH,EAAmB,CAG7B,OAAI,OAAOA,GAAa,UAAYJ,GAAwB,IAAII,CAAQ,EAC/D,GAEF,QAAQ,IAAIzH,EAAQyH,CAAQ,CACrC,CAAA,CACD,CACH,CAEA,MAAME,EAKF,CACF,UAAW,GACX,QAASP,CACX,EAOA,SAAShD,GAA8C,CAErD,OADc,WACD,MACf,CASA,SAASwD,GACPzK,EACA2H,EACwB,CACxB,MAAO,CACL,UAAW3H,EAAQ,WAAa2H,GAAe,UAC/C,iBAAkB3H,EAAQ,kBAAoBiK,EAAwB,iBACtE,QAASjK,EAAQ,SAAWwK,EAAa,QAAQ,SAAW7C,GAAe,OAAO,QAClF,uBACE3H,EAAQ,wBAA0BwK,EAAa,QAAQ,uBACzD,wBACExK,EAAQ,yBAA2BwK,EAAa,QAAQ,wBAC1D,YAAaxK,EAAQ,aAAewK,EAAa,QAAQ,YACzD,cAAexK,EAAQ,eAAiBwK,EAAa,QAAQ,cAC7D,WAAYxK,EAAQ,YAAcwK,EAAa,QAAQ,UAAA,CAE3D,CAQO,SAASE,GACd/C,EAA2CV,IAClC,CACT,MAAO,GAAQU,GAAe,OAASA,EAAc,UACvD,CAQO,SAASgD,GAAQ3K,EAA0B,GAAU,CAC1D,MAAM2H,EAAgBV,EAAA,EACtB,GAAI,CAACU,GAAe,MAClB,MAAM,IAAI,MAAM,oDAAoD,EAStE,GANK6C,EAAa,gBAChBA,EAAa,cAAgB7C,EAAc,MAC3C6C,EAAa,gBAAkB7C,EAAc,MAAM,SAGrD6C,EAAa,QAAUC,GAAsBzK,EAAS2H,CAAa,EAC/D6C,EAAa,QAAQ,QAAS,CAChC,MAAMI,EAAcJ,EAAa,eAAiB7C,EAAc,MAC5D,OAAOiD,EAAY,YAAe,WACpCA,EAAY,WAAWJ,EAAa,QAAQ,OAAO,EAEnD,QAAQ,KACN,gEAAA,CAGN,CACAzC,GAAyB,CACvB,cAAeyC,EAAa,cAC5B,QAASA,EAAa,OAAA,CACvB,EACD7C,EAAc,MAAQwC,GAAqBK,EAAa,aAAa,EAErEd,GAAA,EACAc,EAAa,UAAY,EAC3B,CAOO,SAASK,IAAkB,CAChC,MAAMlD,EAAgBV,EAAA,EACtB,GAAI,CAACU,GAAiB,CAAC6C,EAAa,cAClC,OAMF,MAAMM,EAAWN,EAAa,cAC1B,OAAOM,EAAS,YAAe,WACjCA,EAAS,WAAWN,EAAa,eAAsC,EAEvEM,EAAS,QAAUN,EAAa,gBAElC7C,EAAc,MAAQ6C,EAAa,cACnCR,GAAA,EACAQ,EAAa,UAAY,GACzBA,EAAa,cAAgB,OAC7BA,EAAa,gBAAkB,OAC/BA,EAAa,QAAUP,CACzB,CAOO,SAASc,IAAuB,CACrC,OAAOP,EAAa,SACtB,CC3LA,MAAMQ,GAAqB,kCAO3B,SAAS/D,IAA8C,CAErD,OADc,WACD,MACf,CAQA,SAASgE,GAAetD,EAAuC,CAC7D,MAAO,EAASA,EAAqDqD,EAAkB,CACzF,CAQA,SAASE,GAAgBvD,EAAoC,CAC1DA,EAAqDqD,EAAkB,EAAI,EAC9E,CAOA,SAASG,IAAmB,CAC1B,MAAMxD,EAAgBV,GAAA,EACtB,GAAI,GAACU,GAAiBsD,GAAetD,CAAa,GAIlD,IAAI,CAAC+C,GAA2B/C,CAAa,EAAG,CAC9C,QAAQ,KACN,4FAAA,EAEF,MACF,CAEA,GAAI,CACFgD,GAAQ,CAAE,UAAWhD,EAAc,SAAA,CAAW,EAC9CuD,GAAgBvD,CAAa,CAC/B,OAAStF,EAAO,CACd,QAAQ,KAAK,wCAAyCA,CAAK,CAC7D,EACF,CAEA8I,GAAA,EC7CO,MAAMC,GAAU"}
|
package/dist/haori-bootstrap.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"haori-bootstrap.js","sources":["../src/bootstrap_resolver.ts","../src/dialog.ts","../src/message.ts","../src/modal.ts","../src/toast.ts","../src/bootstrap_haori.ts","../src/collapse_persist.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_ATTRIBUTE = 'data-haori-dialog';\nconst CONFIRM_ATTRIBUTE = 'data-haori-confirm';\nconst DIALOG_TITLE_ATTRIBUTE = 'data-haori-dialog-title';\nconst DIALOG_OK_ATTRIBUTE = 'data-haori-dialog-ok';\nconst CONFIRM_OK_ATTRIBUTE = 'data-haori-confirm-ok';\nconst CONFIRM_CANCEL_ATTRIBUTE = 'data-haori-confirm-cancel';\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(\n documentObject: Document,\n options: ResolvedInstallOptions,\n): 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(isConfirm ? CONFIRM_ATTRIBUTE : DIALOG_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(CONFIRM_CANCEL_ATTRIBUTE, 'true');\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(isConfirm ? CONFIRM_OK_ATTRIBUTE : DIALOG_OK_ATTRIBUTE, 'true');\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>(`[${DIALOG_OK_ATTRIBUTE}]`);\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(message: string, options: ResolvedInstallOptions): 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>(`[${CONFIRM_OK_ATTRIBUTE}]`);\n const cancelButton = modalElement.querySelector<HTMLButtonElement>(\n `[${CONFIRM_CANCEL_ATTRIBUTE}]`,\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-owned';\nconst CONTAINER_ATTRIBUTE = 'data-haori-message-container';\nconst INVALID_TARGET_ATTRIBUTE = 'data-haori-invalid-target';\nconst VALID_TARGET_ATTRIBUTE = 'data-haori-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 && (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 =\n 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 { clearManagedMessages } from './message';\nimport type { ResolvedInstallOptions } from './types';\n\n/**\n * 操作対象の Bootstrap Modal 要素を解決する。\n *\n * <p>渡された要素が `.modal` の場合はその要素を、そうでない場合は祖先方向で\n * 最も近い `.modal` を返す。値を省略した `data-{event}-close` などで対象が\n * トリガー要素自身(例: モーダル内の閉じるボタン)に解決された場合でも、\n * 本来のモーダルへ正しく辿れるようにするための関数。任意要素を `.modal`\n * 化する破壊的処理は行わない。\n *\n * @param element 操作対象として渡された要素。\n * @return 解決された `.modal` 要素。見つからない場合は null。\n */\nfunction resolveModalElement(element: HTMLElement): HTMLElement | null {\n if (element.classList.contains('modal')) {\n return element;\n }\n\n return element.closest('.modal');\n}\n\n/**\n * 解決済みの Bootstrap Modal 要素へ最低限の属性を補う。\n *\n * <p>対象は必ず `.modal` 要素であることを前提とし、`.modal` クラスの付与は\n * 行わない(非 modal 要素を破壊的に modal 化しない)。\n *\n * @param element 整形対象の `.modal` 要素。\n * @return 戻り値はない。\n */\nfunction prepareModalElement(element: HTMLElement): void {\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 * <p>渡された要素が `.modal` でない場合は祖先方向で最も近い `.modal` を\n * 対象に解決する。解決できない場合は要素を modal 化せず reject する。\n *\n * <p>再表示時に前回の管理メッセージ(`is-invalid` / `is-valid` 状態や\n * `invalid-feedback` / `alert` コンテナ)が残らないよう、表示前に対象\n * `.modal` 配下の管理メッセージをクリアする。\n *\n * @param element 開く対象の要素(`.modal` 自身またはその子孫)。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function openDialogElement(\n element: HTMLElement,\n options: ResolvedInstallOptions,\n): Promise<void> {\n const modalElement = resolveModalElement(element);\n if (!modalElement) {\n return Promise.reject(new Error('No ancestor \".modal\" element was found for the target.'));\n }\n\n prepareModalElement(modalElement);\n // 再表示時に前回のメッセージが残らないよう、開く前にクリアする。\n void clearManagedMessages(modalElement);\n const modalInstance = createModalInstance(modalElement, 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 * <p>渡された要素が `.modal` でない場合は祖先方向で最も近い `.modal` を\n * 対象に解決する。解決できない場合は要素を modal 化せず reject する。\n *\n * @param element 閉じる対象の要素(`.modal` 自身またはその子孫)。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function closeDialogElement(\n element: HTMLElement,\n options: ResolvedInstallOptions,\n): Promise<void> {\n const modalElement = resolveModalElement(element);\n if (!modalElement) {\n return Promise.reject(new Error('No ancestor \".modal\" element was found for the target.'));\n }\n\n prepareModalElement(modalElement);\n const modalInstance = createModalInstance(modalElement, 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-toast-container';\nconst TOAST_ATTRIBUTE = 'data-haori-toast';\nconst TOAST_LEVEL_ATTRIBUTE = 'data-haori-toast-level';\nconst TOAST_ACCENT_ATTRIBUTE = 'data-haori-toast-accent';\nconst TOAST_DISMISS_ATTRIBUTE = 'data-haori-toast-dismiss';\n\ninterface ToastAppearance {\n /** アクセント帯へ適用する Bootstrap 背景クラス。 */\n accentClassName: string;\n /** 文言非依存の識別子として付与する正規化済みレベル。 */\n level: 'success' | 'warning' | 'error' | 'info';\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', level: 'success' };\n case 'warning':\n return { accentClassName: 'bg-warning', level: 'warning' };\n case 'error':\n return { accentClassName: 'bg-danger', level: 'error' };\n default:\n return { accentClassName: 'bg-info', level: '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>(\n options.toastContainerSelector,\n );\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(\n documentObject: Document,\n options: ResolvedInstallOptions,\n): 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).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 toastElement.setAttribute(TOAST_LEVEL_ATTRIBUTE, appearance.level);\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(\n methodName: 'openDialog' | 'closeDialog',\n element: HTMLElement,\n): 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(() =>\n fallbackDialog(normalizedMessage),\n );\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(() =>\n fallbackConfirm(normalizedMessage),\n );\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","/**\n * @fileoverview Bootstrap collapse の開閉状態を sessionStorage へ永続化する。\n *\n * `data-haori-persist=\"キー名\"` を collapse 要素(`.collapse`)に付与すると、\n * `shown.bs.collapse` / `hidden.bs.collapse` を監視して開閉状態を保存し、ページ再訪時や\n * `data-import` で後から挿入されたフラグメントにも保存済みの状態を復元する。\n *\n * Haori 本体の式サンドボックスはストレージ操作を禁止しているため、ストレージを使う\n * 永続化は Bootstrap 連携の責務として本パッケージ側に置く。\n */\n\n/** sessionStorage キーの接頭辞。 */\nconst STORAGE_PREFIX = 'haori-bootstrap:collapse:';\n\n/** 永続化対象を示す属性名。属性値が保存キーになる。 */\nconst PERSIST_ATTR = 'data-haori-persist';\n\n/** 開閉状態。 */\ntype CollapseState = 'shown' | 'hidden';\n\n/** 多重 setup を防ぐフラグ。 */\nlet started = false;\n\n/** 挿入監視用の MutationObserver。 */\nlet observer: MutationObserver | undefined;\n\n/** setup 時に監視対象とした document。 */\nlet observedDocument: Document | undefined;\n\n/**\n * 保存キーから sessionStorage のキーを生成する。\n *\n * @param key 永続化キー。\n * @return sessionStorage のキー。\n */\nfunction storageKey(key: string): string {\n return STORAGE_PREFIX + key;\n}\n\n/**\n * 保存済みの開閉状態を読み出す。\n *\n * @param key 永続化キー。\n * @return 保存済み状態。未保存・取得不可なら undefined。\n */\nfunction readState(key: string): CollapseState | undefined {\n try {\n const value = window.sessionStorage.getItem(storageKey(key));\n return value === 'shown' || value === 'hidden' ? value : undefined;\n } catch {\n // プライベートモードやストレージ無効時は黙って諦める。\n return undefined;\n }\n}\n\n/**\n * 開閉状態を保存する。\n *\n * @param key 永続化キー。\n * @param state 保存する開閉状態。\n * @return 戻り値はない。\n */\nfunction writeState(key: string, state: CollapseState): void {\n try {\n window.sessionStorage.setItem(storageKey(key), state);\n } catch {\n // 保存できない環境では永続化を諦める(機能は無効化するだけで例外は伝播させない)。\n }\n}\n\n/**\n * collapse に紐づくトグル要素(`data-bs-toggle=\"collapse\"`)の aria-expanded と\n * `collapsed` クラスを開閉状態へ同期する。直接クラスを操作して復元するため、\n * Bootstrap が次回トグルするまでの間もトグル表示が状態と一致するようにする。\n *\n * @param collapseElement 対象の collapse 要素。\n * @param shown 展開状態なら true。\n * @return 戻り値はない。\n */\nfunction syncToggles(collapseElement: HTMLElement, shown: boolean): void {\n const id = collapseElement.id;\n const selectors = [`[data-bs-toggle=\"collapse\"][data-bs-target=\"#${id}\"]`];\n if (id) {\n selectors.push(`[data-bs-toggle=\"collapse\"][href=\"#${id}\"]`);\n }\n if (!id) {\n return;\n }\n const doc = collapseElement.ownerDocument;\n doc.querySelectorAll<HTMLElement>(selectors.join(',')).forEach((toggle) => {\n toggle.setAttribute('aria-expanded', shown ? 'true' : 'false');\n toggle.classList.toggle('collapsed', !shown);\n });\n}\n\n/**\n * 1 つの collapse 要素へ保存済み状態を復元する。\n *\n * @param element 対象要素。\n * @return 戻り値はない。\n */\nfunction restoreElement(element: HTMLElement): void {\n const key = element.getAttribute(PERSIST_ATTR);\n if (!key) {\n return;\n }\n const state = readState(key);\n if (!state) {\n return;\n }\n const isShown = element.classList.contains('show');\n if (state === 'shown' && !isShown) {\n element.classList.add('show');\n syncToggles(element, true);\n } else if (state === 'hidden' && isShown) {\n element.classList.remove('show');\n syncToggles(element, false);\n }\n}\n\n/**\n * ルート配下(およびルート自身)のすべての永続化対象を復元する。\n *\n * @param root 探索の起点。\n * @return 戻り値はない。\n */\nfunction restoreWithin(root: ParentNode | HTMLElement): void {\n if (root instanceof HTMLElement && root.hasAttribute(PERSIST_ATTR)) {\n restoreElement(root);\n }\n root.querySelectorAll<HTMLElement>(`[${PERSIST_ATTR}]`).forEach(restoreElement);\n}\n\n/**\n * Bootstrap collapse の開閉イベントを受けて状態を保存する。\n *\n * @param event collapse イベント。\n * @param state 保存する開閉状態。\n * @return 戻り値はない。\n */\nfunction handleToggle(event: Event, state: CollapseState): void {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n const key = target.getAttribute(PERSIST_ATTR);\n if (key) {\n writeState(key, state);\n }\n}\n\n/** `shown.bs.collapse` ハンドラ。 */\nconst onShown = (event: Event): void => handleToggle(event, 'shown');\n\n/** `hidden.bs.collapse` ハンドラ。 */\nconst onHidden = (event: Event): void => handleToggle(event, 'hidden');\n\n/**\n * collapse 永続化を有効化する。多重呼び出しは無視する。\n *\n * body が未生成の場合は DOMContentLoaded を待ってから初期化する。\n *\n * @param doc 対象 document。既定は現在の document。\n * @return 戻り値はない。\n */\nexport function setupCollapsePersistence(doc: Document = document): void {\n if (started) {\n return;\n }\n started = true;\n observedDocument = doc;\n\n // Bootstrap 5 の collapse イベントはバブリングするため document 委譲で受ける。\n doc.addEventListener('shown.bs.collapse', onShown);\n doc.addEventListener('hidden.bs.collapse', onHidden);\n\n const initialize = (): void => {\n restoreWithin(doc);\n // data-import などで後から挿入されるフラグメントにも復元を適用する。\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n mutation.addedNodes.forEach((node) => {\n if (node instanceof HTMLElement) {\n restoreWithin(node);\n }\n });\n }\n });\n if (doc.body) {\n observer.observe(doc.body, { childList: true, subtree: true });\n }\n };\n\n if (doc.body) {\n initialize();\n } else {\n doc.addEventListener('DOMContentLoaded', initialize, { once: true });\n }\n}\n\n/**\n * collapse 永続化を無効化し、監視を解除する。\n *\n * @param doc 対象 document。既定は setup 時の document。\n * @return 戻り値はない。\n */\nexport function teardownCollapsePersistence(doc: Document = observedDocument ?? document): void {\n if (!started) {\n return;\n }\n started = false;\n doc.removeEventListener('shown.bs.collapse', onShown);\n doc.removeEventListener('hidden.bs.collapse', onHidden);\n observer?.disconnect();\n observer = undefined;\n observedDocument = undefined;\n}\n","import { BootstrapHaori, setBootstrapHaoriContext } from './bootstrap_haori';\nimport { setupCollapsePersistence, teardownCollapsePersistence } from './collapse_persist';\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: 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 // collapse の開閉状態を sessionStorage へ永続化する(多重呼び出しは内部で無視)。\n setupCollapsePersistence();\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 teardownCollapsePersistence();\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.5.21';\n"],"names":["isConstructor","value","resolveModalConstructor","bootstrap","resolveToastConstructor","hasModalSupport","hasToastSupport","createModalInstance","element","options","modalConstructor","createToastInstance","toastOptions","toastConstructor","DIALOG_ATTRIBUTE","CONFIRM_ATTRIBUTE","DIALOG_TITLE_ATTRIBUTE","DIALOG_OK_ATTRIBUTE","CONFIRM_OK_ATTRIBUTE","CONFIRM_CANCEL_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","resolveModalElement","prepareModalElement","openDialogElement","closeDialogElement","TOAST_CONTAINER_ATTRIBUTE","TOAST_ATTRIBUTE","TOAST_LEVEL_ATTRIBUTE","TOAST_ACCENT_ATTRIBUTE","TOAST_DISMISS_ATTRIBUTE","TOAST_POSITION_CLASSES","resolveToastAppearance","resolveToastRoot","ensureToastContainer","rootElement","positionClasses","allPositionClasses","c","showToast","appearance","toastElement","bodyWrapper","accentElement","dismissButton","toastInstance","defaultContext","context","normalizeMessageText","getBrowserWindow","toPromiseVoid","getOriginalMethod","methodName","method","warnNoop","apiName","fallbackDialog","normalizedMessage","originalMethod","browserWindow","fallbackConfirm","fallbackToast","fallbackModal","setBootstrapHaoriContext","nextContext","BootstrapHaori","STORAGE_PREFIX","PERSIST_ATTR","started","observer","observedDocument","storageKey","key","readState","writeState","state","syncToggles","collapseElement","shown","id","selectors","toggle","restoreElement","isShown","restoreWithin","root","handleToggle","event","onShown","onHidden","setupCollapsePersistence","doc","initialize","mutations","mutation","node","teardownCollapsePersistence","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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"}
|
|
1
|
+
{"version":3,"file":"haori-bootstrap.js","sources":["../src/bootstrap_resolver.ts","../src/dialog.ts","../src/message.ts","../src/modal.ts","../src/toast.ts","../src/bootstrap_haori.ts","../src/collapse_persist.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_ATTRIBUTE = 'data-haori-dialog';\nconst CONFIRM_ATTRIBUTE = 'data-haori-confirm';\nconst DIALOG_TITLE_ATTRIBUTE = 'data-haori-dialog-title';\nconst DIALOG_OK_ATTRIBUTE = 'data-haori-dialog-ok';\nconst CONFIRM_OK_ATTRIBUTE = 'data-haori-confirm-ok';\nconst CONFIRM_CANCEL_ATTRIBUTE = 'data-haori-confirm-cancel';\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(\n documentObject: Document,\n options: ResolvedInstallOptions,\n): 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(isConfirm ? CONFIRM_ATTRIBUTE : DIALOG_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(CONFIRM_CANCEL_ATTRIBUTE, 'true');\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(isConfirm ? CONFIRM_OK_ATTRIBUTE : DIALOG_OK_ATTRIBUTE, 'true');\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>(`[${DIALOG_OK_ATTRIBUTE}]`);\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(message: string, options: ResolvedInstallOptions): 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>(`[${CONFIRM_OK_ATTRIBUTE}]`);\n const cancelButton = modalElement.querySelector<HTMLButtonElement>(\n `[${CONFIRM_CANCEL_ATTRIBUTE}]`,\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-owned';\nconst CONTAINER_ATTRIBUTE = 'data-haori-message-container';\nconst INVALID_TARGET_ATTRIBUTE = 'data-haori-invalid-target';\nconst VALID_TARGET_ATTRIBUTE = 'data-haori-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 && (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 =\n 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 { clearManagedMessages } from './message';\nimport type { ResolvedInstallOptions } from './types';\n\n/**\n * 操作対象の Bootstrap Modal 要素を解決する。\n *\n * <p>渡された要素が `.modal` の場合はその要素を、そうでない場合は祖先方向で\n * 最も近い `.modal` を返す。値を省略した `data-{event}-close` などで対象が\n * トリガー要素自身(例: モーダル内の閉じるボタン)に解決された場合でも、\n * 本来のモーダルへ正しく辿れるようにするための関数。任意要素を `.modal`\n * 化する破壊的処理は行わない。\n *\n * @param element 操作対象として渡された要素。\n * @return 解決された `.modal` 要素。見つからない場合は null。\n */\nfunction resolveModalElement(element: HTMLElement): HTMLElement | null {\n if (element.classList.contains('modal')) {\n return element;\n }\n\n return element.closest('.modal');\n}\n\n/**\n * 解決済みの Bootstrap Modal 要素へ最低限の属性を補う。\n *\n * <p>対象は必ず `.modal` 要素であることを前提とし、`.modal` クラスの付与は\n * 行わない(非 modal 要素を破壊的に modal 化しない)。\n *\n * @param element 整形対象の `.modal` 要素。\n * @return 戻り値はない。\n */\nfunction prepareModalElement(element: HTMLElement): void {\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 * <p>渡された要素が `.modal` でない場合は祖先方向で最も近い `.modal` を\n * 対象に解決する。解決できない場合は要素を modal 化せず reject する。\n *\n * <p>再表示時に前回の管理メッセージ(`is-invalid` / `is-valid` 状態や\n * `invalid-feedback` / `alert` コンテナ)が残らないよう、表示前に対象\n * `.modal` 配下の管理メッセージをクリアする。\n *\n * @param element 開く対象の要素(`.modal` 自身またはその子孫)。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function openDialogElement(\n element: HTMLElement,\n options: ResolvedInstallOptions,\n): Promise<void> {\n const modalElement = resolveModalElement(element);\n if (!modalElement) {\n return Promise.reject(new Error('No ancestor \".modal\" element was found for the target.'));\n }\n\n prepareModalElement(modalElement);\n // 再表示時に前回のメッセージが残らないよう、開く前にクリアする。\n void clearManagedMessages(modalElement);\n const modalInstance = createModalInstance(modalElement, 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 * <p>渡された要素が `.modal` でない場合は祖先方向で最も近い `.modal` を\n * 対象に解決する。解決できない場合は要素を modal 化せず reject する。\n *\n * @param element 閉じる対象の要素(`.modal` 自身またはその子孫)。\n * @param options 解決済み導入設定。\n * @return 完了時に解決される Promise。\n */\nexport function closeDialogElement(\n element: HTMLElement,\n options: ResolvedInstallOptions,\n): Promise<void> {\n const modalElement = resolveModalElement(element);\n if (!modalElement) {\n return Promise.reject(new Error('No ancestor \".modal\" element was found for the target.'));\n }\n\n prepareModalElement(modalElement);\n const modalInstance = createModalInstance(modalElement, 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-toast-container';\nconst TOAST_ATTRIBUTE = 'data-haori-toast';\nconst TOAST_LEVEL_ATTRIBUTE = 'data-haori-toast-level';\nconst TOAST_ACCENT_ATTRIBUTE = 'data-haori-toast-accent';\nconst TOAST_DISMISS_ATTRIBUTE = 'data-haori-toast-dismiss';\n\ninterface ToastAppearance {\n /** アクセント帯へ適用する Bootstrap 背景クラス。 */\n accentClassName: string;\n /** 文言非依存の識別子として付与する正規化済みレベル。 */\n level: 'success' | 'warning' | 'error' | 'info';\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', level: 'success' };\n case 'warning':\n return { accentClassName: 'bg-warning', level: 'warning' };\n case 'error':\n return { accentClassName: 'bg-danger', level: 'error' };\n default:\n return { accentClassName: 'bg-info', level: '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>(\n options.toastContainerSelector,\n );\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(\n documentObject: Document,\n options: ResolvedInstallOptions,\n): 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).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 toastElement.setAttribute(TOAST_LEVEL_ATTRIBUTE, appearance.level);\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(\n methodName: 'openDialog' | 'closeDialog',\n element: HTMLElement,\n): 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(() =>\n fallbackDialog(normalizedMessage),\n );\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(() =>\n fallbackConfirm(normalizedMessage),\n );\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","/**\n * @fileoverview Bootstrap collapse の開閉状態を sessionStorage へ永続化する。\n *\n * `data-haori-persist=\"キー名\"` を collapse 要素(`.collapse`)に付与すると、\n * `shown.bs.collapse` / `hidden.bs.collapse` を監視して開閉状態を保存し、ページ再訪時や\n * `data-import` で後から挿入されたフラグメントにも保存済みの状態を復元する。\n *\n * Haori 本体の式サンドボックスはストレージ操作を禁止しているため、ストレージを使う\n * 永続化は Bootstrap 連携の責務として本パッケージ側に置く。\n */\n\n/** sessionStorage キーの接頭辞。 */\nconst STORAGE_PREFIX = 'haori-bootstrap:collapse:';\n\n/** 永続化対象を示す属性名。属性値が保存キーになる。 */\nconst PERSIST_ATTR = 'data-haori-persist';\n\n/** 開閉状態。 */\ntype CollapseState = 'shown' | 'hidden';\n\n/** 多重 setup を防ぐフラグ。 */\nlet started = false;\n\n/** 挿入監視用の MutationObserver。 */\nlet observer: MutationObserver | undefined;\n\n/** setup 時に監視対象とした document。 */\nlet observedDocument: Document | undefined;\n\n/**\n * 保存キーから sessionStorage のキーを生成する。\n *\n * @param key 永続化キー。\n * @return sessionStorage のキー。\n */\nfunction storageKey(key: string): string {\n return STORAGE_PREFIX + key;\n}\n\n/**\n * 保存済みの開閉状態を読み出す。\n *\n * @param key 永続化キー。\n * @return 保存済み状態。未保存・取得不可なら undefined。\n */\nfunction readState(key: string): CollapseState | undefined {\n try {\n const value = window.sessionStorage.getItem(storageKey(key));\n return value === 'shown' || value === 'hidden' ? value : undefined;\n } catch {\n // プライベートモードやストレージ無効時は黙って諦める。\n return undefined;\n }\n}\n\n/**\n * 開閉状態を保存する。\n *\n * @param key 永続化キー。\n * @param state 保存する開閉状態。\n * @return 戻り値はない。\n */\nfunction writeState(key: string, state: CollapseState): void {\n try {\n window.sessionStorage.setItem(storageKey(key), state);\n } catch {\n // 保存できない環境では永続化を諦める(機能は無効化するだけで例外は伝播させない)。\n }\n}\n\n/**\n * collapse に紐づくトグル要素(`data-bs-toggle=\"collapse\"`)の aria-expanded と\n * `collapsed` クラスを開閉状態へ同期する。直接クラスを操作して復元するため、\n * Bootstrap が次回トグルするまでの間もトグル表示が状態と一致するようにする。\n *\n * @param collapseElement 対象の collapse 要素。\n * @param shown 展開状態なら true。\n * @return 戻り値はない。\n */\nfunction syncToggles(collapseElement: HTMLElement, shown: boolean): void {\n const id = collapseElement.id;\n const selectors = [`[data-bs-toggle=\"collapse\"][data-bs-target=\"#${id}\"]`];\n if (id) {\n selectors.push(`[data-bs-toggle=\"collapse\"][href=\"#${id}\"]`);\n }\n if (!id) {\n return;\n }\n const doc = collapseElement.ownerDocument;\n doc.querySelectorAll<HTMLElement>(selectors.join(',')).forEach((toggle) => {\n toggle.setAttribute('aria-expanded', shown ? 'true' : 'false');\n toggle.classList.toggle('collapsed', !shown);\n });\n}\n\n/**\n * 1 つの collapse 要素へ保存済み状態を復元する。\n *\n * @param element 対象要素。\n * @return 戻り値はない。\n */\nfunction restoreElement(element: HTMLElement): void {\n const key = element.getAttribute(PERSIST_ATTR);\n if (!key) {\n return;\n }\n const state = readState(key);\n if (!state) {\n return;\n }\n const isShown = element.classList.contains('show');\n if (state === 'shown' && !isShown) {\n element.classList.add('show');\n syncToggles(element, true);\n } else if (state === 'hidden' && isShown) {\n element.classList.remove('show');\n syncToggles(element, false);\n }\n}\n\n/**\n * ルート配下(およびルート自身)のすべての永続化対象を復元する。\n *\n * @param root 探索の起点。\n * @return 戻り値はない。\n */\nfunction restoreWithin(root: ParentNode | HTMLElement): void {\n if (root instanceof HTMLElement && root.hasAttribute(PERSIST_ATTR)) {\n restoreElement(root);\n }\n root.querySelectorAll<HTMLElement>(`[${PERSIST_ATTR}]`).forEach(restoreElement);\n}\n\n/**\n * Bootstrap collapse の開閉イベントを受けて状態を保存する。\n *\n * @param event collapse イベント。\n * @param state 保存する開閉状態。\n * @return 戻り値はない。\n */\nfunction handleToggle(event: Event, state: CollapseState): void {\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n const key = target.getAttribute(PERSIST_ATTR);\n if (key) {\n writeState(key, state);\n }\n}\n\n/** `shown.bs.collapse` ハンドラ。 */\nconst onShown = (event: Event): void => handleToggle(event, 'shown');\n\n/** `hidden.bs.collapse` ハンドラ。 */\nconst onHidden = (event: Event): void => handleToggle(event, 'hidden');\n\n/**\n * collapse 永続化を有効化する。多重呼び出しは無視する。\n *\n * body が未生成の場合は DOMContentLoaded を待ってから初期化する。\n *\n * @param doc 対象 document。既定は現在の document。\n * @return 戻り値はない。\n */\nexport function setupCollapsePersistence(doc: Document = document): void {\n if (started) {\n return;\n }\n started = true;\n observedDocument = doc;\n\n // Bootstrap 5 の collapse イベントはバブリングするため document 委譲で受ける。\n doc.addEventListener('shown.bs.collapse', onShown);\n doc.addEventListener('hidden.bs.collapse', onHidden);\n\n const initialize = (): void => {\n restoreWithin(doc);\n // data-import などで後から挿入されるフラグメントにも復元を適用する。\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n mutation.addedNodes.forEach((node) => {\n if (node instanceof HTMLElement) {\n restoreWithin(node);\n }\n });\n }\n });\n if (doc.body) {\n observer.observe(doc.body, { childList: true, subtree: true });\n }\n };\n\n if (doc.body) {\n initialize();\n } else {\n doc.addEventListener('DOMContentLoaded', initialize, { once: true });\n }\n}\n\n/**\n * collapse 永続化を無効化し、監視を解除する。\n *\n * @param doc 対象 document。既定は setup 時の document。\n * @return 戻り値はない。\n */\nexport function teardownCollapsePersistence(doc: Document = observedDocument ?? document): void {\n if (!started) {\n return;\n }\n started = false;\n doc.removeEventListener('shown.bs.collapse', onShown);\n doc.removeEventListener('hidden.bs.collapse', onHidden);\n observer?.disconnect();\n observer = undefined;\n observedDocument = undefined;\n}\n","import { BootstrapHaori, setBootstrapHaoriContext } from './bootstrap_haori';\nimport { setupCollapsePersistence, teardownCollapsePersistence } from './collapse_persist';\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: 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 // collapse の開閉状態を sessionStorage へ永続化する(多重呼び出しは内部で無視)。\n setupCollapsePersistence();\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 teardownCollapsePersistence();\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.5.22';\n"],"names":["isConstructor","value","resolveModalConstructor","bootstrap","resolveToastConstructor","hasModalSupport","hasToastSupport","createModalInstance","element","options","modalConstructor","createToastInstance","toastOptions","toastConstructor","DIALOG_ATTRIBUTE","CONFIRM_ATTRIBUTE","DIALOG_TITLE_ATTRIBUTE","DIALOG_OK_ATTRIBUTE","CONFIRM_OK_ATTRIBUTE","CONFIRM_CANCEL_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","resolveModalElement","prepareModalElement","openDialogElement","closeDialogElement","TOAST_CONTAINER_ATTRIBUTE","TOAST_ATTRIBUTE","TOAST_LEVEL_ATTRIBUTE","TOAST_ACCENT_ATTRIBUTE","TOAST_DISMISS_ATTRIBUTE","TOAST_POSITION_CLASSES","resolveToastAppearance","resolveToastRoot","ensureToastContainer","rootElement","positionClasses","allPositionClasses","c","showToast","appearance","toastElement","bodyWrapper","accentElement","dismissButton","toastInstance","defaultContext","context","normalizeMessageText","getBrowserWindow","toPromiseVoid","getOriginalMethod","methodName","method","warnNoop","apiName","fallbackDialog","normalizedMessage","originalMethod","browserWindow","fallbackConfirm","fallbackToast","fallbackModal","setBootstrapHaoriContext","nextContext","BootstrapHaori","STORAGE_PREFIX","PERSIST_ATTR","started","observer","observedDocument","storageKey","key","readState","writeState","state","syncToggles","collapseElement","shown","id","selectors","toggle","restoreElement","isShown","restoreWithin","root","handleToggle","event","onShown","onHidden","setupCollapsePersistence","doc","initialize","mutations","mutation","node","teardownCollapsePersistence","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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"}
|
package/dist/index.d.ts
CHANGED