haori-bootstrap 0.5.52 → 0.5.54

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.52
5
+ Version: 0.5.54
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.56.0/dist/haori.iife.js"></script>
44
+ <script src="https://cdn.jsdelivr.net/npm/haori@0.57.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.52/dist/haori-bootstrap.iife.js"></script>
46
+ <script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.5.54/dist/haori-bootstrap.iife.js"></script>
47
47
  ```
48
48
 
49
49
  IIFE 版は、window.Haori と window.bootstrap が利用可能な場合に自動で有効化されます。
@@ -195,6 +195,33 @@ Bootstrap collapse 要素に `data-haori-persist="キー名"` を付与すると
195
195
  - 文言の出し分けは、コピーしたキーをモーダル側の `{{ ... }}` で直接参照すれば足りるため、キーのリネームや計算は通常不要です。
196
196
  - 動作例は `demo/modal-copy.html` を参照してください。
197
197
 
198
+ ## 取得中にモーダルを閉じさせない
199
+
200
+ `.modal` に `data-haori-dismiss-lock` を付けると、属性がある間は Esc キー・背景のクリック・`data-bs-dismiss` ではモーダルを閉じません。Haori の閉じる操作(`data-{event}-close`、`data-{event}-error-close` などの失敗時のアクション、`Haori.closeDialog()`)では閉じます。
201
+
202
+ ```html
203
+ <div class="modal fade" id="reward-dialog" tabindex="-1"
204
+ data-haori-dismiss-lock="{{!!_fetch.loading}}">
205
+ <div class="modal-dialog"><div class="modal-content">
206
+ <button type="button" class="btn-close" data-bs-dismiss="modal"
207
+ disabled="{{!!_fetch.loading}}"></button>
208
+ <button type="button"
209
+ data-click-fetch="/api/rewards/{{reward.id}}.json"
210
+ data-click-fetch-state="#reward-dialog"
211
+ data-click-error-close="#reward-dialog">取り直し</button>
212
+ </div></div>
213
+ </div>
214
+ ```
215
+
216
+ - 属性の値は見ません。属性があれば閉じません(値を書かずに付けると、常に Haori の閉じる操作でだけ閉じるモーダルになります)。
217
+ - 式で書いた場合は、Haori コアが通常の属性として評価します。結果が `false` / `null` / `undefined` になると属性が消え、Bootstrap の既定どおり閉じられるようになります。`0` や空文字では属性が残るため、真偽で書く場合は `{{!!式}}` のように真偽へ揃えてください。
218
+ - `_fetch` は、`data-{event}-fetch-state` で `.modal` 自身かその祖先へ注入してください。`.modal` の内側の要素へ注入すると、`.modal` の属性からは参照できません。
219
+ - 画面のスクリプトが直接呼ぶ `bootstrap.Modal` の `hide()` でも閉じません。閉じる操作は `hide.bs.modal` を取り消して止めます。
220
+ - 止めたときに、`data-bs-backdrop="static"` のような揺れる表示は出しません。閉じるボタンを押せなくするには、上の例のように `disabled` を式で書きます(Bootstrap は `disabled` の `data-bs-dismiss` を処理しません)。
221
+ - 属性がある間に `data-bs-toggle` で別のモーダルを開くと、前のモーダルは閉じずに残ります。
222
+ - 属性の書き換えは Haori コアの描画を経るため、取得の開始・終了から少し遅れて切り替わります。
223
+ - 動作例は `demo/dismiss-lock.html` を参照してください。
224
+
198
225
  ## e2e 向け安定セレクタ
199
226
 
200
227
  `dialog` / `confirm` / `toast` が描画する要素には、文言・ロケールに依存しない安定した識別属性を付与しています。Playwright などの e2e テストでは、表示文言やボタン名ではなくこれらの属性でセレクタを組むことを推奨します(文言変更やロケール差で壊れません)。
@@ -236,6 +263,15 @@ npm run build
236
263
  npm pack --dry-run
237
264
  ```
238
265
 
266
+ デモの E2E(Chrome が必要です):
267
+
268
+ ```bash
269
+ npm run test:e2e # 開発サーバーで確かめる
270
+ npm run test:e2e:pages # ビルド済みのデモを GitHub Pages と同じサブパスで配信して確かめる
271
+ ```
272
+
273
+ デモが取得する静的な JSON は `demo/public/data/` に置きます。`demo/` 直下に置くとビルドに含まれず、公開先でだけ 404 になります。
274
+
239
275
  通常リリース手順:
