haori-bootstrap 0.5.55 → 0.5.56

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.55
5
+ Version: 0.5.56
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.57.1/dist/haori.iife.js"></script>
44
+ <script src="https://cdn.jsdelivr.net/npm/haori@0.58.0/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.55/dist/haori-bootstrap.iife.js"></script>
46
+ <script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.5.56/dist/haori-bootstrap.iife.js"></script>
47
47
  ```
48
48
 
49
49
  IIFE 版は、window.Haori と window.bootstrap が利用可能な場合に自動で有効化されます。
@@ -225,6 +225,23 @@ Bootstrap collapse 要素に `data-haori-persist="キー名"` を付与すると
225
225
  - 属性の書き換えは Haori コアの描画を経るため、取得の開始・終了から少し遅れて切り替わります。
226
226
  - 動作例は `demo/dismiss-lock.html` を参照してください。
227
227
 
228
+ ### 閉じたときに状態を戻す
229
+
230
+ Bootstrap の `hidden.bs.modal` は、閉じたモーダルから発火します。Haori コア 0.58.0 以降の `data-on-target` で発火元を指定すると、そのモーダルが閉じたときだけ手続きを走らせられます。閉じ方(Esc キー・背景のクリック・`data-bs-dismiss`・Haori の閉じる操作)は問いません。
231
+
232
+ ```html
233
+ <div id="state" data-bind='{"subOpen": false}'>
234
+ <span hidden id="sub-closed" data-click-data='{"subOpen": false}'
235
+ data-click-bind="#state" data-click-bind-merge></span>
236
+ <!-- #sub-modal が閉じたときだけ #sub-closed を押す。ほかのモーダルが閉じても走らない -->
237
+ <div data-on="hidden.bs.modal" data-on-target="#sub-modal"
238
+ data-on-click="#sub-closed"></div>
239
+ </div>
240
+ ```
241
+
242
+ - `data-on-target` を書かないと、どのモーダルが閉じても走ります。
243
+ - 入れ子のモーダルで、子が開いている間は親を閉じさせない(親に `data-haori-dismiss-lock="{{!!subOpen}}"`)構成でも、子を Esc キー・背景のクリックで閉じたときに `subOpen` を下ろせます。
244
+
228
245
  ## e2e 向け安定セレクタ
229
246
 
230
247
  `dialog` / `confirm` / `toast` が描画する要素には、文言・ロケールに依存しない安定した識別属性を付与しています。Playwright などの e2e テストでは、表示文言やボタン名ではなくこれらの属性でセレクタを組むことを推奨します(文言変更やロケール差で壊れません)。
@@ -287,12 +304,12 @@ push 後に、そのタグから GitHub Release を published にします。公
287
304
  次回 patch リリースの例:
288
305
 
289
306
  ```bash
290
- # version が 0.5.56 になる
307
+ # version が 0.5.57 になる
291
308
  npm version patch
292
309
  git push origin main --follow-tags
293
310
  ```
294
311
 
295
- その後、push 済みタグの GitHub Release を作成して published にします。例として次回は `0.5.56` タグになります。
312
+ その後、push 済みタグの GitHub Release を作成して published にします。例として次回は `0.5.57` タグになります。
296
313
 
297
314
  自動公開:
298
315
 
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.55
5
+ Version: 0.5.56
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.57.1/dist/haori.iife.js"></script>
44
+ <script src="https://cdn.jsdelivr.net/npm/haori@0.58.0/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.55/dist/haori-bootstrap.iife.js"></script>
46
+ <script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.5.56/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.
@@ -225,6 +225,23 @@ Add `data-haori-dismiss-lock` to a `.modal` to stop the Escape key, backdrop cli
225
225
  - Attribute updates go through Haori core's rendering, so the lock switches slightly after the fetch starts or ends.
226
226
  - See `demo/dismiss-lock.html` for a working example.
227
227
 
228
+ ### Resetting state when a modal is closed
229
+
230
+ Bootstrap fires `hidden.bs.modal` from the modal that was closed. With `data-on-target` (Haori core 0.58.0 or later) you can run a procedure only when that modal is closed, however it was closed (Escape, backdrop click, `data-bs-dismiss`, or Haori's own close operations).
231
+
232
+ ```html
233
+ <div id="state" data-bind='{"subOpen": false}'>
234
+ <span hidden id="sub-closed" data-click-data='{"subOpen": false}'
235
+ data-click-bind="#state" data-click-bind-merge></span>
236
+ <!-- Click #sub-closed only when #sub-modal is closed; other modals do not trigger it -->
237
+ <div data-on="hidden.bs.modal" data-on-target="#sub-modal"
238
+ data-on-click="#sub-closed"></div>
239
+ </div>
240
+ ```
241
+
242
+ - Without `data-on-target`, the procedure runs whenever any modal is closed.
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
+
228
245
  ## Stable selectors for e2e
229
246
 
230
247
  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.
@@ -284,15 +301,15 @@ git push origin main --follow-tags
284
301
 
285
302
  After pushing, publish a GitHub Release from the generated version tag. The release workflow then publishes the package and uploads `dist.zip` automatically.
286
303
 
287
- Example next patch release after `0.5.55`:
304
+ Example next patch release after `0.5.56`:
288
305
 
289
306
  ```bash
290
- # version becomes 0.5.56
307
+ # version becomes 0.5.57
291
308
  npm version patch
292
309
  git push origin main --follow-tags
293
310
  ```
294
311
 
295
- Create and publish the GitHub Release for the pushed tag such as `0.5.56`.
312
+ Create and publish the GitHub Release for the pushed tag such as `0.5.57`.
296
313
 
297
314
  Release automation:
298
315
 
@@ -1,3 +1,3 @@
1
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.55";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})({});
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})({});
3
3
  //# sourceMappingURL=haori-bootstrap.iife.js.map