haori-bootstrap 0.5.56 → 0.5.58

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.56
5
+ Version: 0.5.58
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.58.0/dist/haori.iife.js"></script>
44
+ <script src="https://cdn.jsdelivr.net/npm/haori@0.59.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.56/dist/haori-bootstrap.iife.js"></script>
46
+ <script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.5.58/dist/haori-bootstrap.iife.js"></script>
47
47
  ```
48
48
 
49
49
  IIFE 版は、window.Haori と window.bootstrap が利用可能な場合に自動で有効化されます。
@@ -76,7 +76,7 @@ install({
76
76
  | toast(message, level) | トースト通知 | Promise<void> |
77
77
  | openDialog(element) | 対象の Modal を開く(`.modal` 自身またはその子孫を渡す。非 `.modal` の場合は祖先方向で最も近い `.modal` に解決)。表示前に対象 Modal 配下の管理メッセージと `is-invalid` / `is-valid` 状態をクリアするため、再表示時はクリーンな状態で開く。 | Promise<void> |
78
78
  | closeDialog(element) | 対象の Modal を閉じる(`.modal` 自身またはその子孫を渡す。非 `.modal` の場合は祖先方向で最も近い `.modal` に解決)。表示アニメーション中に呼んだ場合は、表示完了を待ってから閉じる | Promise<void> |
79
- | addErrorMessage(target, message) | 管理対象エラーメッセージの追加 | Promise<void> |
79
+ | addErrorMessage(target, message) | 管理対象エラーメッセージの追加。入力欄・`button`・`a`・子要素を持てない要素(`img` など)には要素の直後へ、それ以外には要素の中の先頭へ出します。 | Promise<void> |
80
80
  | addMessage(target, message, level?) | レベル付き管理対象メッセージを追加(`'error'` \| `'success'` \| `'warning'` \| `'info'`)。再呼び出し時は Bootstrap 検証クラス(`is-invalid` / `is-valid`)も切り替わります。 | Promise<void> |
81
81
  | clearMessages(parentOrTarget) | 管理対象メッセージのみ削除 | Promise<void> |
82
82
  | install(options) | Bootstrap 対応 Haori を再適用し、runtime を含めて設定を上書き | void |
@@ -242,6 +242,16 @@ Bootstrap の `hidden.bs.modal` は、閉じたモーダルから発火します
242
242
  - `data-on-target` を書かないと、どのモーダルが閉じても走ります。
243
243
  - 入れ子のモーダルで、子が開いている間は親を閉じさせない(親に `data-haori-dismiss-lock="{{!!subOpen}}"`)構成でも、子を Esc キー・背景のクリックで閉じたときに `subOpen` を下ろせます。
244
244
 
245
+ ### 入れ子のモーダルのフォーカス
246
+
247
+ 開いているモーダルの上に別のモーダルを開いたとき(入れ子のモーダル)、フォーカスを子へ移し、子が閉じたら親へ戻します。Bootstrap は入れ子のモーダルに対応しておらず、子を開いても、フォーカスが親の中へ引き戻されることがあるためです。そのままでは、Esc キーが親へ届いて子が閉じず、Haori の確認ダイアログを親の中から開くと、Enter キーで後ろにある親のボタンが押されます。
248
+
249
+ - 子が開き終わったとき(`shown.bs.modal`)、他のモーダルも開いていて、フォーカスが子の外にあれば、子のモーダル自身へフォーカスを移します。子の中の入力欄などへ先にフォーカスを移していれば、そのままにします。
250
+ - 子が閉じたとき(`hidden.bs.modal`)、他のモーダルがまだ開いていて、フォーカスがそのどれにも無ければ、子を開く直前に親の中でフォーカスがあった要素(子を開いたボタンなど)へ戻します。その要素が消えた・無効になったなどで戻せないときは、開いているモーダルのうち文書の中で最後にあるもの(いちばん手前に表示されるもの)へ戻します。
251
+ - 子のモーダルに `data-bs-focus="false"` を宣言すると、子へフォーカスを移しません。
252
+ - Haori で開いたモーダル、`data-bs-toggle` で開いたモーダル、Haori の確認・通知のダイアログのいずれにも効きます。他のモーダルが開いていないときは何もしません。
253
+ - 次の 2 点は Bootstrap 本体の動作で、このライブラリでは直していません。子を閉じた後は、親の中で Tab キーのフォーカスの閉じ込めが効きません。また、子が閉じると Bootstrap が `body` の `modal-open` を外すため、親が開いたままでも背景がスクロールできます。
254
+
245
255
  ## e2e 向け安定セレクタ
246
256
 
247
257
  `dialog` / `confirm` / `toast` が描画する要素には、文言・ロケールに依存しない安定した識別属性を付与しています。Playwright などの e2e テストでは、表示文言やボタン名ではなくこれらの属性でセレクタを組むことを推奨します(文言変更やロケール差で壊れません)。
@@ -304,12 +314,12 @@ push 後に、そのタグから GitHub Release を published にします。公
304
314
  次回 patch リリースの例:
305
315
 
306
316
  ```bash
307
- # version が 0.5.57 になる
317
+ # version が 0.5.59 になる
308
318
  npm version patch
309
319
  git push origin main --follow-tags
310
320
  ```
311
321
 
312
- その後、push 済みタグの GitHub Release を作成して published にします。例として次回は `0.5.57` タグになります。
322
+ その後、push 済みタグの GitHub Release を作成して published にします。例として次回は `0.5.59` タグになります。
313
323
 
314
324
  自動公開:
315
325
 
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.56
5
+ Version: 0.5.58
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.58.0/dist/haori.iife.js"></script>
44
+ <script src="https://cdn.jsdelivr.net/npm/haori@0.59.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.56/dist/haori-bootstrap.iife.js"></script>
46
+ <script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.5.58/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.
@@ -76,7 +76,7 @@ install({
76
76
  | toast(message, level) | Toast notification | Promise<void> |
77
77
  | openDialog(element) | Open the target's modal (pass the `.modal` itself or a descendant; a non-`.modal` element resolves to its nearest ancestor `.modal`). Managed messages and `is-invalid` / `is-valid` state under the modal are cleared before it is shown, so a reopened form starts clean. | Promise<void> |
78
78
  | closeDialog(element) | Close the target's modal (pass the `.modal` itself or a descendant; a non-`.modal` element resolves to its nearest ancestor `.modal`). When called during the show animation, it waits for the animation to finish and then closes | Promise<void> |
79
- | addErrorMessage(target, message) | Append managed error messages | Promise<void> |
79
+ | addErrorMessage(target, message) | Append managed error messages. Form controls, `button`, `a`, and elements that cannot have children (such as `img`) get them right after the element; other elements get them as their first child. | Promise<void> |
80
80
  | addMessage(target, message, level?) | Append a level-aware managed message (`'error'` \| `'success'` \| `'warning'` \| `'info'`). Switches Bootstrap validation classes (`is-invalid` / `is-valid`) on re-call. | Promise<void> |
81
81
  | clearMessages(parentOrTarget) | Remove only managed messages | Promise<void> |
82
82
  | install(options) | Re-apply Bootstrap-backed Haori with overridden options, including runtime | void |
@@ -242,6 +242,16 @@ Bootstrap fires `hidden.bs.modal` from the modal that was closed. With `data-on-
242
242
  - Without `data-on-target`, the procedure runs whenever any modal is closed.
