@zinejs/core 0.9.0 → 0.9.2

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.
Files changed (37) hide show
  1. package/LICENSE +73 -0
  2. package/dist/controls/icons.d.ts +4 -0
  3. package/dist/controls/sidebar.d.ts +2 -0
  4. package/dist/controls/types.d.ts +3 -0
  5. package/dist/{controls-CcOu_19g.js → controls-Dh1okIx6.js} +60 -44
  6. package/dist/controls-Dh1okIx6.js.map +1 -0
  7. package/dist/{cssRenderer-Deskm2ND.js → cssRenderer-CTaM4cAj.js} +35 -29
  8. package/dist/cssRenderer-CTaM4cAj.js.map +1 -0
  9. package/dist/flipSound-BFXSkWBo.js +78 -0
  10. package/dist/flipSound-BFXSkWBo.js.map +1 -0
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.js +709 -569
  13. package/dist/index.js.map +1 -1
  14. package/dist/index.umd.js +4 -4
  15. package/dist/index.umd.js.map +1 -1
  16. package/dist/loading/loading.d.ts +2 -1
  17. package/dist/{loading-DF88K9yJ.js → loading-BgbqJz5k.js} +7 -8
  18. package/dist/loading-BgbqJz5k.js.map +1 -0
  19. package/dist/renderer/types.d.ts +7 -0
  20. package/dist/{share-BrQa6aYm.js → share-CZorhnKI.js} +25 -22
  21. package/dist/share-CZorhnKI.js.map +1 -0
  22. package/dist/sound/clip.d.ts +9 -0
  23. package/dist/sound/flipSound.d.ts +30 -0
  24. package/dist/strings.d.ts +74 -0
  25. package/dist/{styles-D_zOGk2q.js → styles-C1Qp5pby.js} +4 -2
  26. package/dist/styles-C1Qp5pby.js.map +1 -0
  27. package/dist/{webglRenderer-CmQ_mUrX.js → webglRenderer-DQn4pc1S.js} +85 -79
  28. package/dist/webglRenderer-DQn4pc1S.js.map +1 -0
  29. package/dist/zine.d.ts +35 -0
  30. package/options.schema.json +27 -0
  31. package/package.json +12 -10
  32. package/dist/controls-CcOu_19g.js.map +0 -1
  33. package/dist/cssRenderer-Deskm2ND.js.map +0 -1
  34. package/dist/loading-DF88K9yJ.js.map +0 -1
  35. package/dist/share-BrQa6aYm.js.map +0 -1
  36. package/dist/styles-D_zOGk2q.js.map +0 -1
  37. package/dist/webglRenderer-CmQ_mUrX.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flipSound-BFXSkWBo.js","names":["#ctorCache","#volume","#url","#muted","#context","#decode","#ctx","#buffer","#gain","#decoding","#loadBuffer"],"sources":["../src/sound/clip.ts","../src/sound/flipSound.ts"],"sourcesContent":["/**\n * The bundled default page-flip sound, as a base64 `data:` URI.\n *\n * Generated by `scripts/embed-flip-clip.mjs` from `packages/core/assets/flip.mp3` — do not\n * hand-edit. Inlined rather than shipped as a separate asset so the default clip needs no bundler\n * URL resolution and no network fetch (works offline / under strict CSP); consumers who want an\n * external file use the `sound.url` option instead.\n */\nexport const FLIP_CLIP = 'data:audio/mpeg;base64,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VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//PkZAAA4AQAAHgAAAHACAAA8AAAMBkak0dlxzAYGoNHlcZMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//PkZAAAAAGkAAAAAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//PkZAAAAAGkAAAAAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//PkZAAAAAGkAAAAAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//PkZAAAAAGkAAAAAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//PkZAAAAAGkAAAAAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//PkZAAAAAGkAAAAAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//PkZAAAAAGkAAAAAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//PkZAAAAAGkAAAAAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//PkZAAAAAGkAAAAAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//PkZAAAAAGkAAAAAAAAA0gAAAAATEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV';\n","import { FLIP_CLIP } from './clip';\n\n/** Default playback volume when the reader does not set one. */\nconst DEFAULT_VOLUME = 0.5;\n\ntype AudioContextCtor = typeof AudioContext;\n\nfunction audioContextCtor(): AudioContextCtor | undefined {\n if (typeof window === 'undefined') return undefined;\n const w = window as unknown as { AudioContext?: AudioContextCtor; webkitAudioContext?: AudioContextCtor };\n return w.AudioContext ?? w.webkitAudioContext;\n}\n\nfunction clamp01(n: number): number {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\n/** Decode a `data:...;base64,...` URI to bytes, for feeding decodeAudioData. */\nfunction dataUriToBytes(dataUri: string): ArrayBuffer | undefined {\n if (typeof atob !== 'function') return undefined;\n const comma = dataUri.indexOf(',');\n if (comma < 0) return undefined;\n const binary = atob(dataUri.slice(comma + 1));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes.buffer;\n}\n\nexport interface FlipSoundOptions {\n /** A clip URL that overrides the bundled default (fetched at runtime). */\n url?: string;\n /** Playback volume, 0..1. Default 0.5. */\n volume?: number;\n}\n\n/**\n * Plays a short sound on each page turn.\n *\n * Everything here is best-effort: a browser that gates audio behind a gesture, has no Web Audio, or\n * cannot decode the clip simply stays silent. A page flip must never throw or stall because of\n * sound, so every path is guarded and failures are swallowed.\n *\n * Web Audio (not `<audio>`) so rapid flips overlap cleanly — each turn plays a fresh buffer source\n * through one shared gain node (volume + mute).\n */\nexport class FlipSound {\n #ctorCache: AudioContextCtor | undefined;\n #ctx: AudioContext | null = null;\n #gain: GainNode | null = null;\n #buffer: AudioBuffer | null = null;\n #decoding: Promise<void> | null = null;\n #volume: number;\n #muted = false;\n #url: string | undefined;\n\n constructor(options: FlipSoundOptions = {}) {\n this.#ctorCache = audioContextCtor();\n this.#volume = clamp01(options.volume ?? DEFAULT_VOLUME);\n this.#url = options.url;\n }\n\n /** Whether this environment can play at all — no context constructor means never. */\n get available(): boolean {\n return this.#ctorCache !== undefined && (Boolean(this.#url) || FLIP_CLIP.length > 0);\n }\n\n /**\n * Play the clip once. Best-effort: silent if audio is unavailable, muted, still gesture-locked,\n * or the clip has not decoded yet (the first flip may miss while it decodes; the rest play).\n */\n play(): void {\n if (this.#muted || !this.available) return;\n // Create/resume the context synchronously here, inside the flip's own gesture frame, so the\n // browser unlocks audio. Decoding is async and may lag the very first flip; later flips are hot.\n const ctx = this.#context();\n if (!ctx) return;\n if (ctx.state === 'suspended') void ctx.resume().catch(() => {});\n void this.#decode().then(() => {\n if (!this.#ctx || !this.#buffer || !this.#gain || this.#muted) return;\n try {\n const source = this.#ctx.createBufferSource();\n source.buffer = this.#buffer;\n source.connect(this.#gain);\n source.start();\n } catch {\n // Context closed mid-play, or otherwise unavailable: stay silent.\n }\n });\n }\n\n setMuted(muted: boolean): void {\n this.#muted = muted;\n if (this.#gain) this.#gain.gain.value = muted ? 0 : this.#volume;\n }\n\n isMuted(): boolean {\n return this.#muted;\n }\n\n destroy(): void {\n try {\n void this.#ctx?.close();\n } catch {\n // Already closed or closing.\n }\n this.#ctx = null;\n this.#gain = null;\n this.#buffer = null;\n }\n\n #context(): AudioContext | null {\n if (this.#ctx) return this.#ctx;\n if (!this.#ctorCache) return null;\n try {\n const ctx = new this.#ctorCache();\n const gain = ctx.createGain();\n gain.gain.value = this.#muted ? 0 : this.#volume;\n gain.connect(ctx.destination);\n this.#ctx = ctx;\n this.#gain = gain;\n } catch {\n this.#ctx = null;\n }\n return this.#ctx;\n }\n\n /** Decode the clip to an AudioBuffer once; later calls await the first attempt. */\n #decode(): Promise<void> {\n if (this.#decoding) return this.#decoding;\n this.#decoding = this.#loadBuffer().catch(() => {\n // Fetch/decode failed → stay silent; do not retry on every flip.\n });\n return this.#decoding;\n }\n\n async #loadBuffer(): Promise<void> {\n const ctx = this.#context();\n if (!ctx) return;\n let bytes: ArrayBuffer | undefined;\n if (this.#url) {\n const res = await fetch(this.#url);\n bytes = await res.arrayBuffer();\n } else if (FLIP_CLIP) {\n bytes = dataUriToBytes(FLIP_CLIP);\n }\n if (!bytes) return;\n // slice(0): some engines detach the source ArrayBuffer during decode.\n this.#buffer = await ctx.decodeAudioData(bytes.slice(0));\n }\n}\n"],"mappings":"ACOA,SAAS,IAAiD;CACxD,IAAI,OAAO,SAAW,KAAa;CACnC,IAAM,IAAI;CACV,OAAO,EAAE,gBAAgB,EAAE;AAC7B;AAEA,SAAS,EAAQ,GAAmB;CAClC,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AACjC;AAGA,SAAS,EAAe,GAA0C;CAChE,IAAI,OAAO,QAAS,YAAY;CAChC,IAAM,IAAQ,EAAQ,QAAQ,GAAG;CACjC,IAAI,IAAQ,GAAG;CACf,IAAM,IAAS,KAAK,EAAQ,MAAM,IAAQ,CAAC,CAAC,GACtC,IAAQ,IAAI,WAAW,EAAO,MAAM;CAC1C,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK,EAAM,KAAK,EAAO,WAAW,CAAC;CACtE,OAAO,EAAM;AACf;AAmBA,IAAa,IAAb,MAAuB;CACrB;CACA,KAA4B;CAC5B,KAAyB;CACzB,KAA8B;CAC9B,KAAkC;CAClC;CACA,KAAS;CACT;CAEA,YAAY,IAA4B,CAAC,GAAG;EAG1C,AAFA,KAAKA,KAAa,EAAiB,GACnC,KAAKC,KAAU,EAAQ,EAAQ,UAAU,EAAc,GACvD,KAAKC,KAAO,EAAQ;CACtB;CAGA,IAAI,YAAqB;EACvB,OAAO,KAAKF,OAAe,KAAA,MAAc,EAAQ,KAAKE,MAAI;CAC5D;CAMA,OAAa;EACX,IAAI,KAAKC,MAAU,CAAC,KAAK,WAAW;EAGpC,IAAM,IAAM,KAAKC,GAAS;EACrB,MACD,EAAI,UAAU,eAAa,EAAS,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,GAC/D,KAAUC,GAAQ,CAAC,CAAC,WAAW;GACzB,OAAC,KAAKC,MAAQ,CAAC,KAAKC,MAAW,CAAC,KAAKC,MAAS,KAAKL,KACvD,IAAI;IACF,IAAM,IAAS,KAAKG,GAAK,mBAAmB;IAG5C,AAFA,EAAO,SAAS,KAAKC,IACrB,EAAO,QAAQ,KAAKC,EAAK,GACzB,EAAO,MAAM;GACf,QAAQ,CAER;EACF,CAAC;CACH;CAEA,SAAS,GAAsB;EAE7B,AADA,KAAKL,KAAS,GACV,KAAKK,OAAO,KAAKA,GAAM,KAAK,QAAQ,IAAQ,IAAI,KAAKP;CAC3D;CAEA,UAAmB;EACjB,OAAO,KAAKE;CACd;CAEA,UAAgB;EACd,IAAI;GACF,KAAUG,IAAM,MAAM;EACxB,QAAQ,CAER;EAGA,AAFA,KAAKA,KAAO,MACZ,KAAKE,KAAQ,MACb,KAAKD,KAAU;CACjB;CAEA,KAAgC;EAC9B,IAAI,KAAKD,IAAM,OAAO,KAAKA;EAC3B,IAAI,CAAC,KAAKN,IAAY,OAAO;EAC7B,IAAI;GACF,IAAM,IAAM,IAAI,KAAKA,GAAW,GAC1B,IAAO,EAAI,WAAW;GAI5B,AAHA,EAAK,KAAK,QAAQ,KAAKG,KAAS,IAAI,KAAKF,IACzC,EAAK,QAAQ,EAAI,WAAW,GAC5B,KAAKK,KAAO,GACZ,KAAKE,KAAQ;EACf,QAAQ;GACN,KAAKF,KAAO;EACd;EACA,OAAO,KAAKA;CACd;CAGA,KAAyB;EAKvB,OAJI,AACJ,KAAKG,OAAY,KAAKC,GAAY,CAAC,CAAC,YAAY,CAEhD,CAAC,GAH0B,KAAKD;CAKlC;CAEA,MAAMC,KAA6B;EACjC,IAAM,IAAM,KAAKN,GAAS;EAC1B,IAAI,CAAC,GAAK;EACV,IAAI;EACJ,AAIE,IAJE,KAAKF,KAEC,OAAM,MADI,MAAM,KAAKA,EAAI,EAAA,CACf,YAAY,IAEtB,EAAe,yhoBAAS,GAE7B,MAEL,KAAKK,KAAU,MAAM,EAAI,gBAAgB,EAAM,MAAM,CAAC,CAAC;CACzD;AACF"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export { Zine } from './zine';
2
2
  export type { ZineOptions, ZoomOptions, SearchHit } from './zine';
3
+ export { defaultStrings } from './strings';
4
+ export type { ZineStrings } from './strings';
3
5
  export { defineControl, getControl, DEFAULT_ITEMS } from './controls/registry';
4
6
  export type { ControlContext, ControlDef, ControlItem, ControlsColorScheme, ControlsOptions, ControlsPosition, } from './controls/types';
5
7
  export { ImageSource } from './source/imageSource';