kerfjs 5.0.0-beta.7 → 5.0.0-beta.71
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/CHANGELOG.md +2488 -117
- package/README.md +96 -37
- package/ai/cursorrules +110 -61
- package/ai/manifest.json +16 -7
- package/ai/skill.md +120 -75
- package/dist/actions.d.ts +1 -1
- package/dist/actions.js +10 -6
- package/dist/actions.js.map +1 -1
- package/dist/array-signal.js +1 -1
- package/dist/async.js +22 -19
- package/dist/async.js.map +1 -1
- package/dist/attach.js +1 -66
- package/dist/attach.js.map +1 -1
- package/dist/{chunk-HW7KSM2Y.js → chunk-3C6F6NM4.js} +1 -1
- package/dist/{chunk-HW7KSM2Y.js.map → chunk-3C6F6NM4.js.map} +1 -1
- package/dist/{chunk-GY4XV2UV.js → chunk-4TX6YJDM.js} +10 -3
- package/dist/chunk-4TX6YJDM.js.map +1 -0
- package/dist/{chunk-QIP723L4.js → chunk-5WRGJZV6.js} +3 -2
- package/dist/chunk-5WRGJZV6.js.map +1 -0
- package/dist/{chunk-KZJXHFIB.js → chunk-BI4HGICV.js} +3 -3
- package/dist/chunk-BI4HGICV.js.map +1 -0
- package/dist/chunk-FM6N2B4N.js +70 -0
- package/dist/chunk-FM6N2B4N.js.map +1 -0
- package/dist/{chunk-LVH3GC6B.js → chunk-H7WTRM6F.js} +3 -3
- package/dist/chunk-H7WTRM6F.js.map +1 -0
- package/dist/{chunk-U6FK33SG.js → chunk-IHMDBBUJ.js} +2 -2
- package/dist/chunk-IHMDBBUJ.js.map +1 -0
- package/dist/chunk-JN7EJM3B.js +86 -0
- package/dist/chunk-JN7EJM3B.js.map +1 -0
- package/dist/{chunk-UZJ6I4T6.js → chunk-MK42GLPV.js} +1 -1
- package/dist/chunk-MK42GLPV.js.map +1 -0
- package/dist/{chunk-SVATPF5R.js → chunk-TLL3KXT6.js} +249 -160
- package/dist/chunk-TLL3KXT6.js.map +1 -0
- package/dist/{chunk-ZDCJZCNO.js → chunk-UGNPDLNI.js} +78 -45
- package/dist/chunk-UGNPDLNI.js.map +1 -0
- package/dist/{chunk-V46JKE44.js → chunk-WKIPLNVO.js} +1 -1
- package/dist/chunk-WKIPLNVO.js.map +1 -0
- package/dist/{delegate-CL9VTZFb.d.ts → delegate--CrfgYtC.d.ts} +0 -34
- package/dist/dev.d.ts +31 -13
- package/dist/dev.js +101 -35
- package/dist/dev.js.map +1 -1
- package/dist/html.js +5 -4
- package/dist/html.js.map +1 -1
- package/dist/index.d.ts +14 -9
- package/dist/index.js +29 -20
- package/dist/index.js.map +1 -1
- package/dist/jsx-runtime.d.ts +13 -5
- package/dist/jsx-runtime.js +1 -1
- package/dist/list.d.ts +7 -3
- package/dist/list.js +126 -28
- package/dist/list.js.map +1 -1
- package/dist/overlay.d.ts +25 -28
- package/dist/overlay.js +580 -275
- package/dist/overlay.js.map +1 -1
- package/dist/remount.js +2 -2
- package/dist/router.d.ts +13 -4
- package/dist/router.js +37 -10
- package/dist/router.js.map +1 -1
- package/dist/scope.d.ts +35 -8
- package/dist/scope.js +61 -30
- package/dist/scope.js.map +1 -1
- package/dist/testing.js +1 -1
- package/dist/timing.d.ts +3 -2
- package/dist/timing.js +1 -1
- package/dist/timing.js.map +1 -1
- package/llms.txt +11 -4
- package/package.json +32 -7
- package/setup/cli.mjs +90 -0
- package/setup/index.d.mts +37 -0
- package/setup/index.mjs +1347 -0
- package/setup/jsonc.mjs +201 -0
- package/setup/state.schema.json +56 -0
- package/dist/chunk-GY4XV2UV.js.map +0 -1
- package/dist/chunk-KPXIOG2C.js +0 -54
- package/dist/chunk-KPXIOG2C.js.map +0 -1
- package/dist/chunk-KZJXHFIB.js.map +0 -1
- package/dist/chunk-LVH3GC6B.js.map +0 -1
- package/dist/chunk-QIP723L4.js.map +0 -1
- package/dist/chunk-SVATPF5R.js.map +0 -1
- package/dist/chunk-U6FK33SG.js.map +0 -1
- package/dist/chunk-UZJ6I4T6.js.map +0 -1
- package/dist/chunk-V46JKE44.js.map +0 -1
- package/dist/chunk-ZDCJZCNO.js.map +0 -1
package/dist/overlay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/overlay-position.ts","../src/overlay-core.ts","../src/overlay-choice.ts","../src/overlay-confirm.ts","../src/overlay-form.ts","../src/overlay-prompt.ts","../src/overlay-toast.ts"],"names":["document","options"],"mappings":";;;;;;;;;;AA8BO,SAAS,gBAAA,CAAiB,EAAA,EAAiB,MAAA,EAAiB,OAAA,GAAiC,EAAC,EAAS;AAC5G,EAAA,MAAM,EAAE,SAAA,GAAY,QAAA,EAAU,QAAQ,OAAA,EAAS,GAAA,GAAM,GAAE,GAAI,OAAA;AAK3D,EAAA,EAAA,CAAG,MAAM,QAAA,GAAW,OAAA;AACpB,EAAA,EAAA,CAAG,MAAM,MAAA,GAAS,GAAA;AAClB,EAAA,MAAM,UAAA,GAAa,OAAO,qBAAA,EAAsB;AAChD,EAAA,MAAM,WAAA,GAAc,GAAG,qBAAA,EAAsB;AAC7C,EAAA,MAAM,gBAAgB,MAAA,CAAO,UAAA;AAC7B,EAAA,MAAM,iBAAiB,MAAA,CAAO,WAAA;AAG9B,EAAA,MAAM,QAAA,GAAW,WAAW,MAAA,GAAS,GAAA;AACrC,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,GAAM,GAAA,GAAM,WAAA,CAAY,MAAA;AACpD,EAAA,IAAI,QAAQ,SAAA,KAAc,KAAA;AAC1B,EAAA,IAAI,SAAS,QAAA,GAAW,WAAA,CAAY,SAAS,cAAA,IAAkB,QAAA,IAAY,GAAG,KAAA,GAAQ,KAAA;AAAA,OAAA,IAC7E,CAAC,SAAS,QAAA,GAAW,CAAA,IAAK,WAAW,WAAA,CAAY,MAAA,IAAU,gBAAgB,KAAA,GAAQ,IAAA;AAG5F,EAAA,IAAI,OAAO,KAAA,KAAU,KAAA,GAAQ,WAAW,KAAA,GAAQ,WAAA,CAAY,QAAQ,UAAA,CAAW,IAAA;AAC/E,EAAA,IAAA,GAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,EAAM,aAAA,GAAgB,WAAA,CAAY,KAAK,CAAC,CAAA;AAEpE,EAAA,EAAA,CAAG,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AACvB,EAAA,EAAA,CAAG,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,KAAA,GAAQ,WAAW,QAAQ,CAAA,EAAA,CAAA;AAC/C;AAQO,SAAS,cAAA,CAAe,EAAA,EAAiB,MAAA,EAAiB,OAAA,GAAiC,EAAC,EAAe;AAChH,EAAA,MAAM,UAAA,GAAa,MAAY,gBAAA,CAAiB,EAAA,EAAI,QAAQ,OAAO,CAAA;AACnE,EAAA,UAAA,EAAW;AACX,EAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,UAAA,EAAY,IAAI,CAAA;AAClD,EAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,UAAU,CAAA;AAC5C,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,UAAA,EAAY,IAAI,CAAA;AACrD,IAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,UAAU,CAAA;AAAA,EACjD,CAAA;AACF;;;ACiBA,IAAM,SAAA,GACJ,iLAAA;AAIF,SAAS,UAAU,IAAA,EAA8B;AAC/C,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,gBAAA,CAA8B,SAAS,CAAC,CAAA,CAAE,MAAA;AAAA,IACtE,CAAC,OAAO,CAAC,EAAA,CAAG,aAAa,QAAQ,CAAA,IAAK,GAAG,QAAA,IAAY;AAAA,GACvD;AAKA,EAAA,KAAA,MAAW,EAAA,IAAM,OAAO,IAAI,CAAC,GAAG,YAAA,CAAa,UAAU,CAAA,EAAG,EAAA,CAAG,QAAA,GAAW,CAAA;AACxE,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,cAAA,GAA0B;AACjC,EAAA,OAAO,OAAO,iBAAA,KAAsB,WAAA,IAC/B,OAAO,iBAAA,CAAkB,UAAU,SAAA,KAAc,UAAA;AACxD;AACA,SAAS,eAAA,GAA2B;AAClC,EAAA,OAAO,OAAO,WAAA,KAAgB,WAAA,IACzB,OAAO,WAAA,CAAY,UAAU,WAAA,KAAgB,UAAA;AACpD;AAEA,IAAM,sBAAA,0BAAgC,2BAA2B,CAAA;AAKjE,SAAS,qBAAqB,OAAA,EAAqC;AACjE,EAAA,MAAMA,YAAW,OAAA,CAAQ,aAAA;AACzB,EAAA,OAAOA,SAAAA,CAAS,sBAAsB,CAAA,KAAM,EAAC;AAC/C;AAQO,SAAS,OAAA,CAAQ,OAAA,EAAyB,OAAA,GAA0B,EAAC,EAAkB;AAC5F,EAAA,MAAM;AAAA,IACJ,YAAY,QAAA,CAAS,IAAA;AAAA,IACrB,SAAA,GAAY,cAAA;AAAA,IACZ,OAAA,GAAU,CAAC,QAAA,EAAU,UAAU,CAAA;AAAA,IAC/B,YAAA,GAAe,IAAA;AAAA,IACf,IAAA,GAAO,IAAA;AAAA,IACP,IAAA,GAAO,QAAA;AAAA,IACP,SAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA,GAAS;AAAA,GACX,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAA,GACJ,OAAA,KAAY,KAAA,GAAQ,EAAC,GAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAA,GAAU,CAAC,OAAO,CAAA;AACtE,EAAA,MAAM,YAAY,QAAA,CAAS,aAAA;AAM3B,EAAA,MAAM,SAAA,GAAY,MAAA,IAAU,IAAA,IAAQ,cAAA,EAAe;AACnD,EAAA,MAAM,UAAA,GAAa,MAAA,IAAU,CAAC,IAAA,IAAQ,eAAA,EAAgB;AAEtD,EAAA,MAAM,OAAA,GAAuB,YAAY,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,GAAI,QAAA,CAAS,cAAc,KAAK,CAAA;AACxG,EAAA,OAAA,CAAQ,SAAA,GAAY,SAAA;AACpB,EAAA,IAAI,UAAA,EAAY,OAAA,CAAQ,YAAA,CAAa,SAAA,EAAW,QAAQ,CAAA;AAGxD,EAAA,IAAI,IAAA,IAAQ,CAAC,SAAA,EAAW;AACtB,IAAA,OAAA,CAAQ,YAAA,CAAa,QAAQ,IAAI,CAAA;AACjC,IAAA,OAAA,CAAQ,YAAA,CAAa,cAAc,MAAM,CAAA;AAAA,EAC3C;AACA,EAAA,SAAA,CAAU,YAAY,OAAO,CAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,CAAC,SAAA,IAAa,CAAC,UAAA;AAChC,EAAA,MAAM,aAAA,GAAgB,QAAA,GAAW,oBAAA,CAAqB,OAAO,CAAA,GAAI,MAAA;AAEjE,EAAA,MAAM,iBAAA,GAAoB,MACxB,aAAA,KAAkB,MAAA,IAAa,cAAc,aAAA,CAAc,MAAA,GAAS,CAAC,CAAA,KAAM,OAAA;AAE7E,EAAA,MAAM,YAAA,GAAe,MAAM,OAAA,EAAS,OAAO,YAAY,UAAA,GAAa,OAAA,GAAU,MAAM,OAAO,CAAA;AAC3F,EAAA,aAAA,EAAe,KAAK,OAAO,CAAA;AAK3B,EAAA,IAAI,YAAA,GAAe,KAAA;AACnB,EAAA,IAAI,SAAA,EAAW;AACb,IAAC,QAA8B,SAAA,EAAU;AACzC,IAAA,YAAA,GAAe,IAAA;AAAA,EACjB,WAAW,UAAA,EAAY;AACrB,IAAC,QAAkD,WAAA,EAAY;AAI/D,IAAA,OAAA,CAAQ,MAAM,KAAA,GAAQ,MAAA;AACtB,IAAA,YAAA,GAAe,IAAA;AAAA,EACjB;AAEA,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,YAAoD,EAAC;AAC3D,EAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAiB,CAAC,OAAA,KAAY;AAC/C,IAAA,SAAA,CAAU,OAAA,GAAU,OAAA;AAAA,EACtB,CAAC,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,EAAQ,KAAA,EAAM;AAE9B,EAAA,SAAS,MAAM,KAAA,EAAuB;AACpC,IAAA,IAAI,MAAM,MAAA,EAAQ;AAClB,IAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AACf,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,MAAA,MAAM,UAAA,GAAa,aAAA,CAAc,OAAA,CAAQ,OAAO,CAAA;AAChD,MAAA,IAAI,UAAA,KAAe,EAAA,EAAI,aAAA,CAAc,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA,IAC3D;AACA,IAAA,KAAA,MAAW,MAAA,IAAU,UAAU,MAAA,EAAO;AACtC,IAAA,YAAA,EAAa;AAIb,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,GAAe,KAAA;AACf,MAAA,IAAI,SAAA,EAAY,OAAA,CAA8B,KAAA,EAAM;AAAA,WAC9C,QAAkD,WAAA,EAAY;AAAA,IACtE;AACA,IAAA,OAAA,CAAQ,MAAA,EAAO;AACf,IAAA,IAAI,SAAA,YAAqB,WAAA,IAAe,SAAA,CAAU,WAAA,YAAuB,KAAA,EAAM;AAC/E,IAAA,SAAA,CAAU,UAAU,KAAK,CAAA;AAAA,EAC3B;AAEA,EAAA,SAAS,WAAA,GAAoB;AAC3B,IAAA,SAAA,IAAY;AACZ,IAAA,KAAA,EAAM;AAAA,EACR;AAEA,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA;AAC7C,EAAA,IAAI,SAAA,EAAW;AAIb,IAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAuB;AACvC,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,YAAY,WAAA,EAAY;AAAA,IAC9B,CAAA;AACA,IAAA,OAAA,CAAQ,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AAC3C,IAAA,QAAA,CAAS,KAAK,MAAM,OAAA,CAAQ,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,EACrE,CAAA,MAAA,IAAW,cAAc,IAAA,EAAM;AAC7B,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAA+B;AAChD,MAAA,IAAI,CAAC,mBAAkB,EAAG;AAC1B,MAAA,IAAI,UAAA,IAAc,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU;AACxC,QAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,QAAA,WAAA,EAAY;AACZ,QAAA;AAAA,MACF;AACA,MAAA,IAAI,IAAA,IAAQ,KAAA,CAAM,GAAA,KAAQ,KAAA,EAAO;AAC/B,QAAA,MAAM,KAAA,GAAQ,UAAU,OAAO,CAAA;AAC/B,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA;AAAA,QACF;AACA,QAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,QAAA,MAAM,SAAS,QAAA,CAAS,aAAA;AACxB,QAAA,MAAM,OAAA,GAAU,CAAC,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA;AACxC,QAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,KAAW,KAAA,IAAS,OAAA,CAAA,EAAU;AACnD,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,IAAA,CAAK,KAAA,EAAM;AAAA,QACb,WAAW,CAAC,KAAA,CAAM,QAAA,KAAa,MAAA,KAAW,QAAQ,OAAA,CAAA,EAAU;AAC1D,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,KAAA,CAAM,KAAA,EAAM;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,SAAA,EAAW,IAAI,CAAA;AACpD,IAAA,QAAA,CAAS,KAAK,MAAM,QAAA,CAAS,oBAAoB,SAAA,EAAW,SAAA,EAAW,IAAI,CAAC,CAAA;AAAA,EAC9E;AAEA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EAAG;AACjC,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAuB;AACtC,MAAA,IAAI,CAAC,mBAAkB,EAAG;AAC1B,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,OAAA,EAAS,WAAA,EAAY;AAAA,IAC5C,CAAA;AACA,IAAA,OAAA,CAAQ,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACzC,IAAA,QAAA,CAAS,KAAK,MAAM,OAAA,CAAQ,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AAChC,IAAA,MAAM,MAAA,GAAS,aAAA,KAAkB,MAAA,GAC7B,EAAC,GACD,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,GAAI,aAAA,GAAgB,CAAC,aAAa,CAAA;AAGjE,IAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAuB;AACzC,MAAA,IAAI,CAAC,mBAAkB,EAAG;AAC1B,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,IAAI,WAAW,IAAA,EAAM;AACrB,MAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9B,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,KAAO,UAAU,EAAA,CAAG,QAAA,CAAS,MAAM,CAAC,CAAA,EAAG;AAC/D,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,UAAA,EAAY,IAAI,CAAA;AACnD,IAAA,QAAA,CAAS,KAAK,MAAM,QAAA,CAAS,oBAAoB,OAAA,EAAS,UAAA,EAAY,IAAI,CAAC,CAAA;AAAA,EAC7E;AAEA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,MAAA,OAAA,CAAQ,aAAA,CAA2B,YAAY,CAAA,EAAG,KAAA,EAAM;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAO,CAAA,CAAE,CAAC,CAAA;AAClC,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,KAAA,CAAM,KAAA,EAAM;AAAA,MACd,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,QAAA,GAAW,EAAA;AACnB,QAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,MAAA,EAAO;AACtC;AAmDO,SAAS,OAAA,CACd,MAAA,EACA,OAAA,EACA,OAAA,GAA0B,EAAC,EACZ;AACf,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,SAAA,GAAY,cAAA;AAAA,IACZ,SAAA,GAAY,QAAA;AAAA,IACZ,KAAA,GAAQ,OAAA;AAAA,IACR,GAAA,GAAM,CAAA;AAAA,IACN,OAAA,GAAU,CAAC,SAAS,CAAA;AAAA,IACpB,YAAA,GAAe,KAAA;AAAA,IACf,aAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA,GAAS;AAAA,GACX,GAAI,OAAA;AAEJ,EAAA,MAAM,WAAA,GAAc,aAAA,KAAkB,MAAA,GAClC,KACA,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,GAAI,CAAC,GAAG,aAAa,CAAA,GAAI,CAAC,aAAa,CAAA;AAEtE,EAAA,MAAM,MAAA,GAAS,QAAQ,OAAA,EAAS;AAAA,IAC9B,SAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA,EAAM,KAAA;AAAA,IACN,YAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA,EAAe,CAAC,MAAA,EAAQ,GAAG,WAAW,CAAA;AAAA,IACtC;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,cAAA,GAAiB,eAAe,MAAA,CAAO,EAAA,EAAI,QAAQ,EAAE,SAAA,EAAW,KAAA,EAAO,GAAA,EAAK,CAAA;AAClF,EAAA,KAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA;AAEtC,EAAA,OAAO,MAAA;AACT;AA6BO,SAAS,OAAA,CAAQ,MAAA,EAAiB,OAAA,EAAyB,OAAA,GAA0B,EAAC,EAAe;AAC1G,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,SAAA,GAAY,cAAA;AAAA,IACZ,KAAA,GAAQ,GAAA;AAAA,IACR,SAAA,GAAY,GAAA;AAAA,IACZ,IAAA,GAAO,SAAA;AAAA,IACP,SAAA,GAAY,KAAA;AAAA,IACZ,KAAA,GAAQ,OAAA;AAAA,IACR,GAAA,GAAM,CAAA;AAAA,IACN,MAAA,GAAS;AAAA,GACX,GAAI,OAAA;AAEJ,EAAA,MAAM,OAAuB,OAAO,OAAA,KAAY,aAC5C,OAAA,GACA,OAAO,YAAY,QAAA,GACjB,GAAA,CAAI,MAAA,EAAQ,EAAE,OAAO,CAAA,EAAG,SAAS,UAAU,QAAA,EAAU,OAAA,EAAS,CAAA,GAC9D,OAAA;AAEN,EAAA,MAAM,SAAyF,EAAC;AAChG,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,SAAS,IAAA,GAAa;AACpB,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,EAAM,EAAE,SAAA,EAAW,SAAA,EAAW,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,QAAQ,CAAA;AAC/G,IAAA,MAAA,CAAO,EAAA,CAAG,YAAA,CAAa,MAAA,EAAQ,IAAI,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,eAAe,MAAA,CAAO,EAAA,EAAI,QAAQ,EAAE,SAAA,EAAW,KAAA,EAAO,GAAA,EAAK,CAAA;AACxE,IAAA,OAAA,GAAU,EAAE,QAAQ,IAAA,EAAK;AAAA,EAC3B;AAEA,EAAA,SAAS,IAAA,GAAa;AACpB,IAAA,IAAI,YAAY,MAAA,EAAW;AAC3B,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAA,OAAA,CAAQ,OAAO,KAAA,EAAM;AACrB,IAAA,OAAA,GAAU,MAAA;AAAA,EACZ;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAuB;AACtC,IAAA,QAAA,IAAY,KAAA,CAAM,IAAA,KAAS,OAAA,GAAU,CAAA,GAAI,CAAA;AACzC,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAW,YAAA,CAAa,OAAO,IAAI,CAAA;AACvD,IAAA,IAAI,YAAY,MAAA,EAAW;AAC3B,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAW,YAAA,CAAa,OAAO,IAAI,CAAA;AACvD,IAAA,MAAA,CAAO,IAAA,GAAO,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA;AAAA,EACtC,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAuB;AACtC,IAAA,QAAA,IAAY,KAAA,CAAM,IAAA,KAAS,MAAA,GAAS,KAAK,EAAC;AAC1C,IAAA,IAAI,QAAA,EAAU;AACd,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAW,YAAA,CAAa,OAAO,IAAI,CAAA;AACvD,IAAA,IAAI,YAAY,MAAA,EAAW;AAC3B,IAAA,MAAA,CAAO,IAAA,GAAO,UAAA,CAAW,IAAA,EAAM,SAAS,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,gBAAgB,OAAO,CAAA;AAC/C,EAAA,MAAA,CAAO,gBAAA,CAAiB,gBAAgB,OAAO,CAAA;AAC/C,EAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,EAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,OAAO,CAAA;AAEvC,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,CAAO,mBAAA,CAAoB,gBAAgB,OAAO,CAAA;AAClD,IAAA,MAAA,CAAO,mBAAA,CAAoB,gBAAgB,OAAO,CAAA;AAClD,IAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC3C,IAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,OAAO,CAAA;AAC1C,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAW,YAAA,CAAa,OAAO,IAAI,CAAA;AACvD,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAW,YAAA,CAAa,OAAO,IAAI,CAAA;AACvD,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AACF;;;ACndO,SAAS,MAAA,CACd,OAAA,EACA,OAAA,EACA,OAAA,GAA4B,EAAC,EACV;AACnB,EAAA,MAAM,EAAE,WAAW,SAAA,GAAY,cAAA,EAAgB,OAAO,YAAA,EAAc,MAAA,GAAS,KAAA,EAAO,MAAA,EAAO,GAAI,OAAA;AAC/F,EAAA,MAAM,aAAa,cAAA,IAAkB,OAAA;AACrC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO,EAAE,aAAA,EAAe,MAAA,CAAO,CAAC,CAAA,EAAE,CAAE,CAAA;AAExE,EAAA,MAAM,IAAA,GAAuB,MAAA,KAAW,MAAA,GACpC,MAAA,CAAO,EAAE,OAAA,EAAS,OAAA,EAAS,WAAA,EAAa,CAAA,GACxC,GAAA,CAAI,KAAA,EAAO;AAAA,IACX,KAAA,EAAO,aAAA;AAAA,IACP,QAAA,EAAU;AAAA,MACR,KAAA,KAAU,MAAA,GAAY,GAAA,CAAI,IAAA,EAAM,EAAE,OAAO,oBAAA,EAAsB,QAAA,EAAU,KAAA,EAAO,CAAA,GAAI,EAAA;AAAA,MACpF,IAAI,GAAA,EAAK,EAAE,OAAO,sBAAA,EAAwB,QAAA,EAAU,SAAS,CAAA;AAAA,MAC7D,IAAI,KAAA,EAAO;AAAA,QACT,KAAA,EAAO,sBAAA;AAAA,QACP,UAAU,OAAA,CAAQ,GAAA;AAAA,UAAI,CAAC,MAAA,EAAQ,CAAA,KAC7B,GAAA,CAAI,QAAA,EAAU;AAAA,YACZ,IAAA,EAAM,QAAA;AAAA,YACN,OAAO,MAAA,CAAO,SAAA,KAAc,SAAY,CAAA,oBAAA,EAAuB,MAAA,CAAO,SAAS,CAAA,CAAA,GAAK,qBAAA;AAAA,YACpF,GAAG,YAAY,CAAC,CAAA;AAAA,YAChB,UAAU,MAAA,CAAO;AAAA,WAClB;AAAA;AACH,OACD;AAAA;AACH,GACD,CAAA;AAEH,EAAA,IAAI,aAAA;AACJ,EAAA,MAAM,MAAA,GAAS,IAAI,OAAA,CAAkB,CAAC,OAAA,KAAY;AAChD,IAAA,aAAA,GAAgB,OAAA;AAAA,EAClB,CAAC,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,EAAM;AAAA,IAC3B,SAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,EAAS,CAAC,QAAA,EAAU,UAAU,CAAA;AAAA,IAC9B,YAAA,EAAc,eAAA;AAAA,IACd,IAAA,EAAM,IAAA;AAAA,IACN;AAAA,GACD,CAAA;AAED,EAAA,QAAA,CAAS,OAAO,EAAA,EAAI,OAAA,EAAS,eAAA,EAAiB,CAAC,QAAQ,EAAA,KAAO;AAC5D,IAAA,aAAA,CAAc,OAAA,CAAQ,OAAO,EAAA,CAAG,YAAA,CAAa,aAAa,CAAC,CAAC,EAAE,KAAK,CAAA;AACnE,IAAA,MAAA,CAAO,KAAA,EAAM;AAAA,EACf,CAAC,CAAA;AAED,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAA,CAAO,EAAA,CAAG,gBAAA,CAAiB,SAAA,EAAW,CAAC,KAAA,KAAyB;AAC9D,MAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,aAAA,CAAc,YAAiB,CAAA;AAC/B,QAAA,MAAA,CAAO,KAAA,EAAM;AAAA,MACf;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,KAAK,OAAO,MAAA,CAAO,IAAA,CAAK,MAAM,aAAA,CAAc,IAAI,CAAC,CAAA;AACjD,EAAA,OAAO,MAAA;AACT;;;ACvDO,SAAS,OAAA,CAAQ,OAAA,EAAiB,OAAA,GAA0B,EAAC,EAAqB;AACvF,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,SAAA,GAAY,cAAA;AAAA,IACZ,KAAA;AAAA,IACA,MAAA,GAAS,IAAA;AAAA,IACT,UAAA,GAAa,QAAA;AAAA,IACb,MAAA,GAAS,KAAA;AAAA,IACT,MAAA,GAAS,KAAA;AAAA,IACT;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,OAAuB,MAAA,KAAW,MAAA,GACpC,OAAO,EAAE,OAAA,EAAS,IAAI,EAAE,cAAA,EAAgB,MAAK,EAAG,MAAA,EAAQ,EAAE,cAAA,EAAgB,QAAA,IAAY,CAAA,GACtF,IAAI,KAAA,EAAO;AAAA,IACX,KAAA,EAAO,cAAA;AAAA,IACP,QAAA,EAAU;AAAA,MACR,KAAA,KAAU,MAAA,GAAY,GAAA,CAAI,IAAA,EAAM,EAAE,OAAO,qBAAA,EAAuB,QAAA,EAAU,KAAA,EAAO,CAAA,GAAI,EAAA;AAAA,MACrF,IAAI,GAAA,EAAK,EAAE,OAAO,uBAAA,EAAyB,QAAA,EAAU,SAAS,CAAA;AAAA,MAC9D,IAAI,KAAA,EAAO;AAAA,QACT,KAAA,EAAO,uBAAA;AAAA,QACP,QAAA,EAAU;AAAA,UACR,GAAA,CAAI,UAAU,EAAE,IAAA,EAAM,UAAU,cAAA,EAAgB,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,CAAA;AAAA,UAChF,IAAI,QAAA,EAAU;AAAA,YACZ,IAAA,EAAM,QAAA;AAAA,YACN,cAAA,EAAgB,IAAA;AAAA,YAChB,KAAA,EAAO,kBAAA;AAAA,YACP,QAAA,EAAU;AAAA,WACX;AAAA;AACH,OACD;AAAA;AACH,GACD,CAAA;AAEH,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,EAAM;AAAA,IAC3B,SAAA;AAAA,IACA,SAAA,EAAW,MAAA,GAAS,CAAA,EAAG,SAAS,CAAA,qBAAA,CAAA,GAA0B,SAAA;AAAA,IAC1D,OAAA,EAAS,CAAC,QAAA,EAAU,UAAU,CAAA;AAAA,IAC9B,YAAA,EAAc,qBAAA;AAAA,IACd,IAAA,EAAM,IAAA;AAAA,IACN;AAAA,GACD,CAAA;AAED,EAAA,QAAA,CAAS,OAAO,EAAA,EAAI,OAAA,EAAS,gBAAA,EAAkB,CAAC,QAAQ,EAAA,KAAO;AAC7D,IAAA,MAAA,CAAO,KAAA,CAAM,EAAA,CAAG,YAAA,CAAa,cAAc,MAAM,IAAI,CAAA;AAAA,EACvD,CAAC,CAAA;AAED,EAAA,OAAO,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAU,UAAU,IAAI,CAAA;AACrD;;;ACxCO,SAAS,IAAA,CACd,MAAA,EACA,OAAA,GAAuB,EAAC,EACgB;AACxC,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IAAW,SAAA,GAAY,cAAA;AAAA,IAAgB,KAAA;AAAA,IAAO,MAAA,GAAS,IAAA;AAAA,IAAM,UAAA,GAAa,QAAA;AAAA,IAAU,MAAA,GAAS,KAAA;AAAA,IAAO;AAAA,GACtG,GAAI,OAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,MAA8C;AAAA,IAChE,cAAc,KAAA,CAAM,IAAA;AAAA,IACpB,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,IAAA,EAAM,MAAM,IAAA,IAAQ,MAAA;AAAA,IACpB,KAAA,EAAO,MAAM,YAAA,IAAgB,EAAA;AAAA,IAC7B,GAAI,MAAM,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,KAAA,CAAM,WAAA,EAAY,GAAI;AAAC,GAC9E,CAAA;AAEA,EAAA,MAAM,IAAA,GAAuB,MAAA,KAAW,MAAA,GACpC,MAAA,CAAO;AAAA,IACP,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MAC7B,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAA;AAAA,MAC5B,KAAA,EAAO,WAAW,KAAK,CAAA;AAAA,MACvB,KAAA,EAAO,EAAE,kBAAA,EAAoB,KAAA,CAAM,IAAA;AAAK,KAC1C,CAAE,CAAA;AAAA,IACF,EAAA,EAAI,EAAE,WAAA,EAAa,IAAA,EAAK;AAAA,IACxB,MAAA,EAAQ,EAAE,WAAA,EAAa,QAAA;AAAS,GACjC,CAAA,GACC,GAAA,CAAI,KAAA,EAAO;AAAA,IACX,KAAA,EAAO,WAAA;AAAA,IACP,QAAA,EAAU;AAAA,MACR,KAAA,KAAU,MAAA,GAAY,GAAA,CAAI,IAAA,EAAM,EAAE,OAAO,kBAAA,EAAoB,QAAA,EAAU,KAAA,EAAO,CAAA,GAAI,EAAA;AAAA,MAClF,GAAG,MAAA,CAAO,GAAA;AAAA,QAAI,CAAC,KAAA,KACb,GAAA,CAAI,KAAA,EAAO;AAAA,UACT,KAAA,EAAO,kBAAA;AAAA,UACP,QAAA,EAAU;AAAA,YACR,GAAA,CAAI,OAAA,EAAS,EAAE,KAAA,EAAO,kBAAA,EAAoB,UAAU,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,YAC/E,GAAA,CAAI,SAAS,EAAE,KAAA,EAAO,oBAAoB,GAAG,UAAA,CAAW,KAAK,CAAA,EAAG,CAAA;AAAA,YAChE,GAAA,CAAI,GAAA,EAAK,EAAE,KAAA,EAAO,kBAAA,EAAoB,oBAAoB,KAAA,CAAM,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI;AAAA;AACtF,SACD;AAAA,OACH;AAAA,MACA,IAAI,KAAA,EAAO;AAAA,QACT,KAAA,EAAO,oBAAA;AAAA,QACP,QAAA,EAAU;AAAA,UACR,GAAA,CAAI,UAAU,EAAE,IAAA,EAAM,UAAU,WAAA,EAAa,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,CAAA;AAAA,UAC7E,IAAI,QAAA,EAAU;AAAA,YACZ,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,IAAA;AAAA,YACb,KAAA,EAAO,eAAA;AAAA,YACP,QAAA,EAAU;AAAA,WACX;AAAA;AACH,OACD;AAAA;AACH,GACD,CAAA;AAEH,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,EAAM;AAAA,IAC3B,SAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,EAAS,CAAC,QAAA,EAAU,UAAU,CAAA;AAAA,IAC9B,YAAA,EAAc,cAAA;AAAA,IACd,IAAA,EAAM,IAAA;AAAA,IACN;AAAA,GACD,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAChB,KAAA,CAAM,IAAA,CAAK,OAAO,EAAA,CAAG,gBAAA,CAA8B,oBAAoB,CAAC,CAAA,CAAE,IAAA;AAAA,IACxE,CAAC,EAAA,KAAO,EAAA,CAAG,YAAA,CAAa,kBAAkB,CAAA,KAAM;AAAA,GAClD,IAAK,IAAA;AACP,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAmC;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,GAAG,gBAAA,CAAmC,mBAAmB,CAAC,CAAA,CAAE,IAAA;AAAA,MAC1F,CAAC,EAAA,KAAO,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA,KAAM;AAAA,KAC5C;AACA,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,KAAA;AAChC,IAAA,MAAA,CAAO,MAAM,IAAI,CAAA;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0CAAA,EAA6C,IAAI,CAAA,GAAA,CAAK,CAAA;AAAA,EACxE,CAAA;AAEA,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,QAAA,CAAS,MAAM,IAAI,CAAA;AACnB,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACnC,IAAA,IAAI,OAAA,KAAY,IAAA,EAAM,OAAA,CAAQ,MAAA,GAAS,IAAA;AAAA,EACzC;AAEA,EAAA,SAAS,SAAA,GAAkB;AACzB,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,IAAI,YAAA,GAAwC,IAAA;AAC5C,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,MAAM,QAAQ,EAAA,CAAG,KAAA;AACjB,MAAA,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AACrB,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,GAAW,KAAK,CAAA;AACpC,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACnC,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AACjD,QAAA,IAAI,YAAY,IAAA,EAAM;AACpB,UAAA,OAAA,CAAQ,WAAA,GAAc,KAAA;AACtB,UAAA,OAAA,CAAQ,MAAA,GAAS,KAAA;AAAA,QACnB;AACA,QAAA,IAAI,YAAA,KAAiB,MAAM,YAAA,GAAe,EAAA;AAAA,MAC5C,CAAA,MAAA,IAAW,YAAY,IAAA,EAAM;AAC3B,QAAA,OAAA,CAAQ,MAAA,GAAS,IAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,YAAA,CAAa,KAAA,EAAM;AACnB,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,EACrB;AAEA,EAAA,QAAA,CAAS,OAAO,EAAA,EAAI,OAAA,EAAS,aAAA,EAAe,CAAC,QAAQ,EAAA,KAAO;AAC1D,IAAA,IAAI,EAAA,CAAG,YAAA,CAAa,WAAW,CAAA,KAAM,MAAM,SAAA,EAAU;AAAA,SAChD,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,EACxB,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,EAAA,CAAG,gBAAA,CAAiB,SAAA,EAAW,CAAC,KAAA,KAAyB;AAC9D,IAAA,IAAI,MAAM,GAAA,KAAQ,OAAA,IAAY,MAAM,MAAA,EAA2B,OAAA,CAAQ,cAAc,CAAA,EAAG;AACtF,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,EAAU;AAAA,IACZ;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,OAAO,MAAA,CAAO,IAAA;AAAA,IAAK,CAAC,KAAA,KACzB,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,WAAY,KAAA,GAAmC;AAAA,GACpF;AACF;;;ACvIO,SAAS,MAAA,CAAO,OAAA,EAAiB,OAAA,GAAyB,EAAC,EAA2B;AAC3F,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,SAAA,GAAY,cAAA;AAAA,IACZ,KAAA;AAAA,IACA,YAAA,GAAe,EAAA;AAAA,IACf,WAAA;AAAA,IACA,SAAA,GAAY,MAAA;AAAA,IACZ,MAAA,GAAS,IAAA;AAAA,IACT,UAAA,GAAa,QAAA;AAAA,IACb,QAAA;AAAA,IACA,MAAA,GAAS,KAAA;AAAA,IACT;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,UAAA,GAAqC;AAAA,IACzC,mBAAA,EAAqB,EAAA;AAAA,IACrB,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,GAAI,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,KAAgB;AAAC,GACrD;AAEA,EAAA,MAAM,IAAA,GAAuB,MAAA,KAAW,MAAA,GACpC,MAAA,CAAO;AAAA,IACP,OAAA;AAAA,IACA,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO,EAAE,mBAAA,EAAqB,EAAA,EAAG;AAAA,IACjC,EAAA,EAAI,EAAE,aAAA,EAAe,IAAA,EAAK;AAAA,IAC1B,MAAA,EAAQ,EAAE,aAAA,EAAe,QAAA;AAAS,GACnC,CAAA,GACC,GAAA,CAAI,KAAA,EAAO;AAAA,IACX,KAAA,EAAO,aAAA;AAAA,IACP,QAAA,EAAU;AAAA,MACR,KAAA,KAAU,MAAA,GAAY,GAAA,CAAI,IAAA,EAAM,EAAE,OAAO,oBAAA,EAAsB,QAAA,EAAU,KAAA,EAAO,CAAA,GAAI,EAAA;AAAA,MACpF,IAAI,OAAA,EAAS,EAAE,OAAO,sBAAA,EAAwB,QAAA,EAAU,SAAS,CAAA;AAAA,MACjE,IAAI,OAAA,EAAS,EAAE,OAAO,oBAAA,EAAsB,GAAG,YAAY,CAAA;AAAA,MAC3D,GAAA,CAAI,KAAK,EAAE,KAAA,EAAO,sBAAsB,mBAAA,EAAqB,EAAA,EAAI,QAAA,EAAU,EAAA,EAAI,CAAA;AAAA,MAC/E,IAAI,KAAA,EAAO;AAAA,QACT,KAAA,EAAO,sBAAA;AAAA,QACP,QAAA,EAAU;AAAA,UACR,GAAA,CAAI,UAAU,EAAE,IAAA,EAAM,UAAU,aAAA,EAAe,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,CAAA;AAAA,UAC/E,IAAI,QAAA,EAAU;AAAA,YACZ,IAAA,EAAM,QAAA;AAAA,YACN,aAAA,EAAe,IAAA;AAAA,YACf,KAAA,EAAO,iBAAA;AAAA,YACP,QAAA,EAAU;AAAA,WACX;AAAA;AACH,OACD;AAAA;AACH,GACD,CAAA;AAEH,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,EAAM;AAAA,IAC3B,SAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,EAAS,CAAC,QAAA,EAAU,UAAU,CAAA;AAAA,IAC9B,YAAA,EAAc,qBAAA;AAAA,IACd,IAAA,EAAM,IAAA;AAAA,IACN;AAAA,GACD,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,EAAA,CAAG,aAAA,CAAgC,0BAA0B,CAAA;AAClF,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAA,CAAO,MAAM,IAAI,CAAA;AACjB,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AACA,EAAA,MAAM,WAAA,GAAc,KAAA;AACpB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,EAAA,CAAG,aAAA,CAA2B,qBAAqB,CAAA;AAC1E,EAAA,IAAI,OAAA,KAAY,IAAA,EAAM,OAAA,CAAQ,MAAA,GAAS,IAAA;AAEvC,EAAA,SAAS,SAAA,GAAkB;AACzB,IAAA,MAAM,QAAQ,WAAA,CAAY,KAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,WAAW,KAAK,CAAA;AAC9B,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AACjD,MAAA,IAAI,YAAY,IAAA,EAAM;AACpB,QAAA,OAAA,CAAQ,WAAA,GAAc,KAAA;AACtB,QAAA,OAAA,CAAQ,MAAA,GAAS,KAAA;AAAA,MACnB;AACA,MAAA,WAAA,CAAY,KAAA,EAAM;AAClB,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,EACpB;AAEA,EAAA,QAAA,CAAS,OAAO,EAAA,EAAI,OAAA,EAAS,eAAA,EAAiB,CAAC,QAAQ,EAAA,KAAO;AAC5D,IAAA,IAAI,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA,KAAM,MAAM,SAAA,EAAU;AAAA,SAClD,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,EACxB,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,EAAA,CAAG,gBAAA,CAAiB,SAAA,EAAW,CAAC,KAAA,KAAyB;AAC9D,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,WAAW,WAAA,EAAa;AACzD,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,SAAA,EAAU;AAAA,IACZ;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA,CAAO,OAAO,IAAA,CAAK,CAAC,UAAW,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAK,CAAA;AACjF;;;AC7DA,IAAM,SAAA,0BAAmB,aAAa,CAAA;AAMtC,SAAS,YAAY,SAAA,EAA8B;AACjD,EAAA,IAAI,SAAA,KAAc,QAAW,OAAO,SAAA;AACpC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,cAAc,CAAA;AACtD,EAAA,IAAI,QAAA,KAAa,MAAM,OAAO,QAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,EAAA,MAAA,CAAO,SAAA,GAAY,aAAA;AACnB,EAAA,MAAA,CAAO,YAAA,CAAa,aAAa,QAAQ,CAAA;AACzC,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAChC,EAAA,OAAO,MAAA;AACT;AASO,SAAS,KAAA,CAAM,OAAA,EAAuB,OAAA,GAAwB,EAAC,EAAgB;AACpF,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,SAAA,GAAY,YAAA;AAAA,IACZ,QAAA,GAAW,GAAA;AAAA,IACX,IAAA,GAAO,QAAA;AAAA,IACP,IAAA,GAAO,OAAA;AAAA,IACP,QAAA,GAAW,MAAA;AAAA,IACX,OAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA,GAAe;AAAA,GACjB,GAAI,OAAA;AAEJ,EAAA,MAAM,MAAA,GAAS,YAAY,SAAS,CAAA;AACpC,EAAA,MAAM,MAAA,GAAU,MAAA,CAAO,SAAS,CAAA,yBAAU,GAAA,EAAe;AAGzD,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,KAAA,MAAW,CAAA,IAAK,CAAC,GAAG,MAAM,CAAA,EAAG;AAC3B,MAAA,IAAI,QAAA,KAAa,SAAA,EAAW,CAAA,CAAE,SAAA,EAAU;AAAA,WACnC,CAAA,EAAE;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,EAAA,EAAA,CAAG,SAAA,GAAY,SAAA;AACf,EAAA,IAAI,OAAA,KAAY,QAAW,EAAA,CAAG,SAAA,CAAU,IAAI,CAAA,EAAG,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AACtE,EAAA,EAAA,CAAG,YAAA,CAAa,QAAQ,IAAI,CAAA;AAC5B,EAAA,MAAA,CAAO,YAAY,EAAE,CAAA;AAErB,EAAA,MAAM,MAAA,GAAS,OAAO,OAAA,KAAY,UAAA,GAC9B,OAAA,GACA,MAAM,OAAO,OAAA,KAAY,QAAA,GAAW,UAAA,CAAW,OAAO,CAAA,GAAI,OAAA;AAC9D,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA;AACrC,EAAA,MAAM,KAAA,GAKF,EAAE,SAAA,EAAW,KAAA,EAAO,SAAS,KAAA,EAAO,KAAA,EAAO,MAAA,EAAW,SAAA,EAAW,MAAA,EAAU;AAE/E,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,UAAA,CAAW,sBAAsB,MAAM;AACrC,MAAA,IAAI,CAAC,KAAA,CAAM,SAAA,EAAW,EAAA,CAAG,SAAA,CAAU,IAAI,UAAU,CAAA;AAAA,IACnD,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,IAAI,MAAM,OAAA,EAAS;AACnB,IAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,IAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAClB,IAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW,YAAA,CAAa,MAAM,SAAS,CAAA;AAC/D,IAAA,YAAA,EAAa;AACb,IAAA,EAAA,CAAG,MAAA,EAAO;AACV,IAAA,MAAA,CAAO,OAAO,OAAoB,CAAA;AAAA,EACpC,CAAA;AAKA,EAAA,MAAM,YAAY,MAAY;AAC5B,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,MAAM,KAAK,CAAA;AACvD,IAAA,MAAA,EAAO;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,IAAI,MAAM,SAAA,EAAW;AACrB,IAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAClB,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW,YAAA,CAAa,MAAM,KAAK,CAAA;AAIvD,IAAA,IAAI,UAAA,KAAe,MAAA,EAAW,EAAA,CAAG,SAAA,CAAU,OAAO,UAAU,CAAA;AAC5D,IAAA,IAAI,SAAA,KAAc,MAAA,EAAW,EAAA,CAAG,SAAA,CAAU,IAAI,SAAS,CAAA;AACvD,IAAA,IAAI,SAAA,KAAc,MAAA,IAAa,YAAA,GAAe,CAAA,EAAG;AAC/C,MAAA,KAAA,CAAM,SAAA,GAAY,UAAA,CAAW,MAAA,EAAQ,YAAY,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,MAAA,EAAO;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,SAAS,QAAQC,QAAAA,EAAuC;AACtD,IAAA,IAAIA,QAAAA,EAAS,OAAA,KAAY,IAAA,EAAM,SAAA,EAAU;AAAA,SACpC,OAAA,EAAQ;AAAA,EACf;AACA,EAAC,QAAsB,SAAA,GAAY,SAAA;AAEnC,EAAA,MAAA,CAAO,IAAI,OAAoB,CAAA;AAC/B,EAAA,IAAI,WAAW,CAAA,EAAG,KAAA,CAAM,KAAA,GAAQ,UAAA,CAAW,SAAS,QAAQ,CAAA;AAC5D,EAAA,OAAO,EAAE,IAAI,OAAA,EAAQ;AACvB","file":"overlay.js","sourcesContent":["/**\n * Anchored positioning primitives for `kerfjs/overlay` — position an element\n * relative to an anchor, with viewport flip + clamp. These are standalone: they\n * take any element and have no overlay lifecycle, so `popover()` / `tooltip()`\n * build on them but you can also position your own element (an inline hint, a\n * custom menu). Re-exported from `src/overlay.ts` so the public `kerfjs/overlay`\n * surface is unchanged (KF-511 split out of overlay.ts's dialog + toast code).\n */\n\n/** Vertical placement relative to an anchor (used by `popover`, {@link positionAnchored}, `tooltip`). */\nexport type PopoverPlacement = 'bottom' | 'top';\n\n/** Placement options for {@link positionAnchored} / {@link autoReposition}. */\nexport interface AnchorPositionOptions {\n /** Preferred side of the anchor; flips to the other side if it would overflow the viewport. Default `'bottom'`. */\n placement?: PopoverPlacement;\n /** Horizontal edge to line up with the anchor: `'start'` (left edges) or `'end'` (right edges). Default `'start'`. */\n align?: 'start' | 'end';\n /** Gap in px between the anchor and the element. Default `4`. */\n gap?: number;\n}\n\n/**\n * One-shot: position `el` relative to `anchor` — below by default, flipping above\n * if it would overflow the viewport, aligned to a horizontal edge and clamped into\n * view. Sets `el.style` `position: fixed`, `margin: 0`, `left`, and `top` (fixed so\n * `left`/`top` are viewport coordinates, matching `getBoundingClientRect`). This is\n * `popover()`'s placement core, usable on any element (an inline hint, a tooltip) —\n * no overlay lifecycle. Pair with {@link autoReposition} to keep it glued while open.\n */\nexport function positionAnchored(el: HTMLElement, anchor: Element, options: AnchorPositionOptions = {}): void {\n const { placement = 'bottom', align = 'start', gap = 4 } = options;\n // Fix `el` FIRST, then measure it. Measuring a still-`display:block` wrapper\n // reports the full body-content width (≈ viewport minus body margins), which\n // collapses the horizontal clamp below and lands the element at the body's left\n // edge. As a fixed, shrink-to-fit box its `width`/`height` are its real size.\n el.style.position = 'fixed';\n el.style.margin = '0';\n const anchorRect = anchor.getBoundingClientRect();\n const elementRect = el.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Vertical: preferred side, flipped only if it overflows and the other side fits.\n const belowTop = anchorRect.bottom + gap;\n const aboveTop = anchorRect.top - gap - elementRect.height;\n let below = placement !== 'top';\n if (below && belowTop + elementRect.height > viewportHeight && aboveTop >= 0) below = false;\n else if (!below && aboveTop < 0 && belowTop + elementRect.height <= viewportHeight) below = true;\n\n // Horizontal: align to an anchor edge, then clamp into the viewport.\n let left = align === 'end' ? anchorRect.right - elementRect.width : anchorRect.left;\n left = Math.max(0, Math.min(left, viewportWidth - elementRect.width));\n\n el.style.left = `${left}px`;\n el.style.top = `${below ? belowTop : aboveTop}px`;\n}\n\n/**\n * Keep `el` positioned against `anchor` (via {@link positionAnchored}) as the page\n * scrolls or resizes. Positions once immediately, then re-runs on `scroll`\n * (capture phase — catches scrolls in any inner container, not just `window`) and\n * `resize`. Returns a disposer that removes the listeners.\n */\nexport function autoReposition(el: HTMLElement, anchor: Element, options: AnchorPositionOptions = {}): () => void {\n const reposition = (): void => positionAnchored(el, anchor, options);\n reposition();\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n}\n","/**\n * Internal overlay / popover / tooltip lifecycle implementation.\n *\n * Every real kerf app hand-rolls this: `toElement → body.appendChild → mount →\n * wire dismissal → remove`, plus the fiddly parts (Escape, backdrop / outside\n * click, focus trap, restoring focus on close). `window.confirm` is a no-op in\n * Tauri WKWebViews, so a hand-built overlay is mandatory there. This subpath\n * blesses the pattern as three functions over `mount()` — `overlay()`, and the\n * `confirm()` / `toast()` conveniences built on it. No per-instance framework\n * state: each call owns its DOM + listeners in a closure and returns a handle.\n *\n * import { overlay, confirm, toast } from 'kerfjs/overlay';\n *\n * const ok = await confirm('Delete this file?', { danger: true });\n * toast('Saved');\n * const dialog = overlay(<Settings />, { dismiss: ['escape', 'backdrop'] });\n * // …later: dialog.close(); or await dialog.result;\n *\n * Structural only — kerf ships no CSS. The wrapper gets your `className`; style\n * the backdrop / centering / animation yourself.\n */\nimport { jsx, type SafeHtml } from './jsx-runtime.js';\nimport { mount, type MountResult } from './mount.js';\nimport { type AnchorPositionOptions, autoReposition, type PopoverPlacement, positionAnchored } from './overlay-position.js';\n\n/** A user-initiated dismissal trigger. */\nexport type DismissTrigger = 'escape' | 'backdrop' | 'outside';\n\n/** Content for an overlay: static `SafeHtml`, or a render function `mount()` drives reactively. */\nexport type OverlayContent = SafeHtml | (() => MountResult);\n\n/** Options for {@link overlay}. */\nexport interface OverlayOptions {\n /** Where to append the overlay wrapper. Default `document.body`. */\n container?: Element;\n /** Class on the wrapper element (you style it — kerf ships no CSS). Default `'kerf-overlay'`. */\n className?: string;\n /**\n * Which user actions dismiss the overlay. Default `['escape', 'backdrop']`.\n * `'backdrop'` = a click on the wrapper itself (not its content); `'outside'`\n * = a click anywhere outside the wrapper (for anchored popovers). `false`\n * disables user dismissal (close it programmatically).\n */\n dismiss?: DismissTrigger | DismissTrigger[] | false;\n /**\n * Where focus lands on open: a selector, `true` (first focusable element, or\n * the wrapper if none), or `false` (leave focus alone). Default `true`.\n */\n initialFocus?: string | boolean;\n /**\n * Trap Tab / Shift+Tab within the overlay while open and mark it\n * `role=\"dialog\"` / `aria-modal=\"true\"`. Default `true`. Set `false` for a\n * non-modal popover.\n */\n trap?: boolean;\n /** ARIA role for the wrapper when `trap` is on. Default `'dialog'`. */\n role?: string;\n /** Called on any user-initiated dismissal (before `close()` runs). */\n onDismiss?: () => void;\n /** For `'outside'` dismissal: clicks on these elements do NOT count as outside (e.g. the trigger button). */\n outsideIgnore?: Element | readonly Element[];\n /**\n * Opt into the browser **top layer** (`docs/19-native-overlay-backing.md`).\n * When `true` and the engine supports it, a modal overlay (`trap: true`) is\n * hosted in a `<dialog>` opened with `.showModal()` — real inerting of the rest\n * of the document + guaranteed stacking above any `z-index` — and a non-modal\n * one (`trap: false`) uses the Popover API (`[popover]` + `showPopover()`).\n * Feature-detected; falls back to today's plain `<div>` where unsupported.\n *\n * The `render` slot + promise API are unchanged — kerf just hosts your markup\n * in a `<dialog>` / `[popover]` instead of a `<div>`. Two caveats: native\n * `<dialog>` / `[popover]` carry **UA default styles** (a `::backdrop`,\n * centering, border, padding) that kerf does not reset — style the element (and\n * its `::backdrop`) via `className`; and `container` is effectively a **no-op**\n * for visual position, since the top layer ignores where the element lives in\n * the DOM. Default `false`.\n */\n native?: boolean;\n}\n\n/** Handle returned by {@link overlay}. Holds no framework state — it's a closure. */\nexport interface OverlayHandle {\n /** The wrapper element (mounted into, appended to `container`). */\n el: HTMLElement;\n /** Tear down: dispose the mount, remove listeners + the node, restore focus, resolve `result`. Idempotent. */\n close(result?: unknown): void;\n /** Resolves with the value passed to `close()` (or `undefined` on user dismissal). */\n result: Promise<unknown>;\n}\n\nconst FOCUSABLE =\n 'a[href],area[href],button:not([disabled]),input:not([disabled]),'\n + 'select:not([disabled]),textarea:not([disabled]),iframe,'\n + '[tabindex]:not([tabindex=\"-1\"]),[contenteditable=\"true\"]';\n\nfunction focusable(root: Element): HTMLElement[] {\n const items = Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (el) => !el.hasAttribute('hidden') && el.tabIndex >= 0,\n );\n // WebKit on macOS follows the system's keyboard-navigation preference and\n // may omit implicitly tabbable controls from sequential focus navigation.\n // A focus trap promises stable traversal through every eligible control, so\n // make those implicit stops explicit while preserving authored tabindexes.\n for (const el of items) if (!el.hasAttribute('tabindex')) el.tabIndex = 0;\n return items;\n}\n\n// Native top-layer feature detection (KF-526). Modal → `<dialog>.showModal()`;\n// non-modal → the Popover API. Each is independent — an engine may ship one\n// without the other — and both fall back to the plain `<div>` where absent.\nfunction supportsDialog(): boolean {\n return typeof HTMLDialogElement !== 'undefined'\n && typeof HTMLDialogElement.prototype.showModal === 'function';\n}\nfunction supportsPopover(): boolean {\n return typeof HTMLElement !== 'undefined'\n && typeof HTMLElement.prototype.showPopover === 'function';\n}\n\nconst FALLBACK_OVERLAY_STACK = Symbol('kerf.fallbackOverlayStack');\ntype FallbackOverlayDocument = Document & {\n [FALLBACK_OVERLAY_STACK]?: HTMLElement[];\n};\n\nfunction fallbackOverlayStack(wrapper: HTMLElement): HTMLElement[] {\n const document = wrapper.ownerDocument as FallbackOverlayDocument;\n return document[FALLBACK_OVERLAY_STACK] ??= [];\n}\n\n/**\n * Open an overlay: append a wrapper to `container`, `mount()` `content` inside\n * it, wire the requested dismissals + (optionally) a focus trap, and return a\n * handle. Concurrent fallback overlays dismiss from the top down. See\n * {@link OverlayOptions}.\n */\nexport function overlay(content: OverlayContent, options: OverlayOptions = {}): OverlayHandle {\n const {\n container = document.body,\n className = 'kerf-overlay',\n dismiss = ['escape', 'backdrop'],\n initialFocus = true,\n trap = true,\n role = 'dialog',\n onDismiss,\n outsideIgnore,\n native = false,\n } = options;\n\n const triggers: readonly DismissTrigger[] =\n dismiss === false ? [] : Array.isArray(dismiss) ? dismiss : [dismiss];\n const restoreTo = document.activeElement;\n\n // Native top-layer backing (KF-526), feature-detected: a modal overlay\n // (`trap`) → `<dialog>.showModal()`; a non-modal one → `[popover]`. Each falls\n // back to the plain `<div>` where the API is missing, so behavior is unchanged\n // on unsupporting engines.\n const useDialog = native && trap && supportsDialog();\n const usePopover = native && !trap && supportsPopover();\n\n const wrapper: HTMLElement = useDialog ? document.createElement('dialog') : document.createElement('div');\n wrapper.className = className;\n if (usePopover) wrapper.setAttribute('popover', 'manual');\n // `<dialog>.showModal()` conveys modality natively (role + inert), so the ARIA\n // attributes are only needed on the plain-`<div>` fallback.\n if (trap && !useDialog) {\n wrapper.setAttribute('role', role);\n wrapper.setAttribute('aria-modal', 'true');\n }\n container.appendChild(wrapper);\n const fallback = !useDialog && !usePopover;\n const fallbackStack = fallback ? fallbackOverlayStack(wrapper) : undefined;\n\n const isTopmostFallback = (): boolean =>\n fallbackStack === undefined || fallbackStack[fallbackStack.length - 1] === wrapper;\n\n const disposeMount = mount(wrapper, typeof content === 'function' ? content : () => content);\n fallbackStack?.push(wrapper);\n\n // Enter the top layer after the content is mounted + connected. `showModal()`\n // moves focus into the dialog by default; kerf's `initialFocus` pass below runs\n // afterward and wins.\n let nativeOpened = false;\n if (useDialog) {\n (wrapper as HTMLDialogElement).showModal();\n nativeOpened = true;\n } else if (usePopover) {\n (wrapper as HTMLElement & { showPopover(): void }).showPopover();\n // Neutralize the UA `[popover] { inset: 0; margin: auto }` anchoring so\n // `positionAnchored` (which sets `top`/`left`) controls placement — otherwise\n // the retained `right`/`bottom` insets would stretch/center the element.\n wrapper.style.inset = 'auto';\n nativeOpened = true;\n }\n\n const removers: Array<() => void> = [];\n const resultBox: { resolve?: (value: unknown) => void } = {};\n const result = new Promise<unknown>((resolve) => {\n resultBox.resolve = resolve;\n });\n const state = { closed: false };\n\n function close(value?: unknown): void {\n if (state.closed) return;\n state.closed = true;\n if (fallbackStack !== undefined) {\n const stackIndex = fallbackStack.indexOf(wrapper);\n if (stackIndex !== -1) fallbackStack.splice(stackIndex, 1);\n }\n for (const remove of removers) remove();\n disposeMount();\n // Exit the top layer before removing the node, so the native close steps run\n // (restore inert, fire the dialog's `close`). `<dialog>` also restores focus\n // itself; kerf's manual restore below stays as the fallback path's behavior.\n if (nativeOpened) {\n nativeOpened = false;\n if (useDialog) (wrapper as HTMLDialogElement).close();\n else (wrapper as HTMLElement & { hidePopover(): void }).hidePopover();\n }\n wrapper.remove();\n if (restoreTo instanceof HTMLElement && restoreTo.isConnected) restoreTo.focus();\n resultBox.resolve?.(value);\n }\n\n function userDismiss(): void {\n onDismiss?.();\n close();\n }\n\n const wantEscape = triggers.includes('escape');\n if (useDialog) {\n // A native modal `<dialog>` confines Tab focus itself and surfaces Escape as\n // a `cancel` event. Take that over: `preventDefault` so kerf owns teardown\n // (and so Escape is swallowed when it isn't a dismiss trigger), then dismiss.\n const onCancel = (event: Event): void => {\n event.preventDefault();\n if (wantEscape) userDismiss();\n };\n wrapper.addEventListener('cancel', onCancel);\n removers.push(() => wrapper.removeEventListener('cancel', onCancel));\n } else if (wantEscape || trap) {\n const onKeydown = (event: KeyboardEvent): void => {\n if (!isTopmostFallback()) return;\n if (wantEscape && event.key === 'Escape') {\n event.stopPropagation();\n userDismiss();\n return;\n }\n if (trap && event.key === 'Tab') {\n const items = focusable(wrapper);\n if (items.length === 0) {\n event.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n const outside = !wrapper.contains(active);\n if (event.shiftKey && (active === first || outside)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && (active === last || outside)) {\n event.preventDefault();\n first.focus();\n }\n }\n };\n document.addEventListener('keydown', onKeydown, true);\n removers.push(() => document.removeEventListener('keydown', onKeydown, true));\n }\n\n if (triggers.includes('backdrop')) {\n const onClick = (event: Event): void => {\n if (!isTopmostFallback()) return;\n if (event.target === wrapper) userDismiss();\n };\n wrapper.addEventListener('click', onClick);\n removers.push(() => wrapper.removeEventListener('click', onClick));\n }\n\n if (triggers.includes('outside')) {\n const ignore = outsideIgnore === undefined\n ? []\n : Array.isArray(outsideIgnore) ? outsideIgnore : [outsideIgnore];\n // Capture phase: the click that opened this overlay already passed\n // document's capture phase, so this never fires for that opening click.\n const onDocClick = (event: Event): void => {\n if (!isTopmostFallback()) return;\n const target = event.target as Node | null;\n if (target === null) return;\n if (wrapper.contains(target)) return;\n if (ignore.some((el) => el === target || el.contains(target))) return;\n userDismiss();\n };\n document.addEventListener('click', onDocClick, true);\n removers.push(() => document.removeEventListener('click', onDocClick, true));\n }\n\n if (initialFocus !== false) {\n if (typeof initialFocus === 'string') {\n wrapper.querySelector<HTMLElement>(initialFocus)?.focus();\n } else {\n const first = focusable(wrapper)[0];\n if (first !== undefined) {\n first.focus();\n } else {\n wrapper.tabIndex = -1;\n wrapper.focus();\n }\n }\n }\n\n return { el: wrapper, close, result };\n}\n\n// The anchored-positioning primitives — `positionAnchored` / `autoReposition`\n// plus their option types — live in `./overlay-position.ts` (KF-511) since they\n// stand alone (any element, no overlay lifecycle). Re-exported here so the\n// `kerfjs/overlay` surface is unchanged; `popover()` / `tooltip()` below build on\n// `autoReposition` (imported above).\nexport { type AnchorPositionOptions, autoReposition, type PopoverPlacement, positionAnchored };\n\n/** Options for {@link popover}. */\nexport interface PopoverOptions {\n /** Where to append the popover wrapper. Default `document.body`. */\n container?: Element;\n /** Class on the wrapper. Default `'kerf-popover'`. */\n className?: string;\n /** Preferred side of the anchor. Flips to the other side if it would overflow the viewport. Default `'bottom'`. */\n placement?: PopoverPlacement;\n /** Horizontal edge to line up with the anchor: `'start'` (left edges) or `'end'` (right edges). Default `'start'`. */\n align?: 'start' | 'end';\n /** Gap in px between the anchor and the popover. Default `4`. */\n gap?: number;\n /**\n * Which user actions dismiss the popover. Default `['outside']` (a click\n * outside the popover, the anchor exempt). Pass `false` to close only via `close()`.\n */\n dismiss?: DismissTrigger | DismissTrigger[] | false;\n /** Focus behavior on open. Default `false` (non-modal — leave focus alone). */\n initialFocus?: string | boolean;\n /** Extra elements (besides the anchor) whose clicks do NOT count as outside. */\n outsideIgnore?: Element | readonly Element[];\n /** Called on any user-initiated dismissal. */\n onDismiss?: () => void;\n /**\n * Host the popover in the browser top layer (the Popover API — `[popover]` +\n * `showPopover()`) where supported, so it stacks above any `z-index` without a\n * z-index war. Falls back to today's plain `<div>` where unsupported. kerf keeps\n * owning positioning + its own dismiss wiring; the popover is `popover=\"manual\"`.\n * See {@link OverlayOptions.native}. Default `false`.\n */\n native?: boolean;\n}\n\n/**\n * Anchored, non-modal overlay: positions `content` relative to `anchor` (below by\n * default, flipping above if it would overflow, and clamped horizontally to the\n * viewport) and repositions on scroll / resize while open. A thin wrapper over\n * {@link overlay} with non-modal defaults — `trap: false`, `dismiss: ['outside']`,\n * and the anchor added to `outsideIgnore` so the trigger click doesn't self-close.\n * Returns the same {@link OverlayHandle}; `close()` also drops the reposition\n * listeners. `position: fixed` is set inline (you style everything else).\n */\nexport function popover(\n anchor: Element,\n content: OverlayContent,\n options: PopoverOptions = {},\n): OverlayHandle {\n const {\n container,\n className = 'kerf-popover',\n placement = 'bottom',\n align = 'start',\n gap = 4,\n dismiss = ['outside'],\n initialFocus = false,\n outsideIgnore,\n onDismiss,\n native = false,\n } = options;\n\n const extraIgnore = outsideIgnore === undefined\n ? []\n : Array.isArray(outsideIgnore) ? [...outsideIgnore] : [outsideIgnore];\n\n const handle = overlay(content, {\n container,\n className,\n dismiss,\n trap: false,\n initialFocus,\n onDismiss,\n outsideIgnore: [anchor, ...extraIgnore],\n native,\n });\n\n // Position + keep it glued while open; drop the listeners on close.\n const stopReposition = autoReposition(handle.el, anchor, { placement, align, gap });\n void handle.result.then(stopReposition);\n\n return handle;\n}\n\n/** Content for a {@link tooltip}: text (auto-escaped), `SafeHtml`, or a render function. */\nexport type TooltipContent = string | SafeHtml | (() => MountResult);\n\n/** Options for {@link tooltip}. */\nexport interface TooltipOptions extends AnchorPositionOptions {\n /** Where to append the tooltip wrapper. Default `document.body`. */\n container?: Element;\n /** Class on the wrapper. Default `'kerf-tooltip'`. */\n className?: string;\n /** Delay in ms before showing after hover/focus enters. Default `400`. */\n delay?: number;\n /** Delay in ms before hiding after hover/focus leaves. Default `100`. */\n hideDelay?: number;\n /** ARIA role on the wrapper. Default `'tooltip'`. */\n role?: string;\n /** Host the tooltip in the browser top layer (the Popover API) where supported. See {@link OverlayOptions.native}. Default `false`. */\n native?: boolean;\n}\n\n/**\n * A hover/focus-triggered, non-modal, auto-hiding tooltip anchored to `anchor`.\n * Shows after `delay` on `pointerenter`/`focus`, hides after `hideDelay` on\n * `pointerleave`/`blur`, and positions itself with {@link autoReposition} (above\n * the anchor by default). Unlike {@link popover} there is no click-dismiss model —\n * it follows the pointer/focus. Returns a disposer that removes the anchor\n * listeners and hides any shown tooltip. Structural only (kerf ships no CSS).\n */\nexport function tooltip(anchor: Element, content: TooltipContent, options: TooltipOptions = {}): () => void {\n const {\n container,\n className = 'kerf-tooltip',\n delay = 400,\n hideDelay = 100,\n role = 'tooltip',\n placement = 'top',\n align = 'start',\n gap = 4,\n native = false,\n } = options;\n\n const body: OverlayContent = typeof content === 'function'\n ? content\n : typeof content === 'string'\n ? jsx('span', { class: `${className}__text`, children: content })\n : content;\n\n const timers: { show?: ReturnType<typeof setTimeout>; hide?: ReturnType<typeof setTimeout> } = {};\n let current: { handle: OverlayHandle; stop: () => void } | undefined;\n let presence = 0;\n\n function show(): void {\n const handle = overlay(body, { container, className, dismiss: false, trap: false, initialFocus: false, native });\n handle.el.setAttribute('role', role);\n const stop = autoReposition(handle.el, anchor, { placement, align, gap });\n current = { handle, stop };\n }\n\n function hide(): void {\n if (current === undefined) return;\n current.stop();\n current.handle.close();\n current = undefined;\n }\n\n const onEnter = (event: Event): void => {\n presence |= event.type === 'focus' ? 2 : 1;\n if (timers.hide !== undefined) clearTimeout(timers.hide);\n if (current !== undefined) return;\n if (timers.show !== undefined) clearTimeout(timers.show); // debounce: one pending show at a time\n timers.show = setTimeout(show, delay);\n };\n const onLeave = (event: Event): void => {\n presence &= event.type === 'blur' ? ~2 : ~1;\n if (presence) return;\n if (timers.show !== undefined) clearTimeout(timers.show);\n if (current === undefined) return;\n timers.hide = setTimeout(hide, hideDelay);\n };\n\n anchor.addEventListener('pointerenter', onEnter);\n anchor.addEventListener('pointerleave', onLeave);\n anchor.addEventListener('focus', onEnter);\n anchor.addEventListener('blur', onLeave);\n\n return () => {\n anchor.removeEventListener('pointerenter', onEnter);\n anchor.removeEventListener('pointerleave', onLeave);\n anchor.removeEventListener('focus', onEnter);\n anchor.removeEventListener('blur', onLeave);\n if (timers.show !== undefined) clearTimeout(timers.show);\n if (timers.hide !== undefined) clearTimeout(timers.hide);\n hide();\n };\n}\n","/** `choice()` implementation and public option types. */\nimport { delegate } from './delegate.js';\nimport { jsx } from './jsx-runtime.js';\nimport { overlay, type OverlayContent } from './overlay-core.js';\n\n/** One choosable action in a {@link choice} dialog. */\nexport interface ChoiceAction<R> {\n value: R;\n label: string;\n className?: string;\n}\n\n/** Wiring slots for a {@link ChoiceOptions.render}. */\nexport interface ChoiceRenderSlots {\n message: string;\n actions: Array<Record<string, string>>;\n}\n\n/** Options for {@link choice}. */\nexport interface ChoiceOptions<R> {\n container?: Element;\n className?: string;\n title?: string;\n defaultValue?: R;\n native?: boolean;\n render?: (slots: ChoiceRenderSlots) => OverlayContent;\n}\n\n/** The N-way sibling of {@link confirm}. */\nexport function choice<R>(\n message: string,\n actions: ReadonlyArray<ChoiceAction<R>>,\n options: ChoiceOptions<R> = {},\n): Promise<R | null> {\n const { container, className = 'kerf-overlay', title, defaultValue, native = false, render } = options;\n const hasDefault = 'defaultValue' in options;\n const actionAttrs = actions.map((_, i) => ({ 'data-choice': String(i) }));\n\n const body: OverlayContent = render !== undefined\n ? render({ message, actions: actionAttrs })\n : jsx('div', {\n class: 'kerf-choice',\n children: [\n title !== undefined ? jsx('h2', { class: 'kerf-choice__title', children: title }) : '',\n jsx('p', { class: 'kerf-choice__message', children: message }),\n jsx('div', {\n class: 'kerf-choice__actions',\n children: actions.map((action, i) =>\n jsx('button', {\n type: 'button',\n class: action.className !== undefined ? `kerf-choice__action ${action.className}` : 'kerf-choice__action',\n ...actionAttrs[i],\n children: action.label,\n }),\n ),\n }),\n ],\n });\n\n let resolveChoice!: (result: R | null) => void;\n const result = new Promise<R | null>((resolve) => {\n resolveChoice = resolve;\n });\n\n const handle = overlay(body, {\n container,\n className,\n dismiss: ['escape', 'backdrop'],\n initialFocus: '[data-choice]',\n trap: true,\n native,\n });\n\n delegate(handle.el, 'click', '[data-choice]', (_event, el) => {\n resolveChoice(actions[Number(el.getAttribute('data-choice'))].value);\n handle.close();\n });\n\n if (hasDefault) {\n handle.el.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n resolveChoice(defaultValue as R);\n handle.close();\n }\n });\n }\n\n void handle.result.then(() => resolveChoice(null));\n return result;\n}\n","/** `confirm()` implementation and public option types. */\nimport { delegate } from './delegate.js';\nimport { jsx } from './jsx-runtime.js';\nimport { overlay, type OverlayContent } from './overlay-core.js';\n\n/** Wiring slots passed to a {@link ConfirmOptions.render}. */\nexport interface ConfirmRenderSlots {\n message: string;\n /** Spread onto the confirm control. */\n ok: Record<string, string>;\n /** Spread onto the cancel control. */\n cancel: Record<string, string>;\n}\n\n/** Options for {@link confirm}. */\nexport interface ConfirmOptions {\n /** Where to append the overlay. Default `document.body`. */\n container?: Element;\n /** Wrapper class. Default `'kerf-overlay'`. */\n className?: string;\n /** Optional heading above the message. */\n title?: string;\n /** Confirm button label. Default `'OK'`. */\n okText?: string;\n /** Cancel button label. Default `'Cancel'`. */\n cancelText?: string;\n /** Add a `kerf-confirm--danger` class to the wrapper for destructive actions. */\n danger?: boolean;\n /** Host the dialog in the browser top layer where supported. */\n native?: boolean;\n /** Bring your own body while retaining kerf's dialog wiring. */\n render?: (slots: ConfirmRenderSlots) => OverlayContent;\n}\n\n/** A promise-based `window.confirm` replacement. */\nexport function confirm(message: string, options: ConfirmOptions = {}): Promise<boolean> {\n const {\n container,\n className = 'kerf-overlay',\n title,\n okText = 'OK',\n cancelText = 'Cancel',\n danger = false,\n native = false,\n render,\n } = options;\n\n const body: OverlayContent = render !== undefined\n ? render({ message, ok: { 'data-confirm': 'ok' }, cancel: { 'data-confirm': 'cancel' } })\n : jsx('div', {\n class: 'kerf-confirm',\n children: [\n title !== undefined ? jsx('h2', { class: 'kerf-confirm__title', children: title }) : '',\n jsx('p', { class: 'kerf-confirm__message', children: message }),\n jsx('div', {\n class: 'kerf-confirm__actions',\n children: [\n jsx('button', { type: 'button', 'data-confirm': 'cancel', children: cancelText }),\n jsx('button', {\n type: 'button',\n 'data-confirm': 'ok',\n class: 'kerf-confirm__ok',\n children: okText,\n }),\n ],\n }),\n ],\n });\n\n const handle = overlay(body, {\n container,\n className: danger ? `${className} kerf-confirm--danger` : className,\n dismiss: ['escape', 'backdrop'],\n initialFocus: '[data-confirm=\"ok\"]',\n trap: true,\n native,\n });\n\n delegate(handle.el, 'click', '[data-confirm]', (_event, el) => {\n handle.close(el.getAttribute('data-confirm') === 'ok');\n });\n\n return handle.result.then((value) => value === true);\n}\n","/** `form()` implementation and public option types. */\nimport { delegate } from './delegate.js';\nimport { jsx } from './jsx-runtime.js';\nimport { overlay, type OverlayContent } from './overlay-core.js';\nimport type { FieldValidator } from './overlay-prompt.js';\n\n/** A single field in a {@link form}. */\nexport interface FormField {\n name: string;\n label?: string;\n defaultValue?: string;\n placeholder?: string;\n type?: string;\n validate?: FieldValidator;\n}\n\n/** One field's wiring in a {@link FormRenderSlots}. */\nexport interface FormRenderField {\n name: string;\n label: string;\n input: Record<string, string>;\n error: Record<string, string>;\n}\n\n/** Wiring slots for a {@link FormOptions.render}. */\nexport interface FormRenderSlots {\n fields: FormRenderField[];\n ok: Record<string, string>;\n cancel: Record<string, string>;\n}\n\n/** Options for {@link form}. */\nexport interface FormOptions {\n container?: Element;\n className?: string;\n title?: string;\n okText?: string;\n cancelText?: string;\n native?: boolean;\n render?: (slots: FormRenderSlots) => OverlayContent;\n}\n\n/** A promise-based multi-field dialog. */\nexport function form(\n fields: readonly FormField[],\n options: FormOptions = {},\n): Promise<Record<string, string> | null> {\n const {\n container, className = 'kerf-overlay', title, okText = 'OK', cancelText = 'Cancel', native = false, render,\n } = options;\n\n const fieldAttrs = (field: FormField): Record<string, string> => ({\n 'data-field': field.name,\n name: field.name,\n type: field.type ?? 'text',\n value: field.defaultValue ?? '',\n ...(field.placeholder !== undefined ? { placeholder: field.placeholder } : {}),\n });\n\n const body: OverlayContent = render !== undefined\n ? render({\n fields: fields.map((field) => ({\n name: field.name,\n label: field.label ?? field.name,\n input: fieldAttrs(field),\n error: { 'data-field-error': field.name },\n })),\n ok: { 'data-form': 'ok' },\n cancel: { 'data-form': 'cancel' },\n })\n : jsx('div', {\n class: 'kerf-form',\n children: [\n title !== undefined ? jsx('h2', { class: 'kerf-form__title', children: title }) : '',\n ...fields.map((field) =>\n jsx('div', {\n class: 'kerf-form__field',\n children: [\n jsx('label', { class: 'kerf-form__label', children: field.label ?? field.name }),\n jsx('input', { class: 'kerf-form__input', ...fieldAttrs(field) }),\n jsx('p', { class: 'kerf-form__error', 'data-field-error': field.name, children: '' }),\n ],\n }),\n ),\n jsx('div', {\n class: 'kerf-form__actions',\n children: [\n jsx('button', { type: 'button', 'data-form': 'cancel', children: cancelText }),\n jsx('button', {\n type: 'button',\n 'data-form': 'ok',\n class: 'kerf-form__ok',\n children: okText,\n }),\n ],\n }),\n ],\n });\n\n const handle = overlay(body, {\n container,\n className,\n dismiss: ['escape', 'backdrop'],\n initialFocus: '[data-field]',\n trap: true,\n native,\n });\n\n const errorFor = (name: string): HTMLElement | null =>\n Array.from(handle.el.querySelectorAll<HTMLElement>('[data-field-error]')).find(\n (el) => el.getAttribute('data-field-error') === name,\n ) ?? null;\n const inputFor = (name: string): HTMLInputElement => {\n const input = Array.from(handle.el.querySelectorAll<HTMLInputElement>('input[data-field]')).find(\n (el) => el.getAttribute('data-field') === name,\n );\n if (input !== undefined) return input;\n handle.close(null);\n throw new Error(`form(): render missing <input data-field=\"${name}\">.`);\n };\n\n for (const field of fields) {\n inputFor(field.name);\n const errorEl = errorFor(field.name);\n if (errorEl !== null) errorEl.hidden = true;\n }\n\n function attemptOk(): void {\n const record: Record<string, string> = {};\n let firstInvalid: HTMLInputElement | null = null;\n for (const field of fields) {\n const el = inputFor(field.name);\n const value = el.value;\n record[field.name] = value;\n const error = field.validate?.(value);\n const errorEl = errorFor(field.name);\n if (typeof error === 'string' && error.length > 0) {\n if (errorEl !== null) {\n errorEl.textContent = error;\n errorEl.hidden = false;\n }\n if (firstInvalid === null) firstInvalid = el;\n } else if (errorEl !== null) {\n errorEl.hidden = true;\n }\n }\n if (firstInvalid !== null) {\n firstInvalid.focus();\n return;\n }\n handle.close(record);\n }\n\n delegate(handle.el, 'click', '[data-form]', (_event, el) => {\n if (el.getAttribute('data-form') === 'ok') attemptOk();\n else handle.close(null);\n });\n\n handle.el.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Enter' && (event.target as Element | null)?.matches('[data-field]')) {\n event.preventDefault();\n attemptOk();\n }\n });\n\n return handle.result.then((value) =>\n value !== null && typeof value === 'object' ? (value as Record<string, string>) : null,\n );\n}\n","/** `prompt()` implementation and public option types. */\nimport { delegate } from './delegate.js';\nimport { jsx } from './jsx-runtime.js';\nimport { overlay, type OverlayContent } from './overlay-core.js';\n\n/** Validate a single field's value. */\nexport type FieldValidator = (value: string) => string | null | undefined | void;\n\n/** Options for {@link prompt}. */\nexport interface PromptOptions {\n container?: Element;\n className?: string;\n title?: string;\n defaultValue?: string;\n placeholder?: string;\n inputType?: string;\n okText?: string;\n cancelText?: string;\n validate?: FieldValidator;\n native?: boolean;\n render?: (slots: PromptRenderSlots) => OverlayContent;\n}\n\n/** Wiring slots for a {@link PromptOptions.render}. */\nexport interface PromptRenderSlots {\n message: string;\n input: Record<string, string>;\n error: Record<string, string>;\n ok: Record<string, string>;\n cancel: Record<string, string>;\n}\n\n/** A promise-based `window.prompt` replacement. */\nexport function prompt(message: string, options: PromptOptions = {}): Promise<string | null> {\n const {\n container,\n className = 'kerf-overlay',\n title,\n defaultValue = '',\n placeholder,\n inputType = 'text',\n okText = 'OK',\n cancelText = 'Cancel',\n validate,\n native = false,\n render,\n } = options;\n\n const inputAttrs: Record<string, string> = {\n 'data-prompt-input': '',\n type: inputType,\n value: defaultValue,\n ...(placeholder !== undefined ? { placeholder } : {}),\n };\n\n const body: OverlayContent = render !== undefined\n ? render({\n message,\n input: inputAttrs,\n error: { 'data-prompt-error': '' },\n ok: { 'data-prompt': 'ok' },\n cancel: { 'data-prompt': 'cancel' },\n })\n : jsx('div', {\n class: 'kerf-prompt',\n children: [\n title !== undefined ? jsx('h2', { class: 'kerf-prompt__title', children: title }) : '',\n jsx('label', { class: 'kerf-prompt__message', children: message }),\n jsx('input', { class: 'kerf-prompt__input', ...inputAttrs }),\n jsx('p', { class: 'kerf-prompt__error', 'data-prompt-error': '', children: '' }),\n jsx('div', {\n class: 'kerf-prompt__actions',\n children: [\n jsx('button', { type: 'button', 'data-prompt': 'cancel', children: cancelText }),\n jsx('button', {\n type: 'button',\n 'data-prompt': 'ok',\n class: 'kerf-prompt__ok',\n children: okText,\n }),\n ],\n }),\n ],\n });\n\n const handle = overlay(body, {\n container,\n className,\n dismiss: ['escape', 'backdrop'],\n initialFocus: '[data-prompt-input]',\n trap: true,\n native,\n });\n\n const input = handle.el.querySelector<HTMLInputElement>('input[data-prompt-input]');\n if (input === null) {\n handle.close(null);\n throw new Error('prompt(): render missing <input data-prompt-input>.');\n }\n const promptInput = input;\n const errorEl = handle.el.querySelector<HTMLElement>('[data-prompt-error]');\n if (errorEl !== null) errorEl.hidden = true;\n\n function attemptOk(): void {\n const value = promptInput.value;\n const error = validate?.(value);\n if (typeof error === 'string' && error.length > 0) {\n if (errorEl !== null) {\n errorEl.textContent = error;\n errorEl.hidden = false;\n }\n promptInput.focus();\n return;\n }\n handle.close(value);\n }\n\n delegate(handle.el, 'click', '[data-prompt]', (_event, el) => {\n if (el.getAttribute('data-prompt') === 'ok') attemptOk();\n else handle.close(null);\n });\n\n handle.el.addEventListener('keydown', (event: KeyboardEvent) => {\n if (event.key === 'Enter' && event.target === promptInput) {\n event.preventDefault();\n attemptOk();\n }\n });\n\n return handle.result.then((value) => (typeof value === 'string' ? value : null));\n}\n","/**\n * `toast()` for `kerfjs/overlay` — a non-modal, auto-dismissing notification that\n * stacks in a shared body-level region. Split out of `overlay.ts` (KF-513) since\n * it's a distinct transient-UI concern from the modal dialogs; re-exported from\n * `overlay.ts` so the public `kerfjs/overlay` surface is unchanged. Structural\n * only — kerf ships no CSS; you style the region / toast / animations.\n */\nimport { type SafeHtml } from './jsx-runtime.js';\nimport { mount, type MountResult } from './mount.js';\nimport { escapeHtml } from './utils/escapeHtml.js';\n\n/** Content for a {@link toast}: an escaped text string, trusted `SafeHtml`, or a render function. */\nexport type ToastContent = string | SafeHtml | (() => MountResult);\n\n/** Accent variant for a {@link toast} — mapped to a `${className}--${variant}` class. */\nexport type ToastVariant = 'info' | 'success' | 'warning';\n\n/** Options for {@link toast}. */\nexport interface ToastOptions {\n /** Where toasts stack. Default: a lazily-created `<div class=\"kerf-toasts\">` on `document.body`. */\n container?: Element;\n /** Class on the toast element. Default `'kerf-toast'`. */\n className?: string;\n /** Auto-dismiss after this many ms. `0` keeps it until dismissed by hand. Default `4000`. */\n duration?: number;\n /** ARIA role. Default `'status'`. */\n role?: string;\n /**\n * `'stack'` (default) shows toasts stacked in the region; `'replace'` dismisses\n * the region's current toast(s) first (collapse-to-latest for a rapid sequence).\n */\n mode?: 'stack' | 'replace';\n /**\n * How `mode: 'replace'` drops the prior toast(s): `'fade'` (default) runs their\n * full exit transition (nice for a STACKING region), or `'instant'` removes them\n * synchronously with no exit — what a single, exactly-centered toast slot wants,\n * so the outgoing and incoming messages never cross-fade in the same spot.\n */\n collapse?: 'fade' | 'instant';\n /** Accent variant — adds a `${className}--${variant}` class (kerf ships no CSS; you style it). */\n variant?: ToastVariant;\n /** Class added on the next animation frame after mount, so a CSS **entrance** transition can run. */\n enterClass?: string;\n /**\n * Class added when dismissing, so CSS owns the **exit**. On dismiss the\n * `enterClass` (if any) is also REMOVED, so `exitClass` doesn't have to\n * out-specify it — and a symmetric single-class fade (entrance = add\n * `enterClass`, exit = remove it) works by setting only `enterClass` +\n * `exitDuration`. The node is removed `exitDuration` ms later.\n */\n exitClass?: string;\n /** ms to wait before removing the node on dismiss — applies when `exitClass` is set OR when it's > 0 (to let a removed `enterClass` transition out). Default `0`. */\n exitDuration?: number;\n}\n\n/** Handle returned by {@link toast}. */\nexport interface ToastHandle {\n /** The toast element — inspect it, or run your own entrance/exit transitions. */\n el: HTMLElement;\n /**\n * Dismiss it early. Default runs the `exitClass` transition (removed after\n * `exitDuration`); pass `{ instant: true }` to remove it **synchronously** with\n * no exit — for an action button that immediately shows a replacement toast in a\n * single centered slot (no cross-fade). Idempotent.\n */\n dismiss(options?: { instant?: boolean }): void;\n}\n\n/** The region's active toasts live on the region element (in the DOM), not in module state. */\nconst TOAST_SET = Symbol('kerf.toasts');\n/** A dismiss function with an `.removeNow()` for instant (no-exit) teardown. */\ntype Dismisser = (() => void) & { removeNow: () => void };\ntype ToastCarrier = Element & { [TOAST_SET]?: Set<Dismisser> };\n\n/** The singleton toast region lives in the DOM (queried, not held in a module variable). */\nfunction toastRegion(container?: Element): Element {\n if (container !== undefined) return container;\n const existing = document.querySelector('.kerf-toasts');\n if (existing !== null) return existing;\n const region = document.createElement('div');\n region.className = 'kerf-toasts';\n region.setAttribute('aria-live', 'polite');\n document.body.appendChild(region);\n return region;\n}\n\n/**\n * Show a non-modal, auto-dismissing notification. Stacks in a shared body-level\n * region (or your `container`). Returns a {@link ToastHandle} (`{ el, dismiss }`)\n * so you can run entrance/exit transitions, wire an action button, or inspect the\n * node. `mode: 'replace'` collapses a rapid sequence to the latest; `variant`\n * adds an accent class; `enterClass`/`exitClass` let CSS own the animation.\n */\nexport function toast(content: ToastContent, options: ToastOptions = {}): ToastHandle {\n const {\n container,\n className = 'kerf-toast',\n duration = 4000,\n role = 'status',\n mode = 'stack',\n collapse = 'fade',\n variant,\n enterClass,\n exitClass,\n exitDuration = 0,\n } = options;\n\n const region = toastRegion(container) as ToastCarrier;\n const active = (region[TOAST_SET] ??= new Set<Dismisser>());\n // collapse-to-latest: 'instant' removes priors synchronously (no cross-fade in a\n // centered single slot); 'fade' runs their exit transition (nice for a stack).\n if (mode === 'replace') {\n for (const d of [...active]) {\n if (collapse === 'instant') d.removeNow();\n else d();\n }\n }\n\n const el = document.createElement('div');\n el.className = className;\n if (variant !== undefined) el.classList.add(`${className}--${variant}`);\n el.setAttribute('role', role);\n region.appendChild(el);\n\n const render = typeof content === 'function'\n ? content\n : () => typeof content === 'string' ? escapeHtml(content) : content;\n const disposeMount = mount(el, render);\n const state: {\n dismissed: boolean;\n removed: boolean;\n timer: ReturnType<typeof setTimeout> | undefined;\n exitTimer: ReturnType<typeof setTimeout> | undefined;\n } = { dismissed: false, removed: false, timer: undefined, exitTimer: undefined };\n\n if (enterClass !== undefined) {\n globalThis.requestAnimationFrame(() => {\n if (!state.dismissed) el.classList.add(enterClass);\n });\n }\n\n const remove = (): void => {\n if (state.removed) return;\n state.removed = true;\n state.dismissed = true; // once removed, a later dismiss() is a clean no-op\n if (state.exitTimer !== undefined) clearTimeout(state.exitTimer);\n disposeMount();\n el.remove();\n active.delete(dismiss as Dismisser);\n };\n\n // Force synchronous teardown NOW, with no exit transition — even if a fade is\n // already in flight (so `mode:'replace'` collapse can clean up a mid-exit toast,\n // and `dismiss({ instant: true })` drops it immediately).\n const removeNow = (): void => {\n if (state.timer !== undefined) clearTimeout(state.timer);\n remove();\n };\n\n const fadeOut = (): void => {\n if (state.dismissed) return;\n state.dismissed = true;\n if (state.timer !== undefined) clearTimeout(state.timer);\n // Reverse the entrance (drop enterClass so exitClass needn't out-specify it),\n // add exitClass, and delay removal for the transition — including the\n // single-class idiom (enterClass removed + exitDuration, no exitClass).\n if (enterClass !== undefined) el.classList.remove(enterClass);\n if (exitClass !== undefined) el.classList.add(exitClass);\n if (exitClass !== undefined || exitDuration > 0) {\n state.exitTimer = setTimeout(remove, exitDuration);\n } else {\n remove();\n }\n };\n\n function dismiss(options?: { instant?: boolean }): void {\n if (options?.instant === true) removeNow();\n else fadeOut();\n }\n (dismiss as Dismisser).removeNow = removeNow;\n\n active.add(dismiss as Dismisser);\n if (duration > 0) state.timer = setTimeout(fadeOut, duration);\n return { el, dismiss };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/overlay-position.ts","../src/overlay-core.ts","../src/overlay-choice.ts","../src/overlay-confirm.ts","../src/overlay-prompt.ts","../src/overlay-form.ts","../src/overlay-toast.ts"],"names":["options"],"mappings":"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","file":"overlay.js","sourcesContent":["/**\n * Anchored positioning primitives for `kerfjs/overlay` — position an element\n * relative to an anchor, with viewport flip + clamp. These are standalone: they\n * take any element and have no overlay lifecycle, so `popover()` / `tooltip()`\n * build on them but you can also position your own element (an inline hint, a\n * custom menu). Re-exported from `src/overlay.ts` so the public `kerfjs/overlay`\n * surface is unchanged (KF-511 split out of overlay.ts's dialog + toast code).\n */\n\n/** Vertical placement relative to an anchor (used by `popover`, {@link positionAnchored}, `tooltip`). */\nexport type PopoverPlacement = 'bottom' | 'top';\n\n/** Placement options for {@link positionAnchored} / {@link autoReposition}. */\nexport interface AnchorPositionOptions {\n /** Preferred side of the anchor; flips to the other side if it would overflow the viewport. Default `'bottom'`. */\n placement?: PopoverPlacement;\n /** Horizontal edge to line up with the anchor: `'start'` (left edges) or `'end'` (right edges). Default `'start'`. */\n align?: 'start' | 'end';\n /** Gap in px between the anchor and the element. Default `4`. */\n gap?: number;\n}\n\n/**\n * One-shot: position `el` relative to `anchor` — below by default, flipping above\n * if it would overflow the viewport, aligned to a horizontal edge and clamped into\n * view. Sets `el.style` `position: fixed`, `margin: 0`, `left`, and `top` (fixed so\n * `left`/`top` are viewport coordinates, matching `getBoundingClientRect`). When an\n * ancestor makes itself the containing block for fixed descendants (a\n * `transform`, `filter`, `perspective`, or `contain` on a wrapping `<dialog>`),\n * `left`/`top` are translated (and unscaled) into that box's coordinates so `el`\n * still lands next to the anchor. This is\n * `popover()`'s placement core, usable on any element (an inline hint, a tooltip) —\n * no overlay lifecycle. Pair with {@link autoReposition} to keep it glued while open.\n */\nexport function positionAnchored(\n el: HTMLElement,\n anchor: Element,\n options: AnchorPositionOptions = {},\n): void {\n const { placement = 'bottom', align = 'start', gap = 4 } = options;\n // Fix `el` FIRST, then measure it. Measuring a still-`display:block` wrapper\n // reports the full body-content width (≈ viewport minus body margins), which\n // collapses the horizontal clamp below and lands the element at the body's left\n // edge. As a fixed, shrink-to-fit box its `width`/`height` are its real size.\n el.style.position = 'fixed';\n el.style.margin = '0';\n const anchorRect = anchor.getBoundingClientRect();\n const elementRect = el.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // Vertical: preferred side, flipped only if it overflows and the other side fits.\n const belowTop = anchorRect.bottom + gap;\n const aboveTop = anchorRect.top - gap - elementRect.height;\n let below = placement !== 'top';\n if (below && belowTop + elementRect.height > viewportHeight && aboveTop >= 0)\n below = false;\n else if (\n !below &&\n aboveTop < 0 &&\n belowTop + elementRect.height <= viewportHeight\n )\n below = true;\n\n // Horizontal: align to an anchor edge, then clamp into the viewport.\n let left =\n align === 'end' ? anchorRect.right - elementRect.width : anchorRect.left;\n left = Math.max(0, Math.min(left, viewportWidth - elementRect.width));\n\n // `left`/`top` so far are viewport coordinates. They are only the CSS values\n // too when `el`'s fixed-position containing block is the viewport; an\n // ancestor with a `transform`, `filter`, `perspective`, `contain`, … (say a\n // modal `<dialog>` holding an overlay host slot) captures fixed descendants,\n // so map the coordinates into that box's space.\n const [originX, originY, scaleX, scaleY] = fixedOrigin(el);\n el.style.left = `${(left - originX) / scaleX}px`;\n el.style.top = `${((below ? belowTop : aboveTop) - originY) / scaleY}px`;\n}\n\n/**\n * Where `left: 0; top: 0` actually lands for a fixed-position child of `el`'s\n * parent, plus that containing block's scale — `[x, y, scaleX, scaleY]`, which\n * is `[0, 0, 1, 1]` when the viewport is the containing block. Measured with a\n * 1px probe rather than `el` itself so `el`'s own transform or running entrance\n * animation cannot skew it. The probe is inserted and removed synchronously, so\n * it is never painted. Translation and scale are compensated; a rotated or\n * skewed containing block is not.\n */\nfunction fixedOrigin(el: HTMLElement): [number, number, number, number] {\n const parent = el.parentNode;\n if (!parent) return [0, 0, 1, 1];\n const probe = el.ownerDocument.createElement('div');\n probe.style.cssText =\n 'position:fixed;left:0;top:0;width:1px;height:1px;margin:0;padding:0;border:0';\n parent.insertBefore(probe, el);\n const rect = probe.getBoundingClientRect();\n probe.remove();\n // A zero size (a containing block mid `scale(0)` animation, or a DOM without\n // layout) would divide by zero; treat it as unscaled.\n return [rect.left, rect.top, rect.width || 1, rect.height || 1];\n}\n\n/**\n * Keep `el` positioned against `anchor` (via {@link positionAnchored}) as the page\n * scrolls or resizes. Positions once immediately, then re-runs on `scroll`\n * (capture phase — catches scrolls in any inner container, not just `window`) and\n * `resize`. Returns a disposer that removes the listeners.\n */\nexport function autoReposition(\n el: HTMLElement,\n anchor: Element,\n options: AnchorPositionOptions = {},\n): () => void {\n const reposition = (): void => positionAnchored(el, anchor, options);\n reposition();\n window.addEventListener('scroll', reposition, true);\n window.addEventListener('resize', reposition);\n return () => {\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n}\n","/**\n * Internal overlay / popover / tooltip lifecycle implementation.\n *\n * Every real kerf app hand-rolls this: `toElement → body.appendChild → mount →\n * wire dismissal → remove`, plus the fiddly parts (Escape, backdrop / outside\n * click, focus trap, restoring focus on close). `window.confirm` is a no-op in\n * Tauri WKWebViews, so a hand-built overlay is mandatory there. This subpath\n * blesses the pattern as three functions over `mount()` — `overlay()`, and the\n * `confirm()` / `toast()` conveniences built on it. No per-instance framework\n * state: each call owns its DOM + listeners in a closure and returns a handle.\n *\n * import { overlay, confirm, toast } from 'kerfjs/overlay';\n *\n * const ok = await confirm('Delete this file?', { danger: true });\n * toast('Saved');\n * const dialog = overlay(<Settings />, { dismiss: ['escape', 'backdrop'] });\n * // …later: dialog.close(); or await dialog.result;\n *\n * Structural only — kerf ships no CSS. The wrapper gets your `className`; style\n * the backdrop / centering / animation yourself.\n */\nimport { attach } from './attach.js';\nimport { devHooks } from './dev-hooks.js';\nimport { jsx, type SafeHtml } from './jsx-runtime.js';\nimport { mount, type MountResult } from './mount.js';\nimport {\n type AnchorPositionOptions,\n autoReposition,\n type PopoverPlacement,\n positionAnchored,\n} from './overlay-position.js';\nimport { OVERLAY_HOST_SELECTOR } from './utils/overlay-host.js';\n\n/** A user-initiated dismissal trigger. */\nexport type DismissTrigger = 'escape' | 'backdrop' | 'outside';\n\n/** Content for an overlay: static `SafeHtml`, or a render function `mount()` drives reactively. */\nexport type OverlayContent = SafeHtml | (() => MountResult);\n\n/** Options for {@link overlay}. */\nexport interface OverlayOptions {\n /** Where to append the overlay wrapper. Default `document.body`. */\n container?: Element;\n /** Class on the wrapper element (you style it — kerf ships no CSS). Default `'kerf-overlay'`. */\n className?: string;\n /**\n * Which user actions dismiss the overlay. Default `['escape', 'backdrop']`.\n * `'backdrop'` = a click on the wrapper itself (not its content); `'outside'`\n * = a click anywhere outside the wrapper (for anchored popovers). `false`\n * disables user dismissal (close it programmatically).\n */\n dismiss?: DismissTrigger | DismissTrigger[] | false;\n /**\n * Where focus lands on open: a selector, `true` (first focusable element, or\n * the wrapper if none), or `false` (leave focus alone). Default `true`.\n */\n initialFocus?: string | boolean;\n /**\n * Trap Tab / Shift+Tab within the overlay while open and mark it\n * `role=\"dialog\"` / `aria-modal=\"true\"`. Default `true`. Set `false` for a\n * non-modal popover.\n */\n trap?: boolean;\n /** ARIA role for the wrapper when `trap` is on. Default `'dialog'`. */\n role?: string;\n /** Called on any user-initiated dismissal (before `close()` runs). */\n onDismiss?: () => void;\n /** For `'outside'` dismissal: clicks on these elements do NOT count as outside (e.g. the trigger button). */\n outsideIgnore?: Element | readonly Element[];\n /**\n * Opt into the browser **top layer** (`docs/19-native-overlay-backing.md`).\n * When `true` and the engine supports it, a modal overlay (`trap: true`) is\n * hosted in a `<dialog>` opened with `.showModal()` — real inerting of the rest\n * of the document + guaranteed stacking above any `z-index` — and a non-modal\n * one (`trap: false`) uses the Popover API (`[popover]` + `showPopover()`).\n * Feature-detected; falls back to today's plain `<div>` where unsupported.\n *\n * The `render` slot + promise API are unchanged — kerf just hosts your markup\n * in a `<dialog>` / `[popover]` instead of a `<div>`. Two caveats: native\n * `<dialog>` / `[popover]` carry **UA default styles** (a `::backdrop`,\n * centering, border, padding) that kerf does not reset — style the element (and\n * its `::backdrop`) via `className`; and `container` is effectively a **no-op**\n * for visual position, since the top layer ignores where the element lives in\n * the DOM. Default `false`.\n */\n native?: boolean;\n}\n\n/** Handle returned by {@link overlay}. Holds no framework state — it's a closure. */\nexport interface OverlayHandle {\n /** The wrapper element (mounted into, appended to `container`). */\n el: HTMLElement;\n /** Tear down: dispose the mount, remove listeners + the node, restore focus, resolve `result`. Idempotent. */\n close(result?: unknown): void;\n /** Resolves with the value passed to `close()` (or `undefined` on user dismissal). */\n result: Promise<unknown>;\n}\n\nconst FOCUSABLE =\n 'a[href],area[href],button:not([disabled]),input:not([disabled]),' +\n 'select:not([disabled]),textarea:not([disabled]),iframe,' +\n '[tabindex]:not([tabindex=\"-1\"]),[contenteditable=\"true\"]';\n\nfunction focusable(root: Element): HTMLElement[] {\n const items = Array.from(\n root.querySelectorAll<HTMLElement>(FOCUSABLE),\n ).filter((el) => !el.hasAttribute('hidden') && el.tabIndex >= 0);\n // WebKit on macOS follows the system's keyboard-navigation preference and\n // may omit implicitly tabbable controls from sequential focus navigation.\n // A focus trap promises stable traversal through every eligible control, so\n // make those implicit stops explicit while preserving authored tabindexes.\n for (const el of items) if (!el.hasAttribute('tabindex')) el.tabIndex = 0;\n return items;\n}\n\n// Native top-layer feature detection (KF-526). Modal → `<dialog>.showModal()`;\n// non-modal → the Popover API. Each is independent — an engine may ship one\n// without the other — and both fall back to the plain `<div>` where absent.\nfunction supportsDialog(): boolean {\n return (\n typeof HTMLDialogElement !== 'undefined' &&\n typeof HTMLDialogElement.prototype.showModal === 'function'\n );\n}\nfunction supportsPopover(): boolean {\n return (\n typeof HTMLElement !== 'undefined' &&\n typeof HTMLElement.prototype.showPopover === 'function'\n );\n}\n\n// Stacked-surface arbitration (KF-CW7GJ8: a tooltip inside a modal used to\n// become \"topmost\" and disable the modal's Escape, backdrop, and focus trap).\n// Every open overlay — native or fallback — is recorded, in open order, on a\n// per-document stack. An input kind (Escape, a backdrop / outside click, Tab\n// for the trap) belongs to the topmost surface that HANDLES that kind; a\n// surface that doesn't handle it is transparent, except that a modal surface\n// is a barrier nothing beneath it sees past. A tooltip (or any overlay with no\n// dismiss trigger and no trap) handles nothing, so it never intercepts. The\n// `handled` set marks an event a surface already acted on, so one click that is\n// both \"outside\" a popover and on the modal backdrop closes only the popover.\nconst OVERLAY_ARBITRATION = Symbol('kerf.overlayArbitration');\n\n/** An arbitration input: a dismiss trigger, or Tab for the focus trap. */\ntype ArbitrationKind = DismissTrigger | 'trap';\n\ninterface OverlaySurface {\n el: HTMLElement;\n triggers: readonly DismissTrigger[];\n modal: boolean;\n /** Where focus returns on close; re-pointed when the surface holding it closes first. */\n restoreTo: Element | null;\n /** Non-modal only: move (or re-show) into the top layer above a newly opened modal `<dialog>`. */\n liftAbove?: () => void;\n}\n\ninterface OverlayArbitration {\n stack: OverlaySurface[];\n handled: WeakSet<Event>;\n /** Document capture listener, installed only while the stack is non-empty. */\n onToggle: (event: Event) => void;\n}\n\ntype ArbitratedDocument = Document & {\n [OVERLAY_ARBITRATION]?: OverlayArbitration;\n};\n\nfunction overlayArbitration(doc: Document): OverlayArbitration {\n const arbitrated = doc as ArbitratedDocument;\n return (arbitrated[OVERLAY_ARBITRATION] ??= {\n stack: [],\n handled: new WeakSet(),\n // KF-AHY6H4: an app-owned modal `<dialog>` opened outside kerf would leave\n // the kerf surfaces already showing inert beneath it. A dialog fires\n // `toggle` after it opens (it does not bubble, so listen in the capture\n // phase); re-host above it exactly as kerf does for its own dialogs, which\n // are skipped here because `overlay()` already re-hosted synchronously.\n onToggle: (event) => {\n const dialog = event.target as Element;\n const arbitration = arbitrated[OVERLAY_ARBITRATION] as OverlayArbitration;\n if (\n dialog.tagName === 'DIALOG' &&\n !arbitration.stack.some(({ el }) => el === dialog) &&\n isOpenModal(dialog, arbitration)\n )\n rehostAbove(arbitration, dialog);\n },\n });\n}\n\n// Every non-modal kerf surface already open is blocked beneath a modal\n// `<dialog>` that just opened: lift (or re-show) it above (KF-FJ9VD8). One\n// inside that dialog is part of its subtree already.\nfunction rehostAbove(arbitration: OverlayArbitration, dialog: Element): void {\n for (const { el, liftAbove } of arbitration.stack)\n if (el !== dialog && el.isConnected && !dialog.contains(el)) liftAbove?.();\n}\n\n// Is `dialog` an open modal `<dialog>`? kerf's own are known from the stack;\n// an app-owned one is found through `:modal`, which an older engine may not\n// parse (then only kerf's own count).\nfunction isOpenModal(\n dialog: Element,\n arbitration: OverlayArbitration,\n): boolean {\n if (!dialog.isConnected || (dialog as HTMLDialogElement).open !== true)\n return false;\n if (arbitration.stack.some(({ el, modal }) => modal && el === dialog))\n return true;\n try {\n return dialog.matches(':modal');\n } catch {\n return false; // `:modal` unsupported\n }\n}\n\n// Is a modal `<dialog>` open (KF-0V9RTE: a plain surface opened in that state\n// is inert and painted beneath the dialog's top layer)?\nfunction modalDialogOpen(\n doc: Document,\n arbitration: OverlayArbitration,\n): boolean {\n return (\n arbitration.stack.some(({ el }) => isOpenModal(el, arbitration)) ||\n Array.from(doc.querySelectorAll('dialog[open]')).some((dialog) =>\n isOpenModal(dialog, arbitration),\n )\n );\n}\n\n// The in-dialog host slot (KF-FBHQEP: a surface lifted over a modal\n// `<dialog>` is visible but inert, because every engine inerts content outside\n// the modal). A `popover()` / `tooltip()` whose anchor sits inside an open\n// modal `<dialog>` renders into that dialog's `[data-kerf-overlay-host]`\n// element instead, so it is part of the modal subtree and fully interactive.\n// An app-owned dialog opts in by marking an element; a dialog kerf opened\n// itself gets one on demand — `display: contents` so it adds no layout box,\n// and `data-morph-skip` + `data-morph-preserve` so the dialog content's own\n// `mount()` neither re-renders nor removes it (`utils/overlay-host.ts` makes\n// the slot a nested-mount boundary).\nfunction overlayHost(anchor: Element): Element | undefined {\n const arbitration = overlayArbitration(document);\n const dialog = anchor.closest('dialog');\n if (dialog === null || !isOpenModal(dialog, arbitration)) return undefined;\n let host = Array.from(dialog.querySelectorAll(OVERLAY_HOST_SELECTOR)).find(\n (el) => el.closest('dialog') === dialog,\n );\n if (host === undefined && arbitration.stack.some(({ el }) => el === dialog)) {\n dialog.insertAdjacentHTML(\n 'beforeend',\n '<div data-kerf-overlay-host data-morph-skip data-morph-preserve style=\"display:contents\"></div>',\n );\n host = dialog.lastElementChild as Element;\n }\n return host;\n}\n\n// `self` is on the stack and handles `kind` (its callers are exactly the\n// handlers it installed for that kind), so it owns `kind` unless some surface\n// above it handles `kind` too or is modal.\nfunction ownsInput(\n stack: readonly OverlaySurface[],\n self: OverlaySurface,\n kind: ArbitrationKind,\n): boolean {\n for (let i = stack.indexOf(self) + 1; i < stack.length; i++) {\n const above = stack[i];\n if (above.modal || (kind !== 'trap' && above.triggers.includes(kind)))\n return false;\n }\n return true;\n}\n\n// Validate a string `initialFocus` BEFORE any DOM mutation: `querySelector`\n// throws a generic `SyntaxError` DOMException on a malformed selector, and the\n// focus pass runs last — after the wrapper, mount, listeners, and stack entry\n// already exist — so an unvalidated selector would strand all of them with no\n// handle to close. An inert fragment parses the selector without matching.\nfunction assertInitialFocusSelector(selector: string): void {\n try {\n document.createDocumentFragment().querySelector(selector);\n } catch (cause) {\n throw new Error(\n `overlay(): invalid initialFocus selector ${JSON.stringify(selector)}`,\n { cause },\n );\n }\n}\n\n/**\n * Open an overlay: append a wrapper to `container`, `mount()` `content` inside\n * it, wire the requested dismissals + (optionally) a focus trap, and return a\n * handle. Concurrent fallback overlays dismiss from the top down. See\n * {@link OverlayOptions}.\n *\n * Construction is transactional: a malformed `initialFocus` selector throws a\n * descriptive error before anything is touched, and if a later setup phase\n * throws (the content's first render, `showModal()` / `showPopover()`), every\n * piece already installed — wrapper node, mount, listeners, fallback-stack\n * entry, top-layer state, moved focus — is rolled back before the original\n * error is rethrown.\n */\nexport function overlay(\n content: OverlayContent,\n options: OverlayOptions = {},\n): OverlayHandle {\n const {\n container = document.body,\n className = 'kerf-overlay',\n dismiss = ['escape', 'backdrop'],\n initialFocus = true,\n trap = true,\n role = 'dialog',\n onDismiss,\n outsideIgnore,\n native = false,\n } = options;\n\n if (typeof initialFocus === 'string')\n assertInitialFocusSelector(initialFocus);\n\n const triggers: readonly DismissTrigger[] =\n dismiss === false ? [] : Array.isArray(dismiss) ? dismiss : [dismiss];\n\n // Native top-layer backing (KF-526), feature-detected: a modal overlay\n // (`trap`) → `<dialog>.showModal()`; a non-modal one → `[popover]`. Each falls\n // back to the plain `<div>` where the API is missing, so behavior is unchanged\n // on unsupporting engines. A surface opened while a modal `<dialog>` is open\n // is lifted the same way even without `native` (KF-0V9RTE), because a plain\n // `<div>` would be inert and painted beneath the dialog.\n const arbitration = overlayArbitration(document);\n // A surface placed inside an open modal `<dialog>` (its host slot, or an\n // explicit `container` there) is already part of the modal subtree: no lift.\n const containerDialog = container.closest('dialog');\n const liftOverModal =\n !native &&\n !(containerDialog !== null && isOpenModal(containerDialog, arbitration)) &&\n modalDialogOpen(document, arbitration);\n const topLayer = native || liftOverModal;\n const useDialog = topLayer && trap && supportsDialog();\n const usePopover = topLayer && !trap && supportsPopover();\n\n const wrapper: HTMLElement = useDialog\n ? document.createElement('dialog')\n : document.createElement('div');\n wrapper.className = className;\n if (usePopover) wrapper.setAttribute('popover', 'manual');\n // `<dialog>.showModal()` conveys modality natively (role + inert), so the ARIA\n // attributes are only needed on the plain-`<div>` fallback.\n if (trap && !useDialog) {\n wrapper.setAttribute('role', role);\n wrapper.setAttribute('aria-modal', 'true');\n }\n const surface: OverlaySurface = {\n el: wrapper,\n triggers,\n modal: trap,\n restoreTo: document.activeElement,\n };\n\n // Does this surface own `kind` right now (and has no surface acted on `event`)?\n const owns = (kind: ArbitrationKind, event?: Event): boolean =>\n !(event !== undefined && arbitration.handled.has(event)) &&\n ownsInput(arbitration.stack, surface, kind);\n\n const removers: Array<() => void> = [];\n const resultBox: { resolve?: (value: unknown) => void } = {};\n const result = new Promise<unknown>((resolve) => {\n resultBox.resolve = resolve;\n });\n const state = { closed: false };\n let disposeMount: (() => void) | undefined;\n let nativeOpened = false;\n\n // KF-FJ9VD8: a modal `<dialog>` kerf opens later would leave this non-modal\n // surface inert beneath it, so the opener calls this to move it into the top\n // layer — or, if it is already a `[popover]`, re-show it so it stacks above\n // the new dialog (the top layer orders by most recent show).\n if (!trap)\n surface.liftAbove = () => {\n if (!supportsPopover()) {\n devHooks.overlayBlockedByModal?.('hidden');\n return;\n }\n const el = wrapper as HTMLElement & {\n showPopover(): void;\n hidePopover(): void;\n };\n if (nativeOpened) el.hidePopover();\n else {\n wrapper.setAttribute('popover', 'manual');\n wrapper.style.inset = 'auto';\n }\n el.showPopover();\n nativeOpened = true;\n if (wrapper.querySelector(FOCUSABLE) !== null)\n devHooks.overlayBlockedByModal?.('inert');\n };\n\n // Also the construction rollback (see the transaction below): every step\n // tolerates a phase that never ran — no mount yet, no stack entry, never\n // appended, never shown.\n function close(value?: unknown): void {\n if (state.closed) return;\n state.closed = true;\n const { stack } = arbitration;\n const stackIndex = stack.indexOf(surface);\n if (stackIndex !== -1) stack.splice(stackIndex, 1);\n if (stack.length === 0)\n document.removeEventListener('toggle', arbitration.onToggle, true);\n // A surface opened from inside this one would restore focus into a node\n // that is about to be detached: hand it this surface's own restore target.\n for (const other of stack)\n if (other.restoreTo !== null && wrapper.contains(other.restoreTo))\n other.restoreTo = surface.restoreTo;\n const active = document.activeElement;\n for (const remove of removers) remove();\n disposeMount?.();\n // Exit the top layer before removing the node, so the native close steps run\n // (restore inert, fire the dialog's `close`). `<dialog>` also restores focus\n // itself; kerf's manual restore below stays as the fallback path's behavior.\n if (nativeOpened) {\n nativeOpened = false;\n if (useDialog) (wrapper as HTMLDialogElement).close();\n else (wrapper as HTMLElement & { hidePopover(): void }).hidePopover();\n }\n wrapper.remove();\n restoreFocus(active);\n resultBox.resolve?.(value);\n }\n\n // Closing a surface that doesn't hold focus (an out-of-order close beneath\n // another open surface) must not pull focus out of the surface that does;\n // otherwise focus returns to where it was when this surface opened.\n function restoreFocus(active: Element | null): void {\n if (\n active instanceof HTMLElement &&\n active.isConnected &&\n arbitration.stack.some((other) => other.el.contains(active))\n ) {\n if (document.activeElement !== active) active.focus();\n return;\n }\n const { restoreTo } = surface;\n if (restoreTo instanceof HTMLElement && restoreTo.isConnected)\n restoreTo.focus();\n }\n\n function userDismiss(): void {\n onDismiss?.();\n close();\n }\n\n // One transaction: if any phase below throws (the content's first render,\n // `showModal()` / `showPopover()`, …), roll back whatever the earlier phases\n // installed via `close()` and rethrow the original error. No handle is\n // returned on failure, so nothing may outlive the call.\n try {\n container.appendChild(wrapper);\n disposeMount = mount(\n wrapper,\n typeof content === 'function' ? content : () => content,\n );\n // Watch for app-owned modal dialogs while any kerf surface is open.\n if (arbitration.stack.push(surface) === 1)\n document.addEventListener('toggle', arbitration.onToggle, true);\n\n // Enter the top layer after the content is mounted + connected.\n // `showModal()` moves focus into the dialog by default; kerf's\n // `initialFocus` pass below runs afterward and wins.\n if (useDialog) {\n (wrapper as HTMLDialogElement).showModal();\n nativeOpened = true;\n rehostAbove(arbitration, wrapper);\n } else if (usePopover) {\n (wrapper as HTMLElement & { showPopover(): void }).showPopover();\n nativeOpened = true;\n // Neutralize the UA `[popover] { inset: 0; margin: auto }` anchoring so\n // `positionAnchored` (which sets `top`/`left`) controls placement —\n // otherwise the retained `right`/`bottom` insets would stretch/center it.\n wrapper.style.inset = 'auto';\n }\n\n installDismissal();\n if (container.closest(OVERLAY_HOST_SELECTOR) !== null) {\n makeTabReachable();\n // KF-WZ9KQM: a slot-hosted surface leaves with its dialog even when its\n // anchor (moved out of the dialog) stays connected, so the anchor watch\n // never fires. Watch the wrapper itself: close as cleanup (no\n // `onDismiss`) and leave the open-order stack.\n removers.push(attach(wrapper, () => close));\n }\n applyInitialFocus();\n } catch (error) {\n close();\n throw error;\n }\n\n // What the lift cannot repair: no top-layer API at all, or a lifted\n // non-modal surface whose controls the modal still inerts.\n if (liftOverModal) {\n if (!useDialog && !usePopover) devHooks.overlayBlockedByModal?.('hidden');\n else if (usePopover && wrapper.querySelector(FOCUSABLE) !== null)\n devHooks.overlayBlockedByModal?.('inert');\n }\n\n return { el: wrapper, close, result };\n\n function installDismissal(): void {\n const wantEscape = triggers.includes('escape');\n if (useDialog) {\n // A native modal `<dialog>` confines Tab focus itself and surfaces Escape as\n // a `cancel` event. Take that over: `preventDefault` so kerf owns teardown\n // (and so Escape is swallowed when it isn't a dismiss trigger), then dismiss.\n // A surface stacked above that handles Escape (or is modal) owns it; a\n // stray `cancel` then leaves this dialog open.\n const onCancel = (event: Event): void => {\n event.preventDefault();\n if (wantEscape && owns('escape')) userDismiss();\n };\n wrapper.addEventListener('cancel', onCancel);\n removers.push(() => wrapper.removeEventListener('cancel', onCancel));\n } else if (wantEscape || trap) {\n const onKeydown = (event: KeyboardEvent): void => {\n if (wantEscape && event.key === 'Escape') {\n if (!owns('escape', event)) return;\n // `preventDefault` also withholds the close request from a native\n // `<dialog>` beneath, so one Escape closes exactly one surface.\n event.stopPropagation();\n event.preventDefault();\n arbitration.handled.add(event);\n userDismiss();\n return;\n }\n if (trap && event.key === 'Tab' && owns('trap')) {\n const items = focusable(wrapper);\n if (items.length === 0) {\n event.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n const outside = !wrapper.contains(active);\n if (event.shiftKey && (active === first || outside)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && (active === last || outside)) {\n event.preventDefault();\n first.focus();\n }\n }\n };\n document.addEventListener('keydown', onKeydown, true);\n removers.push(() =>\n document.removeEventListener('keydown', onKeydown, true),\n );\n }\n\n if (triggers.includes('backdrop')) {\n const onClick = (event: Event): void => {\n if (event.target !== wrapper || !owns('backdrop', event)) return;\n arbitration.handled.add(event);\n userDismiss();\n };\n wrapper.addEventListener('click', onClick);\n removers.push(() => wrapper.removeEventListener('click', onClick));\n }\n\n if (triggers.includes('outside')) {\n const ignore =\n outsideIgnore === undefined\n ? []\n : Array.isArray(outsideIgnore)\n ? outsideIgnore\n : [outsideIgnore];\n // Capture phase: the click that opened this overlay already passed\n // document's capture phase, so this never fires for that opening click.\n const onDocClick = (event: Event): void => {\n const target = event.target as Node | null;\n if (target === null) return;\n if (wrapper.contains(target)) return;\n if (ignore.some((el) => el === target || el.contains(target))) return;\n if (!owns('outside', event)) return;\n arbitration.handled.add(event);\n userDismiss();\n };\n document.addEventListener('click', onDocClick, true);\n removers.push(() =>\n document.removeEventListener('click', onDocClick, true),\n );\n }\n }\n\n // KF-QZ9SFG (slot-hosted controls unreachable by Tab in macOS WebKit): a\n // surface in an overlay host slot sits in the modal dialog's own Tab order,\n // not behind a kerf trap, so WebKit's system keyboard-navigation preference\n // would skip its implicitly tabbable controls. Make those stops explicit, as\n // the trap does — now, and again before each Tab so a control a re-render\n // added (or whose tabindex the morph dropped) is reachable too.\n function makeTabReachable(): void {\n focusable(wrapper);\n const onTab = (event: KeyboardEvent): void => {\n if (event.key === 'Tab') focusable(wrapper);\n };\n document.addEventListener('keydown', onTab, true);\n removers.push(() => document.removeEventListener('keydown', onTab, true));\n }\n\n function applyInitialFocus(): void {\n if (initialFocus !== false) {\n if (typeof initialFocus === 'string') {\n wrapper.querySelector<HTMLElement>(initialFocus)?.focus();\n } else {\n const first = focusable(wrapper)[0];\n if (first !== undefined) {\n first.focus();\n } else {\n wrapper.tabIndex = -1;\n wrapper.focus();\n }\n }\n }\n }\n}\n\n/**\n * Internal: run a promise-dialog helper's post-open wiring (required-slot\n * lookups, `delegate()` handlers, key listeners) as the tail of `overlay()`'s\n * construction transaction. `wire` registers a disposer for every listener it\n * installs via `track`; if any step throws, those listeners are removed, the\n * just-opened overlay is closed (node, mount, dismissal listeners, stack\n * entry, top-layer state, focus), and the original error is rethrown — so a\n * failed helper call returns no promise and leaves no open overlay behind.\n *\n * After construction, `guard` wraps a user-action handler (OK click, Enter).\n * KF-B0CFQP (a throwing `validate` callback): a throw inside a guarded action\n * is a programming error, so it closes the dialog (full teardown, focus\n * restored) and the returned promise REJECTS with the original error, instead\n * of the error escaping the event handler and stranding an open dialog whose\n * OK can never succeed. Otherwise the returned promise settles with\n * `settle(handle.result's value)`. Not re-exported from `kerfjs/overlay`.\n */\nexport function wireDialog<T>(\n handle: OverlayHandle,\n wire: (\n track: (dispose: () => void) => void,\n guard: (action: () => void) => () => void,\n ) => void,\n settle: (value: unknown) => T,\n): Promise<T> {\n const disposers: Array<() => void> = [];\n // Holds a guarded action's error AND is the close() value that marks the\n // failure, so only a throw that actually settles the dialog rejects it.\n const failure: unknown[] = [];\n try {\n wire(\n (dispose) => void disposers.push(dispose),\n (action) => () => {\n try {\n action();\n } catch (error) {\n failure[0] = error;\n handle.close(failure);\n }\n },\n );\n } catch (error) {\n disposers.forEach((dispose) => dispose());\n handle.close();\n throw error;\n }\n // One hop, not a chain: `settle` maps the value in the same reaction, so a\n // helper's promise settles as soon after `close()` as it always has.\n return handle.result.then((value) => {\n if (value === failure) throw failure[0];\n return settle(value);\n });\n}\n\n// The anchored-positioning primitives — `positionAnchored` / `autoReposition`\n// plus their option types — live in `./overlay-position.ts` (KF-511) since they\n// stand alone (any element, no overlay lifecycle). Re-exported here so the\n// `kerfjs/overlay` surface is unchanged; `popover()` / `tooltip()` below build on\n// `autoReposition` (imported above).\nexport {\n type AnchorPositionOptions,\n autoReposition,\n type PopoverPlacement,\n positionAnchored,\n};\n\n/** Options for {@link popover}. */\nexport interface PopoverOptions {\n /**\n * Where to append the popover wrapper. Default: when `anchor` sits inside an\n * open modal `<dialog>`, that dialog's `[data-kerf-overlay-host]` element (a\n * dialog kerf opened gets one automatically), so the popover is part of the\n * modal subtree and stays interactive; otherwise `document.body`.\n */\n container?: Element;\n /** Class on the wrapper. Default `'kerf-popover'`. */\n className?: string;\n /** Preferred side of the anchor. Flips to the other side if it would overflow the viewport. Default `'bottom'`. */\n placement?: PopoverPlacement;\n /** Horizontal edge to line up with the anchor: `'start'` (left edges) or `'end'` (right edges). Default `'start'`. */\n align?: 'start' | 'end';\n /** Gap in px between the anchor and the popover. Default `4`. */\n gap?: number;\n /**\n * Which user actions dismiss the popover. Default `['outside']` (a click\n * outside the popover, the anchor exempt). Pass `false` to close only via `close()`.\n */\n dismiss?: DismissTrigger | DismissTrigger[] | false;\n /** Focus behavior on open. Default `false` (non-modal — leave focus alone). */\n initialFocus?: string | boolean;\n /** Extra elements (besides the anchor) whose clicks do NOT count as outside. */\n outsideIgnore?: Element | readonly Element[];\n /** Called on any user-initiated dismissal. */\n onDismiss?: () => void;\n /**\n * Host the popover in the browser top layer (the Popover API — `[popover]` +\n * `showPopover()`) where supported, so it stacks above any `z-index` without a\n * z-index war. Falls back to today's plain `<div>` where unsupported. kerf keeps\n * owning positioning + its own dismiss wiring; the popover is `popover=\"manual\"`.\n * See {@link OverlayOptions.native}. Default `false`.\n */\n native?: boolean;\n}\n\n/**\n * Anchored, non-modal overlay: positions `content` relative to `anchor` (below by\n * default, flipping above if it would overflow, and clamped horizontally to the\n * viewport) and repositions on scroll / resize while open. A thin wrapper over\n * {@link overlay} with non-modal defaults — `trap: false`, `dismiss: ['outside']`,\n * and the anchor added to `outsideIgnore` so the trigger click doesn't self-close.\n * Returns the same {@link OverlayHandle}; `close()` also drops the reposition\n * listeners. `position: fixed` is set inline (you style everything else).\n */\nexport function popover(\n anchor: Element,\n content: OverlayContent,\n options: PopoverOptions = {},\n): OverlayHandle {\n const {\n container,\n className = 'kerf-popover',\n placement = 'bottom',\n align = 'start',\n gap = 4,\n dismiss = ['outside'],\n initialFocus = false,\n outsideIgnore,\n onDismiss,\n native = false,\n } = options;\n\n const extraIgnore =\n outsideIgnore === undefined\n ? []\n : Array.isArray(outsideIgnore)\n ? [...outsideIgnore]\n : [outsideIgnore];\n\n const handle = overlay(content, {\n container: container ?? overlayHost(anchor),\n className,\n dismiss,\n trap: false,\n initialFocus,\n onDismiss,\n outsideIgnore: [anchor, ...extraIgnore],\n native,\n });\n\n // Position + keep it glued while open; drop the listeners on close. A throw\n // while positioning (e.g. an anchor whose geometry read fails) is still part\n // of construction: close the just-opened overlay before rethrowing.\n let stopReposition: () => void;\n try {\n stopReposition = autoReposition(handle.el, anchor, {\n placement,\n align,\n gap,\n });\n } catch (error) {\n handle.close();\n throw error;\n }\n void handle.result.then(stopReposition);\n\n // KF-BAVCEV: never outlive the anchor. When it leaves the document (e.g. the\n // modal holding it closes) close the popover as cleanup — not a user\n // dismissal, so no `onDismiss`. A move within the document keeps it open.\n void handle.result.then(attach(anchor, () => handle.close));\n\n return handle;\n}\n\n/** Content for a {@link tooltip}: text (auto-escaped), `SafeHtml`, or a render function. */\nexport type TooltipContent = string | SafeHtml | (() => MountResult);\n\n/** Options for {@link tooltip}. */\nexport interface TooltipOptions extends AnchorPositionOptions {\n /** Where to append the tooltip wrapper. Default: the anchor's modal-dialog host slot (see {@link PopoverOptions.container}), else `document.body`. */\n container?: Element;\n /** Class on the wrapper. Default `'kerf-tooltip'`. */\n className?: string;\n /** Delay in ms before showing after hover/focus enters. Default `400`. */\n delay?: number;\n /** Delay in ms before hiding after hover/focus leaves. Default `100`. */\n hideDelay?: number;\n /** ARIA role on the wrapper. Default `'tooltip'`. */\n role?: string;\n /** Host the tooltip in the browser top layer (the Popover API) where supported. See {@link OverlayOptions.native}. Default `false`. */\n native?: boolean;\n}\n\n/**\n * A hover/focus-triggered, non-modal, auto-hiding tooltip anchored to `anchor`.\n * Shows after `delay` on `pointerenter`/`focus`, hides after `hideDelay` on\n * `pointerleave`/`blur`, and positions itself with {@link autoReposition} (above\n * the anchor by default). Unlike {@link popover} there is no click-dismiss model —\n * it follows the pointer/focus. Returns a disposer that removes the anchor\n * listeners and hides any shown tooltip. Structural only (kerf ships no CSS).\n */\nexport function tooltip(\n anchor: Element,\n content: TooltipContent,\n options: TooltipOptions = {},\n): () => void {\n const {\n container,\n className = 'kerf-tooltip',\n delay = 400,\n hideDelay = 100,\n role = 'tooltip',\n placement = 'top',\n align = 'start',\n gap = 4,\n native = false,\n } = options;\n\n const body: OverlayContent =\n typeof content === 'function'\n ? content\n : typeof content === 'string'\n ? jsx('span', { class: `${className}__text`, children: content })\n : content;\n\n const timers: {\n show?: ReturnType<typeof setTimeout>;\n hide?: ReturnType<typeof setTimeout>;\n } = {};\n let current:\n | { handle: OverlayHandle; stop: () => void; unwatch: () => void }\n | undefined;\n let presence = 0;\n\n // Runs from the `delay` timer, so there is no caller to throw to. A failed\n // show (a throwing render fn, `native` `showPopover()`, or positioning) is\n // rolled back before `current` is set — nothing stays on screen and the\n // next pointerenter / focus schedules a fresh attempt — and the original\n // error then escapes the timer callback for the host to report as uncaught\n // (a window `error` event in browsers), the same way kerf's other deferred\n // callbacks (debounce / throttle timers, attach teardown) surface errors.\n function show(): void {\n // The anchor left the document while the show was pending (KF-BAVCEV).\n if (!anchor.isConnected) return;\n const handle = overlay(body, {\n container: container ?? overlayHost(anchor),\n className,\n dismiss: false,\n trap: false,\n initialFocus: false,\n native,\n });\n handle.el.setAttribute('role', role);\n let stop: () => void;\n try {\n stop = autoReposition(handle.el, anchor, { placement, align, gap });\n } catch (error) {\n // Not yet tracked in `current`, so `hide()` could never reach it.\n handle.close();\n throw error;\n }\n // KF-BAVCEV: an anchor removed from the document (e.g. with the modal that\n // held it) fires no pointerleave / blur, so hide when it leaves and forget\n // its presence; a move within the document keeps the tooltip shown.\n const unwatch = attach(anchor, () => () => {\n presence = 0;\n if (timers.hide !== undefined) clearTimeout(timers.hide);\n hide();\n });\n current = { handle, stop, unwatch };\n // A surface that closed itself (its host slot left the document with the\n // dialog) must not stay `current`, or the next hover would never show.\n void handle.result.then(() => {\n if (current?.handle === handle) hide();\n });\n }\n\n function hide(): void {\n const shown = current;\n if (shown === undefined) return;\n // Cleared first: `unwatch()` runs the anchor teardown, which re-enters here.\n current = undefined;\n shown.unwatch();\n shown.stop();\n shown.handle.close();\n }\n\n const onEnter = (event: Event): void => {\n presence |= event.type === 'focus' ? 2 : 1;\n if (timers.hide !== undefined) clearTimeout(timers.hide);\n if (current !== undefined) return;\n if (timers.show !== undefined) clearTimeout(timers.show); // debounce: one pending show at a time\n timers.show = setTimeout(show, delay);\n };\n const onLeave = (event: Event): void => {\n presence &= event.type === 'blur' ? ~2 : ~1;\n if (presence) return;\n if (timers.show !== undefined) clearTimeout(timers.show);\n if (current === undefined) return;\n timers.hide = setTimeout(hide, hideDelay);\n };\n\n anchor.addEventListener('pointerenter', onEnter);\n anchor.addEventListener('pointerleave', onLeave);\n anchor.addEventListener('focus', onEnter);\n anchor.addEventListener('blur', onLeave);\n\n return () => {\n anchor.removeEventListener('pointerenter', onEnter);\n anchor.removeEventListener('pointerleave', onLeave);\n anchor.removeEventListener('focus', onEnter);\n anchor.removeEventListener('blur', onLeave);\n if (timers.show !== undefined) clearTimeout(timers.show);\n if (timers.hide !== undefined) clearTimeout(timers.hide);\n hide();\n };\n}\n","/** `choice()` implementation and public option types. */\nimport { delegate } from './delegate.js';\nimport { jsx } from './jsx-runtime.js';\nimport { overlay, type OverlayContent, wireDialog } from './overlay-core.js';\n\n/** One choosable action in a {@link choice} dialog. */\nexport interface ChoiceAction<R> {\n value: R;\n label: string;\n className?: string;\n}\n\n/** Wiring slots for a {@link ChoiceOptions.render}. */\nexport interface ChoiceRenderSlots {\n message: string;\n actions: Array<Record<string, string>>;\n}\n\n/** Options for {@link choice}. */\nexport interface ChoiceOptions<R> {\n container?: Element;\n className?: string;\n title?: string;\n defaultValue?: R;\n native?: boolean;\n render?: (slots: ChoiceRenderSlots) => OverlayContent;\n}\n\n/** The N-way sibling of {@link confirm}. */\nexport function choice<R>(\n message: string,\n actions: ReadonlyArray<ChoiceAction<R>>,\n options: ChoiceOptions<R> = {},\n): Promise<R | null> {\n const {\n container,\n className = 'kerf-overlay',\n title,\n defaultValue,\n native = false,\n render,\n } = options;\n const hasDefault = 'defaultValue' in options;\n const actionAttrs = actions.map((_, i) => ({ 'data-choice': String(i) }));\n\n const body: OverlayContent =\n render !== undefined\n ? render({ message, actions: actionAttrs })\n : jsx('div', {\n class: 'kerf-choice',\n children: [\n title !== undefined\n ? jsx('h2', { class: 'kerf-choice__title', children: title })\n : '',\n jsx('p', { class: 'kerf-choice__message', children: message }),\n jsx('div', {\n class: 'kerf-choice__actions',\n children: actions.map((action, i) =>\n jsx('button', {\n type: 'button',\n class:\n action.className !== undefined\n ? `kerf-choice__action ${action.className}`\n : 'kerf-choice__action',\n ...actionAttrs[i],\n children: action.label,\n }),\n ),\n }),\n ],\n });\n\n let resolveChoice!: (result: R | null) => void;\n const result = new Promise<R | null>((resolve) => {\n resolveChoice = resolve;\n });\n\n const handle = overlay(body, {\n container,\n className,\n dismiss: ['escape', 'backdrop'],\n initialFocus: '[data-choice]',\n trap: true,\n native,\n });\n\n // Post-open wiring is still construction: a throw closes the overlay. Any\n // close settles a still-pending choice as a dismissal (`null`).\n void wireDialog(\n handle,\n (track) => {\n track(\n delegate(handle.el, 'click', '[data-choice]', (_event, el) => {\n resolveChoice(actions[Number(el.getAttribute('data-choice'))].value);\n handle.close();\n }),\n );\n\n if (hasDefault) {\n const onKeydown = (event: KeyboardEvent): void => {\n if (event.key === 'Enter') {\n event.preventDefault();\n resolveChoice(defaultValue as R);\n handle.close();\n }\n };\n // Last wiring step: nothing after it can throw, so it needs no rollback.\n handle.el.addEventListener('keydown', onKeydown);\n }\n },\n () => resolveChoice(null),\n );\n return result;\n}\n","/** `confirm()` implementation and public option types. */\nimport { delegate } from './delegate.js';\nimport { jsx } from './jsx-runtime.js';\nimport { overlay, type OverlayContent, wireDialog } from './overlay-core.js';\n\n/** Wiring slots passed to a {@link ConfirmOptions.render}. */\nexport interface ConfirmRenderSlots {\n message: string;\n /** Spread onto the confirm control. */\n ok: Record<string, string>;\n /** Spread onto the cancel control. */\n cancel: Record<string, string>;\n}\n\n/** Options for {@link confirm}. */\nexport interface ConfirmOptions {\n /** Where to append the overlay. Default `document.body`. */\n container?: Element;\n /** Wrapper class. Default `'kerf-overlay'`. */\n className?: string;\n /** Optional heading above the message. */\n title?: string;\n /** Confirm button label. Default `'OK'`. */\n okText?: string;\n /** Cancel button label. Default `'Cancel'`. */\n cancelText?: string;\n /** Add a `kerf-confirm--danger` class to the wrapper for destructive actions. */\n danger?: boolean;\n /** Host the dialog in the browser top layer where supported. */\n native?: boolean;\n /** Bring your own body while retaining kerf's dialog wiring. */\n render?: (slots: ConfirmRenderSlots) => OverlayContent;\n}\n\n/** A promise-based `window.confirm` replacement. */\nexport function confirm(\n message: string,\n options: ConfirmOptions = {},\n): Promise<boolean> {\n const {\n container,\n className = 'kerf-overlay',\n title,\n okText = 'OK',\n cancelText = 'Cancel',\n danger = false,\n native = false,\n render,\n } = options;\n\n const body: OverlayContent =\n render !== undefined\n ? render({\n message,\n ok: { 'data-confirm': 'ok' },\n cancel: { 'data-confirm': 'cancel' },\n })\n : jsx('div', {\n class: 'kerf-confirm',\n children: [\n title !== undefined\n ? jsx('h2', { class: 'kerf-confirm__title', children: title })\n : '',\n jsx('p', { class: 'kerf-confirm__message', children: message }),\n jsx('div', {\n class: 'kerf-confirm__actions',\n children: [\n jsx('button', {\n type: 'button',\n 'data-confirm': 'cancel',\n children: cancelText,\n }),\n jsx('button', {\n type: 'button',\n 'data-confirm': 'ok',\n class: 'kerf-confirm__ok',\n children: okText,\n }),\n ],\n }),\n ],\n });\n\n const handle = overlay(body, {\n container,\n className: danger ? `${className} kerf-confirm--danger` : className,\n dismiss: ['escape', 'backdrop'],\n initialFocus: '[data-confirm=\"ok\"]',\n trap: true,\n native,\n });\n\n // Post-open wiring is still construction: a throw closes the overlay. The\n // click table is the only (and so the last) step, so it needs no rollback.\n return wireDialog(\n handle,\n () => {\n delegate(handle.el, 'click', '[data-confirm]', (_event, el) => {\n handle.close(el.getAttribute('data-confirm') === 'ok');\n });\n },\n (value) => value === true,\n );\n}\n","/** `prompt()` implementation and public option types. */\nimport { delegate } from './delegate.js';\nimport { jsx } from './jsx-runtime.js';\nimport { overlay, type OverlayContent, wireDialog } from './overlay-core.js';\n\n/**\n * Validate a single field's value, synchronously: return a non-empty message\n * to block OK, anything else to accept. A validator that throws is treated as\n * a programming error — the dialog closes and the returned promise rejects\n * with that error.\n */\nexport type FieldValidator = (\n value: string,\n) => string | null | undefined | void;\n\n/** Options for {@link prompt}. */\n/**\n * Run a {@link FieldValidator}: the message it reports, or `undefined` when the\n * value is valid. Validators are synchronous — a promise result is a\n * programming error that closes the dialog and rejects its promise (the stray\n * promise's own rejection is silenced so it is not reported twice).\n * Internal to the dialog helpers.\n */\nexport function runValidator(\n validate: FieldValidator | undefined,\n value: string,\n owner: string,\n): string | undefined {\n const result: unknown = validate?.(value);\n if (typeof (result as PromiseLike<unknown> | null)?.then === 'function') {\n (result as PromiseLike<unknown>).then(undefined, () => undefined);\n throw new TypeError(`${owner}: validate returned a promise.`);\n }\n return typeof result === 'string' && result.length > 0 ? result : undefined;\n}\n\nexport interface PromptOptions {\n container?: Element;\n className?: string;\n title?: string;\n defaultValue?: string;\n placeholder?: string;\n inputType?: string;\n okText?: string;\n cancelText?: string;\n validate?: FieldValidator;\n native?: boolean;\n render?: (slots: PromptRenderSlots) => OverlayContent;\n}\n\n/** Wiring slots for a {@link PromptOptions.render}. */\nexport interface PromptRenderSlots {\n message: string;\n input: Record<string, string>;\n error: Record<string, string>;\n ok: Record<string, string>;\n cancel: Record<string, string>;\n}\n\n/** A promise-based `window.prompt` replacement. */\nexport function prompt(\n message: string,\n options: PromptOptions = {},\n): Promise<string | null> {\n const {\n container,\n className = 'kerf-overlay',\n title,\n defaultValue = '',\n placeholder,\n inputType = 'text',\n okText = 'OK',\n cancelText = 'Cancel',\n validate,\n native = false,\n render,\n } = options;\n\n const inputAttrs: Record<string, string> = {\n 'data-prompt-input': '',\n type: inputType,\n value: defaultValue,\n ...(placeholder !== undefined ? { placeholder } : {}),\n };\n\n const body: OverlayContent =\n render !== undefined\n ? render({\n message,\n input: inputAttrs,\n error: { 'data-prompt-error': '' },\n ok: { 'data-prompt': 'ok' },\n cancel: { 'data-prompt': 'cancel' },\n })\n : jsx('div', {\n class: 'kerf-prompt',\n children: [\n title !== undefined\n ? jsx('h2', { class: 'kerf-prompt__title', children: title })\n : '',\n jsx('label', { class: 'kerf-prompt__message', children: message }),\n jsx('input', { class: 'kerf-prompt__input', ...inputAttrs }),\n jsx('p', {\n class: 'kerf-prompt__error',\n 'data-prompt-error': '',\n children: '',\n }),\n jsx('div', {\n class: 'kerf-prompt__actions',\n children: [\n jsx('button', {\n type: 'button',\n 'data-prompt': 'cancel',\n children: cancelText,\n }),\n jsx('button', {\n type: 'button',\n 'data-prompt': 'ok',\n class: 'kerf-prompt__ok',\n children: okText,\n }),\n ],\n }),\n ],\n });\n\n const handle = overlay(body, {\n container,\n className,\n dismiss: ['escape', 'backdrop'],\n initialFocus: '[data-prompt-input]',\n trap: true,\n native,\n });\n\n // Post-open wiring is still construction: a missing required input or any\n // other throw below removes what was wired, closes the overlay, and rethrows.\n return wireDialog(\n handle,\n (track, guard) => {\n // Looked up again at OK: a reactive re-render may have replaced the\n // input, and a detached node would report a stale value. Missing at\n // construction is a render bug (rolls back, throws); missing at OK\n // rejects the promise through `guard`.\n const inputFor = (problem = 'render missing'): HTMLInputElement => {\n const input = handle.el.querySelector<HTMLInputElement>(\n 'input[data-prompt-input]',\n );\n if (input !== null) return input;\n throw new Error(`prompt(): ${problem} <input data-prompt-input>.`);\n };\n inputFor();\n const errorEl = handle.el.querySelector<HTMLElement>(\n '[data-prompt-error]',\n );\n if (errorEl !== null) errorEl.hidden = true;\n\n // A throwing (or promise-returning) `validate` closes the dialog and\n // rejects the promise (guard).\n const attemptOk = guard((): void => {\n const input = inputFor('removed after open:');\n const value = input.value;\n const error = runValidator(validate, value, 'prompt()');\n if (error !== undefined) {\n if (errorEl !== null) {\n errorEl.textContent = error;\n errorEl.hidden = false;\n }\n input.focus();\n return;\n }\n handle.close(value);\n });\n\n track(\n delegate(handle.el, 'click', '[data-prompt]', (_event, el) => {\n if (el.getAttribute('data-prompt') === 'ok') attemptOk();\n else handle.close(null);\n }),\n );\n\n const onKeydown = (event: KeyboardEvent): void => {\n if (\n event.key === 'Enter' &&\n (event.target as Element | null)?.matches('input[data-prompt-input]')\n ) {\n event.preventDefault();\n attemptOk();\n }\n };\n // Last wiring step: nothing after it can throw, so it needs no rollback.\n handle.el.addEventListener('keydown', onKeydown);\n },\n (value) => (typeof value === 'string' ? value : null),\n );\n}\n","/** `form()` implementation and public option types. */\nimport { delegate } from './delegate.js';\nimport { jsx } from './jsx-runtime.js';\nimport { overlay, type OverlayContent, wireDialog } from './overlay-core.js';\nimport { type FieldValidator, runValidator } from './overlay-prompt.js';\n\n/** A single field in a {@link form}. */\nexport interface FormField {\n name: string;\n label?: string;\n defaultValue?: string;\n placeholder?: string;\n type?: string;\n validate?: FieldValidator;\n}\n\n/** One field's wiring in a {@link FormRenderSlots}. */\nexport interface FormRenderField {\n name: string;\n label: string;\n input: Record<string, string>;\n error: Record<string, string>;\n}\n\n/** Wiring slots for a {@link FormOptions.render}. */\nexport interface FormRenderSlots {\n fields: FormRenderField[];\n ok: Record<string, string>;\n cancel: Record<string, string>;\n}\n\n/** Options for {@link form}. */\nexport interface FormOptions {\n container?: Element;\n className?: string;\n title?: string;\n okText?: string;\n cancelText?: string;\n native?: boolean;\n render?: (slots: FormRenderSlots) => OverlayContent;\n}\n\n/** A promise-based multi-field dialog. */\nexport function form(\n fields: readonly FormField[],\n options: FormOptions = {},\n): Promise<Record<string, string> | null> {\n const {\n container,\n className = 'kerf-overlay',\n title,\n okText = 'OK',\n cancelText = 'Cancel',\n native = false,\n render,\n } = options;\n\n const fieldAttrs = (field: FormField): Record<string, string> => ({\n 'data-field': field.name,\n name: field.name,\n type: field.type ?? 'text',\n value: field.defaultValue ?? '',\n ...(field.placeholder !== undefined\n ? { placeholder: field.placeholder }\n : {}),\n });\n\n const body: OverlayContent =\n render !== undefined\n ? render({\n fields: fields.map((field) => ({\n name: field.name,\n label: field.label ?? field.name,\n input: fieldAttrs(field),\n error: { 'data-field-error': field.name },\n })),\n ok: { 'data-form': 'ok' },\n cancel: { 'data-form': 'cancel' },\n })\n : jsx('div', {\n class: 'kerf-form',\n children: [\n title !== undefined\n ? jsx('h2', { class: 'kerf-form__title', children: title })\n : '',\n ...fields.map((field) =>\n jsx('div', {\n class: 'kerf-form__field',\n children: [\n jsx('label', {\n class: 'kerf-form__label',\n children: field.label ?? field.name,\n }),\n jsx('input', {\n class: 'kerf-form__input',\n ...fieldAttrs(field),\n }),\n jsx('p', {\n class: 'kerf-form__error',\n 'data-field-error': field.name,\n children: '',\n }),\n ],\n }),\n ),\n jsx('div', {\n class: 'kerf-form__actions',\n children: [\n jsx('button', {\n type: 'button',\n 'data-form': 'cancel',\n children: cancelText,\n }),\n jsx('button', {\n type: 'button',\n 'data-form': 'ok',\n class: 'kerf-form__ok',\n children: okText,\n }),\n ],\n }),\n ],\n });\n\n const handle = overlay(body, {\n container,\n className,\n dismiss: ['escape', 'backdrop'],\n initialFocus: '[data-field]',\n trap: true,\n native,\n });\n\n // Post-open wiring is still construction: a missing required field input or\n // any other throw below removes what was wired, closes the overlay, and\n // rethrows.\n return wireDialog(\n handle,\n (track, guard) => {\n const errorFor = (name: string): HTMLElement | null =>\n Array.from(\n handle.el.querySelectorAll<HTMLElement>('[data-field-error]'),\n ).find((el) => el.getAttribute('data-field-error') === name) ?? null;\n // KF-HRNJ4T (a field input removed after open by a reactive re-render):\n // at construction a missing input is a render bug that rolls back and\n // throws synchronously; at OK time it throws inside `guard`, so the\n // dialog closes and the promise rejects naming the field — never a\n // `null` that reads as a user Cancel.\n const inputFor = (\n name: string,\n problem = 'render missing',\n ): HTMLInputElement => {\n const input = Array.from(\n handle.el.querySelectorAll<HTMLInputElement>('input[data-field]'),\n ).find((el) => el.getAttribute('data-field') === name);\n if (input !== undefined) return input;\n throw new Error(`form(): ${problem} <input data-field=\"${name}\">.`);\n };\n\n for (const field of fields) {\n inputFor(field.name);\n const errorEl = errorFor(field.name);\n if (errorEl !== null) errorEl.hidden = true;\n }\n\n // A throwing `field.validate` closes the dialog and rejects the promise.\n const attemptOk = guard((): void => {\n const record: Record<string, string> = {};\n let firstInvalid: HTMLInputElement | null = null;\n for (const field of fields) {\n const el = inputFor(field.name, 'removed after open:');\n const value = el.value;\n record[field.name] = value;\n const error = runValidator(field.validate, value, 'form()');\n const errorEl = errorFor(field.name);\n if (error !== undefined) {\n if (errorEl !== null) {\n errorEl.textContent = error;\n errorEl.hidden = false;\n }\n if (firstInvalid === null) firstInvalid = el;\n } else if (errorEl !== null) {\n errorEl.hidden = true;\n }\n }\n if (firstInvalid !== null) {\n firstInvalid.focus();\n return;\n }\n handle.close(record);\n });\n\n track(\n delegate(handle.el, 'click', '[data-form]', (_event, el) => {\n if (el.getAttribute('data-form') === 'ok') attemptOk();\n else handle.close(null);\n }),\n );\n\n const onKeydown = (event: KeyboardEvent): void => {\n if (\n event.key === 'Enter' &&\n (event.target as Element | null)?.matches('[data-field]')\n ) {\n event.preventDefault();\n attemptOk();\n }\n };\n // Last wiring step: nothing after it can throw, so it needs no rollback.\n handle.el.addEventListener('keydown', onKeydown);\n },\n (value) =>\n value !== null && typeof value === 'object'\n ? (value as Record<string, string>)\n : null,\n );\n}\n","/**\n * `toast()` for `kerfjs/overlay` — a non-modal, auto-dismissing notification that\n * stacks in a shared body-level region. Split out of `overlay.ts` (KF-513) since\n * it's a distinct transient-UI concern from the modal dialogs; re-exported from\n * `overlay.ts` so the public `kerfjs/overlay` surface is unchanged. Structural\n * only — kerf ships no CSS; you style the region / toast / animations.\n */\nimport { type SafeHtml } from './jsx-runtime.js';\nimport { mount, type MountResult } from './mount.js';\nimport { escapeHtml } from './utils/escapeHtml.js';\n\n/** Content for a {@link toast}: an escaped text string, trusted `SafeHtml`, or a render function. */\nexport type ToastContent = string | SafeHtml | (() => MountResult);\n\n/** Accent variant for a {@link toast} — mapped to a `${className}--${variant}` class. */\nexport type ToastVariant = 'info' | 'success' | 'warning';\n\n/** Options for {@link toast}. */\nexport interface ToastOptions {\n /** Where toasts stack. Default: a lazily-created `<div class=\"kerf-toasts\">` on `document.body`. */\n container?: Element;\n /** Class on the toast element. Default `'kerf-toast'`. */\n className?: string;\n /** Auto-dismiss after this many ms. `0` keeps it until dismissed by hand. Default `4000`. */\n duration?: number;\n /** ARIA role. Default `'status'`. */\n role?: string;\n /**\n * `'stack'` (default) shows toasts stacked in the region; `'replace'` dismisses\n * the region's current toast(s) first (collapse-to-latest for a rapid sequence).\n */\n mode?: 'stack' | 'replace';\n /**\n * How `mode: 'replace'` drops the prior toast(s): `'fade'` (default) runs their\n * full exit transition (nice for a STACKING region), or `'instant'` removes them\n * synchronously with no exit — what a single, exactly-centered toast slot wants,\n * so the outgoing and incoming messages never cross-fade in the same spot.\n */\n collapse?: 'fade' | 'instant';\n /** Accent variant — adds a `${className}--${variant}` class (kerf ships no CSS; you style it). */\n variant?: ToastVariant;\n /** Class added on the next animation frame after mount, so a CSS **entrance** transition can run. */\n enterClass?: string;\n /**\n * Class added when dismissing, so CSS owns the **exit**. On dismiss the\n * `enterClass` (if any) is also REMOVED, so `exitClass` doesn't have to\n * out-specify it — and a symmetric single-class fade (entrance = add\n * `enterClass`, exit = remove it) works by setting only `enterClass` +\n * `exitDuration`. The node is removed `exitDuration` ms later.\n */\n exitClass?: string;\n /** ms to wait before removing the node on dismiss — applies when `exitClass` is set OR when it's > 0 (to let a removed `enterClass` transition out). Default `0`. */\n exitDuration?: number;\n}\n\n/** Handle returned by {@link toast}. */\nexport interface ToastHandle {\n /** The toast element — inspect it, or run your own entrance/exit transitions. */\n el: HTMLElement;\n /**\n * Dismiss it early. Default runs the `exitClass` transition (removed after\n * `exitDuration`); pass `{ instant: true }` to remove it **synchronously** with\n * no exit — for an action button that immediately shows a replacement toast in a\n * single centered slot (no cross-fade). Idempotent.\n */\n dismiss(options?: { instant?: boolean }): void;\n}\n\n/** The region's active toasts live on the region element (in the DOM), not in module state. */\nconst TOAST_SET = Symbol('kerf.toasts');\n/** A dismiss function with an `.removeNow()` for instant (no-exit) teardown. */\ntype Dismisser = (() => void) & { removeNow: () => void };\ntype ToastCarrier = Element & { [TOAST_SET]?: Set<Dismisser> };\n\n/** The singleton toast region lives in the DOM (queried, not held in a module variable). */\nfunction toastRegion(container?: Element): Element {\n if (container !== undefined) return container;\n const existing = document.querySelector('.kerf-toasts');\n if (existing !== null) return existing;\n const region = document.createElement('div');\n region.className = 'kerf-toasts';\n region.setAttribute('aria-live', 'polite');\n document.body.appendChild(region);\n return region;\n}\n\n/**\n * Show a non-modal, auto-dismissing notification. Stacks in a shared body-level\n * region (or your `container`). Returns a {@link ToastHandle} (`{ el, dismiss }`)\n * so you can run entrance/exit transitions, wire an action button, or inspect the\n * node. `mode: 'replace'` collapses a rapid sequence to the latest; `variant`\n * adds an accent class; `enterClass`/`exitClass` let CSS own the animation.\n */\nexport function toast(\n content: ToastContent,\n options: ToastOptions = {},\n): ToastHandle {\n const {\n container,\n className = 'kerf-toast',\n duration = 4000,\n role = 'status',\n mode = 'stack',\n collapse = 'fade',\n variant,\n enterClass,\n exitClass,\n exitDuration = 0,\n } = options;\n\n const region = toastRegion(container) as ToastCarrier;\n const active = (region[TOAST_SET] ??= new Set<Dismisser>());\n // collapse-to-latest: 'instant' removes priors synchronously (no cross-fade in a\n // centered single slot); 'fade' runs their exit transition (nice for a stack).\n if (mode === 'replace') {\n for (const d of [...active]) {\n if (collapse === 'instant') d.removeNow();\n else d();\n }\n }\n\n const el = document.createElement('div');\n el.className = className;\n if (variant !== undefined) el.classList.add(`${className}--${variant}`);\n el.setAttribute('role', role);\n region.appendChild(el);\n\n const render =\n typeof content === 'function'\n ? content\n : () => (typeof content === 'string' ? escapeHtml(content) : content);\n const disposeMount = mount(el, render);\n const state: {\n dismissed: boolean;\n removed: boolean;\n timer: ReturnType<typeof setTimeout> | undefined;\n exitTimer: ReturnType<typeof setTimeout> | undefined;\n } = {\n dismissed: false,\n removed: false,\n timer: undefined,\n exitTimer: undefined,\n };\n\n if (enterClass !== undefined) {\n globalThis.requestAnimationFrame(() => {\n if (!state.dismissed) el.classList.add(enterClass);\n });\n }\n\n const remove = (): void => {\n if (state.removed) return;\n state.removed = true;\n state.dismissed = true; // once removed, a later dismiss() is a clean no-op\n if (state.exitTimer !== undefined) clearTimeout(state.exitTimer);\n disposeMount();\n el.remove();\n active.delete(dismiss as Dismisser);\n };\n\n // Force synchronous teardown NOW, with no exit transition — even if a fade is\n // already in flight (so `mode:'replace'` collapse can clean up a mid-exit toast,\n // and `dismiss({ instant: true })` drops it immediately).\n const removeNow = (): void => {\n if (state.timer !== undefined) clearTimeout(state.timer);\n remove();\n };\n\n const fadeOut = (): void => {\n if (state.dismissed) return;\n state.dismissed = true;\n if (state.timer !== undefined) clearTimeout(state.timer);\n // Reverse the entrance (drop enterClass so exitClass needn't out-specify it),\n // add exitClass, and delay removal for the transition — including the\n // single-class idiom (enterClass removed + exitDuration, no exitClass).\n if (enterClass !== undefined) el.classList.remove(enterClass);\n if (exitClass !== undefined) el.classList.add(exitClass);\n if (exitClass !== undefined || exitDuration > 0) {\n state.exitTimer = setTimeout(remove, exitDuration);\n } else {\n remove();\n }\n };\n\n function dismiss(options?: { instant?: boolean }): void {\n if (options?.instant === true) removeNow();\n else fadeOut();\n }\n (dismiss as Dismisser).removeNow = removeNow;\n\n active.add(dismiss as Dismisser);\n if (duration > 0) state.timer = setTimeout(fadeOut, duration);\n return { el, dismiss };\n}\n"]}
|
package/dist/remount.js
CHANGED
package/dist/router.d.ts
CHANGED
|
@@ -44,7 +44,8 @@ interface RouterOptions {
|
|
|
44
44
|
base?: string;
|
|
45
45
|
/**
|
|
46
46
|
* Auto-intercept clicks on in-app `<a href>` links (same-origin, left-click, no
|
|
47
|
-
* modifier keys / `
|
|
47
|
+
* modifier keys / `download` / `target` other than `_self`) and route them
|
|
48
|
+
* instead of reloading.
|
|
48
49
|
* Opt a single link out with `data-router-ignore` or `rel="external"`. Default
|
|
49
50
|
* `true`; set `false` to wire navigation entirely yourself.
|
|
50
51
|
*/
|
|
@@ -61,9 +62,12 @@ interface RouterHandle {
|
|
|
61
62
|
/** History forward — `history.forward()`. */
|
|
62
63
|
forward: () => void;
|
|
63
64
|
/**
|
|
64
|
-
* A reactive "is this path active?" —
|
|
65
|
-
* `pattern` or
|
|
66
|
-
* `match('/')` is
|
|
65
|
+
* A reactive "is this path active?" — a literal path-prefix comparison: true
|
|
66
|
+
* when the current path equals `pattern` or continues it at a `/` boundary
|
|
67
|
+
* (`match('/users')` is true on `/users/7`). `match('/')` is exact (only true
|
|
68
|
+
* on `/`). `pattern` is NOT run through the route matcher, so `:param` / `*`
|
|
69
|
+
* segments compare as literal text (`match('/users/:id')` is never true) —
|
|
70
|
+
* pass the static prefix. Bind it for active-nav styling.
|
|
67
71
|
*/
|
|
68
72
|
match: (pattern: string) => ReadonlySignal<boolean>;
|
|
69
73
|
/** Convenience: a bound class signal — `className` while {@link match}`(pattern)` is active, else `''`. */
|
|
@@ -82,6 +86,11 @@ interface RouterHandle {
|
|
|
82
86
|
* immediately (so `route.value` is correct before first paint), installs a
|
|
83
87
|
* `popstate` listener (+ `hashchange` in hash mode) and, unless disabled, a
|
|
84
88
|
* single delegated link interceptor. See {@link RouterOptions} / {@link RouterHandle}.
|
|
89
|
+
*
|
|
90
|
+
* One router per document is the supported shape: a second router follows
|
|
91
|
+
* link clicks and `popstate`, but not another router's programmatic
|
|
92
|
+
* `navigate()` (pushState fires no popstate; there is no cross-router
|
|
93
|
+
* broadcasting).
|
|
85
94
|
*/
|
|
86
95
|
declare function createRouter(options: RouterOptions): RouterHandle;
|
|
87
96
|
|
package/dist/router.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { delegate } from './chunk-
|
|
2
|
-
import { jsx } from './chunk-
|
|
3
|
-
import { signal, computed } from './chunk-
|
|
1
|
+
import { delegate } from './chunk-JN7EJM3B.js';
|
|
2
|
+
import { jsx } from './chunk-UGNPDLNI.js';
|
|
3
|
+
import { signal, computed } from './chunk-IHMDBBUJ.js';
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
@@ -47,7 +47,12 @@ function isWithinBase(path, base) {
|
|
|
47
47
|
return base.length === 0 || path === base || path.startsWith(base + "/");
|
|
48
48
|
}
|
|
49
49
|
function createRouter(options) {
|
|
50
|
-
const {
|
|
50
|
+
const {
|
|
51
|
+
routes,
|
|
52
|
+
mode = "history",
|
|
53
|
+
base = "",
|
|
54
|
+
interceptLinks = true
|
|
55
|
+
} = options;
|
|
51
56
|
const normBase = base === "/" ? "" : base.replace(/\/$/, "");
|
|
52
57
|
let matched = null;
|
|
53
58
|
const readLocation = () => {
|
|
@@ -91,7 +96,11 @@ function createRouter(options) {
|
|
|
91
96
|
};
|
|
92
97
|
const navigate = (path, opts = {}) => {
|
|
93
98
|
const url = mode === "hash" ? "#" + (path.startsWith("/") ? path : "/" + path) : normBase + (path.startsWith("/") ? path : "/" + path);
|
|
94
|
-
history[opts.replace === true ? "replaceState" : "pushState"](
|
|
99
|
+
history[opts.replace === true ? "replaceState" : "pushState"](
|
|
100
|
+
opts.state ?? null,
|
|
101
|
+
"",
|
|
102
|
+
url
|
|
103
|
+
);
|
|
95
104
|
route.value = resolve(readLocation());
|
|
96
105
|
};
|
|
97
106
|
const match = (pattern) => computed(() => {
|
|
@@ -123,8 +132,14 @@ function createRouter(options) {
|
|
|
123
132
|
if (interceptLinks && typeof document !== "undefined") {
|
|
124
133
|
const onClick = (event, anchor) => {
|
|
125
134
|
const mouseEvent = event;
|
|
126
|
-
if (mouseEvent.defaultPrevented
|
|
127
|
-
|
|
135
|
+
if (mouseEvent.defaultPrevented) {
|
|
136
|
+
sync();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (mouseEvent.button !== 0 || mouseEvent.metaKey || mouseEvent.ctrlKey || mouseEvent.shiftKey || mouseEvent.altKey)
|
|
140
|
+
return;
|
|
141
|
+
if (anchor.hasAttribute("download") || anchor.hasAttribute("data-router-ignore"))
|
|
142
|
+
return;
|
|
128
143
|
const target = anchor.getAttribute("target");
|
|
129
144
|
if (target !== null && target !== "" && target !== "_self") return;
|
|
130
145
|
const rel = anchor.getAttribute("rel");
|
|
@@ -136,12 +151,15 @@ function createRouter(options) {
|
|
|
136
151
|
event.preventDefault();
|
|
137
152
|
navigate(url.pathname.slice(normBase.length) + url.search + url.hash);
|
|
138
153
|
} else {
|
|
139
|
-
if (url.pathname !== location.pathname || !url.hash.startsWith("#/"))
|
|
154
|
+
if (url.pathname !== location.pathname || !url.hash.startsWith("#/"))
|
|
155
|
+
return;
|
|
140
156
|
event.preventDefault();
|
|
141
157
|
navigate(url.hash.slice(1));
|
|
142
158
|
}
|
|
143
159
|
};
|
|
144
|
-
removers.push(
|
|
160
|
+
removers.push(
|
|
161
|
+
delegate(document.body, "click", "a[href]", onClick)
|
|
162
|
+
);
|
|
145
163
|
}
|
|
146
164
|
let disposed = false;
|
|
147
165
|
const dispose = () => {
|
|
@@ -149,7 +167,16 @@ function createRouter(options) {
|
|
|
149
167
|
disposed = true;
|
|
150
168
|
for (const remove of removers) remove();
|
|
151
169
|
};
|
|
152
|
-
return {
|
|
170
|
+
return {
|
|
171
|
+
route,
|
|
172
|
+
navigate,
|
|
173
|
+
back: () => history.back(),
|
|
174
|
+
forward: () => history.forward(),
|
|
175
|
+
match,
|
|
176
|
+
activeClass,
|
|
177
|
+
outlet,
|
|
178
|
+
dispose
|
|
179
|
+
};
|
|
153
180
|
}
|
|
154
181
|
|
|
155
182
|
export { createRouter };
|