240
276
 
241
277
  ```bash
@@ -248,12 +284,12 @@ push 後に、そのタグから GitHub Release を published にします。公
248
284
  次回 patch リリースの例:
249
285
 
250
286
  ```bash
251
- # version が 0.5.53 になる
287
+ # version が 0.5.55 になる
252
288
  npm version patch
253
289
  git push origin main --follow-tags
254
290
  ```
255
291
 
256
- その後、push 済みタグの GitHub Release を作成して published にします。例として次回は `0.5.53` タグになります。
292
+ その後、push 済みタグの GitHub Release を作成して published にします。例として次回は `0.5.55` タグになります。
257
293
 
258
294
  自動公開:
259
295
 
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.52
5
+ Version: 0.5.54
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.56.0/dist/haori.iife.js"></script>
44
+ <script src="https://cdn.jsdelivr.net/npm/haori@0.57.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.52/dist/haori-bootstrap.iife.js"></script>
46
+ <script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.5.54/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.
@@ -195,6 +195,33 @@ When you open a single shared Bootstrap modal from per-row buttons (inside `data
195
195
  - Wording can be branched on the copied keys directly in the modal via `{{ ... }}`, so renaming/computing keys is usually unnecessary.
196
196
  - See `demo/modal-copy.html` for a working example.
197
197
 
198
+ ## Keeping a modal open while fetching
199
+
200
+ Add `data-haori-dismiss-lock` to a `.modal` to stop the Escape key, backdrop clicks and `data-bs-dismiss` from closing it while the attribute is present. Haori's own close operations (`data-{event}-close`, failure actions such as `data-{event}-error-close`, and `Haori.closeDialog()`) still close it.
201
+
202
+ ```html
203
+ <div class="modal fade" id="reward-dialog" tabindex="-1"
204
+ data-haori-dismiss-lock="{{!!_fetch.loading}}">
205
+ <div class="modal-dialog"><div class="modal-content">
206
+ <button type="button" class="btn-close" data-bs-dismiss="modal"
207
+ disabled="{{!!_fetch.loading}}"></button>
208
+ <button type="button"
209
+ data-click-fetch="/api/rewards/{{reward.id}}.json"
210
+ data-click-fetch-state="#reward-dialog"
211
+ data-click-error-close="#reward-dialog">Reload</button>
212
+ </div></div>
213
+ </div>
214
+ ```
215
+
216
+ - The value is not inspected: the modal stays open whenever the attribute is present. Adding it without a value makes a modal that only Haori's close operations can close.
217
+ - When written as an expression, Haori core evaluates it as an ordinary attribute. A result of `false` / `null` / `undefined` removes the attribute, and the modal closes as Bootstrap normally does. `0` and an empty string keep the attribute, so normalize to a boolean with `{{!!expr}}`.
218
+ - Inject `_fetch` into the `.modal` itself or one of its ancestors with `data-{event}-fetch-state`. State injected into an element inside the `.modal` is not visible to the `.modal`'s attributes.
219
+ - A `hide()` call on the `bootstrap.Modal` instance from page scripts is stopped too: the lock works by cancelling `hide.bs.modal`.
220
+ - No bounce animation (as with `data-bs-backdrop="static"`) is shown when a close is stopped. To disable the close button, bind `disabled` as in the example (Bootstrap ignores `data-bs-dismiss` on disabled elements).
221
+ - Opening another modal with `data-bs-toggle` while the attribute is present leaves the locked modal open underneath.
222
+ - Attribute updates go through Haori core's rendering, so the lock switches slightly after the fetch starts or ends.
223
+ - See `demo/dismiss-lock.html` for a working example.
224
+
198
225
  ## Stable selectors for e2e
199
226
 
200
227
  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.
@@ -236,6 +263,15 @@ npm run build
236
263
  npm pack --dry-run
237
264
  ```
238
265
 
266
+ Demo E2E tests (Chrome required):
267
+
268
+ ```bash
269
+ npm run test:e2e # against the dev server
270
+ npm run test:e2e:pages # against the built demo, served under the same subpath as GitHub Pages
271
+ ```
272
+
273
+ Put static JSON that the demos fetch under `demo/public/data/`. Files placed directly under `demo/` are left out of the build and return 404 only on the published site.
274
+
239
275
  Regular release flow:
240
276
 
241
277
  ```bash
@@ -245,15 +281,15 @@ git push origin main --follow-tags
245
281
 
246
282
  After pushing, publish a GitHub Release from the generated version tag. The release workflow then publishes the package and uploads `dist.zip` automatically.
247
283
 
248
- Example next patch release after `0.5.52`:
284
+ Example next patch release after `0.5.54`:
249
285
 
250
286
  ```bash
251
- # version becomes 0.5.53
287
+ # version becomes 0.5.55
252
288
  npm version patch
253
289
  git push origin main --follow-tags
254
290
  ```
255
291
 
256
- Create and publish the GitHub Release for the pushed tag such as `0.5.53`.
292
+ Create and publish the GitHub Release for the pushed tag such as `0.5.55`.
257
293
 
258
294
  Release automation:
259
295
 
@@ -1,3 +1,3 @@
1
- var HaoriBootstrap=(function(E){"use strict";function J(e){return typeof e=="function"}function X(e){return J(e?.Modal)?e?.Modal:void 0}function Q(e){return J(e?.Toast)?e?.Toast:void 0}function N(e){return!!X(e)}function _e(e){return!!Q(e)}function k(e,n,t){const o=X(t);if(o)return typeof o.getOrCreateInstance=="function"?o.getOrCreateInstance(e,n):new o(e,n)}function De(e,n,t){const o=Q(t);if(o)return typeof o.getOrCreateInstance=="function"?o.getOrCreateInstance(e,n):new o(e,n)}const Pe="data-haori-dialog",xe="data-haori-confirm",Oe="data-haori-dialog-title",Y="data-haori-dialog-ok",Z="data-haori-confirm-ok",ee="data-haori-confirm-cancel",qe="OK",$e="Cancel";let Ue=0;function te(){return{backdrop:"static",keyboard:!1}}function ne(e,n){if(n.dialogContainerSelector){const t=e.querySelector(n.dialogContainerSelector);if(t)return t}return e.body}function oe(e,n,t,o){const r=o.dialogTitle,i=e.createElement("div");i.className="modal fade",i.tabIndex=-1,i.setAttribute(t?xe:Pe,"true"),i.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-${++Ue}`,I=e.createElement("div");I.className="modal-header";const A=e.createElement("h5");A.className="modal-title",A.id=b,A.setAttribute(Oe,"true"),A.textContent=r,I.appendChild(A),a.appendChild(I),i.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(ee,"true"),b.textContent=o.dialogCancelLabel??$e,m.appendChild(b)}const d=e.createElement("button");return d.type="button",d.className="btn btn-primary",d.setAttribute(t?Z:Y,"true"),d.textContent=o.dialogOkLabel??qe,m.appendChild(d),a.append(f,m),c.appendChild(a),i.appendChild(c),i}function re(e){let n=!1,t=!1;return{requestClose:o=>{n||(n=!0,o?.(),t&&e.hide())},handleShown:()=>{t=!0,n&&e.hide()}}}function Fe(e,n){const t=globalThis.document,o=oe(t,e,!1,n);ne(t,n).appendChild(o);const r=k(o,te(),n.bootstrap);return r?new Promise((i,c)=>{const a=()=>{o.removeEventListener("shown.bs.modal",m),o.removeEventListener("hidden.bs.modal",f),o.remove(),r.dispose?.(),i()},f=()=>{a()},l=re(r),m=l.handleShown;o.querySelector(`[${Y}]`)?.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 ze(e,n){const t=globalThis.document,o=oe(t,e,!0,n);ne(t,n).appendChild(o);const r=k(o,te(),n.bootstrap);return r?new Promise((i,c)=>{let a=!1;const f=()=>{o.removeEventListener("shown.bs.modal",d),o.removeEventListener("hidden.bs.modal",l),o.remove(),r.dispose?.(),i(a)},l=()=>{f()},m=re(r),d=m.handleShown,b=o.querySelector(`[${Z}]`),I=o.querySelector(`[${ee}]`);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 p="data-haori-owned",h="data-haori-message-container",w="data-haori-invalid-target",L="data-haori-valid-target";function S(e){return e instanceof HTMLInputElement&&(e.type==="checkbox"||e.type==="radio")}function v(e){return e instanceof HTMLInputElement&&e.type==="radio"}function M(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(h)==="true")}function ie(e,n){const t=e.createElement("div");return t.setAttribute(p,"true"),t.textContent=n,t}function se(e){return H(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 We(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=We(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 ae(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(p,"true"),t.setAttribute(h,"true"),e.insertAdjacentElement("afterend",t),t}function Ge(e){const n=v(e)?U(e):R(e);if(!n)return ae(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(h,"true"),n.appendChild(o),o}function Ke(e){const n=se(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(h,"true"),e.insertAdjacentElement("afterbegin",t),t}function T(e){e.getAttribute(w)==="true"&&(e.classList.remove("is-invalid"),e.removeAttribute(w))}function g(e){e.getAttribute(L)==="true"&&(e.classList.remove("is-valid"),e.removeAttribute(L))}function le(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 ce(e){(v(e)?y(e):[e]).forEach(t=>{t.classList.add("is-invalid"),t.setAttribute(w,"true")})}function Ve(e){(v(e)?y(e):[e]).forEach(t=>{T(t)})}function de(e,n){const t=e.nextElementSibling;if(t instanceof HTMLElement&&t.getAttribute(h)==="true")return t.className=B(n),t;const o=document.createElement("div");return o.className=B(n),o.setAttribute(p,"true"),o.setAttribute(h,"true"),e.insertAdjacentElement("afterend",o),o}function je(e,n){const t=v(e)?U(e):R(e);if(!t)return de(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(h,"true"),t.appendChild(r),r}function Je(e,n){const t=se(e);if(t)return t.className=le(n),t;const o=document.createElement("div");return o.className=le(n),o.setAttribute("role","alert"),o.setAttribute(p,"true"),o.setAttribute(h,"true"),e.insertAdjacentElement("afterbegin",o),o}function Xe(e,n){return(S(e)?Ge(e):M(e)?ae(e):Ke(e)).appendChild(ie(document,n)),S(e)?ce(e):M(e)&&(e.classList.add("is-invalid"),e.setAttribute(w,"true")),Promise.resolve()}function Qe(e,n,t){if((S(e)?je(e,t):M(e)?de(e,t):Je(e,t)).appendChild(ie(document,n)),S(e)){const r=v(e)?y(e):[e];t==="success"?r.forEach(i=>{T(i),i.classList.add("is-valid"),i.setAttribute(L,"true")}):!t||t==="error"?(r.forEach(i=>g(i)),ce(e)):r.forEach(i=>{g(i),T(i)})}else M(e)&&(t==="success"?(T(e),e.classList.add("is-valid"),e.setAttribute(L,"true")):!t||t==="error"?(g(e),e.classList.add("is-invalid"),e.setAttribute(w,"true")):(g(e),T(e)));return Promise.resolve()}function ue(e){if(S(e)){const r=v(e)?U(e):R(e);(r?H(r):void 0)?.remove(),Ve(e),(v(e)?y(e):[e]).forEach(a=>g(a))}else if(M(e)){const r=e.nextElementSibling;r instanceof HTMLElement&&r.getAttribute(h)==="true"&&r.remove(),T(e),g(e)}return e.querySelectorAll(`[${h}="true"]`).forEach(r=>{r.remove()}),e.querySelectorAll(`[${w}="true"]`).forEach(r=>{T(r)}),e.querySelectorAll(`[${L}="true"]`).forEach(r=>{g(r)}),Promise.resolve()}const F=new WeakSet;let _=!1,z;const fe=e=>{e.target instanceof HTMLElement&&F.add(e.target)},me=e=>{e.target instanceof HTMLElement&&F.delete(e.target)};function Ye(e=document){_||(_=!0,z=e,e.addEventListener("show.bs.modal",fe),e.addEventListener("shown.bs.modal",me))}function Ze(e=z??document){_&&(_=!1,e.removeEventListener("show.bs.modal",fe),e.removeEventListener("shown.bs.modal",me),z=void 0)}function be(e){return e.classList.contains("modal")?e:e.closest(".modal")}function he(e){e.tabIndex<0&&(e.tabIndex=-1),e.hasAttribute("aria-hidden")||e.setAttribute("aria-hidden","true")}function et(e,n){const t=be(e);if(!t)return Promise.reject(new Error('No ancestor ".modal" element was found for the target.'));he(t),ue(t);const o=k(t,void 0,n.bootstrap);return o?(o.show(),Promise.resolve()):Promise.reject(new Error("Bootstrap Modal is unavailable."))}function tt(e,n){const t=be(e);if(!t)return Promise.reject(new Error('No ancestor ".modal" element was found for the target.'));he(t);const o=k(t,void 0,n.bootstrap);return o?F.has(t)?(t.addEventListener("shown.bs.modal",()=>{o.hide()},{once:!0}),Promise.resolve()):(o.hide(),Promise.resolve()):Promise.reject(new Error("Bootstrap Modal is unavailable."))}const Ee="data-haori-toast-container",nt="data-haori-toast",ot="data-haori-toast-level",rt="data-haori-toast-accent",it="data-haori-toast-dismiss",pe={"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 st(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,n){if(n.toastContainerSelector){const t=e.querySelector(n.toastContainerSelector);if(t)return t}return e.body}function lt(e,n){const t=at(e,n),o=pe[n.toastPosition??"bottom-end"],r=t.querySelector(`[${Ee}="true"]`);if(r){const c=Object.values(pe).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(Ee,"true"),t.appendChild(i),i}function ct(e,n,t){const o=globalThis.document,r=st(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(nt,"true"),i.setAttribute(ot,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(rt,"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(it,"true"),c.appendChild(a),c.appendChild(f),c.appendChild(l),i.appendChild(c),lt(o,t).appendChild(i);const m=t.toastDelay!==void 0?{delay:t.toastDelay}:void 0,d=De(i,m,t.bootstrap);if(!d)return i.remove(),Promise.reject(new Error("Bootstrap Toast is unavailable."));l.addEventListener("click",()=>{d.hide?.()}),i.addEventListener("hidden.bs.toast",()=>{i.remove(),d.dispose?.()},{once:!0});try{return d.show(),Promise.resolve()}catch(b){return i.remove(),d.dispose?.(),Promise.reject(b)}}let u={options:{fallbackToNative:!0}};function C(e){return e?String(e).replace(/\\n/g,`
2
- `):""}function ve(){return globalThis.window}function W(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 Te(e){const n=C(e),t=D("dialog");if(t)return W(t(n));const o=ve();return u.options.fallbackToNative&&typeof o?.alert=="function"?(o.alert(n),Promise.resolve()):(P("dialog"),Promise.resolve())}function ge(e){const n=C(e),t=D("confirm");if(t)return Promise.resolve(t(n)).then(r=>!!r);const o=ve();return u.options.fallbackToNative&&typeof o?.confirm=="function"?Promise.resolve(o.confirm(n)):(P("confirm"),Promise.resolve(!1))}function Ae(e,n){const t=C(e),o=D("toast");return o?W(o(t,n)):(P("toast"),Promise.resolve())}function x(e,n){const t=D(e);return t?W(t(n)):(P(e),Promise.resolve())}function dt(e){u=e}class we{static dialog(n){const t=C(n);return N(u.options.bootstrap)?Fe(t,u.options).catch(()=>Te(t)):Te(t)}static confirm(n){const t=C(n);return N(u.options.bootstrap)?ze(t,u.options).catch(()=>ge(t)):ge(t)}static toast(n,t){const o=C(n);return _e(u.options.bootstrap)?ct(o,t,u.options).catch(()=>Ae(o,t)):Ae(o,t)}static openDialog(n){return N(u.options.bootstrap)?et(n,u.options).catch(()=>x("openDialog",n)):x("openDialog",n)}static closeDialog(n){return N(u.options.bootstrap)?tt(n,u.options).catch(()=>x("closeDialog",n)):x("closeDialog",n)}static addErrorMessage(n,t){return Xe(n,t)}static addMessage(n,t,o){return Qe(n,t,o)}static clearMessages(n){return ue(n)}}const ut="haori-bootstrap:collapse:",O="data-haori-persist";let q=!1,$,G;function Ce(e){return ut+e}function ft(e){try{const n=window.sessionStorage.getItem(Ce(e));return n==="shown"||n==="hidden"?n:void 0}catch{return}}function mt(e,n){try{window.sessionStorage.setItem(Ce(e),n)}catch{}}function Le(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 Se(e){const n=e.getAttribute(O);if(!n)return;const t=ft(n);if(!t)return;const o=e.classList.contains("show");t==="shown"&&!o?(e.classList.add("show"),Le(e,!0)):t==="hidden"&&o&&(e.classList.remove("show"),Le(e,!1))}function Me(e){e instanceof HTMLElement&&e.hasAttribute(O)&&Se(e),e.querySelectorAll(`[${O}]`).forEach(Se)}function ye(e,n){const t=e.target;if(!(t instanceof HTMLElement))return;const o=t.getAttribute(O);o&&mt(o,n)}const Ie=e=>ye(e,"shown"),Ne=e=>ye(e,"hidden");function bt(e=document){if(q)return;q=!0,G=e,e.addEventListener("shown.bs.collapse",Ie),e.addEventListener("hidden.bs.collapse",Ne);const n=()=>{Me(e),$=new MutationObserver(t=>{for(const o of t)o.addedNodes.forEach(r=>{r instanceof HTMLElement&&Me(r)})}),e.body&&$.observe(e.body,{childList:!0,subtree:!0})};e.body?n():e.addEventListener("DOMContentLoaded",n,{once:!0})}function ht(e=G??document){q&&(q=!1,e.removeEventListener("shown.bs.collapse",Ie),e.removeEventListener("hidden.bs.collapse",Ne),$?.disconnect(),$=void 0,G=void 0)}const Et=[{attribute:"dialog-ok-label",apply:(e,n)=>{e.dialogOkLabel=n}},{attribute:"dialog-cancel-label",apply:(e,n)=>{e.dialogCancelLabel=n}}],pt=typeof document<"u"&&document.currentScript instanceof HTMLScriptElement?document.currentScript:null;function K(e,n){const t=e?.getAttribute(n)??null;if(!(t===null||t.trim()===""))return t}function vt(e=typeof document>"u"?null:document,n=pt){const t={};for(const{attribute:o,apply:r}of Et){const i=K(n,`data-${o}`)??K(e?.documentElement??null,`data-haori-${o}`)??K(e?.body??null,`data-haori-${o}`);i!==void 0&&r(t,i)}return t}const V={fallbackToNative:!0},ke=new Set(["dialog","confirm","toast","openDialog","closeDialog","addErrorMessage","addMessage","clearMessages"]);function Tt(e){const n=we;return new Proxy(e,{get(t,o,r){return typeof o=="string"&&ke.has(o)?n[o]:Reflect.get(t,o,r)},has(t,o){return typeof o=="string"&&ke.has(o)?!0:Reflect.has(t,o)}})}const s={installed:!1,options:V};function j(){return globalThis.window}function gt(e,n){const t=vt();return{bootstrap:e.bootstrap??n?.bootstrap,fallbackToNative:e.fallbackToNative??V.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,dialogOkLabel:e.dialogOkLabel??s.options.dialogOkLabel??t.dialogOkLabel,dialogCancelLabel:e.dialogCancelLabel??s.options.dialogCancelLabel??t.dialogCancelLabel,toastPosition:e.toastPosition??s.options.toastPosition,toastDelay:e.toastDelay??s.options.toastDelay}}function He(e=j()){return!!(e?.Haori&&e.bootstrap)}function Re(e={}){const n=j();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=gt(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 設定は無視されます。")}dt({originalHaori:s.originalHaori,options:s.options}),n.Haori=Tt(s.originalHaori),bt(),Ye(),s.installed=!0}function At(){const e=j();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,ht(),Ze(),s.installed=!1,s.originalHaori=void 0,s.originalRuntime=void 0,s.options=V}function wt(){return s.installed}const Be="__haoriJsBootstrapAutoEnabled__";function Ct(){return globalThis.window}function Lt(e){return!!e[Be]}function St(e){e[Be]=!0}function Mt(){const e=Ct();if(!(!e||Lt(e))){if(!He(e)){console.warn("[haori-bootstrap] Auto-enable skipped because window.Haori or window.bootstrap is missing.");return}try{Re({bootstrap:e.bootstrap}),St(e)}catch(n){console.warn("[haori-bootstrap] Auto-enable failed.",n)}}}Mt();const yt="0.5.52";return E.BootstrapHaori=we,E.hasAutoEnablePrerequisites=He,E.install=Re,E.isInstalled=wt,E.uninstall=At,E.version=yt,Object.defineProperty(E,Symbol.toStringTag,{value:"Module"}),E})({});
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.54";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