243
243
  - For nested modals where the parent stays open while a child is open (`data-haori-dismiss-lock="{{!!subOpen}}"` on the parent), this lets you clear `subOpen` even when the child is closed with Escape or a backdrop click.
244
244
 
245
+ ### Focus in nested modals
246
+
247
+ When a modal is opened on top of another open modal (a nested modal), focus moves to the child and returns to the parent when the child is closed. Bootstrap does not support nested modals, and opening a child can pull focus back into the parent. Without this, Escape reaches the parent instead of closing the child, and when a Haori confirm dialog is opened from inside a modal, Enter clicks a button of the parent behind it.
248
+
249
+ - When the child has been shown (`shown.bs.modal`), another modal is open and focus is outside the child, focus moves to the child modal itself. If focus was already moved to an element inside the child, such as an input, it is kept.
250
+ - When the child is hidden (`hidden.bs.modal`), another modal is still open and focus is in none of them, focus returns to the element that had focus in the parent just before the child was opened (such as the button that opened it). If that element cannot take focus (it was removed or disabled), focus moves to the open modal that comes last in the document (the one shown in front).
251
+ - Add `data-bs-focus="false"` to the child modal to keep focus from moving to it.
252
+ - This applies to modals opened by Haori, modals opened with `data-bs-toggle`, and Haori's confirm and alert dialogs. Nothing happens when no other modal is open.
253
+ - Two Bootstrap behaviors are not changed by this library. After the child is closed, Tab focus is no longer trapped inside the parent. Bootstrap also removes `modal-open` from `body` when the child is closed, so the page behind can scroll while the parent is still open.
254
+
245
255
  ## Stable selectors for e2e
246
256
 
247
257
  The elements rendered by `dialog` / `confirm` / `toast` carry stable identifier attributes that do not depend on wording or locale. In e2e tests (e.g. Playwright), prefer building selectors from these attributes instead of visible text or button names — they survive copy changes and localization.
@@ -301,15 +311,15 @@ git push origin main --follow-tags
301
311
 
302
312
  After pushing, publish a GitHub Release from the generated version tag. The release workflow then publishes the package and uploads `dist.zip` automatically.
303
313
 
304
- Example next patch release after `0.5.56`:
314
+ Example next patch release after `0.5.58`:
305
315
 
306
316
  ```bash
307
- # version becomes 0.5.57
317
+ # version becomes 0.5.59
308
318
  npm version patch
309
319
  git push origin main --follow-tags
310
320
  ```
311
321
 
312
- Create and publish the GitHub Release for the pushed tag such as `0.5.57`.
322
+ Create and publish the GitHub Release for the pushed tag such as `0.5.59`.
313
323
 
314
324
  Release automation:
315
325
 
@@ -1,3 +1,3 @@
1
- var HaoriBootstrap=(function(E){"use strict";function X(e){return typeof e=="function"}function Q(e){return X(e?.Modal)?e?.Modal:void 0}function Y(e){return X(e?.Toast)?e?.Toast:void 0}function N(e){return!!Q(e)}function Oe(e){return!!Y(e)}function H(e,n,t){const o=Q(t);if(o)return typeof o.getOrCreateInstance=="function"?o.getOrCreateInstance(e,n):new o(e,n)}function xe(e,n,t){const o=Y(t);if(o)return typeof o.getOrCreateInstance=="function"?o.getOrCreateInstance(e,n):new o(e,n)}const qe="data-haori-dialog",$e="data-haori-confirm",Ue="data-haori-dialog-title",Z="data-haori-dialog-ok",ee="data-haori-confirm-ok",te="data-haori-confirm-cancel",Fe="OK",We="Cancel";let ze=0;function ne(){return{backdrop:"static",keyboard:!1}}function oe(e,n){if(n.dialogContainerSelector){const t=e.querySelector(n.dialogContainerSelector);if(t)return t}return e.body}function re(e,n,t,o){const r=o.dialogTitle,s=e.createElement("div");s.className="modal fade",s.tabIndex=-1,s.setAttribute(t?$e:qe,"true"),s.setAttribute("aria-hidden","true");const c=e.createElement("div");c.className="modal-dialog modal-dialog-centered";const a=e.createElement("div");if(a.className="modal-content",r){const b=`haori-dialog-title-${++ze}`,I=e.createElement("div");I.className="modal-header";const A=e.createElement("h5");A.className="modal-title",A.id=b,A.setAttribute(Ue,"true"),A.textContent=r,I.appendChild(A),a.appendChild(I),s.setAttribute("aria-labelledby",b)}const f=e.createElement("div");f.className="modal-body";const l=e.createElement("p");l.className="mb-0",l.style.whiteSpace="pre-line",l.textContent=n,f.appendChild(l);const m=e.createElement("div");if(m.className="modal-footer",t){const b=e.createElement("button");b.type="button",b.className="btn btn-secondary",b.setAttribute(te,"true"),b.textContent=o.dialogCancelLabel??We,m.appendChild(b)}const d=e.createElement("button");return d.type="button",d.className="btn btn-primary",d.setAttribute(t?ee:Z,"true"),d.textContent=o.dialogOkLabel??Fe,m.appendChild(d),a.append(f,m),c.appendChild(a),s.appendChild(c),s}function se(e){let n=!1,t=!1;return{requestClose:o=>{n||(n=!0,o?.(),t&&e.hide())},handleShown:()=>{t=!0,n&&e.hide()}}}function Ge(e,n){const t=globalThis.document,o=re(t,e,!1,n);oe(t,n).appendChild(o);const r=H(o,ne(),n.bootstrap);return r?new Promise((s,c)=>{const a=()=>{o.removeEventListener("shown.bs.modal",m),o.removeEventListener("hidden.bs.modal",f),o.remove(),r.dispose?.(),s()},f=()=>{a()},l=se(r),m=l.handleShown;o.querySelector(`[${Z}]`)?.addEventListener("click",()=>{l.requestClose()}),o.addEventListener("shown.bs.modal",m),o.addEventListener("hidden.bs.modal",f,{once:!0});try{r.show()}catch(b){o.removeEventListener("shown.bs.modal",m),o.removeEventListener("hidden.bs.modal",f),o.remove(),r.dispose?.(),c(b)}}):(o.remove(),Promise.reject(new Error("Bootstrap Modal is unavailable.")))}function Ke(e,n){const t=globalThis.document,o=re(t,e,!0,n);oe(t,n).appendChild(o);const r=H(o,ne(),n.bootstrap);return r?new Promise((s,c)=>{let a=!1;const f=()=>{o.removeEventListener("shown.bs.modal",d),o.removeEventListener("hidden.bs.modal",l),o.remove(),r.dispose?.(),s(a)},l=()=>{f()},m=se(r),d=m.handleShown,b=o.querySelector(`[${ee}]`),I=o.querySelector(`[${te}]`);b?.addEventListener("click",()=>{m.requestClose(()=>{a=!0})}),I?.addEventListener("click",()=>{m.requestClose(()=>{a=!1})}),o.addEventListener("shown.bs.modal",d),o.addEventListener("hidden.bs.modal",l,{once:!0});try{r.show()}catch(A){o.removeEventListener("shown.bs.modal",d),o.removeEventListener("hidden.bs.modal",l),o.remove(),r.dispose?.(),c(A)}}):(o.remove(),Promise.reject(new Error("Bootstrap Modal is unavailable.")))}const v="data-haori-owned",h="data-haori-message-container",C="data-haori-invalid-target",L="data-haori-valid-target";function S(e){return e instanceof HTMLInputElement&&(e.type==="checkbox"||e.type==="radio")}function p(e){return e instanceof HTMLInputElement&&e.type==="radio"}function M(e){return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement}function k(e){return Array.from(e.children).find(n=>n instanceof HTMLElement&&n.getAttribute(h)==="true")}function ie(e,n){const t=e.createElement("div");return t.setAttribute(v,"true"),t.textContent=n,t}function ae(e){return k(e)}function y(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 Ve(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 U(e){const t=y(e).map(o=>o.closest(".form-check")).filter(o=>o instanceof HTMLElement);if(t.length>1){const o=Ve(t);if(o&&!t.includes(o))return o}return R(e)}function R(e){const n=e.closest(".form-check");return n instanceof HTMLElement?n:void 0}function le(e){const n=e.nextElementSibling;if(n instanceof HTMLElement&&n.getAttribute(h)==="true")return n;const t=document.createElement("div");return t.className="invalid-feedback d-block",t.setAttribute(v,"true"),t.setAttribute(h,"true"),e.insertAdjacentElement("afterend",t),t}function je(e){const n=p(e)?U(e):R(e);if(!n)return le(e);const t=k(n);if(t)return t;const o=document.createElement("div");return o.className="invalid-feedback d-block",o.setAttribute(v,"true"),o.setAttribute(h,"true"),n.appendChild(o),o}function Je(e){const n=ae(e);if(n)return n;const t=document.createElement("div");return t.className="alert alert-danger",t.setAttribute("role","alert"),t.setAttribute(v,"true"),t.setAttribute(h,"true"),e.insertAdjacentElement("afterbegin",t),t}function g(e){e.getAttribute(C)==="true"&&(e.classList.remove("is-invalid"),e.removeAttribute(C))}function T(e){e.getAttribute(L)==="true"&&(e.classList.remove("is-valid"),e.removeAttribute(L))}function ce(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 _(e){return e==="success"?"valid-feedback d-block":"invalid-feedback d-block"}function de(e){(p(e)?y(e):[e]).forEach(t=>{t.classList.add("is-invalid"),t.setAttribute(C,"true")})}function Xe(e){(p(e)?y(e):[e]).forEach(t=>{g(t)})}function ue(e,n){const t=e.nextElementSibling;if(t instanceof HTMLElement&&t.getAttribute(h)==="true")return t.className=_(n),t;const o=document.createElement("div");return o.className=_(n),o.setAttribute(v,"true"),o.setAttribute(h,"true"),e.insertAdjacentElement("afterend",o),o}function Qe(e,n){const t=p(e)?U(e):R(e);if(!t)return ue(e,n);const o=k(t);if(o)return o.className=_(n),o;const r=document.createElement("div");return r.className=_(n),r.setAttribute(v,"true"),r.setAttribute(h,"true"),t.appendChild(r),r}function Ye(e,n){const t=ae(e);if(t)return t.className=ce(n),t;const o=document.createElement("div");return o.className=ce(n),o.setAttribute("role","alert"),o.setAttribute(v,"true"),o.setAttribute(h,"true"),e.insertAdjacentElement("afterbegin",o),o}function Ze(e,n){return(S(e)?je(e):M(e)?le(e):Je(e)).appendChild(ie(document,n)),S(e)?de(e):M(e)&&(e.classList.add("is-invalid"),e.setAttribute(C,"true")),Promise.resolve()}function et(e,n,t){if((S(e)?Qe(e,t):M(e)?ue(e,t):Ye(e,t)).appendChild(ie(document,n)),S(e)){const r=p(e)?y(e):[e];t==="success"?r.forEach(s=>{g(s),s.classList.add("is-valid"),s.setAttribute(L,"true")}):!t||t==="error"?(r.forEach(s=>T(s)),de(e)):r.forEach(s=>{T(s),g(s)})}else M(e)&&(t==="success"?(g(e),e.classList.add("is-valid"),e.setAttribute(L,"true")):!t||t==="error"?(T(e),e.classList.add("is-invalid"),e.setAttribute(C,"true")):(T(e),g(e)));return Promise.resolve()}function fe(e){if(S(e)){const r=p(e)?U(e):R(e);(r?k(r):void 0)?.remove(),Xe(e),(p(e)?y(e):[e]).forEach(a=>T(a))}else if(M(e)){const r=e.nextElementSibling;r instanceof HTMLElement&&r.getAttribute(h)==="true"&&r.remove(),g(e),T(e)}return e.querySelectorAll(`[${h}="true"]`).forEach(r=>{r.remove()}),e.querySelectorAll(`[${C}="true"]`).forEach(r=>{g(r)}),e.querySelectorAll(`[${L}="true"]`).forEach(r=>{T(r)}),Promise.resolve()}const F=new WeakSet,tt="data-haori-dismiss-lock",W=new WeakSet;let B=!1,z;const me=e=>{e.target instanceof HTMLElement&&F.add(e.target)},be=e=>{e.target instanceof HTMLElement&&F.delete(e.target)},he=e=>{const n=e.target;n instanceof HTMLElement&&n.hasAttribute(tt)&&!W.has(n)&&e.preventDefault()};function Ee(e,n){W.add(e);try{n.hide()}finally{W.delete(e)}}function nt(e=document){B||(B=!0,z=e,e.addEventListener("show.bs.modal",me),e.addEventListener("shown.bs.modal",be),e.addEventListener("hide.bs.modal",he))}function ot(e=z??document){B&&(B=!1,e.removeEventListener("show.bs.modal",me),e.removeEventListener("shown.bs.modal",be),e.removeEventListener("hide.bs.modal",he),z=void 0)}function ve(e){return e.classList.contains("modal")?e:e.closest(".modal")}function pe(e){e.tabIndex<0&&(e.tabIndex=-1),e.hasAttribute("aria-hidden")||e.setAttribute("aria-hidden","true")}function rt(e,n){const t=ve(e);if(!t)return Promise.reject(new Error('No ancestor ".modal" element was found for the target.'));pe(t),fe(t);const o=H(t,void 0,n.bootstrap);return o?(o.show(),Promise.resolve()):Promise.reject(new Error("Bootstrap Modal is unavailable."))}function st(e,n){const t=ve(e);if(!t)return Promise.reject(new Error('No ancestor ".modal" element was found for the target.'));pe(t);const o=H(t,void 0,n.bootstrap);return o?F.has(t)?(t.addEventListener("shown.bs.modal",()=>{Ee(t,o)},{once:!0}),Promise.resolve()):(Ee(t,o),Promise.resolve()):Promise.reject(new Error("Bootstrap Modal is unavailable."))}const ge="data-haori-toast-container",it="data-haori-toast",at="data-haori-toast-level",lt="data-haori-toast-accent",ct="data-haori-toast-dismiss",Te={"top-start":"top-0 start-0","top-center":"top-0 start-50 translate-middle-x","top-end":"top-0 end-0","bottom-start":"bottom-0 start-0","bottom-center":"bottom-0 start-50 translate-middle-x","bottom-end":"bottom-0 end-0"};function dt(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 ut(e,n){if(n.toastContainerSelector){const t=e.querySelector(n.toastContainerSelector);if(t)return t}return e.body}function ft(e,n){const t=ut(e,n),o=Te[n.toastPosition??"bottom-end"],r=t.querySelector(`[${ge}="true"]`);if(r){const c=Object.values(Te).flatMap(a=>a.split(" "));return r.classList.remove(...c),r.classList.add(...o.split(" ")),r}const s=e.createElement("div");return s.className=`toast-container position-fixed ${o} p-3`,s.setAttribute(ge,"true"),t.appendChild(s),s}function mt(e,n,t){const o=globalThis.document,r=dt(n),s=o.createElement("div");s.className="toast border bg-body text-body shadow-sm",s.setAttribute("role","status"),s.setAttribute("aria-live","polite"),s.setAttribute("aria-atomic","true"),s.setAttribute(it,"true"),s.setAttribute(at,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(lt,"true");const f=o.createElement("div");f.className="toast-body",f.style.whiteSpace="pre-line",f.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(ct,"true"),c.appendChild(a),c.appendChild(f),c.appendChild(l),s.appendChild(c),ft(o,t).appendChild(s);const m=t.toastDelay!==void 0?{delay:t.toastDelay}:void 0,d=xe(s,m,t.bootstrap);if(!d)return s.remove(),Promise.reject(new Error("Bootstrap Toast is unavailable."));l.addEventListener("click",()=>{d.hide?.()}),s.addEventListener("hidden.bs.toast",()=>{s.remove(),d.dispose?.()},{once:!0});try{return d.show(),Promise.resolve()}catch(b){return s.remove(),d.dispose?.(),Promise.reject(b)}}let u={options:{fallbackToNative:!0}};function w(e){return e?String(e).replace(/\\n/g,`
2
- `):""}function Ae(){return globalThis.window}function G(e){return Promise.resolve(e).then(()=>{})}function D(e){const n=u.originalHaori?.[e];return typeof n=="function"?n:void 0}function P(e){console.warn(`[haori-bootstrap] ${e} skipped because Bootstrap support is unavailable.`)}function Ce(e){const n=w(e),t=D("dialog");if(t)return G(t(n));const o=Ae();return u.options.fallbackToNative&&typeof o?.alert=="function"?(o.alert(n),Promise.resolve()):(P("dialog"),Promise.resolve())}function we(e){const n=w(e),t=D("confirm");if(t)return Promise.resolve(t(n)).then(r=>!!r);const o=Ae();return u.options.fallbackToNative&&typeof o?.confirm=="function"?Promise.resolve(o.confirm(n)):(P("confirm"),Promise.resolve(!1))}function Le(e,n){const t=w(e),o=D("toast");return o?G(o(t,n)):(P("toast"),Promise.resolve())}function O(e,n){const t=D(e);return t?G(t(n)):(P(e),Promise.resolve())}function bt(e){u=e}class Se{static dialog(n){const t=w(n);return N(u.options.bootstrap)?Ge(t,u.options).catch(()=>Ce(t)):Ce(t)}static confirm(n){const t=w(n);return N(u.options.bootstrap)?Ke(t,u.options).catch(()=>we(t)):we(t)}static toast(n,t){const o=w(n);return Oe(u.options.bootstrap)?mt(o,t,u.options).catch(()=>Le(o,t)):Le(o,t)}static openDialog(n){return N(u.options.bootstrap)?rt(n,u.options).catch(()=>O("openDialog",n)):O("openDialog",n)}static closeDialog(n){return N(u.options.bootstrap)?st(n,u.options).catch(()=>O("closeDialog",n)):O("closeDialog",n)}static addErrorMessage(n,t){return Ze(n,t)}static addMessage(n,t,o){return et(n,t,o)}static clearMessages(n){return fe(n)}}const ht="haori-bootstrap:collapse:",x="data-haori-persist";let q=!1,$,K;function Me(e){return ht+e}function Et(e){try{const n=window.sessionStorage.getItem(Me(e));return n==="shown"||n==="hidden"?n:void 0}catch{return}}function vt(e,n){try{window.sessionStorage.setItem(Me(e),n)}catch{}}function ye(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(s=>{s.setAttribute("aria-expanded",n?"true":"false"),s.classList.toggle("collapsed",!n)})}function Ie(e){const n=e.getAttribute(x);if(!n)return;const t=Et(n);if(!t)return;const o=e.classList.contains("show");t==="shown"&&!o?(e.classList.add("show"),ye(e,!0)):t==="hidden"&&o&&(e.classList.remove("show"),ye(e,!1))}function Ne(e){e instanceof HTMLElement&&e.hasAttribute(x)&&Ie(e),e.querySelectorAll(`[${x}]`).forEach(Ie)}function He(e,n){const t=e.target;if(!(t instanceof HTMLElement))return;const o=t.getAttribute(x);o&&vt(o,n)}const ke=e=>He(e,"shown"),Re=e=>He(e,"hidden");function pt(e=document){if(q)return;q=!0,K=e,e.addEventListener("shown.bs.collapse",ke),e.addEventListener("hidden.bs.collapse",Re);const n=()=>{Ne(e),$=new MutationObserver(t=>{for(const o of t)o.addedNodes.forEach(r=>{r instanceof HTMLElement&&Ne(r)})}),e.body&&$.observe(e.body,{childList:!0,subtree:!0})};e.body?n():e.addEventListener("DOMContentLoaded",n,{once:!0})}function gt(e=K??document){q&&(q=!1,e.removeEventListener("shown.bs.collapse",ke),e.removeEventListener("hidden.bs.collapse",Re),$?.disconnect(),$=void 0,K=void 0)}const Tt=[{attribute:"dialog-ok-label",apply:(e,n)=>{e.dialogOkLabel=n}},{attribute:"dialog-cancel-label",apply:(e,n)=>{e.dialogCancelLabel=n}}],At=typeof document<"u"&&document.currentScript instanceof HTMLScriptElement?document.currentScript:null;function V(e,n){const t=e?.getAttribute(n)??null;if(!(t===null||t.trim()===""))return t}function Ct(e=typeof document>"u"?null:document,n=At){const t={};for(const{attribute:o,apply:r}of Tt){const s=V(n,`data-${o}`)??V(e?.documentElement??null,`data-haori-${o}`)??V(e?.body??null,`data-haori-${o}`);s!==void 0&&r(t,s)}return t}const j={fallbackToNative:!0},_e=new Set(["dialog","confirm","toast","openDialog","closeDialog","addErrorMessage","addMessage","clearMessages"]);function wt(e){const n=Se;return new Proxy(e,{get(t,o,r){return typeof o=="string"&&_e.has(o)?n[o]:Reflect.get(t,o,r)},has(t,o){return typeof o=="string"&&_e.has(o)?!0:Reflect.has(t,o)}})}const i={installed:!1,options:j};function J(){return globalThis.window}function Lt(e,n){const t=Ct();return{bootstrap:e.bootstrap??n?.bootstrap,fallbackToNative:e.fallbackToNative??j.fallbackToNative,runtime:e.runtime??i.options.runtime??n?.Haori?.runtime,toastContainerSelector:e.toastContainerSelector??i.options.toastContainerSelector,dialogContainerSelector:e.dialogContainerSelector??i.options.dialogContainerSelector,dialogTitle:e.dialogTitle??i.options.dialogTitle,dialogOkLabel:e.dialogOkLabel??i.options.dialogOkLabel??t.dialogOkLabel,dialogCancelLabel:e.dialogCancelLabel??i.options.dialogCancelLabel??t.dialogCancelLabel,toastPosition:e.toastPosition??i.options.toastPosition,toastDelay:e.toastDelay??i.options.toastDelay}}function Be(e=J()){return!!(e?.Haori&&e.bootstrap)}function De(e={}){const n=J();if(!n?.Haori)throw new Error("window.Haori is required before calling install().");if(i.originalHaori||(i.originalHaori=n.Haori,i.originalRuntime=n.Haori.runtime),i.options=Lt(e,n),i.options.runtime){const t=i.originalHaori??n.Haori;typeof t.setRuntime=="function"?t.setRuntime(i.options.runtime):console.warn("[haori-bootstrap] Haori.setRuntime が利用できません。runtime 設定は無視されます。")}bt({originalHaori:i.originalHaori,options:i.options}),n.Haori=wt(i.originalHaori),pt(),nt(),i.installed=!0}function St(){const e=J();if(!e||!i.originalHaori)return;const n=i.originalHaori;typeof n.setRuntime=="function"?n.setRuntime(i.originalRuntime):n.runtime=i.originalRuntime,e.Haori=i.originalHaori,gt(),ot(),i.installed=!1,i.originalHaori=void 0,i.originalRuntime=void 0,i.options=j}function Mt(){return i.installed}const Pe="__haoriJsBootstrapAutoEnabled__";function yt(){return globalThis.window}function It(e){return!!e[Pe]}function Nt(e){e[Pe]=!0}function Ht(){const e=yt();if(!(!e||It(e))){if(!Be(e)){console.warn("[haori-bootstrap] Auto-enable skipped because window.Haori or window.bootstrap is missing.");return}try{De({bootstrap:e.bootstrap}),Nt(e)}catch(n){console.warn("[haori-bootstrap] Auto-enable failed.",n)}}}Ht();const kt="0.5.56";return E.BootstrapHaori=Se,E.hasAutoEnablePrerequisites=Be,E.install=De,E.isInstalled=Mt,E.uninstall=St,E.version=kt,Object.defineProperty(E,Symbol.toStringTag,{value:"Module"}),E})({});
1
+ var HaoriBootstrap=(function(E){"use strict";function Z(e){return typeof e=="function"}function ee(e){return Z(e?.Modal)?e?.Modal:void 0}function te(e){return Z(e?.Toast)?e?.Toast:void 0}function N(e){return!!ee(e)}function Ge(e){return!!te(e)}function H(e,t,n){const o=ee(n);if(o)return typeof o.getOrCreateInstance=="function"?o.getOrCreateInstance(e,t):new o(e,t)}function Ke(e,t,n){const o=te(n);if(o)return typeof o.getOrCreateInstance=="function"?o.getOrCreateInstance(e,t):new o(e,t)}const Ve="data-haori-dialog",je="data-haori-confirm",Je="data-haori-dialog-title",ne="data-haori-dialog-ok",oe="data-haori-confirm-ok",re="data-haori-confirm-cancel",Xe="OK",Qe="Cancel";let Ye=0;function se(){return{backdrop:"static",keyboard:!1}}function ie(e,t){if(t.dialogContainerSelector){const n=e.querySelector(t.dialogContainerSelector);if(n)return n}return e.body}function ae(e,t,n,o){const r=o.dialogTitle,s=e.createElement("div");s.className="modal fade",s.tabIndex=-1,s.setAttribute(n?je:Ve,"true"),s.setAttribute("aria-hidden","true");const c=e.createElement("div");c.className="modal-dialog modal-dialog-centered";const a=e.createElement("div");if(a.className="modal-content",r){const b=`haori-dialog-title-${++Ye}`,I=e.createElement("div");I.className="modal-header";const T=e.createElement("h5");T.className="modal-title",T.id=b,T.setAttribute(Je,"true"),T.textContent=r,I.appendChild(T),a.appendChild(I),s.setAttribute("aria-labelledby",b)}const f=e.createElement("div");f.className="modal-body";const l=e.createElement("p");l.className="mb-0",l.style.whiteSpace="pre-line",l.textContent=t,f.appendChild(l);const m=e.createElement("div");if(m.className="modal-footer",n){const b=e.createElement("button");b.type="button",b.className="btn btn-secondary",b.setAttribute(re,"true"),b.textContent=o.dialogCancelLabel??Qe,m.appendChild(b)}const d=e.createElement("button");return d.type="button",d.className="btn btn-primary",d.setAttribute(n?oe:ne,"true"),d.textContent=o.dialogOkLabel??Xe,m.appendChild(d),a.append(f,m),c.appendChild(a),s.appendChild(c),s}function le(e){let t=!1,n=!1;return{requestClose:o=>{t||(t=!0,o?.(),n&&e.hide())},handleShown:()=>{n=!0,t&&e.hide()}}}function Ze(e,t){const n=globalThis.document,o=ae(n,e,!1,t);ie(n,t).appendChild(o);const r=H(o,se(),t.bootstrap);return r?new Promise((s,c)=>{const a=()=>{o.removeEventListener("shown.bs.modal",m),o.removeEventListener("hidden.bs.modal",f),o.remove(),r.dispose?.(),s()},f=()=>{a()},l=le(r),m=l.handleShown;o.querySelector(`[${ne}]`)?.addEventListener("click",()=>{l.requestClose()}),o.addEventListener("shown.bs.modal",m),o.addEventListener("hidden.bs.modal",f,{once:!0});try{r.show()}catch(b){o.removeEventListener("shown.bs.modal",m),o.removeEventListener("hidden.bs.modal",f),o.remove(),r.dispose?.(),c(b)}}):(o.remove(),Promise.reject(new Error("Bootstrap Modal is unavailable.")))}function et(e,t){const n=globalThis.document,o=ae(n,e,!0,t);ie(n,t).appendChild(o);const r=H(o,se(),t.bootstrap);return r?new Promise((s,c)=>{let a=!1;const f=()=>{o.removeEventListener("shown.bs.modal",d),o.removeEventListener("hidden.bs.modal",l),o.remove(),r.dispose?.(),s(a)},l=()=>{f()},m=le(r),d=m.handleShown,b=o.querySelector(`[${oe}]`),I=o.querySelector(`[${re}]`);b?.addEventListener("click",()=>{m.requestClose(()=>{a=!0})}),I?.addEventListener("click",()=>{m.requestClose(()=>{a=!1})}),o.addEventListener("shown.bs.modal",d),o.addEventListener("hidden.bs.modal",l,{once:!0});try{r.show()}catch(T){o.removeEventListener("shown.bs.modal",d),o.removeEventListener("hidden.bs.modal",l),o.remove(),r.dispose?.(),c(T)}}):(o.remove(),Promise.reject(new Error("Bootstrap Modal is unavailable.")))}const v="data-haori-owned",h="data-haori-message-container",w="data-haori-invalid-target",L="data-haori-valid-target",tt=new Set(["button","a","area","br","col","embed","hr","img","source","track","wbr"]);function S(e){return e instanceof HTMLInputElement&&(e.type==="checkbox"||e.type==="radio")}function p(e){return e instanceof HTMLInputElement&&e.type==="radio"}function M(e){return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement}function F(e){return tt.has(e.localName)}function ce(e){const t=e.nextElementSibling;return t instanceof HTMLElement&&t.getAttribute(h)==="true"?t:void 0}function k(e){return Array.from(e.children).find(t=>t instanceof HTMLElement&&t.getAttribute(h)==="true")}function de(e,t){const n=e.createElement("div");return n.setAttribute(v,"true"),n.textContent=t,n}function ue(e){return F(e)?ce(e):k(e)}function fe(e,t){e.insertAdjacentElement(F(e)?"afterend":"afterbegin",t)}function y(e){if(e.name){const t=e.form??e.ownerDocument,n=typeof CSS<"u"&&typeof CSS.escape=="function"?CSS.escape(e.name):e.name.replace(/(["\\])/g,"\\$1"),o=Array.from(t.querySelectorAll(`input[type="radio"][name="${n}"]`));if(o.length>0)return o}return[e]}function nt(e){const[t,...n]=e;if(!t)return;let o=t;for(;o;){if(n.every(r=>o?.contains(r)))return o;o=o.parentElement}}function W(e){const n=y(e).map(o=>o.closest(".form-check")).filter(o=>o instanceof HTMLElement);if(n.length>1){const o=nt(n);if(o&&!n.includes(o))return o}return R(e)}function R(e){const t=e.closest(".form-check");return t instanceof HTMLElement?t:void 0}function me(e){const t=e.nextElementSibling;if(t instanceof HTMLElement&&t.getAttribute(h)==="true")return t;const n=document.createElement("div");return n.className="invalid-feedback d-block",n.setAttribute(v,"true"),n.setAttribute(h,"true"),e.insertAdjacentElement("afterend",n),n}function ot(e){const t=p(e)?W(e):R(e);if(!t)return me(e);const n=k(t);if(n)return n;const o=document.createElement("div");return o.className="invalid-feedback d-block",o.setAttribute(v,"true"),o.setAttribute(h,"true"),t.appendChild(o),o}function rt(e){const t=ue(e);if(t)return t;const n=document.createElement("div");return n.className="alert alert-danger",n.setAttribute("role","alert"),n.setAttribute(v,"true"),n.setAttribute(h,"true"),fe(e,n),n}function g(e){e.getAttribute(w)==="true"&&(e.classList.remove("is-invalid"),e.removeAttribute(w))}function A(e){e.getAttribute(L)==="true"&&(e.classList.remove("is-valid"),e.removeAttribute(L))}function be(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 D(e){return e==="success"?"valid-feedback d-block":"invalid-feedback d-block"}function he(e){(p(e)?y(e):[e]).forEach(n=>{n.classList.add("is-invalid"),n.setAttribute(w,"true")})}function st(e){(p(e)?y(e):[e]).forEach(n=>{g(n)})}function Ee(e,t){const n=e.nextElementSibling;if(n instanceof HTMLElement&&n.getAttribute(h)==="true")return n.className=D(t),n;const o=document.createElement("div");return o.className=D(t),o.setAttribute(v,"true"),o.setAttribute(h,"true"),e.insertAdjacentElement("afterend",o),o}function it(e,t){const n=p(e)?W(e):R(e);if(!n)return Ee(e,t);const o=k(n);if(o)return o.className=D(t),o;const r=document.createElement("div");return r.className=D(t),r.setAttribute(v,"true"),r.setAttribute(h,"true"),n.appendChild(r),r}function at(e,t){const n=ue(e);if(n)return n.className=be(t),n;const o=document.createElement("div");return o.className=be(t),o.setAttribute("role","alert"),o.setAttribute(v,"true"),o.setAttribute(h,"true"),fe(e,o),o}function lt(e,t){return(S(e)?ot(e):M(e)?me(e):rt(e)).appendChild(de(document,t)),S(e)?he(e):M(e)&&(e.classList.add("is-invalid"),e.setAttribute(w,"true")),Promise.resolve()}function ct(e,t,n){if((S(e)?it(e,n):M(e)?Ee(e,n):at(e,n)).appendChild(de(document,t)),S(e)){const r=p(e)?y(e):[e];n==="success"?r.forEach(s=>{g(s),s.classList.add("is-valid"),s.setAttribute(L,"true")}):!n||n==="error"?(r.forEach(s=>A(s)),he(e)):r.forEach(s=>{A(s),g(s)})}else M(e)&&(n==="success"?(g(e),e.classList.add("is-valid"),e.setAttribute(L,"true")):!n||n==="error"?(A(e),e.classList.add("is-invalid"),e.setAttribute(w,"true")):(A(e),g(e)));return Promise.resolve()}function ve(e){if(S(e)){const r=p(e)?W(e):R(e);(r?k(r):void 0)?.remove(),st(e),(p(e)?y(e):[e]).forEach(a=>A(a))}else if(M(e)){const r=e.nextElementSibling;r instanceof HTMLElement&&r.getAttribute(h)==="true"&&r.remove(),g(e),A(e)}else F(e)&&ce(e)?.remove();return e.querySelectorAll(`[${h}="true"]`).forEach(r=>{r.remove()}),e.querySelectorAll(`[${w}="true"]`).forEach(r=>{g(r)}),e.querySelectorAll(`[${L}="true"]`).forEach(r=>{A(r)}),Promise.resolve()}const z=new WeakSet,dt="data-haori-dismiss-lock",G=new WeakSet;let _=null,K=new WeakMap,B=!1,V;function pe(e){return Array.from(e.ownerDocument.querySelectorAll(".modal.show")).filter(t=>t!==e)}const ge=e=>{e.target instanceof HTMLElement&&(_=e.target)},Ae=e=>{if(!(e.target instanceof HTMLElement))return;const t=e.target;z.add(t),_&&K.set(t,_)},Te=e=>{if(!(e.target instanceof HTMLElement))return;const t=e.target;z.delete(t),t.getAttribute("data-bs-focus")!=="false"&&pe(t).length>0&&!t.contains(t.ownerDocument.activeElement)&&t.focus()},we=e=>{if(!(e.target instanceof HTMLElement))return;const t=e.target,n=K.get(t),o=pe(t),r=t.ownerDocument.activeElement;o.length===0||o.some(s=>s.contains(r))||n&&o.some(s=>s.contains(n))&&(n.focus(),t.ownerDocument.activeElement===n)||o[o.length-1].focus()},Ce=e=>{const t=e.target;t instanceof HTMLElement&&t.hasAttribute(dt)&&!G.has(t)&&e.preventDefault()};function Le(e,t){G.add(e);try{t.hide()}finally{G.delete(e)}}function ut(e=document){B||(B=!0,V=e,e.addEventListener("focusin",ge),e.addEventListener("show.bs.modal",Ae),e.addEventListener("shown.bs.modal",Te),e.addEventListener("hide.bs.modal",Ce),e.addEventListener("hidden.bs.modal",we))}function ft(e=V??document){B&&(B=!1,e.removeEventListener("focusin",ge),e.removeEventListener("show.bs.modal",Ae),e.removeEventListener("shown.bs.modal",Te),e.removeEventListener("hide.bs.modal",Ce),e.removeEventListener("hidden.bs.modal",we),V=void 0,_=null,K=new WeakMap)}function Se(e){return e.classList.contains("modal")?e:e.closest(".modal")}function Me(e){e.tabIndex<0&&(e.tabIndex=-1),e.hasAttribute("aria-hidden")||e.setAttribute("aria-hidden","true")}function mt(e,t){const n=Se(e);if(!n)return Promise.reject(new Error('No ancestor ".modal" element was found for the target.'));Me(n),ve(n);const o=H(n,void 0,t.bootstrap);return o?(o.show(),Promise.resolve()):Promise.reject(new Error("Bootstrap Modal is unavailable."))}function bt(e,t){const n=Se(e);if(!n)return Promise.reject(new Error('No ancestor ".modal" element was found for the target.'));Me(n);const o=H(n,void 0,t.bootstrap);return o?z.has(n)?(n.addEventListener("shown.bs.modal",()=>{Le(n,o)},{once:!0}),Promise.resolve()):(Le(n,o),Promise.resolve()):Promise.reject(new Error("Bootstrap Modal is unavailable."))}const ye="data-haori-toast-container",ht="data-haori-toast",Et="data-haori-toast-level",vt="data-haori-toast-accent",pt="data-haori-toast-dismiss",Ie={"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 gt(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 At(e,t){if(t.toastContainerSelector){const n=e.querySelector(t.toastContainerSelector);if(n)return n}return e.body}function Tt(e,t){const n=At(e,t),o=Ie[t.toastPosition??"bottom-end"],r=n.querySelector(`[${ye}="true"]`);if(r){const c=Object.values(Ie).flatMap(a=>a.split(" "));return r.classList.remove(...c),r.classList.add(...o.split(" ")),r}const s=e.createElement("div");return s.className=`toast-container position-fixed ${o} p-3`,s.setAttribute(ye,"true"),n.appendChild(s),s}function wt(e,t,n){const o=globalThis.document,r=gt(t),s=o.createElement("div");s.className="toast border bg-body text-body shadow-sm",s.setAttribute("role","status"),s.setAttribute("aria-live","polite"),s.setAttribute("aria-atomic","true"),s.setAttribute(ht,"true"),s.setAttribute(Et,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(vt,"true");const f=o.createElement("div");f.className="toast-body",f.style.whiteSpace="pre-line",f.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(pt,"true"),c.appendChild(a),c.appendChild(f),c.appendChild(l),s.appendChild(c),Tt(o,n).appendChild(s);const m=n.toastDelay!==void 0?{delay:n.toastDelay}:void 0,d=Ke(s,m,n.bootstrap);if(!d)return s.remove(),Promise.reject(new Error("Bootstrap Toast is unavailable."));l.addEventListener("click",()=>{d.hide?.()}),s.addEventListener("hidden.bs.toast",()=>{s.remove(),d.dispose?.()},{once:!0});try{return d.show(),Promise.resolve()}catch(b){return s.remove(),d.dispose?.(),Promise.reject(b)}}let u={options:{fallbackToNative:!0}};function C(e){return e?String(e).replace(/\\n/g,`
2
+ `):""}function Ne(){return globalThis.window}function j(e){return Promise.resolve(e).then(()=>{})}function P(e){const t=u.originalHaori?.[e];return typeof t=="function"?t:void 0}function O(e){console.warn(`[haori-bootstrap] ${e} skipped because Bootstrap support is unavailable.`)}function He(e){const t=C(e),n=P("dialog");if(n)return j(n(t));const o=Ne();return u.options.fallbackToNative&&typeof o?.alert=="function"?(o.alert(t),Promise.resolve()):(O("dialog"),Promise.resolve())}function ke(e){const t=C(e),n=P("confirm");if(n)return Promise.resolve(n(t)).then(r=>!!r);const o=Ne();return u.options.fallbackToNative&&typeof o?.confirm=="function"?Promise.resolve(o.confirm(t)):(O("confirm"),Promise.resolve(!1))}function Re(e,t){const n=C(e),o=P("toast");return o?j(o(n,t)):(O("toast"),Promise.resolve())}function x(e,t){const n=P(e);return n?j(n(t)):(O(e),Promise.resolve())}function Ct(e){u=e}class De{static dialog(t){const n=C(t);return N(u.options.bootstrap)?Ze(n,u.options).catch(()=>He(n)):He(n)}static confirm(t){const n=C(t);return N(u.options.bootstrap)?et(n,u.options).catch(()=>ke(n)):ke(n)}static toast(t,n){const o=C(t);return Ge(u.options.bootstrap)?wt(o,n,u.options).catch(()=>Re(o,n)):Re(o,n)}static openDialog(t){return N(u.options.bootstrap)?mt(t,u.options).catch(()=>x("openDialog",t)):x("openDialog",t)}static closeDialog(t){return N(u.options.bootstrap)?bt(t,u.options).catch(()=>x("closeDialog",t)):x("closeDialog",t)}static addErrorMessage(t,n){return lt(t,n)}static addMessage(t,n,o){return ct(t,n,o)}static clearMessages(t){return ve(t)}}const Lt="haori-bootstrap:collapse:",q="data-haori-persist";let $=!1,U,J;function _e(e){return Lt+e}function St(e){try{const t=window.sessionStorage.getItem(_e(e));return t==="shown"||t==="hidden"?t:void 0}catch{return}}function Mt(e,t){try{window.sessionStorage.setItem(_e(e),t)}catch{}}function Be(e,t){const n=e.id,o=[`[data-bs-toggle="collapse"][data-bs-target="#${n}"]`];if(n&&o.push(`[data-bs-toggle="collapse"][href="#${n}"]`),!n)return;e.ownerDocument.querySelectorAll(o.join(",")).forEach(s=>{s.setAttribute("aria-expanded",t?"true":"false"),s.classList.toggle("collapsed",!t)})}function Pe(e){const t=e.getAttribute(q);if(!t)return;const n=St(t);if(!n)return;const o=e.classList.contains("show");n==="shown"&&!o?(e.classList.add("show"),Be(e,!0)):n==="hidden"&&o&&(e.classList.remove("show"),Be(e,!1))}function Oe(e){e instanceof HTMLElement&&e.hasAttribute(q)&&Pe(e),e.querySelectorAll(`[${q}]`).forEach(Pe)}function xe(e,t){const n=e.target;if(!(n instanceof HTMLElement))return;const o=n.getAttribute(q);o&&Mt(o,t)}const qe=e=>xe(e,"shown"),$e=e=>xe(e,"hidden");function yt(e=document){if($)return;$=!0,J=e,e.addEventListener("shown.bs.collapse",qe),e.addEventListener("hidden.bs.collapse",$e);const t=()=>{Oe(e),U=new MutationObserver(n=>{for(const o of n)o.addedNodes.forEach(r=>{r instanceof HTMLElement&&Oe(r)})}),e.body&&U.observe(e.body,{childList:!0,subtree:!0})};e.body?t():e.addEventListener("DOMContentLoaded",t,{once:!0})}function It(e=J??document){$&&($=!1,e.removeEventListener("shown.bs.collapse",qe),e.removeEventListener("hidden.bs.collapse",$e),U?.disconnect(),U=void 0,J=void 0)}const Nt=[{attribute:"dialog-ok-label",apply:(e,t)=>{e.dialogOkLabel=t}},{attribute:"dialog-cancel-label",apply:(e,t)=>{e.dialogCancelLabel=t}}],Ht=typeof document<"u"&&document.currentScript instanceof HTMLScriptElement?document.currentScript:null;function X(e,t){const n=e?.getAttribute(t)??null;if(!(n===null||n.trim()===""))return n}function kt(e=typeof document>"u"?null:document,t=Ht){const n={};for(const{attribute:o,apply:r}of Nt){const s=X(t,`data-${o}`)??X(e?.documentElement??null,`data-haori-${o}`)??X(e?.body??null,`data-haori-${o}`);s!==void 0&&r(n,s)}return n}const Q={fallbackToNative:!0},Ue=new Set(["dialog","confirm","toast","openDialog","closeDialog","addErrorMessage","addMessage","clearMessages"]);function Rt(e){const t=De;return new Proxy(e,{get(n,o,r){return typeof o=="string"&&Ue.has(o)?t[o]:Reflect.get(n,o,r)},has(n,o){return typeof o=="string"&&Ue.has(o)?!0:Reflect.has(n,o)}})}const i={installed:!1,options:Q};function Y(){return globalThis.window}function Dt(e,t){const n=kt();return{bootstrap:e.bootstrap??t?.bootstrap,fallbackToNative:e.fallbackToNative??Q.fallbackToNative,runtime:e.runtime??i.options.runtime??t?.Haori?.runtime,toastContainerSelector:e.toastContainerSelector??i.options.toastContainerSelector,dialogContainerSelector:e.dialogContainerSelector??i.options.dialogContainerSelector,dialogTitle:e.dialogTitle??i.options.dialogTitle,dialogOkLabel:e.dialogOkLabel??i.options.dialogOkLabel??n.dialogOkLabel,dialogCancelLabel:e.dialogCancelLabel??i.options.dialogCancelLabel??n.dialogCancelLabel,toastPosition:e.toastPosition??i.options.toastPosition,toastDelay:e.toastDelay??i.options.toastDelay}}function Fe(e=Y()){return!!(e?.Haori&&e.bootstrap)}function We(e={}){const t=Y();if(!t?.Haori)throw new Error("window.Haori is required before calling install().");if(i.originalHaori||(i.originalHaori=t.Haori,i.originalRuntime=t.Haori.runtime),i.options=Dt(e,t),i.options.runtime){const n=i.originalHaori??t.Haori;typeof n.setRuntime=="function"?n.setRuntime(i.options.runtime):console.warn("[haori-bootstrap] Haori.setRuntime が利用できません。runtime 設定は無視されます。")}Ct({originalHaori:i.originalHaori,options:i.options}),t.Haori=Rt(i.originalHaori),yt(),ut(),i.installed=!0}function _t(){const e=Y();if(!e||!i.originalHaori)return;const t=i.originalHaori;typeof t.setRuntime=="function"?t.setRuntime(i.originalRuntime):t.runtime=i.originalRuntime,e.Haori=i.originalHaori,It(),ft(),i.installed=!1,i.originalHaori=void 0,i.originalRuntime=void 0,i.options=Q}function Bt(){return i.installed}const ze="__haoriJsBootstrapAutoEnabled__";function Pt(){return globalThis.window}function Ot(e){return!!e[ze]}function xt(e){e[ze]=!0}function qt(){const e=Pt();if(!(!e||Ot(e))){if(!Fe(e)){console.warn("[haori-bootstrap] Auto-enable skipped because window.Haori or window.bootstrap is missing.");return}try{We({bootstrap:e.bootstrap}),xt(e)}catch(t){console.warn("[haori-bootstrap] Auto-enable failed.",t)}}}qt();const $t="0.5.58";return E.BootstrapHaori=De,E.hasAutoEnablePrerequisites=Fe,E.install=We,E.isInstalled=Bt,E.uninstall=_t,E.version=$t,Object.defineProperty(E,Symbol.toStringTag,{value:"Module"}),E})({});
3
3
  //# sourceMappingURL=haori-bootstrap.iife.js.map