vidply 1.2.0 → 1.2.3

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 (167) hide show
  1. package/README.md +974 -946
  2. package/dist/dev/{vidply.AudioDescriptionManager-R47Q4YR4.js → vidply.AudioDescriptionManager-JYYLK5KB.js} +275 -19
  3. package/dist/dev/vidply.AudioDescriptionManager-JYYLK5KB.js.map +7 -0
  4. package/dist/dev/{vidply.CaptionStyleMenu-7XHRBWUM.js → vidply.CaptionStyleMenu-47RCKQF5.js} +4 -4
  5. package/dist/dev/{vidply.DASHRenderer-PWEMC3BT.js → vidply.DASHRenderer-VEJ4HDHO.js} +3 -3
  6. package/dist/dev/vidply.DASHRenderer-VEJ4HDHO.js.map +7 -0
  7. package/dist/dev/{vidply.FloatingPlayerManager-PKNNNAS2.js → vidply.FloatingPlayerManager-C2UVRPZY.js} +5 -5
  8. package/dist/dev/vidply.FloatingPlayerManager-C2UVRPZY.js.map +7 -0
  9. package/dist/dev/{vidply.HLSRenderer-E7RQ74HI.js → vidply.HLSRenderer-ZVBK2TNQ.js} +4 -4
  10. package/dist/dev/vidply.HLSRenderer-ZVBK2TNQ.js.map +7 -0
  11. package/dist/dev/vidply.HTML5Renderer-HLRQUOCU.js +12 -0
  12. package/dist/dev/{vidply.SignLanguageManager-FET5FQZ7.js → vidply.SignLanguageManager-FLUCBW5H.js} +8 -8
  13. package/dist/dev/vidply.SignLanguageManager-FLUCBW5H.js.map +7 -0
  14. package/dist/dev/{vidply.SoundCloudRenderer-RVSJZODO.js → vidply.SoundCloudRenderer-MGMAJ7NK.js} +3 -3
  15. package/dist/dev/vidply.SoundCloudRenderer-MGMAJ7NK.js.map +7 -0
  16. package/dist/dev/{vidply.TranscriptManager-5GXOQCLX.js → vidply.TranscriptManager-Y2RYXHJW.js} +10 -10
  17. package/dist/dev/vidply.TranscriptManager-Y2RYXHJW.js.map +7 -0
  18. package/dist/dev/{vidply.VimeoRenderer-ER2LSBBW.js → vidply.VimeoRenderer-RQFQD7OE.js} +3 -3
  19. package/dist/dev/vidply.VimeoRenderer-RQFQD7OE.js.map +7 -0
  20. package/dist/dev/{vidply.YouTubeRenderer-NFTOWJAB.js → vidply.YouTubeRenderer-EU2BARZF.js} +3 -3
  21. package/dist/dev/vidply.YouTubeRenderer-EU2BARZF.js.map +7 -0
  22. package/dist/dev/{vidply.chunk-BNFIUL2Z.js → vidply.chunk-6LYZYI5G.js} +3 -3
  23. package/dist/dev/vidply.chunk-6LYZYI5G.js.map +7 -0
  24. package/dist/dev/{vidply.chunk-NQPURMQY.js → vidply.chunk-A4ESEOQ2.js} +6 -6
  25. package/dist/dev/vidply.chunk-A4ESEOQ2.js.map +7 -0
  26. package/dist/dev/{vidply.chunk-W25HUCHS.js → vidply.chunk-CGYIED2I.js} +2 -2
  27. package/dist/dev/vidply.chunk-CGYIED2I.js.map +7 -0
  28. package/dist/dev/{vidply.chunk-SK4V2DAU.js → vidply.chunk-HZ7UOKOU.js} +3 -3
  29. package/dist/dev/{vidply.chunk-RZWZGDV7.js → vidply.chunk-I6EDRYGJ.js} +33 -6
  30. package/dist/dev/vidply.chunk-I6EDRYGJ.js.map +7 -0
  31. package/dist/dev/{vidply.chunk-64WXMTGL.js → vidply.chunk-JKMQGLCJ.js} +5 -5
  32. package/dist/dev/vidply.chunk-JKMQGLCJ.js.map +7 -0
  33. package/dist/dev/{vidply.chunk-DZSDO3B7.js → vidply.chunk-JZNZX32Z.js} +2 -2
  34. package/dist/dev/{vidply.chunk-VMSQAZM7.js → vidply.chunk-P25MRJ6O.js} +2 -2
  35. package/dist/dev/{vidply.chunk-6RQA4ROD.js → vidply.chunk-PRFNESYA.js} +2 -2
  36. package/dist/dev/{vidply.chunk-KI7C3QVL.js → vidply.chunk-UI3RYCVF.js} +4 -3
  37. package/dist/dev/vidply.chunk-UI3RYCVF.js.map +7 -0
  38. package/dist/dev/{vidply.chunk-JJ47NO24.js → vidply.chunk-UNFGMABP.js} +2 -2
  39. package/dist/dev/vidply.chunk-UNFGMABP.js.map +7 -0
  40. package/dist/dev/{vidply.de-4YAT7FFM.js → vidply.de-VAUVSQXC.js} +29 -2
  41. package/dist/dev/vidply.de-VAUVSQXC.js.map +7 -0
  42. package/dist/dev/{vidply.es-LEWIRUBH.js → vidply.es-G65HFWO6.js} +29 -2
  43. package/dist/dev/vidply.es-G65HFWO6.js.map +7 -0
  44. package/dist/dev/vidply.esm.js +648 -35
  45. package/dist/dev/vidply.esm.js.map +3 -3
  46. package/dist/dev/{vidply.fr-Q4GV2NOE.js → vidply.fr-MJNOZELM.js} +29 -2
  47. package/dist/dev/vidply.fr-MJNOZELM.js.map +7 -0
  48. package/dist/dev/{vidply.ja-S6ITA6WU.js → vidply.ja-INMDHIYJ.js} +29 -2
  49. package/dist/dev/vidply.ja-INMDHIYJ.js.map +7 -0
  50. package/dist/legacy/vidply.js +1062 -34
  51. package/dist/legacy/vidply.js.map +3 -3
  52. package/dist/legacy/vidply.min.js +2 -2
  53. package/dist/legacy/vidply.min.meta.json +127 -55
  54. package/dist/prod/vidply.AudioDescriptionManager-EKWUNOPE.min.js +6 -0
  55. package/dist/prod/{vidply.CaptionStyleMenu-M3KVQWB5.min.js → vidply.CaptionStyleMenu-JTWSNHRQ.min.js} +2 -2
  56. package/dist/prod/{vidply.DASHRenderer-DN3S27AV.min.js → vidply.DASHRenderer-CIDAHFWM.min.js} +2 -2
  57. package/dist/prod/{vidply.FloatingPlayerManager-SKAZ4J43.min.js → vidply.FloatingPlayerManager-VZXHPCPM.min.js} +2 -2
  58. package/dist/prod/{vidply.HLSRenderer-62HH4YTK.min.js → vidply.HLSRenderer-Q6EFYKID.min.js} +2 -2
  59. package/dist/prod/vidply.HTML5Renderer-XRDJUTOO.min.js +6 -0
  60. package/dist/prod/{vidply.SignLanguageManager-V3OBTSSF.min.js → vidply.SignLanguageManager-JUOSA5AM.min.js} +2 -2
  61. package/dist/prod/{vidply.SoundCloudRenderer-CXRVZIAJ.min.js → vidply.SoundCloudRenderer-7ODD46PO.min.js} +2 -2
  62. package/dist/prod/{vidply.TranscriptManager-SYM3DFUY.min.js → vidply.TranscriptManager-4B2QKYGQ.min.js} +2 -2
  63. package/dist/prod/{vidply.VimeoRenderer-72TWRYFQ.min.js → vidply.VimeoRenderer-MR3UYLY7.min.js} +2 -2
  64. package/dist/prod/{vidply.YouTubeRenderer-UMHEV3KD.min.js → vidply.YouTubeRenderer-ITRTC7NR.min.js} +2 -2
  65. package/dist/prod/{vidply.chunk-YEENJS3Q.min.js → vidply.chunk-3EEDXU4T.min.js} +2 -2
  66. package/dist/prod/{vidply.chunk-P4UXOHWA.min.js → vidply.chunk-5HTX5QXW.min.js} +1 -1
  67. package/dist/prod/{vidply.chunk-ABPXVDLZ.min.js → vidply.chunk-6OGHHIYP.min.js} +2 -2
  68. package/dist/prod/{vidply.chunk-UK7YGOB5.min.js → vidply.chunk-GUPGMFUZ.min.js} +2 -2
  69. package/dist/prod/{vidply.chunk-WX3MVEAL.min.js → vidply.chunk-MWEBITCP.min.js} +1 -1
  70. package/dist/prod/{vidply.chunk-2TB6MUHO.min.js → vidply.chunk-PL3P3JHR.min.js} +1 -1
  71. package/dist/prod/{vidply.chunk-EKEYJWMG.min.js → vidply.chunk-QQZGV7TD.min.js} +2 -2
  72. package/dist/prod/{vidply.chunk-Z3YDSA7O.min.js → vidply.chunk-U5IRRYG5.min.js} +1 -1
  73. package/dist/prod/{vidply.chunk-TM6AXJVD.min.js → vidply.chunk-VKHV4QHA.min.js} +2 -2
  74. package/dist/prod/{vidply.chunk-P3PQBY7N.min.js → vidply.chunk-XA4M574A.min.js} +1 -1
  75. package/dist/prod/{vidply.chunk-RI3X7WHK.min.js → vidply.chunk-ZPTV4JEP.min.js} +2 -2
  76. package/dist/prod/{vidply.de-BCHXRQ53.min.js → vidply.de-UZHFCEZU.min.js} +2 -2
  77. package/dist/prod/{vidply.es-PICAKMZD.min.js → vidply.es-BOISUV2S.min.js} +2 -2
  78. package/dist/prod/vidply.esm.min.js +2 -2
  79. package/dist/prod/{vidply.fr-ZILI7CDR.min.js → vidply.fr-ICSMKPFM.min.js} +2 -2
  80. package/dist/prod/{vidply.ja-5WQ4OK4J.min.js → vidply.ja-VQ2HKGAY.min.js} +2 -2
  81. package/dist/vidply.css +5852 -5796
  82. package/dist/vidply.esm.min.meta.json +204 -149
  83. package/dist/vidply.min.css +1 -1
  84. package/package.json +11 -11
  85. package/src/controls/CaptionManager.ts +598 -598
  86. package/src/controls/ControlBar.ts +4191 -4159
  87. package/src/controls/KeyboardHelp.ts +326 -0
  88. package/src/controls/KeyboardManager.ts +387 -383
  89. package/src/controls/SettingsDialog.ts +488 -488
  90. package/src/controls/TranscriptManager.ts +2426 -2426
  91. package/src/core/AudioDescriptionManager.ts +863 -774
  92. package/src/core/DescriptionSpeechManager.ts +232 -0
  93. package/src/core/FloatingPlayerManager.ts +674 -674
  94. package/src/core/LazyInit.ts +80 -80
  95. package/src/core/MediaSessionManager.ts +341 -0
  96. package/src/core/MetadataAlertsManager.ts +514 -514
  97. package/src/core/Player.ts +2973 -2872
  98. package/src/core/PosterManager.ts +169 -169
  99. package/src/core/PseudoFullscreen.ts +179 -179
  100. package/src/core/ResponsiveManager.ts +231 -231
  101. package/src/core/ResumeManager.ts +236 -236
  102. package/src/core/SignLanguageManager.ts +1308 -1308
  103. package/src/core/ThemeManager.ts +157 -157
  104. package/src/features/PlaylistManager.ts +1838 -1827
  105. package/src/i18n/i18n.ts +223 -223
  106. package/src/i18n/languages/de.ts +244 -217
  107. package/src/i18n/languages/en.ts +245 -218
  108. package/src/i18n/languages/es.ts +241 -214
  109. package/src/i18n/languages/fr.ts +241 -214
  110. package/src/i18n/languages/ja.ts +241 -214
  111. package/src/icons/Icons.ts +168 -167
  112. package/src/index.ts +196 -193
  113. package/src/renderers/DASHRenderer.ts +1077 -1077
  114. package/src/renderers/HLSRenderer.ts +944 -944
  115. package/src/renderers/HTML5Renderer.ts +389 -389
  116. package/src/renderers/SoundCloudRenderer.ts +437 -437
  117. package/src/renderers/VimeoRenderer.ts +298 -298
  118. package/src/renderers/YouTubeRenderer.ts +290 -290
  119. package/src/styles/vidply.css +5852 -5796
  120. package/src/types/events.ts +128 -122
  121. package/src/types/globals.d.ts +313 -313
  122. package/src/types/options.ts +199 -182
  123. package/src/types/renderer.ts +58 -58
  124. package/src/utils/DOMUtils.ts +281 -281
  125. package/src/utils/DownloadInfo.ts +171 -171
  126. package/src/utils/DraggablePanel.ts +539 -539
  127. package/src/utils/DraggablePanelMenu.ts +195 -195
  128. package/src/utils/DraggableResizable.ts +997 -997
  129. package/src/utils/EventEmitter.ts +59 -59
  130. package/src/utils/FormUtils.ts +95 -95
  131. package/src/utils/MenuFactory.ts +483 -483
  132. package/src/utils/Sanitize.ts +70 -70
  133. package/src/utils/SettingsMenuFactory.ts +289 -289
  134. package/src/utils/StorageManager.ts +287 -287
  135. package/src/utils/TrackLabelUtils.ts +52 -52
  136. package/src/utils/UrlSafe.ts +69 -69
  137. package/src/utils/VideoFrameCapture.ts +114 -114
  138. package/src/utils/WindowComponents.ts +250 -250
  139. package/dist/dev/vidply.AudioDescriptionManager-R47Q4YR4.js.map +0 -7
  140. package/dist/dev/vidply.DASHRenderer-PWEMC3BT.js.map +0 -7
  141. package/dist/dev/vidply.FloatingPlayerManager-PKNNNAS2.js.map +0 -7
  142. package/dist/dev/vidply.HLSRenderer-E7RQ74HI.js.map +0 -7
  143. package/dist/dev/vidply.HTML5Renderer-BU4QJJJY.js +0 -12
  144. package/dist/dev/vidply.SignLanguageManager-FET5FQZ7.js.map +0 -7
  145. package/dist/dev/vidply.SoundCloudRenderer-RVSJZODO.js.map +0 -7
  146. package/dist/dev/vidply.TranscriptManager-5GXOQCLX.js.map +0 -7
  147. package/dist/dev/vidply.VimeoRenderer-ER2LSBBW.js.map +0 -7
  148. package/dist/dev/vidply.YouTubeRenderer-NFTOWJAB.js.map +0 -7
  149. package/dist/dev/vidply.chunk-64WXMTGL.js.map +0 -7
  150. package/dist/dev/vidply.chunk-BNFIUL2Z.js.map +0 -7
  151. package/dist/dev/vidply.chunk-JJ47NO24.js.map +0 -7
  152. package/dist/dev/vidply.chunk-KI7C3QVL.js.map +0 -7
  153. package/dist/dev/vidply.chunk-NQPURMQY.js.map +0 -7
  154. package/dist/dev/vidply.chunk-RZWZGDV7.js.map +0 -7
  155. package/dist/dev/vidply.chunk-W25HUCHS.js.map +0 -7
  156. package/dist/dev/vidply.de-4YAT7FFM.js.map +0 -7
  157. package/dist/dev/vidply.es-LEWIRUBH.js.map +0 -7
  158. package/dist/dev/vidply.fr-Q4GV2NOE.js.map +0 -7
  159. package/dist/dev/vidply.ja-S6ITA6WU.js.map +0 -7
  160. package/dist/prod/vidply.AudioDescriptionManager-RHLIJW5C.min.js +0 -6
  161. package/dist/prod/vidply.HTML5Renderer-IU5T3WEW.min.js +0 -6
  162. /package/dist/dev/{vidply.CaptionStyleMenu-7XHRBWUM.js.map → vidply.CaptionStyleMenu-47RCKQF5.js.map} +0 -0
  163. /package/dist/dev/{vidply.HTML5Renderer-BU4QJJJY.js.map → vidply.HTML5Renderer-HLRQUOCU.js.map} +0 -0
  164. /package/dist/dev/{vidply.chunk-SK4V2DAU.js.map → vidply.chunk-HZ7UOKOU.js.map} +0 -0
  165. /package/dist/dev/{vidply.chunk-DZSDO3B7.js.map → vidply.chunk-JZNZX32Z.js.map} +0 -0
  166. /package/dist/dev/{vidply.chunk-VMSQAZM7.js.map → vidply.chunk-P25MRJ6O.js.map} +0 -0
  167. /package/dist/dev/{vidply.chunk-6RQA4ROD.js.map → vidply.chunk-PRFNESYA.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/icons/Icons.ts"],
4
+ "sourcesContent": ["const iconPaths: Record<string, string> = {\n play: `<path d=\"M8 5v14l11-7z\"/>`,\n pause: `<path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\"/>`,\n stop: `<rect x=\"6\" y=\"6\" width=\"12\" height=\"12\"/>`,\n rewind: `<path d=\"M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z\"/>`,\n forward: `<path d=\"M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z\"/>`,\n skipPrevious: `<path d=\"M6 6h2v12H6V6zm3 6l8.5 6V6L9 12z\"/>`,\n skipNext: `<path d=\"M16 6h2v12h-2V6zM6 6l8.5 6L6 18V6z\"/>`,\n restart: `<path d=\"M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z\"/>`,\n volumeHigh: `<path d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\"/>`,\n volumeMedium: `<path d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02z\"/>`,\n volumeLow: `<path d=\"M7 9v6h4l5 5V4l-5 5H7z\"/>`,\n volumeMuted: `<path d=\"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z\"/>`,\n fullscreen: `<path d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"/>`,\n fullscreenExit: `<path d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"/>`,\n settings: `<path d=\"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94L14.4 2.81c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z\"/>`,\n captions: `<path d=\"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 7H9.5v-.5h-2v3h2V13H11v1c0 .55-.45 1-1 1H7c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1zm7 0h-1.5v-.5h-2v3h2V13H18v1c0 .55-.45 1-1 1h-3c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1z\"/>`,\n captionsOff: `<path d=\"M19 4H5c-1.11 0-2 .9-2 2v12c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 7H9.5v-.5h-2v3h2V13H11v1c0 .55-.45 1-1 1H7c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1zm7 0h-1.5v-.5h-2v3h2V13H18v1c0 .55-.45 1-1 1h-3c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v1z\"/><path d=\"M0 0h24v24H0z\" fill=\"none\"/>`,\n pip: `<path d=\"M19 7h-8v6h8V7zm2-4H3c-1.1 0-2 .9-2 2v14c0 1.1.9 1.98 2 1.98h18c1.1 0 2-.88 2-1.98V5c0-1.1-.9-2-2-2zm0 16.01H3V4.98h18v14.03z\"/>`,\n speed: `<path d=\"M20.38 8.57l-1.23 1.85a8 8 0 0 1-.22 7.58H5.07A8 8 0 0 1 15.58 6.85l1.85-1.23A10 10 0 0 0 3.35 19a2 2 0 0 0 1.72 1h13.85a2 2 0 0 0 1.74-1 10 10 0 0 0-.27-10.44z\"/><path d=\"M10.59 15.41a2 2 0 0 0 2.83 0l5.66-8.49-8.49 5.66a2 2 0 0 0 0 2.83z\"/>`,\n close: `<path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>`,\n check: `<path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\"/>`,\n loading: `<path d=\"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z\"/>`,\n error: `<path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\"/>`,\n playlist: `<path d=\"M15 6H3v2h12V6zm0 4H3v2h12v-2zM3 16h8v-2H3v2zM17 6v8.18c-.31-.11-.65-.18-1-.18-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3V8h3V6h-5z\"/>`,\n hd: `<path d=\"M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-8 12H9.5v-2h-2v2H6V9h1.5v2.5h2V9H11v6zm7-1c0 .55-.45 1-1 1h-.75v1.5h-1.5V15H14c-.55 0-1-.45-1-1v-4c0-.55.45-1 1-1h3c.55 0 1 .45 1 1v4zm-3.5-.5h2v-3h-2v3z\"/>`,\n transcript: `<path d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z\"/>`,\n chapters: `<path d=\"M3 5h2v2H3V5zm0 4h2v2H3V9zm0 4h2v2H3v-2zm0 4h2v2H3v-2zM7 5h14v2H7V5zm0 4h14v2H7V9zm0 4h14v2H7v-2zm0 4h14v2H7v-2z\"/>`,\n audioDescription: `<rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"/><text x=\"12\" y=\"14.5\" text-anchor=\"middle\" font-size=\"8\" font-weight=\"bold\" font-family=\"Arial, sans-serif\" fill=\"currentColor\">AD</text>`,\n audioDescriptionOn: `<rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\" fill=\"currentColor\"/><text x=\"12\" y=\"14.5\" text-anchor=\"middle\" font-size=\"8\" font-weight=\"bold\" font-family=\"Arial, sans-serif\" class=\"vidply-icon-ad-fg\">AD</text>`,\n signLanguage: `<g transform=\"scale(1.5)\"><path d=\"M16 11.3c-.1-.9-4.8 1.3-5.4 1.1-2.6-1 5.8-1.3 5.1-2.9s-5.1 1.5-6 1.4C6.5 9.4 16.5 9.1 13.5 8c-1.9-.6-8.8 2.9-6.8.4.7-.6.7-1.9-.7-1.7-9.7 7.2-.7 12.2 8.8 7 0-1.3-3.5.4-4.1.4-2.6 0 5.6-2 5.4-3ZM3.9 7.8c3.2-4.2 3.7 1.2 6 .1s.2-.2.2-.3c.7-2.7 2.5-7.5-1.5-1.3-1.6 0 1.1-4 1-4.6C8.9-1 7.3 4.4 7.2 4.9c-1.6.7-.9-1.4-.7-1.5 3-6-.6-3.1-.9.4-2.5 1.8 0-2.8 0-3.5C2.8-.9 4 9.4 1.1 4.9S.1 4.6 0 5c-.4 2.7 2.6 7.2 3.9 2.8Z\"/></g>`,\n signLanguageOn: `<g transform=\"scale(1.5)\"><path d=\"M16 11.3c-.1-.9-4.8 1.3-5.4 1.1-2.6-1 5.8-1.3 5.1-2.9s-5.1 1.5-6 1.4C6.5 9.4 16.5 9.1 13.5 8c-1.9-.6-8.8 2.9-6.8.4.7-.6.7-1.9-.7-1.7-9.7 7.2-.7 12.2 8.8 7 0-1.3-3.5.4-4.1.4-2.6 0 5.6-2 5.4-3ZM3.9 7.8c3.2-4.2 3.7 1.2 6 .1s.2-.2.2-.3c.7-2.7 2.5-7.5-1.5-1.3-1.6 0 1.1-4 1-4.6C8.9-1 7.3 4.4 7.2 4.9c-1.6.7-.9-1.4-.7-1.5 3-6-.6-3.1-.9.4-2.5 1.8 0-2.8 0-3.5C2.8-.9 4 9.4 1.1 4.9S.1 4.6 0 5c-.4 2.7 2.6 7.2 3.9 2.8Z\"/></g>`,\n signLanguagePip: `<g transform=\"scale(1.2) translate(1, 1)\"><path d=\"M16 11.3c-.1-.9-4.8 1.3-5.4 1.1-2.6-1 5.8-1.3 5.1-2.9s-5.1 1.5-6 1.4C6.5 9.4 16.5 9.1 13.5 8c-1.9-.6-8.8 2.9-6.8.4.7-.6.7-1.9-.7-1.7-9.7 7.2-.7 12.2 8.8 7 0-1.3-3.5.4-4.1.4-2.6 0 5.6-2 5.4-3ZM3.9 7.8c3.2-4.2 3.7 1.2 6 .1s.2-.2.2-.3c.7-2.7 2.5-7.5-1.5-1.3-1.6 0 1.1-4 1-4.6C8.9-1 7.3 4.4 7.2 4.9c-1.6.7-.9-1.4-.7-1.5 3-6-.6-3.1-.9.4-2.5 1.8 0-2.8 0-3.5C2.8-.9 4 9.4 1.1 4.9S.1 4.6 0 5c-.4 2.7 2.6 7.2 3.9 2.8Z\"/></g><polygon points=\"14,23 23,14 23,23\" fill=\"currentColor\"/>`,\n signLanguagePipOn: `<g transform=\"scale(1.2) translate(1, 1)\"><path d=\"M16 11.3c-.1-.9-4.8 1.3-5.4 1.1-2.6-1 5.8-1.3 5.1-2.9s-5.1 1.5-6 1.4C6.5 9.4 16.5 9.1 13.5 8c-1.9-.6-8.8 2.9-6.8.4.7-.6.7-1.9-.7-1.7-9.7 7.2-.7 12.2 8.8 7 0-1.3-3.5.4-4.1.4-2.6 0 5.6-2 5.4-3ZM3.9 7.8c3.2-4.2 3.7 1.2 6 .1s.2-.2.2-.3c.7-2.7 2.5-7.5-1.5-1.3-1.6 0 1.1-4 1-4.6C8.9-1 7.3 4.4 7.2 4.9c-1.6.7-.9-1.4-.7-1.5 3-6-.6-3.1-.9.4-2.5 1.8 0-2.8 0-3.5C2.8-.9 4 9.4 1.1 4.9S.1 4.6 0 5c-.4 2.7 2.6 7.2 3.9 2.8Z\"/></g><polygon points=\"14,23 23,14 23,23\" fill=\"currentColor\"/>`,\n music: `<path d=\"M12 3v9.28c-.47-.17-.97-.28-1.5-.28C8.01 12 6 14.01 6 16.5S8.01 21 10.5 21c2.31 0 4.2-1.75 4.45-4H15V6h4V3h-7zm-1.5 16c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/>`,\n moreVertical: `<path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"/>`,\n move: `<path d=\"M10 9h4V6h3l-5-5-5 5h3v3zm-1 1H6V7l-5 5 5 5v-3h3v-4zm14 2l-5-5v3h-3v4h3v3l5-5zm-9 3h-4v3H7l5 5 5-5h-3v-3z\"/>`,\n resize: `<path d=\"M21.71 11.29l-9-9c-.39-.39-1.02-.39-1.41 0l-9 9c-.39.39-.39 1.02 0 1.41l9 9c.39.39 1.02.39 1.41 0l9-9c.39-.38.39-1.01 0-1.41zM14 14.5V12h-4v2.5L7 11l3-3.5V10h4V7.5l3 3.5-3 3.5z\"/>`,\n clock: `<path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z\"/><path d=\"M12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z\"/>`,\n download: `<path d=\"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"/>`,\n help: `<path d=\"M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z\"/>`\n};\n\n// The `xmlns` declaration is mandatory for `DOMParser.parseFromString`\n// with `image/svg+xml`: without it, XML parsing leaves the child\n// elements (`<path>`, `<rect>`, `<g>`, `<text>`, `<polygon>`) in the\n// null namespace, so the browser can't render them as SVG shapes.\n// The old `innerHTML`-based path worked by accident because the HTML\n// parser treats `<svg>` as a special token and places its descendants\n// in the SVG namespace automatically.\nconst svgWrapper = (paths: string) =>\n `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\">${paths}</svg>`;\n\nexport const Icons: Record<string, string> = Object.fromEntries(\n Object.entries(iconPaths).map(([key, value]) => [key, svgWrapper(value)])\n);\n\nexport function getIcon(name: string): string {\n return Icons[name] || Icons.play || '';\n}\n\n/**\n * Parse every icon once at module load into an SVG template element and\n * clone it per call. This replaces the previous `wrapper.innerHTML = …`\n * approach: `innerHTML` is disallowed by strict CSP (`require-trusted-types-for`)\n * and is slower because the browser has to re-tokenise the same string on\n * every icon render.\n *\n * The icon SVG strings are trusted constants defined in this module, so\n * parsing via `DOMParser` is safe.\n */\nconst iconTemplates: Record<string, SVGSVGElement> = (() => {\n const parser = new DOMParser();\n const templates: Record<string, SVGSVGElement> = {};\n for (const [key, paths] of Object.entries(iconPaths)) {\n const doc = parser.parseFromString(svgWrapper(paths), 'image/svg+xml');\n const root = doc.documentElement;\n // A parse failure produces a `<parsererror>` element as the\n // document root; reject that and skip the entry rather than\n // storing a broken template that would render as nothing.\n if (\n root &&\n root.nodeName.toLowerCase() === 'svg' &&\n !root.querySelector('parsererror')\n ) {\n templates[key] = root as unknown as SVGSVGElement;\n }\n }\n return templates;\n})();\n\nexport function createIconElement(name: string, className = ''): HTMLElement {\n const wrapper = document.createElement('span');\n wrapper.className = `vidply-icon ${className}`.trim();\n wrapper.setAttribute('aria-hidden', 'true');\n\n const template = iconTemplates[name] || iconTemplates.play;\n if (template) {\n wrapper.appendChild(template.cloneNode(true));\n }\n return wrapper;\n}\n\nexport function createPlayOverlay(): SVGSVGElement {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('class', 'vidply-play-overlay');\n svg.setAttribute('viewBox', '0 0 80 80');\n svg.setAttribute('width', '80');\n svg.setAttribute('height', '80');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('role', 'presentation');\n svg.style.cursor = 'pointer';\n\n const defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n const filterId = `vidply-play-shadow-${Math.random().toString(36).slice(2, 11)}`;\n const filter = document.createElementNS('http://www.w3.org/2000/svg', 'filter');\n filter.setAttribute('id', filterId);\n filter.setAttribute('x', '-50%');\n filter.setAttribute('y', '-50%');\n filter.setAttribute('width', '200%');\n filter.setAttribute('height', '200%');\n\n const feGaussianBlur = document.createElementNS('http://www.w3.org/2000/svg', 'feGaussianBlur');\n feGaussianBlur.setAttribute('in', 'SourceAlpha');\n feGaussianBlur.setAttribute('stdDeviation', '3');\n\n const feOffset = document.createElementNS('http://www.w3.org/2000/svg', 'feOffset');\n feOffset.setAttribute('dx', '0');\n feOffset.setAttribute('dy', '2');\n feOffset.setAttribute('result', 'offsetblur');\n\n const feComponentTransfer = document.createElementNS('http://www.w3.org/2000/svg', 'feComponentTransfer');\n const feFuncA = document.createElementNS('http://www.w3.org/2000/svg', 'feFuncA');\n feFuncA.setAttribute('type', 'linear');\n feFuncA.setAttribute('slope', '0.3');\n feComponentTransfer.appendChild(feFuncA);\n\n const feMerge = document.createElementNS('http://www.w3.org/2000/svg', 'feMerge');\n const feMergeNode1 = document.createElementNS('http://www.w3.org/2000/svg', 'feMergeNode');\n const feMergeNode2 = document.createElementNS('http://www.w3.org/2000/svg', 'feMergeNode');\n feMergeNode2.setAttribute('in', 'SourceGraphic');\n feMerge.appendChild(feMergeNode1);\n feMerge.appendChild(feMergeNode2);\n\n filter.appendChild(feGaussianBlur);\n filter.appendChild(feOffset);\n filter.appendChild(feComponentTransfer);\n filter.appendChild(feMerge);\n defs.appendChild(filter);\n svg.appendChild(defs);\n\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n circle.setAttribute('cx', '40');\n circle.setAttribute('cy', '40');\n circle.setAttribute('r', '40');\n circle.setAttribute('fill', 'rgba(255, 255, 255, 0.95)');\n circle.setAttribute('filter', `url(#${filterId})`);\n circle.setAttribute('class', 'vidply-play-overlay-bg');\n svg.appendChild(circle);\n\n const playTriangle = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');\n playTriangle.setAttribute('points', '32,28 32,52 54,40');\n playTriangle.setAttribute('fill', '#0a406e');\n playTriangle.setAttribute('class', 'vidply-play-overlay-icon');\n svg.appendChild(playTriangle);\n\n return svg;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * VidPly v1.2.0 - Universal, Accessible Video Player
2
+ * VidPly v1.2.3 - Universal, Accessible Video Player
3
3
  * (c) 2026 Matthias Peltzer
4
4
  * Released under GPL-2.0-or-later License
5
5
  */
@@ -725,4 +725,4 @@ var DraggableResizable = class {
725
725
  export {
726
726
  DraggableResizable
727
727
  };
728
- //# sourceMappingURL=vidply.chunk-JJ47NO24.js.map
728
+ //# sourceMappingURL=vidply.chunk-UNFGMABP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/DraggableResizable.ts"],
4
+ "sourcesContent": ["import type { StorageManager } from './StorageManager.js';\n\nexport interface DraggableResizableOptions {\n dragHandle?: HTMLElement | null;\n resizeHandles?: HTMLElement[];\n onDragStart?: ((e: Event) => boolean | void) | null;\n onDrag?: ((pos: { x?: number; y?: number; centered?: boolean }) => void) | null;\n onDragEnd?: (() => void) | null;\n onResizeStart?: (() => void) | null;\n onResize?: ((dims: { width: number; height: number; left?: number; top?: number }) => void) | null;\n onResizeEnd?: (() => void) | null;\n constrainToViewport?: boolean;\n minWidth?: number;\n minHeight?: number;\n maintainAspectRatio?: boolean;\n keyboardDragKey?: string;\n keyboardResizeKey?: string;\n keyboardStep?: number;\n keyboardStepLarge?: number;\n maxWidth?: number | (() => number) | null;\n maxHeight?: number | (() => number) | null;\n pointerResizeIndicatorText?: string | null;\n onPointerResizeToggle?: ((enabled: boolean) => void) | null;\n classPrefix?: string;\n storage?: StorageManager | null;\n storageKey?: string | null;\n}\n\ninterface ResolvedOptions extends Required<Omit<DraggableResizableOptions, 'maxWidth' | 'maxHeight'>> {\n maxWidth: number | (() => number) | null;\n maxHeight: number | (() => number) | null;\n}\n\nexport class DraggableResizable {\n element: HTMLElement;\n options: ResolvedOptions;\n isDragging: boolean;\n isResizing: boolean;\n resizeDirection: string | null;\n dragOffsetX: number;\n dragOffsetY: number;\n positionOffsetX: number;\n positionOffsetY: number;\n initialMouseX: number;\n initialMouseY: number;\n needsPositionConversion: boolean;\n resizeStartX: number;\n resizeStartY: number;\n resizeStartWidth: number;\n resizeStartHeight: number;\n resizeStartLeft: number;\n resizeStartTop: number;\n keyboardDragMode: boolean;\n keyboardResizeMode: boolean;\n pointerResizeMode: boolean;\n manuallyPositioned: boolean;\n resizeHandlesManaged: Map<HTMLElement, boolean>;\n resizeIndicatorElement: HTMLElement | null;\n handlers: {\n mousedown: (e: MouseEvent) => void;\n mousemove: (e: MouseEvent) => void;\n mouseup: () => void;\n touchstart: (e: TouchEvent) => void;\n touchmove: (e: TouchEvent) => void;\n touchend: () => void;\n pointerdown: (e: PointerEvent) => void;\n pointermove: (e: PointerEvent) => void;\n pointerup: (e: PointerEvent) => void;\n pointercancel: (e: PointerEvent) => void;\n keydown: (e: KeyboardEvent) => void;\n resizeHandleMousedown: (e: MouseEvent | TouchEvent) => void;\n resizeHandlePointerDown: (e: PointerEvent) => void;\n };\n activePointerId: number | null;\n activePointerType: string | null;\n\n constructor(element: HTMLElement, options: DraggableResizableOptions = {}) {\n this.element = element;\n this.options = {\n dragHandle: null,\n resizeHandles: [],\n onDragStart: null,\n onDrag: null,\n onDragEnd: null,\n onResizeStart: null,\n onResize: null,\n onResizeEnd: null,\n constrainToViewport: true,\n minWidth: 150,\n minHeight: 100,\n maintainAspectRatio: false,\n keyboardDragKey: 'd',\n keyboardResizeKey: 'r',\n keyboardStep: 5,\n keyboardStepLarge: 10,\n maxWidth: null,\n maxHeight: null,\n pointerResizeIndicatorText: null,\n onPointerResizeToggle: null,\n classPrefix: 'draggable',\n storage: null,\n storageKey: null,\n ...options\n } as ResolvedOptions;\n\n // State\n this.isDragging = false;\n this.isResizing = false;\n this.resizeDirection = null;\n this.dragOffsetX = 0;\n this.dragOffsetY = 0;\n this.positionOffsetX = 0;\n this.positionOffsetY = 0;\n this.initialMouseX = 0;\n this.initialMouseY = 0;\n this.needsPositionConversion = false;\n this.resizeStartX = 0;\n this.resizeStartY = 0;\n this.resizeStartWidth = 0;\n this.resizeStartHeight = 0;\n this.resizeStartLeft = 0;\n this.resizeStartTop = 0;\n this.keyboardDragMode = false;\n this.keyboardResizeMode = false;\n this.pointerResizeMode = false;\n this.manuallyPositioned = false; // Flag to track if user has manually moved/resized\n this.resizeHandlesManaged = new Map();\n this.resizeIndicatorElement = null;\n\n // Event handlers\n this.handlers = {\n mousedown: this.onMouseDown.bind(this),\n mousemove: this.onMouseMove.bind(this),\n mouseup: this.onMouseUp.bind(this),\n touchstart: this.onTouchStart.bind(this),\n touchmove: this.onTouchMove.bind(this),\n touchend: this.onTouchEnd.bind(this),\n pointerdown: this.onPointerDown.bind(this),\n pointermove: this.onPointerMove.bind(this),\n pointerup: this.onPointerUp.bind(this),\n pointercancel: this.onPointerUp.bind(this),\n keydown: this.onKeyDown.bind(this),\n resizeHandleMousedown: this.onResizeHandleMouseDown.bind(this),\n resizeHandlePointerDown: this.onResizeHandlePointerDown.bind(this)\n };\n\n // Pointer tracking (Pointer Events unify mouse + touch)\n this.activePointerId = null;\n this.activePointerType = null;\n\n this.init();\n }\n\n hasManagedResizeHandles(): boolean {\n return Array.from(this.resizeHandlesManaged.values()).some(Boolean);\n }\n\n storeOriginalHandleDisplay(handle: HTMLElement): void {\n if (!handle.dataset.originalDisplay) {\n handle.dataset.originalDisplay = handle.style.display || '';\n }\n }\n\n hideResizeHandle(handle: HTMLElement): void {\n handle.style.display = 'none';\n handle.setAttribute('aria-hidden', 'true');\n }\n\n showResizeHandle(handle: HTMLElement): void {\n const original = handle.dataset.originalDisplay !== undefined ? handle.dataset.originalDisplay : '';\n handle.style.display = original;\n handle.removeAttribute('aria-hidden');\n }\n\n setManagedHandlesVisible(visible: boolean): void {\n if (!this.options.resizeHandles || this.options.resizeHandles.length === 0) {\n return;\n }\n\n this.options.resizeHandles.forEach(handle => {\n if (!this.resizeHandlesManaged.get(handle)) {\n return;\n }\n\n if (visible) {\n this.showResizeHandle(handle);\n } else {\n this.hideResizeHandle(handle);\n }\n });\n }\n\n init(): void {\n const dragHandle = this.options.dragHandle || this.element;\n \n // Prefer Pointer Events when available (covers mouse + touch in one codepath)\n if (typeof window !== 'undefined' && 'PointerEvent' in window) {\n dragHandle.addEventListener('pointerdown', this.handlers.pointerdown);\n\n // Document-level up/cancel events (always needed to end a drag/resize that\n // started inside the element even when the pointer leaves the element).\n // pointermove is NOT registered here — it is added lazily in startDragging()\n // and startResizing() with { passive: false } so that it can call\n // e.preventDefault() to suppress scroll during an active interaction, and\n // removed again in stopDragging() / stopResizing(). Keeping the listener\n // absent while the element is merely visible prevents the non-passive\n // handler from blocking compositor-threaded scroll on the rest of the page.\n document.addEventListener('pointerup', this.handlers.pointerup);\n document.addEventListener('pointercancel', this.handlers.pointercancel);\n } else {\n // Fallback for very old browsers\n dragHandle.addEventListener('mousedown', this.handlers.mousedown);\n dragHandle.addEventListener('touchstart', this.handlers.touchstart, { passive: false });\n\n // Document-level move/up events\n document.addEventListener('mousemove', this.handlers.mousemove);\n document.addEventListener('mouseup', this.handlers.mouseup);\n document.addEventListener('touchmove', this.handlers.touchmove, { passive: false });\n document.addEventListener('touchend', this.handlers.touchend);\n }\n \n // Keyboard events\n this.element.addEventListener('keydown', this.handlers.keydown);\n \n // Resize handles\n if (this.options.resizeHandles && this.options.resizeHandles.length > 0) {\n this.options.resizeHandles.forEach(handle => {\n if (typeof window !== 'undefined' && 'PointerEvent' in window) {\n handle.addEventListener('pointerdown', this.handlers.resizeHandlePointerDown);\n } else {\n handle.addEventListener('mousedown', this.handlers.resizeHandleMousedown);\n handle.addEventListener('touchstart', this.handlers.resizeHandleMousedown, { passive: false });\n }\n\n const managed = handle.dataset.vidplyManagedResize === 'true';\n this.resizeHandlesManaged.set(handle, managed);\n if (managed) {\n this.storeOriginalHandleDisplay(handle);\n this.hideResizeHandle(handle);\n }\n });\n }\n }\n\n onPointerDown(e: PointerEvent): void {\n if (e.isPrimary === false) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n\n const target = e.target as HTMLElement;\n if (target.classList.contains(`${this.options.classPrefix}-resize-handle`)) {\n return;\n }\n\n if (this.options.onDragStart && !this.options.onDragStart(e)) {\n return;\n }\n\n this.activePointerId = e.pointerId;\n this.activePointerType = e.pointerType;\n\n try {\n (e.currentTarget as HTMLElement)?.setPointerCapture?.(e.pointerId);\n } catch {\n // ignore\n }\n\n this.startDragging(e.clientX, e.clientY);\n e.preventDefault();\n }\n\n onPointerMove(e: PointerEvent): void {\n if (this.activePointerId !== null && e.pointerId !== this.activePointerId) return;\n\n if (this.isDragging) {\n this.drag(e.clientX, e.clientY);\n e.preventDefault();\n } else if (this.isResizing) {\n this.resize(e.clientX, e.clientY);\n e.preventDefault();\n }\n }\n\n onPointerUp(e: PointerEvent): void {\n if (this.activePointerId !== null && e.pointerId !== this.activePointerId) return;\n\n if (this.isDragging) {\n this.stopDragging();\n } else if (this.isResizing) {\n this.stopResizing();\n }\n\n this.activePointerId = null;\n this.activePointerType = null;\n }\n\n onMouseDown(e: MouseEvent): void {\n const target = e.target as HTMLElement;\n if (target.classList.contains(`${this.options.classPrefix}-resize-handle`)) {\n return;\n }\n \n // Call custom handler if provided\n if (this.options.onDragStart && !this.options.onDragStart(e)) {\n return;\n }\n\n this.startDragging(e.clientX, e.clientY);\n e.preventDefault();\n }\n\n onTouchStart(e: TouchEvent): void {\n const target = e.target as HTMLElement;\n if (target.classList.contains(`${this.options.classPrefix}-resize-handle`)) {\n return;\n }\n \n // Call custom handler if provided\n if (this.options.onDragStart && !this.options.onDragStart(e)) {\n return;\n }\n\n const touch = e.touches[0];\n if (!touch) return;\n this.startDragging(touch.clientX, touch.clientY);\n // Prevent page scroll while dragging (requires passive:false listener)\n e.preventDefault();\n }\n\n onResizeHandlePointerDown(e: PointerEvent): void {\n // Only handle primary pointer\n if (e.isPrimary === false) return;\n\n // Only left click for mouse\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n const handle = e.target as HTMLElement;\n this.resizeDirection = handle.getAttribute('data-direction');\n\n this.activePointerId = e.pointerId;\n this.activePointerType = e.pointerType;\n\n try {\n (e.currentTarget as HTMLElement)?.setPointerCapture?.(e.pointerId);\n } catch {\n // ignore\n }\n\n this.startResizing(e.clientX, e.clientY);\n }\n\n onResizeHandleMouseDown(e: MouseEvent | TouchEvent): void {\n e.preventDefault();\n e.stopPropagation();\n \n const handle = e.target as HTMLElement;\n this.resizeDirection = handle.getAttribute('data-direction');\n \n const clientX = 'clientX' in e ? e.clientX : e.touches?.[0]?.clientX;\n const clientY = 'clientY' in e ? e.clientY : e.touches?.[0]?.clientY;\n if (clientX === undefined || clientY === undefined) return;\n\n this.startResizing(clientX, clientY);\n }\n\n onMouseMove(e: MouseEvent): void {\n if (this.isDragging) {\n this.drag(e.clientX, e.clientY);\n e.preventDefault();\n } else if (this.isResizing) {\n this.resize(e.clientX, e.clientY);\n e.preventDefault();\n }\n }\n\n onTouchMove(e: TouchEvent): void {\n if (this.isDragging || this.isResizing) {\n const touch = e.touches[0];\n if (!touch) return;\n if (this.isDragging) {\n this.drag(touch.clientX, touch.clientY);\n } else {\n this.resize(touch.clientX, touch.clientY);\n }\n e.preventDefault();\n }\n }\n\n onMouseUp(): void {\n if (this.isDragging) {\n this.stopDragging();\n } else if (this.isResizing) {\n this.stopResizing();\n }\n }\n\n onTouchEnd(): void {\n if (this.isDragging) {\n this.stopDragging();\n } else if (this.isResizing) {\n this.stopResizing();\n }\n }\n\n onKeyDown(e: KeyboardEvent): void {\n // Toggle drag mode\n if (e.key.toLowerCase() === this.options.keyboardDragKey.toLowerCase()) {\n e.preventDefault();\n this.toggleKeyboardDragMode();\n return;\n }\n\n // Toggle resize mode\n if (e.key.toLowerCase() === this.options.keyboardResizeKey.toLowerCase()) {\n e.preventDefault();\n if (this.hasManagedResizeHandles()) {\n this.togglePointerResizeMode();\n } else {\n this.toggleKeyboardResizeMode();\n }\n return;\n }\n\n // Exit modes with Escape\n if (e.key === 'Escape') {\n if (this.pointerResizeMode) {\n e.preventDefault();\n this.disablePointerResizeMode();\n return;\n }\n if (this.keyboardDragMode || this.keyboardResizeMode) {\n e.preventDefault();\n this.disableKeyboardDragMode();\n this.disableKeyboardResizeMode();\n return;\n }\n }\n\n // Arrow keys for drag/resize\n if (['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(e.key)) {\n if (this.keyboardDragMode) {\n e.preventDefault();\n e.stopPropagation();\n this.keyboardDrag(e.key, e.shiftKey);\n } else if (this.keyboardResizeMode) {\n e.preventDefault();\n e.stopPropagation();\n this.keyboardResize(e.key, e.shiftKey);\n }\n }\n\n // Home key to reset position\n if (e.key === 'Home' && (this.keyboardDragMode || this.keyboardResizeMode)) {\n e.preventDefault();\n this.resetPosition();\n }\n }\n\n startDragging(clientX: number, clientY: number): void {\n // Get current rendered position BEFORE any changes\n const rect = this.element.getBoundingClientRect();\n \n // Convert position to left/top IMMEDIATELY (before setting any state)\n // Check if element is using right/bottom/transform positioning\n const computedStyle = window.getComputedStyle(this.element);\n const needsConversion = computedStyle.right !== 'auto' || \n computedStyle.bottom !== 'auto' || \n computedStyle.transform !== 'none';\n \n this.positionOffsetX = 0;\n this.positionOffsetY = 0;\n\n if (needsConversion) {\n // Determine the correct left/top values based on position type\n let targetLeft, targetTop;\n \n if (computedStyle.position === 'absolute') {\n // position: absolute uses container-relative coordinates\n const offsetParent = this.element.offsetParent || document.body;\n const parentRect = offsetParent.getBoundingClientRect();\n targetLeft = rect.left - parentRect.left;\n targetTop = rect.top - parentRect.top;\n this.positionOffsetX = parentRect.left;\n this.positionOffsetY = parentRect.top;\n } else if (computedStyle.position === 'fixed') {\n const parsedLeft = parseFloat(computedStyle.left);\n const parsedTop = parseFloat(computedStyle.top);\n const hasLeft = Number.isFinite(parsedLeft);\n const hasTop = Number.isFinite(parsedTop);\n targetLeft = hasLeft ? parsedLeft : rect.left;\n targetTop = hasTop ? parsedTop : rect.top;\n this.positionOffsetX = rect.left - targetLeft;\n this.positionOffsetY = rect.top - targetTop;\n } else {\n // fallback: treat as viewport-relative\n targetLeft = rect.left;\n targetTop = rect.top;\n this.positionOffsetX = rect.left - targetLeft;\n this.positionOffsetY = rect.top - targetTop;\n }\n \n // Build complete style update atomically\n const currentCssText = this.element.style.cssText;\n let newCssText = currentCssText\n .split(';')\n .filter(rule => {\n const trimmed = rule.trim();\n // Filter out empty rules\n if (!trimmed) return false;\n \n const colonIndex = trimmed.indexOf(':');\n if (colonIndex === -1) return false;\n \n const property = trimmed.substring(0, colonIndex).trim();\n const value = trimmed.substring(colonIndex + 1).trim();\n \n // Skip if value is empty or just whitespace (this catches empty border properties)\n if (!value || value === '') return false;\n \n // Skip positioning properties\n if (property === 'right' || property === 'bottom' || property === 'transform' ||\n property === 'left' || property === 'top' || property === 'inset') {\n return false;\n }\n \n // Skip border-image properties (these can have empty values that cause parse errors)\n if (property.startsWith('border-image')) {\n return false;\n }\n \n return true;\n })\n .join('; ');\n \n if (newCssText) newCssText += '; ';\n newCssText += `left: ${targetLeft}px; top: ${targetTop}px; right: auto; bottom: auto; transform: none`;\n \n // Apply all at once\n this.element.style.cssText = newCssText;\n }\n \n // Now calculate offsets based on CURRENT position (after conversion)\n // Re-get rect after potential position change\n const finalRect = this.element.getBoundingClientRect();\n this.dragOffsetX = clientX - finalRect.left;\n this.dragOffsetY = clientY - finalRect.top;\n \n this.isDragging = true;\n this.element.classList.add(`${this.options.classPrefix}-dragging`);\n document.body.style.cursor = 'grabbing';\n document.body.style.userSelect = 'none';\n\n // Register the non-passive pointermove listener only for the duration of\n // the drag so it does not block compositor-threaded scroll at other times.\n if ('PointerEvent' in window) {\n document.addEventListener('pointermove', this.handlers.pointermove, { passive: false });\n }\n }\n\n drag(clientX: number, clientY: number): void {\n if (!this.isDragging) return;\n\n // Calculate new position: current mouse position minus the offset where user clicked\n let newX = clientX - this.dragOffsetX - this.positionOffsetX;\n let newY = clientY - this.dragOffsetY - this.positionOffsetY;\n \n // Constrain to viewport if needed\n if (this.options.constrainToViewport) {\n const rect = this.element.getBoundingClientRect();\n const viewportWidth = document.documentElement.clientWidth;\n const viewportHeight = document.documentElement.clientHeight;\n \n // Keep at least 100px visible\n const minVisible = 100;\n const minX = -(rect.width - minVisible);\n const minY = -(rect.height - minVisible);\n const maxX = viewportWidth - minVisible;\n const maxY = viewportHeight - minVisible;\n \n newX = Math.max(minX, Math.min(newX, maxX));\n newY = Math.max(minY, Math.min(newY, maxY));\n }\n \n this.element.style.left = `${newX}px`;\n this.element.style.top = `${newY}px`;\n \n // Call custom handler if provided\n if (this.options.onDrag) {\n this.options.onDrag({ x: newX, y: newY });\n }\n }\n\n stopDragging(): void {\n this.isDragging = false;\n this.element.classList.remove(`${this.options.classPrefix}-dragging`);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n\n // Remove the non-passive pointermove listener that was added in startDragging().\n if ('PointerEvent' in window) {\n document.removeEventListener('pointermove', this.handlers.pointermove);\n }\n \n // Mark as manually positioned\n this.manuallyPositioned = true;\n \n // Call custom handler if provided\n if (this.options.onDragEnd) {\n this.options.onDragEnd();\n }\n }\n\n startResizing(clientX: number, clientY: number): void {\n this.isResizing = true;\n this.resizeStartX = clientX;\n this.resizeStartY = clientY;\n \n const rect = this.element.getBoundingClientRect();\n this.resizeStartWidth = rect.width;\n this.resizeStartHeight = rect.height;\n this.resizeStartLeft = rect.left;\n this.resizeStartTop = rect.top;\n \n this.element.classList.add(`${this.options.classPrefix}-resizing`);\n document.body.style.userSelect = 'none';\n\n // Register the non-passive pointermove listener only for the duration of\n // the resize so it does not block compositor-threaded scroll at other times.\n if ('PointerEvent' in window) {\n document.addEventListener('pointermove', this.handlers.pointermove, { passive: false });\n }\n \n // Call custom handler if provided\n if (this.options.onResizeStart) {\n this.options.onResizeStart();\n }\n }\n\n resize(clientX: number, clientY: number): void {\n if (!this.isResizing) return;\n\n const deltaX = clientX - this.resizeStartX;\n const deltaY = clientY - this.resizeStartY;\n \n let newWidth = this.resizeStartWidth;\n let newHeight = this.resizeStartHeight;\n let newLeft = this.resizeStartLeft;\n let newTop = this.resizeStartTop;\n\n // Handle horizontal resizing\n const resizeDirection = this.resizeDirection ?? '';\n\n if (resizeDirection.includes('e')) {\n newWidth = Math.max(this.options.minWidth, this.resizeStartWidth + deltaX);\n }\n if (resizeDirection.includes('w')) {\n const proposedWidth = Math.max(this.options.minWidth, this.resizeStartWidth - deltaX);\n newLeft = this.resizeStartLeft + (this.resizeStartWidth - proposedWidth);\n newWidth = proposedWidth;\n }\n\n const maxWidthOption = typeof this.options.maxWidth === 'function'\n ? this.options.maxWidth()\n : this.options.maxWidth;\n if (typeof maxWidthOption === 'number' && Number.isFinite(maxWidthOption)) {\n const clampedWidth = Math.min(newWidth, maxWidthOption);\n if (clampedWidth !== newWidth && resizeDirection.includes('w')) {\n newLeft += newWidth - clampedWidth;\n }\n newWidth = clampedWidth;\n }\n\n // Handle vertical resizing (if not maintaining aspect ratio)\n if (!this.options.maintainAspectRatio) {\n if (resizeDirection.includes('s')) {\n newHeight = Math.max(this.options.minHeight, this.resizeStartHeight + deltaY);\n }\n if (resizeDirection.includes('n')) {\n const proposedHeight = Math.max(this.options.minHeight, this.resizeStartHeight - deltaY);\n newTop = this.resizeStartTop + (this.resizeStartHeight - proposedHeight);\n newHeight = proposedHeight;\n }\n\n const maxHeightOption = typeof this.options.maxHeight === 'function'\n ? this.options.maxHeight()\n : this.options.maxHeight;\n if (typeof maxHeightOption === 'number' && Number.isFinite(maxHeightOption)) {\n const clampedHeight = Math.min(newHeight, maxHeightOption);\n if (clampedHeight !== newHeight && resizeDirection.includes('n')) {\n newTop += newHeight - clampedHeight;\n }\n newHeight = clampedHeight;\n }\n }\n\n // Apply new dimensions\n this.element.style.width = `${newWidth}px`;\n if (!this.options.maintainAspectRatio) {\n this.element.style.height = `${newHeight}px`;\n } else {\n this.element.style.height = 'auto';\n }\n \n // Apply new position if resizing from west or north\n if (resizeDirection.includes('w')) {\n this.element.style.left = `${newLeft}px`;\n }\n if (resizeDirection.includes('n') && !this.options.maintainAspectRatio) {\n this.element.style.top = `${newTop}px`;\n }\n \n // Call custom handler if provided\n if (this.options.onResize) {\n this.options.onResize({ width: newWidth, height: newHeight, left: newLeft, top: newTop });\n }\n }\n\n stopResizing(): void {\n this.isResizing = false;\n this.resizeDirection = null;\n this.element.classList.remove(`${this.options.classPrefix}-resizing`);\n document.body.style.userSelect = '';\n\n // Remove the non-passive pointermove listener that was added in startResizing().\n if ('PointerEvent' in window) {\n document.removeEventListener('pointermove', this.handlers.pointermove);\n }\n \n // Mark as manually positioned\n this.manuallyPositioned = true;\n \n // Call custom handler if provided\n if (this.options.onResizeEnd) {\n this.options.onResizeEnd();\n }\n }\n\n toggleKeyboardDragMode(): void {\n if (this.keyboardDragMode) {\n this.disableKeyboardDragMode();\n } else {\n this.enableKeyboardDragMode();\n }\n }\n\n enableKeyboardDragMode(): void {\n this.keyboardDragMode = true;\n this.keyboardResizeMode = false;\n this.element.classList.add(`${this.options.classPrefix}-keyboard-drag`);\n this.element.classList.remove(`${this.options.classPrefix}-keyboard-resize`);\n this.focusElement();\n }\n\n disableKeyboardDragMode(): void {\n this.keyboardDragMode = false;\n this.element.classList.remove(`${this.options.classPrefix}-keyboard-drag`);\n }\n\n toggleKeyboardResizeMode(): void {\n if (this.keyboardResizeMode) {\n this.disableKeyboardResizeMode();\n } else {\n this.enableKeyboardResizeMode();\n }\n }\n\n enableKeyboardResizeMode(): void {\n this.keyboardResizeMode = true;\n this.keyboardDragMode = false;\n this.element.classList.add(`${this.options.classPrefix}-keyboard-resize`);\n this.element.classList.remove(`${this.options.classPrefix}-keyboard-drag`);\n this.focusElement();\n }\n\n disableKeyboardResizeMode(): void {\n this.keyboardResizeMode = false;\n this.element.classList.remove(`${this.options.classPrefix}-keyboard-resize`);\n }\n\n enablePointerResizeMode({ focus = true }: { focus?: boolean } = {}): void {\n if (!this.hasManagedResizeHandles()) {\n this.enableKeyboardResizeMode();\n return;\n }\n\n if (this.pointerResizeMode) {\n return;\n }\n\n this.pointerResizeMode = true;\n this.setManagedHandlesVisible(true);\n this.element.classList.add(`${this.options.classPrefix}-resizable`);\n this.enableKeyboardResizeMode();\n\n if (focus) {\n this.focusElement();\n }\n\n if (typeof this.options.onPointerResizeToggle === 'function') {\n this.options.onPointerResizeToggle(true);\n }\n }\n\n disablePointerResizeMode({ focus = false }: { focus?: boolean } = {}): void {\n if (!this.pointerResizeMode) {\n return;\n }\n\n this.pointerResizeMode = false;\n this.setManagedHandlesVisible(false);\n this.element.classList.remove(`${this.options.classPrefix}-resizable`);\n this.disableKeyboardResizeMode();\n\n if (focus) {\n this.focusElement();\n }\n\n if (typeof this.options.onPointerResizeToggle === 'function') {\n this.options.onPointerResizeToggle(false);\n }\n }\n\n togglePointerResizeMode(): boolean {\n if (this.pointerResizeMode) {\n this.disablePointerResizeMode();\n } else {\n this.enablePointerResizeMode();\n }\n return this.pointerResizeMode;\n }\n\n focusElement(): void {\n if (typeof this.element.focus === 'function') {\n try {\n this.element.focus({ preventScroll: true });\n } catch {\n // Some browsers do not support the preventScroll option; fallback without it\n this.element.focus();\n }\n }\n }\n\n keyboardDrag(key: string, shiftKey: boolean): void {\n const step = shiftKey ? this.options.keyboardStepLarge : this.options.keyboardStep;\n \n // Get current position\n let currentLeft = parseFloat(this.element.style.left) || 0;\n let currentTop = parseFloat(this.element.style.top) || 0;\n \n // If element is still centered with transform, convert to absolute position first\n const computedStyle = window.getComputedStyle(this.element);\n if (computedStyle.transform !== 'none') {\n const rect = this.element.getBoundingClientRect();\n currentLeft = rect.left;\n currentTop = rect.top;\n this.element.style.transform = 'none';\n this.element.style.left = `${currentLeft}px`;\n this.element.style.top = `${currentTop}px`;\n }\n \n // Calculate new position\n let newX = currentLeft;\n let newY = currentTop;\n\n switch(key) {\n case 'ArrowLeft':\n newX -= step;\n break;\n case 'ArrowRight':\n newX += step;\n break;\n case 'ArrowUp':\n newY -= step;\n break;\n case 'ArrowDown':\n newY += step;\n break;\n }\n\n // Apply position\n this.element.style.left = `${newX}px`;\n this.element.style.top = `${newY}px`;\n \n // Call custom handler if provided\n if (this.options.onDrag) {\n this.options.onDrag({ x: newX, y: newY });\n }\n }\n\n keyboardResize(key: string, shiftKey: boolean): void {\n const step = shiftKey ? this.options.keyboardStepLarge : this.options.keyboardStep;\n const rect = this.element.getBoundingClientRect();\n \n let width = rect.width;\n let height = rect.height;\n\n // Adjust width/height based on arrow key\n switch(key) {\n case 'ArrowLeft':\n width -= step;\n break;\n case 'ArrowRight':\n width += step;\n break;\n case 'ArrowUp':\n if (this.options.maintainAspectRatio) {\n width += step;\n } else {\n height -= step;\n }\n break;\n case 'ArrowDown':\n if (this.options.maintainAspectRatio) {\n width -= step;\n } else {\n height += step;\n }\n break;\n }\n\n // Constrain to minimum dimensions\n width = Math.max(this.options.minWidth, width);\n height = Math.max(this.options.minHeight, height);\n\n // Apply new dimensions\n this.element.style.width = `${width}px`;\n if (!this.options.maintainAspectRatio) {\n this.element.style.height = `${height}px`;\n } else {\n this.element.style.height = 'auto';\n }\n \n // Call custom handler if provided\n if (this.options.onResize) {\n this.options.onResize({ width, height });\n }\n }\n\n resetPosition(): void {\n this.element.style.left = '50%';\n this.element.style.top = '50%';\n this.element.style.transform = 'translate(-50%, -50%)';\n this.element.style.right = '';\n this.element.style.bottom = '';\n \n // Clear manual positioning flag\n this.manuallyPositioned = false;\n \n // Call custom handler if provided\n if (this.options.onDrag) {\n this.options.onDrag({ centered: true });\n }\n }\n\n destroy(): void {\n const dragHandle = this.options.dragHandle || this.element;\n \n this.disablePointerResizeMode();\n \n // Remove drag events\n dragHandle.removeEventListener('mousedown', this.handlers.mousedown);\n dragHandle.removeEventListener('touchstart', this.handlers.touchstart);\n dragHandle.removeEventListener('pointerdown', this.handlers.pointerdown);\n \n // Remove document-level events\n document.removeEventListener('mousemove', this.handlers.mousemove);\n document.removeEventListener('mouseup', this.handlers.mouseup);\n document.removeEventListener('touchmove', this.handlers.touchmove);\n document.removeEventListener('touchend', this.handlers.touchend);\n document.removeEventListener('pointermove', this.handlers.pointermove);\n document.removeEventListener('pointerup', this.handlers.pointerup);\n document.removeEventListener('pointercancel', this.handlers.pointercancel);\n \n // Remove keyboard events\n this.element.removeEventListener('keydown', this.handlers.keydown);\n \n // Remove resize handle events\n if (this.options.resizeHandles && this.options.resizeHandles.length > 0) {\n this.options.resizeHandles.forEach(handle => {\n handle.removeEventListener('mousedown', this.handlers.resizeHandleMousedown);\n handle.removeEventListener('touchstart', this.handlers.resizeHandleMousedown);\n handle.removeEventListener('pointerdown', this.handlers.resizeHandlePointerDown);\n });\n }\n \n // Clean up classes\n this.element.classList.remove(\n `${this.options.classPrefix}-dragging`,\n `${this.options.classPrefix}-resizing`,\n `${this.options.classPrefix}-keyboard-drag`,\n `${this.options.classPrefix}-keyboard-resize`\n );\n }\n}\n\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * VidPly v1.2.0 - Universal, Accessible Video Player
2
+ * VidPly v1.2.3 - Universal, Accessible Video Player
3
3
  * (c) 2026 Matthias Peltzer
4
4
  * Released under GPL-2.0-or-later License
5
5
  */
@@ -178,6 +178,33 @@ var de = {
178
178
  reset: "Zurücksetzen",
179
179
  close: "Schließen"
180
180
  },
181
+ help: {
182
+ title: "Tastaturkürzel",
183
+ button: "Tastaturkürzel",
184
+ close: "Schließen",
185
+ or: "oder",
186
+ keys: {
187
+ space: "Leertaste"
188
+ },
189
+ actions: {
190
+ "play-pause": "Wiedergabe / Pause",
191
+ "seek-backward": "Zurückspulen",
192
+ "seek-forward": "Vorspulen",
193
+ "volume-up": "Lauter",
194
+ "volume-down": "Leiser",
195
+ "mute": "Stumm / Ton an",
196
+ "captions": "Untertitel umschalten",
197
+ "caption-style-menu": "Untertitel-Stil",
198
+ "speed-down": "Langsamer",
199
+ "speed-up": "Schneller",
200
+ "speed-menu": "Wiedergabegeschwindigkeit",
201
+ "quality-menu": "Qualität",
202
+ "chapters-menu": "Kapitel",
203
+ "transcript-toggle": "Transkript umschalten",
204
+ "fullscreen": "Vollbild umschalten",
205
+ "help": "Tastaturkürzel"
206
+ }
207
+ },
181
208
  speeds: {
182
209
  normal: "Normal"
183
210
  },
@@ -220,4 +247,4 @@ var de = {
220
247
  export {
221
248
  de
222
249
  };
223
- //# sourceMappingURL=vidply.de-4YAT7FFM.js.map
250
+ //# sourceMappingURL=vidply.de-VAUVSQXC.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/i18n/languages/de.ts"],
4
+ "sourcesContent": ["/**\n * German translations for VidPly\n */\n\nexport const de = {\n player: {\n label: 'Videoplayer',\n play: 'Abspielen',\n pause: 'Pause',\n stop: 'Stopp',\n restart: 'Von vorne beginnen',\n rewind: 'Zurückspulen',\n forward: 'Vorspulen',\n rewindSeconds: '{seconds} Sekunden zurückspulen',\n forwardSeconds: '{seconds} Sekunden vorspulen',\n previous: 'Vorheriger Titel',\n next: 'Nächster Titel',\n playlist: 'Wiedergabeliste umschalten',\n volume: 'Lautstärke',\n mute: 'Stumm',\n unmute: 'Ton ein',\n fullscreen: 'Vollbild',\n exitFullscreen: 'Vollbild beenden',\n captions: 'Untertitel',\n chapters: 'Kapitel',\n quality: 'Qualität',\n captionStyling: 'Untertitel-Stil',\n transcript: 'Transkript umschalten',\n audioDescription: 'Audiodeskription',\n signLanguage: 'Gebärdensprache-Video',\n settings: 'Einstellungen',\n speed: 'Wiedergabegeschwindigkeit',\n pip: 'Bild-in-Bild',\n floatingPlayer: 'Schwebender Player',\n floatingPlayerClose: 'Schwebenden Player schlie\\u00dfen',\n floatingPlayerEnter: 'Video ausklappen',\n floatingPlayerExit: 'Video andocken',\n floatingPlayerDialog: 'Schwebender Videoplayer. D zum Verschieben, R zum Gr\\u00f6\\u00dfen\\u00e4ndern, Escape zum Schlie\\u00dfen.',\n download: 'Herunterladen',\n downloadWithFormat: 'Herunterladen {format}',\n downloadWithSize: 'Herunterladen ({size})',\n downloadWithFormatSize: 'Herunterladen {format} ({size})',\n currentTime: 'Aktuelle Zeit',\n duration: 'Dauer',\n progress: 'Fortschritt',\n seekForward: '{seconds} Sekunden vorspulen',\n seekBackward: '{seconds} Sekunden zurückspulen',\n volumeUp: 'Lauter',\n volumeDown: 'Leiser',\n loading: 'Lädt...',\n loadingChapters: 'Kapitel werden geladen...',\n error: 'Fehler beim Laden',\n buffering: 'Puffern...',\n signLanguageVideo: 'Gebärdensprache-Video',\n closeSignLanguage: 'Gebärdensprache-Video schließen',\n signLanguageSettings: 'Gebärdensprache-Einstellungen',\n startPlaybackFirst: 'Bitte starten Sie die Wiedergabe zuerst.',\n startPlaybackForAudioDescription: 'Bitte starten Sie die Wiedergabe zuerst, um die Audiodeskription zu nutzen.',\n startPlaybackForSignLanguage: 'Bitte starten Sie die Wiedergabe zuerst, um das Gebärdensprache-Video zu nutzen.',\n noChapters: 'Keine Kapitel verfügbar',\n noCaptions: 'Keine Untertitel verfügbar',\n auto: 'Automatisch',\n autoQuality: 'Automatisch (keine Qualitätsauswahl verfügbar)',\n noQuality: 'Qualitätsauswahl nicht verfügbar',\n signLanguageDragResize: 'Gebärdensprache-Video - Drücken Sie D zum Verschieben per Tastatur, R zum Ändern der Größe',\n signLanguageDragActive: 'Gebärdensprache-Video - Verschiebemodus aktiv. Pfeiltasten zum Bewegen, Escape zum Beenden.',\n signLanguageResizeActive: 'Gebärdensprache-Video - Größenänderungsmodus aktiv. Links-/Rechts-Pfeiltasten zum Ändern der Größe, Escape zum Beenden.',\n enableSignDragMode: 'Verschiebemodus aktivieren. Tastenkombination: D-Taste',\n disableSignDragMode: 'Verschiebemodus deaktivieren. Tastenkombination: D-Taste',\n enableSignDragModeAria: 'Tastatur-Verschiebemodus mit Pfeiltasten aktivieren. Tastenkombination: D-Taste',\n disableSignDragModeAria: 'Tastatur-Verschiebemodus mit Pfeiltasten deaktivieren. Tastenkombination: D-Taste',\n enableSignResizeMode: 'Größenänderungsmodus aktivieren. Tastenkombination: R-Taste',\n disableSignResizeMode: 'Größenänderungsmodus deaktivieren. Tastenkombination: R-Taste',\n enableSignResizeModeAria: 'Tastatur-Größenänderungsmodus mit Pfeiltasten aktivieren. Tastenkombination: R-Taste',\n disableSignResizeModeAria: 'Tastatur-Größenänderungsmodus mit Pfeiltasten deaktivieren. Tastenkombination: R-Taste',\n signDragModeHint: 'Verschiebemodus: Pfeiltasten zum Bewegen, Esc zum Beenden',\n signResizeModeHint: 'Größenänderungsmodus: Pfeiltasten zum Ändern, Esc zum Beenden',\n signDragModeDisabled: 'Verschiebemodus für Gebärdensprache-Video deaktiviert.',\n signResizeModeDisabled: 'Größenänderungsmodus für Gebärdensprache-Video deaktiviert.',\n resizeHandle: 'Größenänderung {direction}-Ecke',\n moreOptions: 'Weitere Optionen',\n noMoreOptions: 'Keine weiteren Optionen verfügbar',\n playing: 'Wird abgespielt',\n paused: 'Pausiert',\n muted: 'Stummgeschaltet',\n unmuted: 'Ton an',\n captionsOn: 'Untertitel an',\n captionsOff: 'Untertitel aus',\n volumePercent: 'Lautstärke {percent} Prozent',\n volumePercentMuted: 'Stummgeschaltet',\n speedRate: 'Geschwindigkeit {rate}x'\n },\n captions: {\n off: 'Aus',\n select: 'Untertitel auswählen',\n fontSize: 'Schriftgröße',\n fontFamily: 'Schriftart',\n color: 'Textfarbe',\n backgroundColor: 'Hintergrundfarbe',\n opacity: 'Deckkraft'\n },\n fontSizes: {\n small: 'Klein',\n normal: 'Normal',\n large: 'Groß',\n xlarge: 'Sehr groß'\n },\n fontFamilies: {\n sansSerif: 'Sans-serif',\n serif: 'Serif',\n monospace: 'Monospace'\n },\n styleLabels: {\n textColor: 'Textfarbe',\n background: 'Hintergrund',\n font: 'Schrift',\n fontSize: 'Schriftgröße',\n opacity: 'Deckkraft'\n },\n audioDescription: {\n enable: 'Audiodeskription aktivieren',\n disable: 'Audiodeskription deaktivieren'\n },\n signLanguage: {\n show: 'Gebärdensprache-Video anzeigen',\n hide: 'Gebärdensprache-Video ausblenden',\n showInMainView: 'Gebärdensprache im Hauptvideo anzeigen',\n hideInMainView: 'Gebärdensprache aus Hauptvideo entfernen'\n },\n transcript: {\n title: 'Transkript',\n ariaLabel: 'Video-Transkript',\n close: 'Transkript schließen',\n loading: 'Transkript wird geladen...',\n noTranscript: 'Kein Transkript für dieses Video verfügbar.',\n settings: 'Transkript-Einstellungen. Eingabetaste zum Öffnen des Menüs drücken oder D zum Aktivieren des Verschiebemodus',\n keyboardDragMode: 'Tastatur-Verschiebemodus mit Pfeiltasten umschalten. Tastenkombination: D-Taste',\n keyboardDragActive: '⌨️ Tastatur-Verschiebemodus aktiv (Pfeiltasten zum Bewegen, Umschalt+Pfeiltasten für große Schritte, D oder ESC zum Beenden)',\n dragResizePrompt: 'Drücken Sie D zum Verschieben oder R zur Größenänderung. Home setzt die Position zurück, Esc schließt.',\n dragModeEnabled: 'Tastatur-Verschiebemodus aktiviert. Pfeiltasten zum Bewegen, Umschalt+Pfeiltasten für größere Schritte. D oder Esc zum Beenden.',\n dragModeDisabled: 'Tastatur-Verschiebemodus deaktiviert.',\n enableDragMode: 'Verschiebemodus aktivieren. Tastenkombination: D-Taste',\n disableDragMode: 'Verschiebemodus deaktivieren. Tastenkombination: D-Taste',\n enableDragModeAria: 'Tastatur-Verschiebemodus mit Pfeiltasten aktivieren. Tastenkombination: D-Taste',\n disableDragModeAria: 'Tastatur-Verschiebemodus mit Pfeiltasten deaktivieren. Tastenkombination: D-Taste',\n resizeWindow: 'Fenster vergrößern/verkleinern',\n disableResizeWindow: 'Resize-Modus deaktivieren',\n enableResizeMode: 'Größenänderungsmodus aktivieren. Tastenkombination: R-Taste',\n disableResizeMode: 'Größenänderungsmodus deaktivieren. Tastenkombination: R-Taste',\n enableResizeModeAria: 'Tastatur-Größenänderungsmodus mit Pfeiltasten aktivieren. Tastenkombination: R-Taste',\n disableResizeModeAria: 'Tastatur-Größenänderungsmodus mit Pfeiltasten deaktivieren. Tastenkombination: R-Taste',\n resizeModeHint: 'Griffe aktiviert. Ziehen Sie Kanten oder Ecken zum Anpassen. Esc oder R zum Beenden.',\n resizeModeEnabled: 'Resize-Modus aktiviert. Kanten oder Ecken ziehen; Esc oder R beendet.',\n resizeModeDisabled: 'Resize-Modus deaktiviert.',\n dragModeBadge: 'Verschiebemodus: Pfeiltasten zum Bewegen, Esc zum Beenden',\n resizeModeBadge: 'Resize-Modus: Kanten oder Ecken ziehen, Esc zum Beenden',\n positionReset: 'Transkriptposition zurückgesetzt.',\n styleTranscript: 'Transkript-Stileinstellungen öffnen',\n closeMenu: 'Menü schließen',\n styleTitle: 'Transkript-Stil',\n autoscroll: 'Auto-Scroll',\n settingsMenu: 'Transkript-Dialog-Einstellungen',\n showTimestamps: 'Zeitstempel anzeigen',\n hideTimestamps: 'Zeitstempel ausblenden',\n showTimestampsAria: 'Zeitstempel im Transkript anzeigen',\n hideTimestampsAria: 'Zeitstempel im Transkript ausblenden',\n seekTo: 'Springe zu {time}'\n },\n settings: {\n title: 'Einstellungen',\n quality: 'Qualität',\n speed: 'Geschwindigkeit',\n captions: 'Untertitel',\n language: 'Sprache',\n reset: 'Zurücksetzen',\n close: 'Schließen'\n },\n help: {\n title: 'Tastaturkürzel',\n button: 'Tastaturkürzel',\n close: 'Schließen',\n or: 'oder',\n keys: {\n space: 'Leertaste'\n },\n actions: {\n 'play-pause': 'Wiedergabe / Pause',\n 'seek-backward': 'Zurückspulen',\n 'seek-forward': 'Vorspulen',\n 'volume-up': 'Lauter',\n 'volume-down': 'Leiser',\n 'mute': 'Stumm / Ton an',\n 'captions': 'Untertitel umschalten',\n 'caption-style-menu': 'Untertitel-Stil',\n 'speed-down': 'Langsamer',\n 'speed-up': 'Schneller',\n 'speed-menu': 'Wiedergabegeschwindigkeit',\n 'quality-menu': 'Qualität',\n 'chapters-menu': 'Kapitel',\n 'transcript-toggle': 'Transkript umschalten',\n 'fullscreen': 'Vollbild umschalten',\n 'help': 'Tastaturkürzel'\n }\n },\n speeds: {\n normal: 'Normal'\n },\n time: {\n display: 'Zeitanzeige',\n durationPrefix: 'Dauer: ',\n of: 'von',\n hour: '{count} Stunde',\n hours: '{count} Stunden',\n minute: '{count} Minute',\n minutes: '{count} Minuten',\n second: '{count} Sekunde',\n seconds: '{count} Sekunden'\n },\n resume: {\n prompt: 'Bei {time} fortsetzen?',\n resume: 'Fortsetzen',\n startOver: 'Von vorne'\n },\n playlist: {\n title: 'Wiedergabeliste',\n trackOf: 'Titel {current} von {total}',\n nowPlaying: 'Läuft gerade: Titel {current} von {total}. {title}{artist}',\n by: ' von ',\n untitled: 'Ohne Titel',\n trackUntitled: 'Titel {number}',\n currentlyPlaying: 'Wird gerade abgespielt',\n notPlaying: 'Nicht aktiv',\n pressEnterPlay: 'Eingabetaste zum Abspielen',\n pressEnterRestart: 'Eingabetaste zum Neustart',\n keyboardInstructions: 'Wiedergabelisten-Navigation: Verwenden Sie die Pfeiltasten nach oben und unten, um zwischen Titeln zu wechseln. Drücken Sie Bild auf oder Bild ab, um 5 Titel zu überspringen. Drücken Sie Pos1, um zum ersten Titel zu springen, Ende für den letzten Titel. Drücken Sie die Eingabetaste oder Leertaste, um den ausgewählten Titel abzuspielen.',\n endOfPlaylist: 'Ende der Wiedergabeliste. {current} von {total}.',\n beginningOfPlaylist: 'Anfang der Wiedergabeliste. 1 von {total}.',\n jumpedToLastTrack: 'Zum letzten Titel gesprungen. {current} von {total}.',\n jumpedToFirstTrack: 'Zum ersten Titel gesprungen. 1 von {total}.',\n firstTrack: 'Erster Titel. 1 von {total}.',\n lastTrack: 'Letzter Titel. {current} von {total}.'\n }\n};\n\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * VidPly v1.2.0 - Universal, Accessible Video Player
2
+ * VidPly v1.2.3 - Universal, Accessible Video Player
3
3
  * (c) 2026 Matthias Peltzer
4
4
  * Released under GPL-2.0-or-later License
5
5
  */
@@ -175,6 +175,33 @@ var es = {
175
175
  reset: "Restablecer",
176
176
  close: "Cerrar"
177
177
  },
178
+ help: {
179
+ title: "Atajos de teclado",
180
+ button: "Atajos de teclado",
181
+ close: "Cerrar",
182
+ or: "o",
183
+ keys: {
184
+ space: "Espacio"
185
+ },
186
+ actions: {
187
+ "play-pause": "Reproducir / Pausar",
188
+ "seek-backward": "Retroceder",
189
+ "seek-forward": "Avanzar",
190
+ "volume-up": "Subir volumen",
191
+ "volume-down": "Bajar volumen",
192
+ "mute": "Silenciar / Activar sonido",
193
+ "captions": "Alternar subtítulos",
194
+ "caption-style-menu": "Estilo de subtítulos",
195
+ "speed-down": "Reducir velocidad",
196
+ "speed-up": "Aumentar velocidad",
197
+ "speed-menu": "Velocidad de reproducción",
198
+ "quality-menu": "Calidad",
199
+ "chapters-menu": "Capítulos",
200
+ "transcript-toggle": "Alternar transcripción",
201
+ "fullscreen": "Alternar pantalla completa",
202
+ "help": "Atajos de teclado"
203
+ }
204
+ },
178
205
  speeds: {
179
206
  normal: "Normal"
180
207
  },
@@ -217,4 +244,4 @@ var es = {
217
244
  export {
218
245
  es
219
246
  };
220
- //# sourceMappingURL=vidply.es-LEWIRUBH.js.map
247
+ //# sourceMappingURL=vidply.es-G65HFWO6.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/i18n/languages/es.ts"],
4
+ "sourcesContent": ["/**\n * Spanish translations for VidPly\n */\n\nexport const es = {\n player: {\n label: 'Reproductor de video',\n play: 'Reproducir',\n pause: 'Pausa',\n stop: 'Detener',\n restart: 'Reiniciar desde el principio',\n rewind: 'Retroceder',\n forward: 'Avanzar',\n rewindSeconds: 'Retroceder {seconds} segundos',\n forwardSeconds: 'Avanzar {seconds} segundos',\n previous: 'Pista anterior',\n next: 'Siguiente pista',\n playlist: 'Alternar lista de reproducción',\n volume: 'Volumen',\n mute: 'Silenciar',\n unmute: 'Activar sonido',\n fullscreen: 'Pantalla completa',\n exitFullscreen: 'Salir de pantalla completa',\n captions: 'Subtítulos',\n chapters: 'Capítulos',\n quality: 'Calidad',\n captionStyling: 'Estilo de subtítulos',\n transcript: 'Alternar transcripción',\n audioDescription: 'Audiodescripción',\n signLanguage: 'Video en lengua de señas',\n settings: 'Configuración',\n speed: 'Velocidad de reproducción',\n pip: 'Imagen en imagen',\n floatingPlayer: 'Reproductor flotante',\n floatingPlayerClose: 'Cerrar reproductor flotante',\n floatingPlayerEnter: 'Sacar el v\\u00eddeo',\n floatingPlayerExit: 'Anclar el v\\u00eddeo',\n floatingPlayerDialog: 'Reproductor de v\\u00eddeo flotante. Pulsa D para mover, R para redimensionar, Escape para cerrar.',\n download: 'Descargar',\n downloadWithFormat: 'Descargar {format}',\n downloadWithSize: 'Descargar ({size})',\n downloadWithFormatSize: 'Descargar {format} ({size})',\n currentTime: 'Tiempo actual',\n duration: 'Duración',\n progress: 'Progreso',\n seekForward: 'Avanzar {seconds} segundos',\n seekBackward: 'Retroceder {seconds} segundos',\n volumeUp: 'Subir volumen',\n volumeDown: 'Bajar volumen',\n loading: 'Cargando...',\n loadingChapters: 'Cargando capítulos...',\n error: 'Error al cargar',\n buffering: 'Almacenando en búfer...',\n signLanguageVideo: 'Video en Lengua de Señas',\n closeSignLanguage: 'Cerrar video en lengua de señas',\n signLanguageSettings: 'Configuración de lengua de señas',\n noChapters: 'No hay capítulos disponibles',\n noCaptions: 'No hay subtítulos disponibles',\n auto: 'Automático',\n autoQuality: 'Automático (selección de calidad no disponible)',\n noQuality: 'Selección de calidad no disponible',\n signLanguageDragResize: 'Video en Lengua de Señas - Presione D para arrastrar con el teclado, R para cambiar el tamaño',\n signLanguageDragActive: 'Video en Lengua de Señas - Modo de arrastre activo. Use las teclas de flecha para mover, Escape para salir.',\n signLanguageResizeActive: 'Video en Lengua de Señas - Modo de cambio de tamaño activo. Use las teclas de flecha izquierda/derecha para cambiar el tamaño, Escape para salir.',\n enableSignDragMode: 'Activar modo de arrastre. Atajo: tecla D',\n disableSignDragMode: 'Desactivar modo de arrastre. Atajo: tecla D',\n enableSignDragModeAria: 'Activar modo de arrastre con teclado usando teclas de flecha. Atajo: tecla D',\n disableSignDragModeAria: 'Desactivar modo de arrastre con teclado usando teclas de flecha. Atajo: tecla D',\n enableSignResizeMode: 'Activar modo de cambio de tamaño. Atajo: tecla R',\n disableSignResizeMode: 'Desactivar modo de cambio de tamaño. Atajo: tecla R',\n enableSignResizeModeAria: 'Activar modo de cambio de tamaño con teclado usando teclas de flecha. Atajo: tecla R',\n disableSignResizeModeAria: 'Desactivar modo de cambio de tamaño con teclado usando teclas de flecha. Atajo: tecla R',\n signDragModeHint: 'Modo de arrastre: flechas para mover, Esc para salir',\n signResizeModeHint: 'Modo de cambio de tamaño: flechas para redimensionar, Esc para salir',\n signDragModeDisabled: 'Modo de arrastre del video en lengua de señas desactivado.',\n signResizeModeDisabled: 'Modo de cambio de tamaño del video en lengua de señas desactivado.',\n resizeHandle: 'Cambiar tamaño esquina {direction}',\n moreOptions: 'Más opciones',\n noMoreOptions: 'No hay opciones adicionales disponibles',\n playing: 'Reproduciendo',\n paused: 'En pausa',\n muted: 'Silenciado',\n unmuted: 'Sonido activado',\n captionsOn: 'Subtítulos activados',\n captionsOff: 'Subtítulos desactivados',\n volumePercent: 'Volumen {percent} por ciento',\n volumePercentMuted: 'Silenciado',\n speedRate: 'Velocidad {rate}x'\n },\n captions: {\n off: 'Desactivado',\n select: 'Seleccionar subtítulos',\n fontSize: 'Tamaño de fuente',\n fontFamily: 'Familia de fuente',\n color: 'Color de texto',\n backgroundColor: 'Color de fondo',\n opacity: 'Opacidad'\n },\n fontSizes: {\n small: 'Pequeño',\n normal: 'Normal',\n large: 'Grande',\n xlarge: 'Muy grande'\n },\n fontFamilies: {\n sansSerif: 'Sans-serif',\n serif: 'Serif',\n monospace: 'Monospace'\n },\n styleLabels: {\n textColor: 'Color de texto',\n background: 'Fondo',\n font: 'Fuente',\n fontSize: 'Tamaño de fuente',\n opacity: 'Opacidad'\n },\n audioDescription: {\n enable: 'Activar audiodescripción',\n disable: 'Desactivar audiodescripción'\n },\n signLanguage: {\n show: 'Mostrar video en lengua de señas',\n hide: 'Ocultar video en lengua de señas',\n showInMainView: 'Mostrar lengua de señas en video principal',\n hideInMainView: 'Ocultar lengua de señas del video principal'\n },\n transcript: {\n title: 'Transcripción',\n ariaLabel: 'Transcripción de video',\n close: 'Cerrar transcripción',\n loading: 'Cargando transcripción...',\n noTranscript: 'No hay transcripción disponible para este video.',\n settings: 'Configuración de transcripción. Presione Enter para abrir el menú o D para activar el modo de arrastre',\n keyboardDragMode: 'Alternar modo de arrastre con teclado usando teclas de flecha. Atajo: tecla D',\n keyboardDragActive: '⌨️ Modo de Arrastre con Teclado Activo (Teclas de flecha para mover, Mayús+Flechas para pasos grandes, D o ESC para salir)',\n dragResizePrompt: 'Pulsa D para mover o R para cambiar el tamaño. Home restablece la posición; Esc cierra.',\n dragModeEnabled: 'Modo de arrastre con teclado activado. Usa flechas para mover, Mayús+Flechas para pasos grandes. Pulsa D o Esc para salir.',\n dragModeDisabled: 'Modo de arrastre con teclado desactivado.',\n enableDragMode: 'Activar modo de arrastre. Atajo: tecla D',\n disableDragMode: 'Desactivar modo de arrastre. Atajo: tecla D',\n enableDragModeAria: 'Activar modo de arrastre con teclado usando teclas de flecha. Atajo: tecla D',\n disableDragModeAria: 'Desactivar modo de arrastre con teclado usando teclas de flecha. Atajo: tecla D',\n resizeWindow: 'Cambiar tamaño de ventana',\n disableResizeWindow: 'Desactivar modo de cambio de tamaño',\n enableResizeMode: 'Activar modo de cambio de tamaño. Atajo: tecla R',\n disableResizeMode: 'Desactivar modo de cambio de tamaño. Atajo: tecla R',\n enableResizeModeAria: 'Activar modo de cambio de tamaño con teclado usando teclas de flecha. Atajo: tecla R',\n disableResizeModeAria: 'Desactivar modo de cambio de tamaño con teclado usando teclas de flecha. Atajo: tecla R',\n resizeModeHint: 'Controladores habilitados. Arrastra bordes o esquinas para ajustar. Pulsa Esc o R para salir.',\n resizeModeEnabled: 'Modo de cambio de tamaño activado. Arrastra bordes o esquinas. Pulsa Esc o R para salir.',\n resizeModeDisabled: 'Modo de cambio de tamaño desactivado.',\n dragModeBadge: 'Modo mover: flechas para mover, Esc para salir',\n resizeModeBadge: 'Modo redimensionar: arrastra bordes o esquinas, Esc para salir',\n positionReset: 'Posición de la transcripción restablecida.',\n styleTranscript: 'Abrir configuración de estilo de transcripción',\n closeMenu: 'Cerrar menú',\n styleTitle: 'Estilo de Transcripción',\n autoscroll: 'Desplazamiento automático',\n settingsMenu: 'Configuración del diálogo de transcripción',\n showTimestamps: 'Mostrar marcas de tiempo',\n hideTimestamps: 'Ocultar marcas de tiempo',\n showTimestampsAria: 'Mostrar marcas de tiempo en la transcripción',\n hideTimestampsAria: 'Ocultar marcas de tiempo en la transcripción',\n seekTo: 'Saltar a {time}'\n },\n settings: {\n title: 'Configuración',\n quality: 'Calidad',\n speed: 'Velocidad',\n captions: 'Subtítulos',\n language: 'Idioma',\n reset: 'Restablecer',\n close: 'Cerrar'\n },\n help: {\n title: 'Atajos de teclado',\n button: 'Atajos de teclado',\n close: 'Cerrar',\n or: 'o',\n keys: {\n space: 'Espacio'\n },\n actions: {\n 'play-pause': 'Reproducir / Pausar',\n 'seek-backward': 'Retroceder',\n 'seek-forward': 'Avanzar',\n 'volume-up': 'Subir volumen',\n 'volume-down': 'Bajar volumen',\n 'mute': 'Silenciar / Activar sonido',\n 'captions': 'Alternar subtítulos',\n 'caption-style-menu': 'Estilo de subtítulos',\n 'speed-down': 'Reducir velocidad',\n 'speed-up': 'Aumentar velocidad',\n 'speed-menu': 'Velocidad de reproducción',\n 'quality-menu': 'Calidad',\n 'chapters-menu': 'Capítulos',\n 'transcript-toggle': 'Alternar transcripción',\n 'fullscreen': 'Alternar pantalla completa',\n 'help': 'Atajos de teclado'\n }\n },\n speeds: {\n normal: 'Normal'\n },\n time: {\n display: 'Visualización de tiempo',\n durationPrefix: 'Duración: ',\n of: 'de',\n hour: '{count} hora',\n hours: '{count} horas',\n minute: '{count} minuto',\n minutes: '{count} minutos',\n second: '{count} segundo',\n seconds: '{count} segundos'\n },\n resume: {\n prompt: '¿Continuar desde {time}?',\n resume: 'Continuar',\n startOver: 'Empezar de nuevo'\n },\n playlist: {\n title: 'Lista de reproducción',\n trackOf: 'Pista {current} de {total}',\n nowPlaying: 'Reproduciendo ahora: Pista {current} de {total}. {title}{artist}',\n by: ' por ',\n untitled: 'Sin título',\n trackUntitled: 'Pista {number}',\n currentlyPlaying: 'Reproduciendo actualmente',\n notPlaying: 'Sin reproducir',\n pressEnterPlay: 'Pulsa Enter para reproducir',\n pressEnterRestart: 'Pulsa Enter para reiniciar',\n keyboardInstructions: 'Navegación de lista de reproducción: Use las teclas de flecha arriba y abajo para moverse entre pistas. Pulse Retroceder página o Avanzar página para saltar 5 pistas. Pulse Inicio para ir a la primera pista, Fin para la última pista. Pulse Intro o Espacio para reproducir la pista seleccionada.',\n endOfPlaylist: 'Fin de la lista de reproducción. {current} de {total}.',\n beginningOfPlaylist: 'Inicio de la lista de reproducción. 1 de {total}.',\n jumpedToLastTrack: 'Saltó a la última pista. {current} de {total}.',\n jumpedToFirstTrack: 'Saltó a la primera pista. 1 de {total}.',\n firstTrack: 'Primera pista. 1 de {total}.',\n lastTrack: 'Última pista. {current} de {total}.'\n }\n};\n\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }