haori-bootstrap 0.5.28 → 0.5.30

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.28
5
+ Version: 0.5.30
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.44.0/dist/haori.iife.js"></script>
44
+ <script src="https://cdn.jsdelivr.net/npm/haori@0.45.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.28/dist/haori-bootstrap.iife.js"></script>
46
+ <script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.5.30/dist/haori-bootstrap.iife.js"></script>
47
47
  ```
48
48
 
49
49
  IIFE 版は、window.Haori と window.bootstrap が利用可能な場合に自動で有効化されます。
@@ -246,25 +246,23 @@ push 後に、そのタグから GitHub Release を published にします。公
246
246
  次回 patch リリースの例:
247
247
 
248
248
  ```bash
249
- # version が 0.5.29 になる
249
+ # version が 0.5.31 になる
250
250
  npm version patch
251
251
  git push origin main --follow-tags
252
252
  ```
253
253
 
254
- その後、push 済みタグの GitHub Release を作成して published にします。例として次回は `0.5.29` タグになります。
254
+ その後、push 済みタグの GitHub Release を作成して published にします。例として次回は `0.5.31` タグになります。
255
255
 
256
256
  自動公開:
257
257
 
258
258
  - `npm version patch` で、src/index.ts の公開用 `version` 定数、README の例、CDN デモ、Playwright の CDN 確認も package.json と同期されます。
259
- - publish-on-release.yml がパッケージを build し、npm publish を実行します。
259
+ - publish-on-release.yml がパッケージを build し、npm の Trusted Publishing(OIDC)で npm publish を実行します。出自証明(provenance)が自動で付きます。
260
260
  - release-archive.yml が dist/ を build し、dist.zip を同じ GitHub Release へ添付します。
261
261
 
262
262
  初回公開のみ:
263
263
 
264
264
  - current version が未公開の場合は、`npm version patch` を実行せず、対象 version のタグをそのまま作成して push します。
265
- - npm アカウント上で `Read and write` 権限の granular access token を作成し、リポジトリシークレット `NPM_TOKEN` として登録します。
266
- - npm アカウントで 2FA を有効化している場合は、write 操作用の bypass 2FA を有効にした token を使います。
267
- - `NPM_TOKEN` の作成に、パッケージの事前公開は不要です。
265
+ - npm のパッケージ設定で、この repository `publish-on-release.yml` Trusted Publisher として登録します(認証は OIDC で行うため、長期トークンは使いません)。
268
266
 
269
267
  名称変更後の初回 `0.3.1` 公開の例:
270
268
 
@@ -277,7 +275,7 @@ git push origin 0.3.1
277
275
  初回公開チェックリスト:
278
276
 
279
277
  1. npm 上で `haori-bootstrap` の名前が空いていることを確認する。
280
- 2. `NPM_TOKEN` を作成して GitHub repository secrets に登録する。
278
+ 2. npm のパッケージ設定で Trusted Publisher(この repository `publish-on-release.yml`)を登録する。
281
279
  3. ローカル確認と `npm pack --dry-run` を実行する。
282
280
  4. リリースタグを push する。
283
281
  5. そのタグから GitHub Release を published にする。
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.28
5
+ Version: 0.5.30
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.44.0/dist/haori.iife.js"></script>
44
+ <script src="https://cdn.jsdelivr.net/npm/haori@0.45.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.28/dist/haori-bootstrap.iife.js"></script>
46
+ <script src="https://cdn.jsdelivr.net/npm/haori-bootstrap@0.5.30/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.
@@ -243,28 +243,26 @@ git push origin main --follow-tags
243
243
 
244
244
  After pushing, publish a GitHub Release from the generated version tag. The release workflow then publishes the package and uploads `dist.zip` automatically.
245
245
 
246
- Example next patch release after `0.5.28`:
246
+ Example next patch release after `0.5.30`:
247
247
 
248
248
  ```bash
249
- # version becomes 0.5.29
249
+ # version becomes 0.5.31
250
250
  npm version patch
251
251
  git push origin main --follow-tags
252
252
  ```
253
253
 
254
- Create and publish the GitHub Release for the pushed tag such as `0.5.29`.
254
+ Create and publish the GitHub Release for the pushed tag such as `0.5.31`.
255
255
 
256
256
  Release automation:
257
257
 
258
258
  - `npm version patch` also keeps the exported `version` constant, README examples, CDN demo, and Playwright CDN checks in sync.
259
- - publish-on-release.yml builds the package and runs npm publish.
259
+ - publish-on-release.yml builds the package and runs npm publish with npm trusted publishing (OIDC), which also attaches provenance.
260
260
  - release-archive.yml builds dist/ and uploads dist.zip to the same GitHub Release.
261
261
 
262
262
  First release only:
263
263
 
264
264
  - If the current version is not published yet, skip `npm version patch` and create/push the tag for that version directly.
265
- - Create a granular npm access token with `Read and write` permission and register it as the repository secret `NPM_TOKEN`.
266
- - If npm account 2FA is enabled, create the token with bypass 2FA for write actions.
267
- - The package does not need to be published already to create `NPM_TOKEN`.
265
+ - Register this repository and `publish-on-release.yml` as a trusted publisher in the npm package settings. Authentication uses OIDC, so no long-lived token is needed.
268
266
 
269
267
  Example for the first `0.3.1` release after the package rename:
270
268
 
@@ -277,7 +275,7 @@ git push origin 0.3.1
277
275
  First release checklist:
278
276
 
279
277
  1. Confirm the npm package name `haori-bootstrap` is still available.
280
- 2. Create and register `NPM_TOKEN` in GitHub repository secrets.
278
+ 2. Register the trusted publisher (this repository and `publish-on-release.yml`) in the npm package settings.
281
279
  3. Run local verification and `npm pack --dry-run`.
282
280
  4. Push the release tag.
283
281
  5. Publish a GitHub Release from that tag.
@@ -1,3 +1,3 @@
1
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,s=e.createElement("div");s.className="modal fade",s.tabIndex=-1,s.setAttribute(t?xe:Pe,"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-${++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),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(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),s.appendChild(c),s}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((s,c)=>{const a=()=>{o.removeEventListener("shown.bs.modal",m),o.removeEventListener("hidden.bs.modal",f),o.remove(),r.dispose?.(),s()},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((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=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 se(e,n){const t=e.createElement("div");return t.setAttribute(p,"true"),t.textContent=n,t}function ie(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=ie(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=ie(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(se(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(se(document,n)),S(e)){const r=v(e)?y(e):[e];t==="success"?r.forEach(s=>{T(s),s.classList.add("is-valid"),s.setAttribute(L,"true")}):!t||t==="error"?(r.forEach(s=>g(s)),ce(e)):r.forEach(s=>{g(s),T(s)})}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",st="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 it(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 s=e.createElement("div");return s.className=`toast-container position-fixed ${o} p-3`,s.setAttribute(Ee,"true"),t.appendChild(s),s}function ct(e,n,t){const o=globalThis.document,r=it(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(nt,"true"),s.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(st,"true"),c.appendChild(a),c.appendChild(f),c.appendChild(l),s.appendChild(c),lt(o,t).appendChild(s);const m=t.toastDelay!==void 0?{delay:t.toastDelay}:void 0,d=De(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 C(e){return 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(s=>{s.setAttribute("aria-expanded",n?"true":"false"),s.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 s=K(n,`data-${o}`)??K(e?.documentElement??null,`data-haori-${o}`)??K(e?.body??null,`data-haori-${o}`);s!==void 0&&r(t,s)}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 i={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??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 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(i.originalHaori||(i.originalHaori=n.Haori,i.originalRuntime=n.Haori.runtime),i.options=gt(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 設定は無視されます。")}dt({originalHaori:i.originalHaori,options:i.options}),n.Haori=Tt(i.originalHaori),bt(),Ye(),i.installed=!0}function At(){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,ht(),Ze(),i.installed=!1,i.originalHaori=void 0,i.originalRuntime=void 0,i.options=V}function wt(){return i.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.28";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})({});
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(s=>{s.setAttribute("aria-expanded",n?"true":"false"),s.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 s=K(n,`data-${o}`)??K(e?.documentElement??null,`data-haori-${o}`)??K(e?.body??null,`data-haori-${o}`);s!==void 0&&r(t,s)}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 i={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??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 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(i.originalHaori||(i.originalHaori=n.Haori,i.originalRuntime=n.Haori.runtime),i.options=gt(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 設定は無視されます。")}dt({originalHaori:i.originalHaori,options:i.options}),n.Haori=Tt(i.originalHaori),bt(),Ye(),i.installed=!0}function At(){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,ht(),Ze(),i.installed=!1,i.originalHaori=void 0,i.originalRuntime=void 0,i.options=V}function wt(){return i.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.30";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})({});
3
3
  //# sourceMappingURL=haori-bootstrap.iife.js.map