@vocalstack/player 0.1.0-alpha.61 → 0.1.0-alpha.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/ds/Icons.tsx","../src/ds/Controls.tsx","../src/core/audio.ts","../src/core/voiceRetry.ts","../src/core/clipPrefetch.ts","../src/core/clipQueue.ts","../src/core/voiceplayer.ts","../src/data/prefs.ts","../src/ds/LanguagePicker.tsx","../src/ui/FileFollow.tsx","../src/core/sites.ts","../src/core/embeds.ts","../src/ui/EmbedFollow.tsx","../src/ui/FacebookFollow.tsx","../src/ui/WistiaFollow.tsx","../src/ui/VidyardFollow.tsx","../src/core/loomStream.ts","../src/data/title.ts","../src/core/background.ts","../src/core/voiceFollow.ts","../src/core/mediaKeys.ts","../src/core/format.ts","../src/core/transcript.ts","../src/data/errors.ts","../src/data/context.tsx","../src/data/transcript.ts","../src/data/i18n.ts","../src/data/tx.ts","../src/core/youtube.ts","../src/core/readalong.ts","../src/ui/shared.tsx","../src/ui/SideColumn.tsx","../src/core/noAudio.ts","../src/data/voicePreview.ts","../src/core/playPosition.ts","../src/core/voiceWait.ts","../src/ui/wait.tsx","../src/ui/core.tsx","../src/core/qr.ts","../src/ui/full.tsx","../src/data/connect.ts","../src/ui/EndCard.tsx","../src/ui/useDesk.ts","../src/ui/IdleSettings.tsx","../src/core/share.ts","../src/ui/Providers.tsx","../src/ui/SourceGate.tsx","../src/data/lookup.ts","../src/ui/VocalStackPlayer.tsx","../src/ui/SiteIcon.tsx"],"sourcesContent":["/** Heroicons v2 outline paths (24px, stroke 1.5) used by the app, as\n * they appear in the design. `currentColor` throughout. */\nimport type { SVGProps } from 'react';\nexport const SITE = 'https://vocalstack.com';\nconst LOGO_DARK = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDUxLjY5MDciIGhlaWdodD0iMTU1LjMwNjQxIiB2aWV3Qm94PSIwIDAgMTA1MS42OTA2IDE1NS4zMDY0MSI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMC44ODczNDc3MSwwLDAsMC44OTExODY4MiwtNDIuNzE2NjMsLTEyMy44NTM4OCkiPjxwYXRoIHN0eWxlPSJmaWxsOiM1NWFiZTU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjAuMzcyOTYyIiBkPSJtIDE2NS43NDM2OSwzMTIuMzQ1MTQgYyAtMy42NTkwNCwtMC45NTg2MSAtNi44OTEzMSwtMy4zNTM0OCAtOS4yMTQ5NCwtNi44Mjc1OSAtMS45MTIyNiwtMi44NTkwOCAtMi4zOTcwNSwtNC41Njk3MSAtMi4zOTcwNSwtOC40NTgzNiAwLC0zLjk5MjU0IDAuMDgyNCwtNC4yNzU3IDQuMjMwMTIsLTE0LjU0NTUzIDQuMDA5MjMsLTkuOTI2ODEgMTEuNzQ1OTcsLTI5LjYwODA0IDE0LjE3MjU0LC0zNi4wNTMwMiAxLjA1NTUsLTIuODAzNDQgNC42MzU3OSwtMTIuMDkwMiA3Ljk1NjE5LC0yMC42MzcyNSAzLjMyMDQsLTguNTQ3MDYgOS40NzI2NSwtMjQuNDkxMiAxMy42NzE2OCwtMzUuNDMxNDMgOS40MTE2MywtMjQuNTIxMjUgMTIuMTUxMjQsLTMxLjM5NjE0IDE0LjE5MjIyLC0zNS42MTQ1NSAxLjMzMjI5LC0yLjc1MzY0IDEuODc4NjcsLTMuNTkyNTggMy4zNDU0NiwtNS4xMzY3MiAxLjk2ODIyLC0yLjA3MjAzIDQuMDk4NCwtMy41NjI1MyA2LjQ2Njg3LC00LjUyNDkzIDEuMjcxMzgsLTAuNTE2NiAyLjI1NzYzLC0wLjY5MzAyIDQuODI2NzksLTAuODYzNCA1LjIxODMsLTAuMzQ2MDcgMjQuNTc0NjIsLTAuNTU0NTggMjQuOTg1MDgsLTAuMjY5MTQgMC40Mzc5NywwLjMwNDU2IDEuMTMxMzEsLTEuNTAwMjEgLTE1LjE1NDEyLDM5LjQ0Njc4IC0yMC42ODg0Miw1Mi4wMTc1NyAtMjguOTYxODUsNzIuOTgyNjUgLTM2Ljc1MTgxLDkzLjEzMDA0IC04LjQwMzU2LDIxLjczNDM0IC05LjM5NDk1LDI0LjIwNzY0IC0xMC43NjMxNiwyNi44NTE2NSAtMi4zNTQ1LDQuNTUgLTYuMzgyNCw3Ljc4MzMxIC0xMS4yNzY2MSw5LjA1MjA3IC0yLjA3MjU5LDAuNTM3MjkgLTYuMDAwMTUsMC40ODEwOSAtOC4yODkyNiwtMC4xMTg2MiB6Ii8+PHBhdGggc3R5bGU9ImZpbGw6IzU1YWJlNTtmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MC4zNzI5NjIiIGQ9Im0gMTIyLjQ5MjIsMzEyLjU4OTE2IGMgLTQuMDc5NTYsLTAuNzMyNTggLTguNjUxMjMsLTMuOTM0MSAtMTEuMjMyNTgsLTcuODY2MTYgLTAuNzMwMDQsLTEuMTEyMDMgLTEuODU0NTksLTMuNDgzMjYgLTIuODQzMDksLTUuOTk0OTYgLTAuODk5NDMsLTIuMjg1NCAtNC43NjI4NywtMTIuMTU1MyAtOC41ODU0MDksLTIxLjkzMzEzIC0zLjgyMjU0LC05Ljc3NzgzIC04LjQ3OTA3MiwtMjEuNjM4MDMgLTEwLjM0Nzg1MiwtMjYuMzU2MDEgLTEuODY4NzgsLTQuNzE3OTcgLTcuNDA0OTY4LC0xOC44MTU5NSAtMTIuMzAyNjQ2LC0zMS4zMjg4NCAtNC44OTc2ODEsLTEyLjUxMjg4IC0xMC44NjE5MjMsLTI3LjcyOTc1IC0xMy4yNTM4NzYsLTMzLjgxNTI1IC0yLjM5MTk1MywtNi4wODU1IC01LjY2NTIxNiwtMTQuNDc3MTUgLTcuMjczOTE4LC0xOC42NDgxMSAtMS42MDg2OTgsLTQuMTcwOTcgLTQuMjM1OTUsLTEwLjg0ODI2IC01LjgzODMzNCwtMTQuODM4NDMgLTIuMDcyNzc5LC01LjE2MTUzIC0yLjgzNjUwOSwtNy4zMzE3NyAtMi42NDY4NjksLTcuNTIxNCAwLjM0NzkwMywtMC4zNDc5MSAyMC44Mjg4ODcsLTAuMzU5MTcgMjQuNzMyODc0LC0wLjAxMzYgNC42NDkyNTYsMC40MTE1NCA3LjAxMjg0OCwxLjUyODExIDEwLjUxNzU0Niw0Ljk2ODUyIDEuNDUwODE5LDEuNDI0MjEgMi4zOTgsMi42MDIxMyAyLjkwNDM3NSwzLjYxMTkgMS43OTg2OTMsMy41ODY3OCA4LjQxODEwMywyMC4wMjg2OSAxOC42NjYyNzksNDYuMzY1MDYgMy42OTgzOSw5LjUwNDMyIDExLjE2MDY3LDI4LjQxMzUxIDE2LjU4Mjg1LDQyLjAyMDQyIDE0LjYzNDMzLDM2LjcyNDY3IDE4Ljc0NzUzLDQ3LjEzNzY1IDE5LjUzOTc1LDQ5LjQ2Njg3IDIuMjI5ODEsNi41NTU4OSAxLjA1NTMzLDEyLjcwMjE0IC0zLjMwNDI2LDE3LjI5MTc2IC0zLjEwMzU5LDMuMjY3MzYgLTYuMjIwNDMsNC42MDg0NSAtMTEuMDIxNzgsNC43NDI0IC0xLjY0MzMxLDAuMDQ1OCAtMy41NzUxOCwtMC4wMjIxIC00LjI5MzA2LC0wLjE1MTAzIHoiLz48cmVjdCBzdHlsZT0iZmlsbDojZWM2MzRkIiB3aWR0aD0iMTEuMjY5NTQiIGhlaWdodD0iNDIuMDk3NjIyIiB4PSIxNjQuODgwMTQiIHk9IjE3Ni4yNTkwOSIgcnk9IjUuNjEwNDk2Ii8+PHJlY3Qgc3R5bGU9ImZpbGw6I2VjNjM0ZCIgd2lkdGg9IjExLjYyMTU2IiBoZWlnaHQ9Ijg3LjAzODYwNSIgeD0iMTQyLjE1ODY4IiB5PSIxNTMuNzg4NiIgcnk9IjUuNjEwNDk2Ii8+PHJlY3Qgc3R5bGU9ImZpbGw6I2VjNjM0ZCIgd2lkdGg9IjExLjI2OTU0IiBoZWlnaHQ9IjQyLjA5NzYyMiIgeD0iMTE5Ljc4OTI0IiB5PSIxNzYuMjU5MDkiIHJ5PSI1LjYxMDQ5NiIvPjwvZz48cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmIiBkPSJtIDIyMi4yNTEzMiw2OC40Nzk4OTcgcSAtMTIuNzk5OTgsMCAtMjEuNzU5OTcsOC45NTk5ODYgLTguOTU5OTgsOC45NTk5ODYgLTguOTU5OTgsMjEuNzU5OTY1IDAsMTIuNTg2NjQyIDguOTU5OTgsMjEuNTQ2NjMyIDQuMjY2NjYsNC40Nzk5OSA5LjgxMzMyLDYuODI2NjYgNS43NTk5OSwyLjEzMzMzIDExLjk0NjY1LDIuMTMzMzMgNi4xODY2NiwwIDExLjczMzMxLC0yLjEzMzMzIDUuNTQ2NjYsLTIuMzQ2NjcgMTAuMDI2NjUsLTYuODI2NjYgOC45NTk5OSwtOC45NTk5OSA4Ljk1OTk5LC0yMS41NDY2MzIgMCwtMTIuNzk5OTc5IC04Ljk1OTk5LC0yMS43NTk5NjUgLTkuMzg2NjUsLTguOTU5OTg2IC0yMS43NTk5NiwtOC45NTk5ODYgeiBtIDAsLTI1LjU5OTk1OSBxIDExLjczMzMxLDAgMjEuOTczMyw0LjQ3OTk5MyAxMC4yMzk5OCw0LjI2NjY2IDE3LjkxOTk3LDExLjk0NjY0OCA3LjY3OTk5LDcuNjc5OTg3IDExLjk0NjY1LDE3LjkxOTk3MSA0LjQ3OTk5LDEwLjIzOTk4NCA0LjQ3OTk5LDIxLjk3MzI5OCAwLDExLjUxOTk4MiAtNC40Nzk5OSwyMS43NTk5NjIgLTQuMjY2NjYsMTAuMjM5OTkgLTExLjk0NjY1LDE3LjkxOTk3IC03LjY3OTk5LDcuNjc5OTkgLTE3LjkxOTk3LDEyLjE1OTk5IC0xMC4yMzk5OSw0LjI2NjY2IC0yMS45NzMzLDQuMjY2NjYgLTExLjczMzMyLDAgLTIxLjk3MzMsLTQuMjY2NjYgLTEwLjIzOTk4LC00LjQ4IC0xNy45MTk5NywtMTIuMTU5OTkgLTcuNjc5OTksLTcuNjc5OTggLTEyLjE1OTk4LC0xNy45MTk5NyAtNC4yNjY2NiwtMTAuMjM5OTggLTQuMjY2NjYsLTIxLjc1OTk2MiAwLC0xMS43MzMzMTQgNC4yNjY2NiwtMjEuOTczMjk4IDQuNDc5OTksLTEwLjIzOTk4NCAxMi4xNTk5OCwtMTcuOTE5OTcxIDcuNjc5OTksLTcuNjc5OTg4IDE3LjkxOTk3LC0xMS45NDY2NDggMTAuMjM5OTgsLTQuNDc5OTkzIDIxLjk3MzMsLTQuNDc5OTkzIHogTSAzODMuMzE3OSwxMzguODc5NzggcSAtNy42Nzk5OSw3LjY3OTk5IC0xNy45MTk5NywxMi4xNTk5OSAtMTAuMjM5OTksNC4yNjY2NiAtMjEuOTczMyw0LjI2NjY2IC0xMS43MzMzMiwwIC0yMS45NzMzLC00LjI2NjY2IC0xMC4yMzk5OCwtNC40OCAtMTcuOTE5OTcsLTEyLjE1OTk5IC03LjY3OTk5LC03LjY3OTk4IC0xMi4xNTk5OCwtMTcuOTE5OTcgLTQuMjY2NjYsLTEwLjIzOTk4IC00LjI2NjY2LC0yMS43NTk5NjIgMCwtMTEuNzMzMzE0IDQuMjY2NjYsLTIxLjk3MzI5OCA0LjQ3OTk5LC0xMC4yMzk5ODQgMTIuMTU5OTgsLTE3LjkxOTk3MSA3LjY3OTk5LC03LjY3OTk4OCAxNy45MTk5NywtMTEuOTQ2NjQ4IDEwLjIzOTk4LC00LjQ3OTk5MyAyMS45NzMzLC00LjQ3OTk5MyAxMS43MzMzMSwwIDIxLjk3MzMsNC40Nzk5OTMgMTAuMjM5OTgsNC4yNjY2NiAxNy45MTk5NywxMS45NDY2NDggbCAtMTguMTMzMzEsMTguMTMzMzA0IHEgLTguOTU5OTgsLTguOTU5OTg2IC0yMS43NTk5NiwtOC45NTk5ODYgLTEyLjM3MzMyLDAgLTIxLjc1OTk3LDguOTU5OTg2IC04Ljk1OTk4LDguOTU5OTg2IC04Ljk1OTk4LDIxLjc1OTk2NSAwLDEyLjU4NjY0MiA4Ljk1OTk4LDIxLjU0NjYzMiA0LjQ4LDQuNDc5OTkgMTAuMDI2NjUsNi44MjY2NiA1LjU0NjY2LDIuMTMzMzMgMTEuNzMzMzIsMi4xMzMzMyAxMy4wMTMzMSwwIDIxLjc1OTk2LC04Ljk1OTk5IHogTSA0OTguMDkxMTQsNDUuNjUzMjY3IFYgMTUyLjUzMzEgSCA0NzIuNDkxMTggViA5OS4xOTk4NDggcSAwLC0xMi43OTk5NzkgLTguOTU5OTgsLTIxLjc1OTk2NSAtOC45NTk5OSwtOC45NTk5ODYgLTIxLjc1OTk3LC04Ljk1OTk4NiAtNi4xODY2NiwwIC0xMS45NDY2NSwyLjM0NjY2MyAtNS41NDY2NSwyLjM0NjY2MyAtOS44MTMzMSw2LjYxMzMyMyAtOC45NTk5OSw4Ljk1OTk4NiAtOC45NTk5OSwyMS43NTk5NjUgMCwxMi41ODY2NDIgOC45NTk5OSwyMS41NDY2MzIgNC4yNjY2Niw0LjQ3OTk5IDkuODEzMzEsNi44MjY2NiA1Ljc1OTk5LDIuMTMzMzMgMTEuOTQ2NjUsMi4xMzMzMyA2LjM5OTk5LDAgMTEuNTE5OTgsLTIuMTMzMzMgbCA5LjE3MzMyLDIyLjgyNjYzIHEgLTkuODEzMzIsNC45MDY2NiAtMjIuODI2NjMsNC45MDY2NiAtMTEuNzMzMzEsMCAtMjEuNzU5OTYsLTQuMjY2NjYgLTkuODEzMzIsLTQuNDggLTE3LjA2NjY0LC0xMi4xNTk5OSAtNy4yNTMzMiwtNy42Nzk5OCAtMTEuMzA2NjUsLTE3LjkxOTk3IC00LjA1MzMzLC0xMC4yMzk5OCAtNC4wNTMzMywtMjEuNzU5OTYyIDAsLTExLjczMzMxNCA0LjA1MzMzLC0yMS45NzMyOTggNC4wNTMzMywtMTAuMjM5OTg0IDExLjMwNjY1LC0xNy45MTk5NzEgNy4yNTMzMiwtNy42Nzk5ODggMTcuMDY2NjQsLTExLjk0NjY0OCAxMC4wMjY2NSwtNC40Nzk5OTMgMjEuNzU5OTYsLTQuNDc5OTkzIDEwLjQ1MzMyLDAgMTguNTU5OTcsMy4xOTk5OTUgOC4xMDY2NiwzLjE5OTk5NSAxNC4yOTMzMSw4LjEwNjY1NCB2IC04LjUzMzMyIHogTSA1MzguNjI0NDYsMTUyLjUzMzEgSCA1MTMuMDI0NSBWIDMuMjAwMDAxNSBoIDI1LjU5OTk2IFYgMTUyLjUzMzEgWiBtIDEyMC4xMDY1OSwtNDIuNjY2NiBxIDAsMTAuNDUzMzEgLTMuNDEzMzMsMTguOTg2NjMgLTMuNDEzMzIsOC4zMTk5OSAtOS44MTMzMSwxNC4yOTMzMSAtNi4xODY2Niw1Ljc2IC0xNS4xNDY2NSw4Ljk1OTk5IC04Ljk1OTk4LDMuMiAtMjAuMDUzMywzLjIgLTE3LjcwNjY0LDAgLTMxLjU3MzI4LC01LjU0NjY2IC0xMy44NjY2NCwtNS43NTk5OSAtMjIuODI2NjMsLTEzLjAxMzMyIGwgMTcuNzA2NjQsLTE3LjcwNjYzIHEgNy4wMzk5OSw2LjM5OTk5IDE1Ljc4NjY0LDkuODEzMzEgNS4zMzMzMiwyLjEzMzMzIDEwLjAyNjY1LDIuNzczMzMgNC42OTMzMywwLjY0IDcuNjc5OTksMC42NCA1LjU0NjY2LDAgMTAuMDI2NjUsLTEuMjggNC42OTMzMiwtMS40OTMzMyA4LjEwNjY1LC0zLjgzOTk5IDcuMjUzMzIsLTUuMzMzMzIgNy4yNTMzMiwtMTQuMDc5OTggMCwtNS4zMzMzMiAtMy44Mzk5OSwtOS41OTk5OCAtMi45ODY2NiwtMy40MTMzMyAtNy42Nzk5OSwtNS41NDY2NiAtMy44Mzk5OSwtMi4xMzMzMyAtOC4xMDY2NSwtMy40MTMzMjggLTQuMjY2NjYsLTEuMjc5OTk4IC03LjY3OTk5LC0yLjM0NjY2MyAtMS4wNjY2NiwtMC40MjY2NjYgLTEuOTIsLTAuNDI2NjY2IC0wLjg1MzMzLC0wLjIxMzMzMyAtMS40OTMzMywtMC42Mzk5OTkgLTAuNDI2NjYsMCAtMS4yNzk5OSwtMC40MjY2NjYgLTQuNDgsLTEuMjc5OTk3IC0xMy4wMTMzMiwtNC40Nzk5OTIgLTguMzE5OTgsLTMuMTk5OTk1IC0xNi42Mzk5NywtOC43NDY2NTMgLTE5LjQxMzMsLTEzLjAxMzMxMyAtMTkuNDEzMywtMzEuOTk5OTQ5IDAsLTEyLjU4NjY0NyA0LjI2NjY2LC0yMS4xMTk5NjYgNC40Nzk5OSwtOC43NDY2NTMgMTEuNTE5OTgsLTE0LjA3OTk3OCA3LjAzOTk5LC01LjU0NjY1NzUgMTUuNTczMzEsLTcuODkzMzIwNCBRIDU5MS41MzExNiw2LjYzNzU3MzNlLTYgNTk5Ljg1MTE1LDYuNjM3NTczM2UtNiBxIDE1LjM1OTk3LDAgMjUuODEzMjksMy42MjY2NjA4NjI0MjY3IDEwLjQ1MzMyLDMuNjI2NjYwOSAxNi42Mzk5Nyw3LjI1MzMyMTUgMy4yLDEuOTE5OTk3IDUuMzMzMzMsMy44Mzk5OTQgMi4zNDY2NiwxLjcwNjY2NCA0LjA1MzMyLDMuMTk5OTk1IGwgLTE4LjEzMzMsMTguMzQ2NjM3IHEgLTUuNzU5OTksLTUuNzU5OTkgLTExLjczMzMyLC04Ljc0NjY1MiAtOC45NTk5OCwtNC4yNjY2NiAtMTguNzczMywtNC4yNjY2NiAtNC4yNjY2NiwwIC04LjUzMzMyLDEuMDY2NjY1IC00LjI2NjY2LDEuMDY2NjY1IC03LjQ2NjY1LDIuNzczMzI5IC05LjM4NjY1LDUuNzU5OTkgLTkuMzg2NjUsMTUuMTQ2NjQyIDAsNS43NTk5OTEgMy44Mzk5OSw5LjgxMzMxOCAyLjc3MzMzLDMuMTk5OTk1IDcuNjc5OTksNS43NTk5OTEgNC4wNTMzMiwyLjEzMzMzIDguNTMzMzIsMy40MTMzMjggNC40Nzk5OSwxLjI3OTk5NyA4LjMxOTk4LDIuMzQ2NjYyIGwgMi41NiwwLjYzOTk5OSBxIDEuMDY2NjYsMC40MjY2NjYgNC4wNTMzMywxLjI3OTk5OCAyLjk4NjY2LDAuODUzMzMyIDcuMDM5OTgsMi41NTk5OTYgNC4wNTMzMywxLjcwNjY2NCA4Ljc0NjY2LDQuMDUzMzI3IDQuOTA2NjYsMi4zNDY2NjMgOS41OTk5OCw1LjU0NjY1OCAyMC42OTMzLDEzLjY1MzMxMSAyMC42OTMzLDMyLjIxMzI4NCB6IG0gNjkuMTE5NzcsNDIuNjY2NiBoIC0yMy40NjY2MyBxIC03LjI1MzMyLDAgLTEzLjY1MzMxLC0yLjc3MzMzIC02LjM5OTk5LC0yLjc3MzMzIC0xMS4wOTMzMiwtNy40NjY2NiAtNC42OTMzMiwtNC45MDY2NiAtNy40NjY2NSwtMTEuMzA2NjUgLTIuNzczMzMsLTYuMzk5OTkgLTIuNzczMzMsLTEzLjY1MzMxIFYgMjQuMzE5OTY4IGwgMjUuNTk5OTYsLTYuMzk5OTkgViA1OC42NjY1OCBoIDE0LjkzMzMxIGwgNi4zOTk5OSwyNS41OTk5NTkgaCAtMjEuMzMzMyB2IDMzLjA2NjYxMSBxIDAsNC4wNTMzMyAyLjc3MzMzLDYuODI2NjYgMi43NzMzMywyLjc3MzMzIDYuNjEzMzIsMi43NzMzMyBoIDE3LjA2NjY0IHogbSAxMTEuMzYsLTEwNi44Nzk4MzMgViAxNTIuNTMzMSBIIDgxMy42MTA4NiBWIDk5LjE5OTg0OCBxIDAsLTEyLjc5OTk3OSAtOC45NTk5OSwtMjEuNzU5OTY1IC04Ljk1OTk4LC04Ljk1OTk4NiAtMjEuNzU5OTYsLTguOTU5OTg2IC02LjE4NjY2LDAgLTExLjk0NjY1LDIuMzQ2NjYzIC01LjU0NjY2LDIuMzQ2NjYzIC05LjgxMzMyLDYuNjEzMzIzIC04Ljk1OTk4LDguOTU5OTg2IC04Ljk1OTk4LDIxLjc1OTk2NSAwLDEyLjU4NjY0MiA4Ljk1OTk4LDIxLjU0NjYzMiA0LjI2NjY2LDQuNDc5OTkgOS44MTMzMiw2LjgyNjY2IDUuNzU5OTksMi4xMzMzMyAxMS45NDY2NSwyLjEzMzMzIDYuMzk5OTksMCAxMS41MTk5OCwtMi4xMzMzMyBsIDkuMTczMzIsMjIuODI2NjMgcSAtOS44MTMzMiw0LjkwNjY2IC0yMi44MjY2Myw0LjkwNjY2IC0xMS43MzMzMiwwIC0yMS43NTk5NywtNC4yNjY2NiAtOS44MTMzMiwtNC40OCAtMTcuMDY2NjQsLTEyLjE1OTk5IC03LjI1MzMyLC03LjY3OTk4IC0xMS4zMDY2NSwtMTcuOTE5OTcgLTQuMDUzMzIsLTEwLjIzOTk4IC00LjA1MzMyLC0yMS43NTk5NjIgMCwtMTEuNzMzMzE0IDQuMDUzMzIsLTIxLjk3MzI5OCA0LjA1MzMzLC0xMC4yMzk5ODQgMTEuMzA2NjUsLTE3LjkxOTk3MSA3LjI1MzMyLC03LjY3OTk4OCAxNy4wNjY2NCwtMTEuOTQ2NjQ4IDEwLjAyNjY1LC00LjQ3OTk5MyAyMS43NTk5NywtNC40Nzk5OTMgMTAuNDUzMzEsMCAxOC41NTk5NywzLjE5OTk5NSA4LjEwNjY1LDMuMTk5OTk1IDE0LjI5MzMxLDguMTA2NjU0IHYgLTguNTMzMzIgeiBtIDEwNy45NDY1Miw5My4yMjY1MTMgcSAtNy42Nzk5OCw3LjY3OTk5IC0xNy45MTk5NywxMi4xNTk5OSAtMTAuMjM5OTgsNC4yNjY2NiAtMjEuOTczMjksNC4yNjY2NiAtMTEuNzMzMzIsMCAtMjEuOTczMywtNC4yNjY2NiAtMTAuMjM5OTksLTQuNDggLTE3LjkxOTk3LC0xMi4xNTk5OSAtNy42Nzk5OSwtNy42Nzk5OCAtMTIuMTU5OTgsLTE3LjkxOTk3IC00LjI2NjY2LC0xMC4yMzk5OCAtNC4yNjY2NiwtMjEuNzU5OTYyIDAsLTExLjczMzMxNCA0LjI2NjY2LC0yMS45NzMyOTggNC40Nzk5OSwtMTAuMjM5OTg0IDEyLjE1OTk4LC0xNy45MTk5NzEgNy42Nzk5OCwtNy42Nzk5ODggMTcuOTE5OTcsLTExLjk0NjY0OCAxMC4yMzk5OCwtNC40Nzk5OTMgMjEuOTczMywtNC40Nzk5OTMgMTEuNzMzMzEsMCAyMS45NzMyOSw0LjQ3OTk5MyAxMC4yMzk5OSw0LjI2NjY2IDE3LjkxOTk3LDExLjk0NjY0OCBsIC0xOC4xMzMzLDE4LjEzMzMwNCBxIC04Ljk1OTk5LC04Ljk1OTk4NiAtMjEuNzU5OTYsLTguOTU5OTg2IC0xMi4zNzMzMiwwIC0yMS43NTk5Nyw4Ljk1OTk4NiAtOC45NTk5OSw4Ljk1OTk4NiAtOC45NTk5OSwyMS43NTk5NjUgMCwxMi41ODY2NDIgOC45NTk5OSwyMS41NDY2MzIgNC40Nzk5OSw0LjQ3OTk5IDEwLjAyNjY1LDYuODI2NjYgNS41NDY2NiwyLjEzMzMzIDExLjczMzMyLDIuMTMzMzMgMTMuMDEzMzEsMCAyMS43NTk5NiwtOC45NTk5OSB6IE0gMTA1MS42OTA3LDQ1Ljg2NjYgOTk4LjM1NzQsOTkuMTk5ODQ4IDEwNTEuNjkwNywxNTIuNTMzMSBoIC0zNi4wNTMzIEwgOTgwLjIyNDEsMTE3LjExOTgyIFYgMTUyLjUzMzEgSCA5NTQuNjI0MTQgViAzLjIwMDAwMTUgSCA5ODAuMjI0MSBWIDgxLjA2NjU0NCBMIDEwMTUuNDI0LDQ1Ljg2NjYgaCAzNi4yNjY3IHoiLz48L3N2Zz4=';\nconst LOGO_LIGHT = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDUxLjY5MDciIGhlaWdodD0iMTU1LjMwNjQxIiB2aWV3Qm94PSIwIDAgMTA1MS42OTA2IDE1NS4zMDY0MSI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMC44ODczNDc3MSwwLDAsMC44OTExODY4MiwtNDIuNzE2NjMsLTEyMy44NTM4OCkiPjxwYXRoIHN0eWxlPSJmaWxsOiMyNDVCOEY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjAuMzcyOTYyIiBkPSJtIDE2NS43NDM2OSwzMTIuMzQ1MTQgYyAtMy42NTkwNCwtMC45NTg2MSAtNi44OTEzMSwtMy4zNTM0OCAtOS4yMTQ5NCwtNi44Mjc1OSAtMS45MTIyNiwtMi44NTkwOCAtMi4zOTcwNSwtNC41Njk3MSAtMi4zOTcwNSwtOC40NTgzNiAwLC0zLjk5MjU0IDAuMDgyNCwtNC4yNzU3IDQuMjMwMTIsLTE0LjU0NTUzIDQuMDA5MjMsLTkuOTI2ODEgMTEuNzQ1OTcsLTI5LjYwODA0IDE0LjE3MjU0LC0zNi4wNTMwMiAxLjA1NTUsLTIuODAzNDQgNC42MzU3OSwtMTIuMDkwMiA3Ljk1NjE5LC0yMC42MzcyNSAzLjMyMDQsLTguNTQ3MDYgOS40NzI2NSwtMjQuNDkxMiAxMy42NzE2OCwtMzUuNDMxNDMgOS40MTE2MywtMjQuNTIxMjUgMTIuMTUxMjQsLTMxLjM5NjE0IDE0LjE5MjIyLC0zNS42MTQ1NSAxLjMzMjI5LC0yLjc1MzY0IDEuODc4NjcsLTMuNTkyNTggMy4zNDU0NiwtNS4xMzY3MiAxLjk2ODIyLC0yLjA3MjAzIDQuMDk4NCwtMy41NjI1MyA2LjQ2Njg3LC00LjUyNDkzIDEuMjcxMzgsLTAuNTE2NiAyLjI1NzYzLC0wLjY5MzAyIDQuODI2NzksLTAuODYzNCA1LjIxODMsLTAuMzQ2MDcgMjQuNTc0NjIsLTAuNTU0NTggMjQuOTg1MDgsLTAuMjY5MTQgMC40Mzc5NywwLjMwNDU2IDEuMTMxMzEsLTEuNTAwMjEgLTE1LjE1NDEyLDM5LjQ0Njc4IC0yMC42ODg0Miw1Mi4wMTc1NyAtMjguOTYxODUsNzIuOTgyNjUgLTM2Ljc1MTgxLDkzLjEzMDA0IC04LjQwMzU2LDIxLjczNDM0IC05LjM5NDk1LDI0LjIwNzY0IC0xMC43NjMxNiwyNi44NTE2NSAtMi4zNTQ1LDQuNTUgLTYuMzgyNCw3Ljc4MzMxIC0xMS4yNzY2MSw5LjA1MjA3IC0yLjA3MjU5LDAuNTM3MjkgLTYuMDAwMTUsMC40ODEwOSAtOC4yODkyNiwtMC4xMTg2MiB6Ii8+PHBhdGggc3R5bGU9ImZpbGw6IzI0NUI4RjtmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MC4zNzI5NjIiIGQ9Im0gMTIyLjQ5MjIsMzEyLjU4OTE2IGMgLTQuMDc5NTYsLTAuNzMyNTggLTguNjUxMjMsLTMuOTM0MSAtMTEuMjMyNTgsLTcuODY2MTYgLTAuNzMwMDQsLTEuMTEyMDMgLTEuODU0NTksLTMuNDgzMjYgLTIuODQzMDksLTUuOTk0OTYgLTAuODk5NDMsLTIuMjg1NCAtNC43NjI4NywtMTIuMTU1MyAtOC41ODU0MDksLTIxLjkzMzEzIC0zLjgyMjU0LC05Ljc3NzgzIC04LjQ3OTA3MiwtMjEuNjM4MDMgLTEwLjM0Nzg1MiwtMjYuMzU2MDEgLTEuODY4NzgsLTQuNzE3OTcgLTcuNDA0OTY4LC0xOC44MTU5NSAtMTIuMzAyNjQ2LC0zMS4zMjg4NCAtNC44OTc2ODEsLTEyLjUxMjg4IC0xMC44NjE5MjMsLTI3LjcyOTc1IC0xMy4yNTM4NzYsLTMzLjgxNTI1IC0yLjM5MTk1MywtNi4wODU1IC01LjY2NTIxNiwtMTQuNDc3MTUgLTcuMjczOTE4LC0xOC42NDgxMSAtMS42MDg2OTgsLTQuMTcwOTcgLTQuMjM1OTUsLTEwLjg0ODI2IC01LjgzODMzNCwtMTQuODM4NDMgLTIuMDcyNzc5LC01LjE2MTUzIC0yLjgzNjUwOSwtNy4zMzE3NyAtMi42NDY4NjksLTcuNTIxNCAwLjM0NzkwMywtMC4zNDc5MSAyMC44Mjg4ODcsLTAuMzU5MTcgMjQuNzMyODc0LC0wLjAxMzYgNC42NDkyNTYsMC40MTE1NCA3LjAxMjg0OCwxLjUyODExIDEwLjUxNzU0Niw0Ljk2ODUyIDEuNDUwODE5LDEuNDI0MjEgMi4zOTgsMi42MDIxMyAyLjkwNDM3NSwzLjYxMTkgMS43OTg2OTMsMy41ODY3OCA4LjQxODEwMywyMC4wMjg2OSAxOC42NjYyNzksNDYuMzY1MDYgMy42OTgzOSw5LjUwNDMyIDExLjE2MDY3LDI4LjQxMzUxIDE2LjU4Mjg1LDQyLjAyMDQyIDE0LjYzNDMzLDM2LjcyNDY3IDE4Ljc0NzUzLDQ3LjEzNzY1IDE5LjUzOTc1LDQ5LjQ2Njg3IDIuMjI5ODEsNi41NTU4OSAxLjA1NTMzLDEyLjcwMjE0IC0zLjMwNDI2LDE3LjI5MTc2IC0zLjEwMzU5LDMuMjY3MzYgLTYuMjIwNDMsNC42MDg0NSAtMTEuMDIxNzgsNC43NDI0IC0xLjY0MzMxLDAuMDQ1OCAtMy41NzUxOCwtMC4wMjIxIC00LjI5MzA2LC0wLjE1MTAzIHoiLz48cmVjdCBzdHlsZT0iZmlsbDojZWM2MzRkIiB3aWR0aD0iMTEuMjY5NTQiIGhlaWdodD0iNDIuMDk3NjIyIiB4PSIxNjQuODgwMTQiIHk9IjE3Ni4yNTkwOSIgcnk9IjUuNjEwNDk2Ii8+PHJlY3Qgc3R5bGU9ImZpbGw6I2VjNjM0ZCIgd2lkdGg9IjExLjYyMTU2IiBoZWlnaHQ9Ijg3LjAzODYwNSIgeD0iMTQyLjE1ODY4IiB5PSIxNTMuNzg4NiIgcnk9IjUuNjEwNDk2Ii8+PHJlY3Qgc3R5bGU9ImZpbGw6I2VjNjM0ZCIgd2lkdGg9IjExLjI2OTU0IiBoZWlnaHQ9IjQyLjA5NzYyMiIgeD0iMTE5Ljc4OTI0IiB5PSIxNzYuMjU5MDkiIHJ5PSI1LjYxMDQ5NiIvPjwvZz48cGF0aCBzdHlsZT0iZmlsbDojZWM2MzRkIiBkPSJtIDIyMi4yNTEzMiw2OC40Nzk4OTcgcSAtMTIuNzk5OTgsMCAtMjEuNzU5OTcsOC45NTk5ODYgLTguOTU5OTgsOC45NTk5ODYgLTguOTU5OTgsMjEuNzU5OTY1IDAsMTIuNTg2NjQyIDguOTU5OTgsMjEuNTQ2NjMyIDQuMjY2NjYsNC40Nzk5OSA5LjgxMzMyLDYuODI2NjYgNS43NTk5OSwyLjEzMzMzIDExLjk0NjY1LDIuMTMzMzMgNi4xODY2NiwwIDExLjczMzMxLC0yLjEzMzMzIDUuNTQ2NjYsLTIuMzQ2NjcgMTAuMDI2NjUsLTYuODI2NjYgOC45NTk5OSwtOC45NTk5OSA4Ljk1OTk5LC0yMS41NDY2MzIgMCwtMTIuNzk5OTc5IC04Ljk1OTk5LC0yMS43NTk5NjUgLTkuMzg2NjUsLTguOTU5OTg2IC0yMS43NTk5NiwtOC45NTk5ODYgeiBtIDAsLTI1LjU5OTk1OSBxIDExLjczMzMxLDAgMjEuOTczMyw0LjQ3OTk5MyAxMC4yMzk5OCw0LjI2NjY2IDE3LjkxOTk3LDExLjk0NjY0OCA3LjY3OTk5LDcuNjc5OTg3IDExLjk0NjY1LDE3LjkxOTk3MSA0LjQ3OTk5LDEwLjIzOTk4NCA0LjQ3OTk5LDIxLjk3MzI5OCAwLDExLjUxOTk4MiAtNC40Nzk5OSwyMS43NTk5NjIgLTQuMjY2NjYsMTAuMjM5OTkgLTExLjk0NjY1LDE3LjkxOTk3IC03LjY3OTk5LDcuNjc5OTkgLTE3LjkxOTk3LDEyLjE1OTk5IC0xMC4yMzk5OSw0LjI2NjY2IC0yMS45NzMzLDQuMjY2NjYgLTExLjczMzMyLDAgLTIxLjk3MzMsLTQuMjY2NjYgLTEwLjIzOTk4LC00LjQ4IC0xNy45MTk5NywtMTIuMTU5OTkgLTcuNjc5OTksLTcuNjc5OTggLTEyLjE1OTk4LC0xNy45MTk5NyAtNC4yNjY2NiwtMTAuMjM5OTggLTQuMjY2NjYsLTIxLjc1OTk2MiAwLC0xMS43MzMzMTQgNC4yNjY2NiwtMjEuOTczMjk4IDQuNDc5OTksLTEwLjIzOTk4NCAxMi4xNTk5OCwtMTcuOTE5OTcxIDcuNjc5OTksLTcuNjc5OTg4IDE3LjkxOTk3LC0xMS45NDY2NDggMTAuMjM5OTgsLTQuNDc5OTkzIDIxLjk3MzMsLTQuNDc5OTkzIHogTSAzODMuMzE3OSwxMzguODc5NzggcSAtNy42Nzk5OSw3LjY3OTk5IC0xNy45MTk5NywxMi4xNTk5OSAtMTAuMjM5OTksNC4yNjY2NiAtMjEuOTczMyw0LjI2NjY2IC0xMS43MzMzMiwwIC0yMS45NzMzLC00LjI2NjY2IC0xMC4yMzk5OCwtNC40OCAtMTcuOTE5OTcsLTEyLjE1OTk5IC03LjY3OTk5LC03LjY3OTk4IC0xMi4xNTk5OCwtMTcuOTE5OTcgLTQuMjY2NjYsLTEwLjIzOTk4IC00LjI2NjY2LC0yMS43NTk5NjIgMCwtMTEuNzMzMzE0IDQuMjY2NjYsLTIxLjk3MzI5OCA0LjQ3OTk5LC0xMC4yMzk5ODQgMTIuMTU5OTgsLTE3LjkxOTk3MSA3LjY3OTk5LC03LjY3OTk4OCAxNy45MTk5NywtMTEuOTQ2NjQ4IDEwLjIzOTk4LC00LjQ3OTk5MyAyMS45NzMzLC00LjQ3OTk5MyAxMS43MzMzMSwwIDIxLjk3MzMsNC40Nzk5OTMgMTAuMjM5OTgsNC4yNjY2NiAxNy45MTk5NywxMS45NDY2NDggbCAtMTguMTMzMzEsMTguMTMzMzA0IHEgLTguOTU5OTgsLTguOTU5OTg2IC0yMS43NTk5NiwtOC45NTk5ODYgLTEyLjM3MzMyLDAgLTIxLjc1OTk3LDguOTU5OTg2IC04Ljk1OTk4LDguOTU5OTg2IC04Ljk1OTk4LDIxLjc1OTk2NSAwLDEyLjU4NjY0MiA4Ljk1OTk4LDIxLjU0NjYzMiA0LjQ4LDQuNDc5OTkgMTAuMDI2NjUsNi44MjY2NiA1LjU0NjY2LDIuMTMzMzMgMTEuNzMzMzIsMi4xMzMzMyAxMy4wMTMzMSwwIDIxLjc1OTk2LC04Ljk1OTk5IHogTSA0OTguMDkxMTQsNDUuNjUzMjY3IFYgMTUyLjUzMzEgSCA0NzIuNDkxMTggViA5OS4xOTk4NDggcSAwLC0xMi43OTk5NzkgLTguOTU5OTgsLTIxLjc1OTk2NSAtOC45NTk5OSwtOC45NTk5ODYgLTIxLjc1OTk3LC04Ljk1OTk4NiAtNi4xODY2NiwwIC0xMS45NDY2NSwyLjM0NjY2MyAtNS41NDY2NSwyLjM0NjY2MyAtOS44MTMzMSw2LjYxMzMyMyAtOC45NTk5OSw4Ljk1OTk4NiAtOC45NTk5OSwyMS43NTk5NjUgMCwxMi41ODY2NDIgOC45NTk5OSwyMS41NDY2MzIgNC4yNjY2Niw0LjQ3OTk5IDkuODEzMzEsNi44MjY2NiA1Ljc1OTk5LDIuMTMzMzMgMTEuOTQ2NjUsMi4xMzMzMyA2LjM5OTk5LDAgMTEuNTE5OTgsLTIuMTMzMzMgbCA5LjE3MzMyLDIyLjgyNjYzIHEgLTkuODEzMzIsNC45MDY2NiAtMjIuODI2NjMsNC45MDY2NiAtMTEuNzMzMzEsMCAtMjEuNzU5OTYsLTQuMjY2NjYgLTkuODEzMzIsLTQuNDggLTE3LjA2NjY0LC0xMi4xNTk5OSAtNy4yNTMzMiwtNy42Nzk5OCAtMTEuMzA2NjUsLTE3LjkxOTk3IC00LjA1MzMzLC0xMC4yMzk5OCAtNC4wNTMzMywtMjEuNzU5OTYyIDAsLTExLjczMzMxNCA0LjA1MzMzLC0yMS45NzMyOTggNC4wNTMzMywtMTAuMjM5OTg0IDExLjMwNjY1LC0xNy45MTk5NzEgNy4yNTMzMiwtNy42Nzk5ODggMTcuMDY2NjQsLTExLjk0NjY0OCAxMC4wMjY2NSwtNC40Nzk5OTMgMjEuNzU5OTYsLTQuNDc5OTkzIDEwLjQ1MzMyLDAgMTguNTU5OTcsMy4xOTk5OTUgOC4xMDY2NiwzLjE5OTk5NSAxNC4yOTMzMSw4LjEwNjY1NCB2IC04LjUzMzMyIHogTSA1MzguNjI0NDYsMTUyLjUzMzEgSCA1MTMuMDI0NSBWIDMuMjAwMDAxNSBoIDI1LjU5OTk2IFYgMTUyLjUzMzEgWiBtIDEyMC4xMDY1OSwtNDIuNjY2NiBxIDAsMTAuNDUzMzEgLTMuNDEzMzMsMTguOTg2NjMgLTMuNDEzMzIsOC4zMTk5OSAtOS44MTMzMSwxNC4yOTMzMSAtNi4xODY2Niw1Ljc2IC0xNS4xNDY2NSw4Ljk1OTk5IC04Ljk1OTk4LDMuMiAtMjAuMDUzMywzLjIgLTE3LjcwNjY0LDAgLTMxLjU3MzI4LC01LjU0NjY2IC0xMy44NjY2NCwtNS43NTk5OSAtMjIuODI2NjMsLTEzLjAxMzMyIGwgMTcuNzA2NjQsLTE3LjcwNjYzIHEgNy4wMzk5OSw2LjM5OTk5IDE1Ljc4NjY0LDkuODEzMzEgNS4zMzMzMiwyLjEzMzMzIDEwLjAyNjY1LDIuNzczMzMgNC42OTMzMywwLjY0IDcuNjc5OTksMC42NCA1LjU0NjY2LDAgMTAuMDI2NjUsLTEuMjggNC42OTMzMiwtMS40OTMzMyA4LjEwNjY1LC0zLjgzOTk5IDcuMjUzMzIsLTUuMzMzMzIgNy4yNTMzMiwtMTQuMDc5OTggMCwtNS4zMzMzMiAtMy44Mzk5OSwtOS41OTk5OCAtMi45ODY2NiwtMy40MTMzMyAtNy42Nzk5OSwtNS41NDY2NiAtMy44Mzk5OSwtMi4xMzMzMyAtOC4xMDY2NSwtMy40MTMzMjggLTQuMjY2NjYsLTEuMjc5OTk4IC03LjY3OTk5LC0yLjM0NjY2MyAtMS4wNjY2NiwtMC40MjY2NjYgLTEuOTIsLTAuNDI2NjY2IC0wLjg1MzMzLC0wLjIxMzMzMyAtMS40OTMzMywtMC42Mzk5OTkgLTAuNDI2NjYsMCAtMS4yNzk5OSwtMC40MjY2NjYgLTQuNDgsLTEuMjc5OTk3IC0xMy4wMTMzMiwtNC40Nzk5OTIgLTguMzE5OTgsLTMuMTk5OTk1IC0xNi42Mzk5NywtOC43NDY2NTMgLTE5LjQxMzMsLTEzLjAxMzMxMyAtMTkuNDEzMywtMzEuOTk5OTQ5IDAsLTEyLjU4NjY0NyA0LjI2NjY2LC0yMS4xMTk5NjYgNC40Nzk5OSwtOC43NDY2NTMgMTEuNTE5OTgsLTE0LjA3OTk3OCA3LjAzOTk5LC01LjU0NjY1NzUgMTUuNTczMzEsLTcuODkzMzIwNCBRIDU5MS41MzExNiw2LjYzNzU3MzNlLTYgNTk5Ljg1MTE1LDYuNjM3NTczM2UtNiBxIDE1LjM1OTk3LDAgMjUuODEzMjksMy42MjY2NjA4NjI0MjY3IDEwLjQ1MzMyLDMuNjI2NjYwOSAxNi42Mzk5Nyw3LjI1MzMyMTUgMy4yLDEuOTE5OTk3IDUuMzMzMzMsMy44Mzk5OTQgMi4zNDY2NiwxLjcwNjY2NCA0LjA1MzMyLDMuMTk5OTk1IGwgLTE4LjEzMzMsMTguMzQ2NjM3IHEgLTUuNzU5OTksLTUuNzU5OTkgLTExLjczMzMyLC04Ljc0NjY1MiAtOC45NTk5OCwtNC4yNjY2NiAtMTguNzczMywtNC4yNjY2NiAtNC4yNjY2NiwwIC04LjUzMzMyLDEuMDY2NjY1IC00LjI2NjY2LDEuMDY2NjY1IC03LjQ2NjY1LDIuNzczMzI5IC05LjM4NjY1LDUuNzU5OTkgLTkuMzg2NjUsMTUuMTQ2NjQyIDAsNS43NTk5OTEgMy44Mzk5OSw5LjgxMzMxOCAyLjc3MzMzLDMuMTk5OTk1IDcuNjc5OTksNS43NTk5OTEgNC4wNTMzMiwyLjEzMzMzIDguNTMzMzIsMy40MTMzMjggNC40Nzk5OSwxLjI3OTk5NyA4LjMxOTk4LDIuMzQ2NjYyIGwgMi41NiwwLjYzOTk5OSBxIDEuMDY2NjYsMC40MjY2NjYgNC4wNTMzMywxLjI3OTk5OCAyLjk4NjY2LDAuODUzMzMyIDcuMDM5OTgsMi41NTk5OTYgNC4wNTMzMywxLjcwNjY2NCA4Ljc0NjY2LDQuMDUzMzI3IDQuOTA2NjYsMi4zNDY2NjMgOS41OTk5OCw1LjU0NjY1OCAyMC42OTMzLDEzLjY1MzMxMSAyMC42OTMzLDMyLjIxMzI4NCB6IG0gNjkuMTE5NzcsNDIuNjY2NiBoIC0yMy40NjY2MyBxIC03LjI1MzMyLDAgLTEzLjY1MzMxLC0yLjc3MzMzIC02LjM5OTk5LC0yLjc3MzMzIC0xMS4wOTMzMiwtNy40NjY2NiAtNC42OTMzMiwtNC45MDY2NiAtNy40NjY2NSwtMTEuMzA2NjUgLTIuNzczMzMsLTYuMzk5OTkgLTIuNzczMzMsLTEzLjY1MzMxIFYgMjQuMzE5OTY4IGwgMjUuNTk5OTYsLTYuMzk5OTkgViA1OC42NjY1OCBoIDE0LjkzMzMxIGwgNi4zOTk5OSwyNS41OTk5NTkgaCAtMjEuMzMzMyB2IDMzLjA2NjYxMSBxIDAsNC4wNTMzMyAyLjc3MzMzLDYuODI2NjYgMi43NzMzMywyLjc3MzMzIDYuNjEzMzIsMi43NzMzMyBoIDE3LjA2NjY0IHogbSAxMTEuMzYsLTEwNi44Nzk4MzMgViAxNTIuNTMzMSBIIDgxMy42MTA4NiBWIDk5LjE5OTg0OCBxIDAsLTEyLjc5OTk3OSAtOC45NTk5OSwtMjEuNzU5OTY1IC04Ljk1OTk4LC04Ljk1OTk4NiAtMjEuNzU5OTYsLTguOTU5OTg2IC02LjE4NjY2LDAgLTExLjk0NjY1LDIuMzQ2NjYzIC01LjU0NjY2LDIuMzQ2NjYzIC05LjgxMzMyLDYuNjEzMzIzIC04Ljk1OTk4LDguOTU5OTg2IC04Ljk1OTk4LDIxLjc1OTk2NSAwLDEyLjU4NjY0MiA4Ljk1OTk4LDIxLjU0NjYzMiA0LjI2NjY2LDQuNDc5OTkgOS44MTMzMiw2LjgyNjY2IDUuNzU5OTksMi4xMzMzMyAxMS45NDY2NSwyLjEzMzMzIDYuMzk5OTksMCAxMS41MTk5OCwtMi4xMzMzMyBsIDkuMTczMzIsMjIuODI2NjMgcSAtOS44MTMzMiw0LjkwNjY2IC0yMi44MjY2Myw0LjkwNjY2IC0xMS43MzMzMiwwIC0yMS43NTk5NywtNC4yNjY2NiAtOS44MTMzMiwtNC40OCAtMTcuMDY2NjQsLTEyLjE1OTk5IC03LjI1MzMyLC03LjY3OTk4IC0xMS4zMDY2NSwtMTcuOTE5OTcgLTQuMDUzMzIsLTEwLjIzOTk4IC00LjA1MzMyLC0yMS43NTk5NjIgMCwtMTEuNzMzMzE0IDQuMDUzMzIsLTIxLjk3MzI5OCA0LjA1MzMzLC0xMC4yMzk5ODQgMTEuMzA2NjUsLTE3LjkxOTk3MSA3LjI1MzMyLC03LjY3OTk4OCAxNy4wNjY2NCwtMTEuOTQ2NjQ4IDEwLjAyNjY1LC00LjQ3OTk5MyAyMS43NTk5NywtNC40Nzk5OTMgMTAuNDUzMzEsMCAxOC41NTk5NywzLjE5OTk5NSA4LjEwNjY1LDMuMTk5OTk1IDE0LjI5MzMxLDguMTA2NjU0IHYgLTguNTMzMzIgeiBtIDEwNy45NDY1Miw5My4yMjY1MTMgcSAtNy42Nzk5OCw3LjY3OTk5IC0xNy45MTk5NywxMi4xNTk5OSAtMTAuMjM5OTgsNC4yNjY2NiAtMjEuOTczMjksNC4yNjY2NiAtMTEuNzMzMzIsMCAtMjEuOTczMywtNC4yNjY2NiAtMTAuMjM5OTksLTQuNDggLTE3LjkxOTk3LC0xMi4xNTk5OSAtNy42Nzk5OSwtNy42Nzk5OCAtMTIuMTU5OTgsLTE3LjkxOTk3IC00LjI2NjY2LC0xMC4yMzk5OCAtNC4yNjY2NiwtMjEuNzU5OTYyIDAsLTExLjczMzMxNCA0LjI2NjY2LC0yMS45NzMyOTggNC40Nzk5OSwtMTAuMjM5OTg0IDEyLjE1OTk4LC0xNy45MTk5NzEgNy42Nzk5OCwtNy42Nzk5ODggMTcuOTE5OTcsLTExLjk0NjY0OCAxMC4yMzk5OCwtNC40Nzk5OTMgMjEuOTczMywtNC40Nzk5OTMgMTEuNzMzMzEsMCAyMS45NzMyOSw0LjQ3OTk5MyAxMC4yMzk5OSw0LjI2NjY2IDE3LjkxOTk3LDExLjk0NjY0OCBsIC0xOC4xMzMzLDE4LjEzMzMwNCBxIC04Ljk1OTk5LC04Ljk1OTk4NiAtMjEuNzU5OTYsLTguOTU5OTg2IC0xMi4zNzMzMiwwIC0yMS43NTk5Nyw4Ljk1OTk4NiAtOC45NTk5OSw4Ljk1OTk4NiAtOC45NTk5OSwyMS43NTk5NjUgMCwxMi41ODY2NDIgOC45NTk5OSwyMS41NDY2MzIgNC40Nzk5OSw0LjQ3OTk5IDEwLjAyNjY1LDYuODI2NjYgNS41NDY2NiwyLjEzMzMzIDExLjczMzMyLDIuMTMzMzMgMTMuMDEzMzEsMCAyMS43NTk5NiwtOC45NTk5OSB6IE0gMTA1MS42OTA3LDQ1Ljg2NjYgOTk4LjM1NzQsOTkuMTk5ODQ4IDEwNTEuNjkwNywxNTIuNTMzMSBoIC0zNi4wNTMzIEwgOTgwLjIyNDEsMTE3LjExOTgyIFYgMTUyLjUzMzEgSCA5NTQuNjI0MTQgViAzLjIwMDAwMTUgSCA5ODAuMjI0MSBWIDgxLjA2NjU0NCBMIDEwMTUuNDI0LDQ1Ljg2NjYgaCAzNi4yNjY3IHoiLz48L3N2Zz4=';\nconst MARK_DARK = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0Ni45NTU0ODJtbSIgaGVpZ2h0PSIzOS44NDUzMW1tIiB2aWV3Qm94PSIwIDAgNDYuOTU1NDgyIDM5Ljg0NTMxIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODAuOTYyNSwtMTI4LjU4NzUpIj48ZyB0cmFuc2Zvcm09Im1hdHJpeCgwLjIzNDc3NzQxLDAsMCwwLjIzNTc5MzE4LDY5LjY2MDM5Miw5NC42Njg4MzgpIj48cGF0aCBzdHlsZT0iZmlsbDojNTVhYmU1O2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDowLjM3Mjk2MiIgZD0ibSAxNjUuNzQzNjksMzEyLjM0NTE0IGMgLTMuNjU5MDQsLTAuOTU4NjEgLTYuODkxMzEsLTMuMzUzNDggLTkuMjE0OTQsLTYuODI3NTkgLTEuOTEyMjYsLTIuODU5MDggLTIuMzk3MDUsLTQuNTY5NzEgLTIuMzk3MDUsLTguNDU4MzYgMCwtMy45OTI1NCAwLjA4MjQsLTQuMjc1NyA0LjIzMDEyLC0xNC41NDU1MyA0LjAwOTIzLC05LjkyNjgxIDExLjc0NTk3LC0yOS42MDgwNCAxNC4xNzI1NCwtMzYuMDUzMDIgMS4wNTU1LC0yLjgwMzQ0IDQuNjM1NzksLTEyLjA5MDIgNy45NTYxOSwtMjAuNjM3MjUgMy4zMjA0LC04LjU0NzA2IDkuNDcyNjUsLTI0LjQ5MTIgMTMuNjcxNjgsLTM1LjQzMTQzIDkuNDExNjMsLTI0LjUyMTI1IDEyLjE1MTI0LC0zMS4zOTYxNCAxNC4xOTIyMiwtMzUuNjE0NTUgMS4zMzIyOSwtMi43NTM2NCAxLjg3ODY3LC0zLjU5MjU4IDMuMzQ1NDYsLTUuMTM2NzIgMS45NjgyMiwtMi4wNzIwMyA0LjA5ODQsLTMuNTYyNTMgNi40NjY4NywtNC41MjQ5MyAxLjI3MTM4LC0wLjUxNjYgMi4yNTc2MywtMC42OTMwMiA0LjgyNjc5LC0wLjg2MzQgNS4yMTgzLC0wLjM0NjA3IDI0LjU3NDYyLC0wLjU1NDU4IDI0Ljk4NTA4LC0wLjI2OTE0IDAuNDM3OTcsMC4zMDQ1NiAxLjEzMTMxLC0xLjUwMDIxIC0xNS4xNTQxMiwzOS40NDY3OCAtMjAuNjg4NDIsNTIuMDE3NTcgLTI4Ljk2MTg1LDcyLjk4MjY1IC0zNi43NTE4MSw5My4xMzAwNCAtOC40MDM1NiwyMS43MzQzNCAtOS4zOTQ5NSwyNC4yMDc2NCAtMTAuNzYzMTYsMjYuODUxNjUgLTIuMzU0NSw0LjU1IC02LjM4MjQsNy43ODMzMSAtMTEuMjc2NjEsOS4wNTIwNyAtMi4wNzI1OSwwLjUzNzI5IC02LjAwMDE1LDAuNDgxMDkgLTguMjg5MjYsLTAuMTE4NjIgeiIvPjxwYXRoIHN0eWxlPSJmaWxsOiM1NWFiZTU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjAuMzcyOTYyIiBkPSJtIDEyMi40OTIyLDMxMi41ODkxNiBjIC00LjA3OTU2LC0wLjczMjU4IC04LjY1MTIzLC0zLjkzNDEgLTExLjIzMjU4LC03Ljg2NjE2IC0wLjczMDA0LC0xLjExMjAzIC0xLjg1NDU5LC0zLjQ4MzI2IC0yLjg0MzA5LC01Ljk5NDk2IC0wLjg5OTQzLC0yLjI4NTQgLTQuNzYyODcsLTEyLjE1NTMgLTguNTg1NDA5LC0yMS45MzMxMyAtMy44MjI1NCwtOS43Nzc4MyAtOC40NzkwNzIsLTIxLjYzODAzIC0xMC4zNDc4NTIsLTI2LjM1NjAxIC0xLjg2ODc4LC00LjcxNzk3IC03LjQwNDk2OCwtMTguODE1OTUgLTEyLjMwMjY0NiwtMzEuMzI4ODQgLTQuODk3NjgxLC0xMi41MTI4OCAtMTAuODYxOTIzLC0yNy43Mjk3NSAtMTMuMjUzODc2LC0zMy44MTUyNSAtMi4zOTE5NTMsLTYuMDg1NSAtNS42NjUyMTYsLTE0LjQ3NzE1IC03LjI3MzkxOCwtMTguNjQ4MTEgLTEuNjA4Njk4LC00LjE3MDk3IC00LjIzNTk1LC0xMC44NDgyNiAtNS44MzgzMzQsLTE0LjgzODQzIC0yLjA3Mjc3OSwtNS4xNjE1MyAtMi44MzY1MDksLTcuMzMxNzcgLTIuNjQ2ODY5LC03LjUyMTQgMC4zNDc5MDMsLTAuMzQ3OTEgMjAuODI4ODg3LC0wLjM1OTE3IDI0LjczMjg3NCwtMC4wMTM2IDQuNjQ5MjU2LDAuNDExNTQgNy4wMTI4NDgsMS41MjgxMSAxMC41MTc1NDYsNC45Njg1MiAxLjQ1MDgxOSwxLjQyNDIxIDIuMzk4LDIuNjAyMTMgMi45MDQzNzUsMy42MTE5IDEuNzk4NjkzLDMuNTg2NzggOC40MTgxMDMsMjAuMDI4NjkgMTguNjY2Mjc5LDQ2LjM2NTA2IDMuNjk4MzksOS41MDQzMiAxMS4xNjA2NywyOC40MTM1MSAxNi41ODI4NSw0Mi4wMjA0MiAxNC42MzQzMywzNi43MjQ2NyAxOC43NDc1Myw0Ny4xMzc2NSAxOS41Mzk3NSw0OS40NjY4NyAyLjIyOTgxLDYuNTU1ODkgMS4wNTUzMywxMi43MDIxNCAtMy4zMDQyNiwxNy4yOTE3NiAtMy4xMDM1OSwzLjI2NzM2IC02LjIyMDQzLDQuNjA4NDUgLTExLjAyMTc4LDQuNzQyNCAtMS42NDMzMSwwLjA0NTggLTMuNTc1MTgsLTAuMDIyMSAtNC4yOTMwNiwtMC4xNTEwMyB6Ii8+PHJlY3Qgc3R5bGU9ImZpbGw6I2Y3ODQ3MiIgd2lkdGg9IjExLjI2OTU0IiBoZWlnaHQ9IjQyLjA5NzYyMiIgeD0iMTY0Ljg4MDE0IiB5PSIxNzYuMjU5MDkiIHJ5PSI1LjYxMDQ5NiIvPjxyZWN0IHN0eWxlPSJmaWxsOiNmNzg0NzIiIHdpZHRoPSIxMS42MjE1NiIgaGVpZ2h0PSI4Ny4wMzg2MDUiIHg9IjE0Mi4xNTg2OCIgeT0iMTUzLjc4ODYiIHJ5PSI1LjYxMDQ5NiIvPjxyZWN0IHN0eWxlPSJmaWxsOiNmNzg0NzIiIHdpZHRoPSIxMS4yNjk1NCIgaGVpZ2h0PSI0Mi4wOTc2MjIiIHg9IjExOS43ODkyNCIgeT0iMTc2LjI1OTA5IiByeT0iNS42MTA0OTYiLz48L2c+PC9nPjwvc3ZnPg==';\nconst MARK_LIGHT = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0Ni45NTU0ODJtbSIgaGVpZ2h0PSIzOS44NDUzMW1tIiB2aWV3Qm94PSIwIDAgNDYuOTU1NDgyIDM5Ljg0NTMxIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODAuOTYyNSwtMTI4LjU4NzUpIj48ZyB0cmFuc2Zvcm09Im1hdHJpeCgwLjIzNDc3NzQxLDAsMCwwLjIzNTc5MzE4LDY5LjY2MDM5Miw5NC42Njg4MzgpIj48cGF0aCBzdHlsZT0iZmlsbDojMjQ1YjhmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDowLjM3Mjk2MiIgZD0ibSAxNjUuNzQzNjksMzEyLjM0NTE0IGMgLTMuNjU5MDQsLTAuOTU4NjEgLTYuODkxMzEsLTMuMzUzNDggLTkuMjE0OTQsLTYuODI3NTkgLTEuOTEyMjYsLTIuODU5MDggLTIuMzk3MDUsLTQuNTY5NzEgLTIuMzk3MDUsLTguNDU4MzYgMCwtMy45OTI1NCAwLjA4MjQsLTQuMjc1NyA0LjIzMDEyLC0xNC41NDU1MyA0LjAwOTIzLC05LjkyNjgxIDExLjc0NTk3LC0yOS42MDgwNCAxNC4xNzI1NCwtMzYuMDUzMDIgMS4wNTU1LC0yLjgwMzQ0IDQuNjM1NzksLTEyLjA5MDIgNy45NTYxOSwtMjAuNjM3MjUgMy4zMjA0LC04LjU0NzA2IDkuNDcyNjUsLTI0LjQ5MTIgMTMuNjcxNjgsLTM1LjQzMTQzIDkuNDExNjMsLTI0LjUyMTI1IDEyLjE1MTI0LC0zMS4zOTYxNCAxNC4xOTIyMiwtMzUuNjE0NTUgMS4zMzIyOSwtMi43NTM2NCAxLjg3ODY3LC0zLjU5MjU4IDMuMzQ1NDYsLTUuMTM2NzIgMS45NjgyMiwtMi4wNzIwMyA0LjA5ODQsLTMuNTYyNTMgNi40NjY4NywtNC41MjQ5MyAxLjI3MTM4LC0wLjUxNjYgMi4yNTc2MywtMC42OTMwMiA0LjgyNjc5LC0wLjg2MzQgNS4yMTgzLC0wLjM0NjA3IDI0LjU3NDYyLC0wLjU1NDU4IDI0Ljk4NTA4LC0wLjI2OTE0IDAuNDM3OTcsMC4zMDQ1NiAxLjEzMTMxLC0xLjUwMDIxIC0xNS4xNTQxMiwzOS40NDY3OCAtMjAuNjg4NDIsNTIuMDE3NTcgLTI4Ljk2MTg1LDcyLjk4MjY1IC0zNi43NTE4MSw5My4xMzAwNCAtOC40MDM1NiwyMS43MzQzNCAtOS4zOTQ5NSwyNC4yMDc2NCAtMTAuNzYzMTYsMjYuODUxNjUgLTIuMzU0NSw0LjU1IC02LjM4MjQsNy43ODMzMSAtMTEuMjc2NjEsOS4wNTIwNyAtMi4wNzI1OSwwLjUzNzI5IC02LjAwMDE1LDAuNDgxMDkgLTguMjg5MjYsLTAuMTE4NjIgeiIvPjxwYXRoIHN0eWxlPSJmaWxsOiMyNDViOGY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjAuMzcyOTYyIiBkPSJtIDEyMi40OTIyLDMxMi41ODkxNiBjIC00LjA3OTU2LC0wLjczMjU4IC04LjY1MTIzLC0zLjkzNDEgLTExLjIzMjU4LC03Ljg2NjE2IC0wLjczMDA0LC0xLjExMjAzIC0xLjg1NDU5LC0zLjQ4MzI2IC0yLjg0MzA5LC01Ljk5NDk2IC0wLjg5OTQzLC0yLjI4NTQgLTQuNzYyODcsLTEyLjE1NTMgLTguNTg1NDA5LC0yMS45MzMxMyAtMy44MjI1NCwtOS43Nzc4MyAtOC40NzkwNzIsLTIxLjYzODAzIC0xMC4zNDc4NTIsLTI2LjM1NjAxIC0xLjg2ODc4LC00LjcxNzk3IC03LjQwNDk2OCwtMTguODE1OTUgLTEyLjMwMjY0NiwtMzEuMzI4ODQgLTQuODk3NjgxLC0xMi41MTI4OCAtMTAuODYxOTIzLC0yNy43Mjk3NSAtMTMuMjUzODc2LC0zMy44MTUyNSAtMi4zOTE5NTMsLTYuMDg1NSAtNS42NjUyMTYsLTE0LjQ3NzE1IC03LjI3MzkxOCwtMTguNjQ4MTEgLTEuNjA4Njk4LC00LjE3MDk3IC00LjIzNTk1LC0xMC44NDgyNiAtNS44MzgzMzQsLTE0LjgzODQzIC0yLjA3Mjc3OSwtNS4xNjE1MyAtMi44MzY1MDksLTcuMzMxNzcgLTIuNjQ2ODY5LC03LjUyMTQgMC4zNDc5MDMsLTAuMzQ3OTEgMjAuODI4ODg3LC0wLjM1OTE3IDI0LjczMjg3NCwtMC4wMTM2IDQuNjQ5MjU2LDAuNDExNTQgNy4wMTI4NDgsMS41MjgxMSAxMC41MTc1NDYsNC45Njg1MiAxLjQ1MDgxOSwxLjQyNDIxIDIuMzk4LDIuNjAyMTMgMi45MDQzNzUsMy42MTE5IDEuNzk4NjkzLDMuNTg2NzggOC40MTgxMDMsMjAuMDI4NjkgMTguNjY2Mjc5LDQ2LjM2NTA2IDMuNjk4MzksOS41MDQzMiAxMS4xNjA2NywyOC40MTM1MSAxNi41ODI4NSw0Mi4wMjA0MiAxNC42MzQzMywzNi43MjQ2NyAxOC43NDc1Myw0Ny4xMzc2NSAxOS41Mzk3NSw0OS40NjY4NyAyLjIyOTgxLDYuNTU1ODkgMS4wNTUzMywxMi43MDIxNCAtMy4zMDQyNiwxNy4yOTE3NiAtMy4xMDM1OSwzLjI2NzM2IC02LjIyMDQzLDQuNjA4NDUgLTExLjAyMTc4LDQuNzQyNCAtMS42NDMzMSwwLjA0NTggLTMuNTc1MTgsLTAuMDIyMSAtNC4yOTMwNiwtMC4xNTEwMyB6Ii8+PHJlY3Qgc3R5bGU9ImZpbGw6I2VjNjM0ZCIgd2lkdGg9IjExLjI2OTU0IiBoZWlnaHQ9IjQyLjA5NzYyMiIgeD0iMTY0Ljg4MDE0IiB5PSIxNzYuMjU5MDkiIHJ5PSI1LjYxMDQ5NiIvPjxyZWN0IHN0eWxlPSJmaWxsOiNlYzYzNGQiIHdpZHRoPSIxMS42MjE1NiIgaGVpZ2h0PSI4Ny4wMzg2MDUiIHg9IjE0Mi4xNTg2OCIgeT0iMTUzLjc4ODYiIHJ5PSI1LjYxMDQ5NiIvPjxyZWN0IHN0eWxlPSJmaWxsOiNlYzYzNGQiIHdpZHRoPSIxMS4yNjk1NCIgaGVpZ2h0PSI0Mi4wOTc2MjIiIHg9IjExOS43ODkyNCIgeT0iMTc2LjI1OTA5IiByeT0iNS42MTA0OTYiLz48L2c+PC9nPjwvc3ZnPg==';\n\ntype P = SVGProps<SVGSVGElement> & { size?: number; stroke?: string; sw?: number };\n\nfunction I({ size = 16, sw = 1.5, children, style, ...rest }: P & { children: React.ReactNode }) {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"none\" stroke=\"currentColor\" strokeWidth={sw} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" style={{ flex: 'none', ...style }} {...rest}>\n {children}\n </svg>\n );\n}\n\nexport const D = {\n plus: 'M12 4.5v15m7.5-7.5h-15',\n check: 'M4.5 12.75l6 6 9-13.5',\n downloaded: 'M12 21a9 9 0 100-18 9 9 0 000 18zM12 6.75v10.5m0 0l3.75-3.75M12 17.25l-3.75-3.75',\n chevronRight: 'm8.25 4.5 7.5 7.5-7.5 7.5',\n chevronLeft: 'M15.75 19.5 8.25 12l7.5-7.5',\n chevronDown: 'm19.5 8.25-7.5 7.5-7.5-7.5',\n external: 'M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-7.5 6L21 3m0 0h-5.25M21 3v5.25',\n arrowLeft: 'M10.5 19.5 3 12m0 0 7.5-7.5M3 12h18',\n arrowRight: 'M4 12h15m0 0-5-5m5 5-5 5',\n volumeOffSpk: 'M17.25 9.75 19.5 12m0 0 2.25 2.25M19.5 12l2.25-2.25M19.5 12l-2.25 2.25M4.5 8.25H6l5.25-4.5v16.5L6 15.75H4.5a1.5 1.5 0 0 1-1.5-1.5v-4.5a1.5 1.5 0 0 1 1.5-1.5Z',\n notice: 'M12 9v3.75m9-1.5a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z',\n close: 'M6 18 18 6M6 6l12 12',\n search: 'M21 21l-4.35-4.35M17 11a6 6 0 1 1-12 0 6 6 0 0 1 12 0Z',\n info: 'M22 12a10 10 0 1 1-20 0 10 10 0 0 1 20 0M12 16v-4M12 8h.01',\n pencil: 'm16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Z',\n infoNote: 'm11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z',\n copy: 'M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75',\n extLink: 'M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25',\n pin: 'M9 3.75h6M10.5 3.75v5.25L7.5 12.75v1.5h9v-1.5l-3-3.75V3.75M12 14.25V20.25',\n pencilEdit: 'm16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125',\n squarePen: 'M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7M18.5 2.5a2.12 2.12 0 0 1 3 3L12 15l-4 1 1-4Z',\n voiceClone: 'M13.75 6.75a3.4 3.4 0 1 1-6.8 0 3.4 3.4 0 0 1 6.8 0ZM3.6 19.7a6.8 6.8 0 0 1 13.5 0 16.3 16.3 0 0 1-6.75 1.47c-2.43 0-4.73-.53-6.8-1.48ZM17.8 4.6a4.5 4.5 0 0 1 0 5.6M20.5 2.6a7.2 7.2 0 0 1 0 9.6',\n headphonesOff: 'M4.5 15.75v-3a7.5 7.5 0 0 1 12.35-5.72M19.5 12.6v3.15M4.5 15.75A2.25 2.25 0 0 0 6.75 18h.75v-4.5h-.75a2.25 2.25 0 0 0-2.25 2.25Zm15 0A2.25 2.25 0 0 1 17.25 18h-.75v-4.5h.75a2.25 2.25 0 0 1 2.25 2.25ZM3.75 20.25 20.25 3.75',\n broadcast: 'M12 9.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm0 0v10.5M8.818 5.818a4.5 4.5 0 0 0 0 6.364m6.364-6.364a4.5 4.5 0 0 1 0 6.364M6.166 3.166a8.25 8.25 0 0 0 0 11.668m11.668-11.668a8.25 8.25 0 0 1 0 11.668M8.25 20.25h7.5',\n globeAlt: 'M12 21a9.004 9.004 0 0 0 8.716-6.747M12 21a9.004 9.004 0 0 1-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 0 1 7.843 4.582M12 3a8.997 8.997 0 0 0-7.843 4.582m15.686 0A11.953 11.953 0 0 1 12 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0 1 21 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0 1 12 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 0 1 3 12c0-1.605.42-3.113 1.157-4.418',\n uturn: 'M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3',\n tabGauge: 'm12 14 4-4M3.34 19a10 10 0 1 1 17.32 0',\n tabScript: 'M15 12h-5m5-4h-5m9 9V5a2 2 0 0 0-2-2H4M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3',\n tabFix: 'm16.133 5.614 1.434-1.435a1.594 1.594 0 1 1 2.254 2.254L7.607 18.647a3.825 3.825 0 0 1-1.612.961l-2.282.68.68-2.282a3.825 3.825 0 0 1 .961-1.612L16.134 5.614Z',\n pencilFix: 'm16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Z',\n tabEnding: 'M3 3v1.5M3 21v-6m0 0 2.77-.693a9 9 0 0 1 6.208.682l.108.054a9 9 0 0 0 6.086.71l3.114-.732a48.524 48.524 0 0 1-.005-10.499l-3.11.732a9 9 0 0 1-6.085-.711l-.108-.054a9 9 0 0 0-6.208-.682L3 4.5M3 15V4.5',\n tabSummary: 'M15 4H7m11 12 3 3-3 3M3 4v13a2 2 0 0 0 2 2h16M7 14h7M7 9h12',\n tabExport: 'M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3',\n tabSettings: 'M10.5 6h9.75M10.5 6a1.5 1.5 0 1 1-3 0m3 0a1.5 1.5 0 1 0-3 0M3.75 6H7.5m3 12h9.75m-9.75 0a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m-3.75 0H7.5m9-6h3.75m-3.75 0a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m-9.75 0h9.75',\n tabSources: 'M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1zM17 21v-2M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10M21 21v-2M3 5V3M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2zM7 5V3',\n textLines: 'M3.75 6.75h9m-9 4.5h16.5m-16.5 4.5h16.5m-16.5 4.5h10.5M15.75 6.75h4.5',\n mic: 'M12 18.75a6 6 0 0 0 6-6v-1.5m-6 7.5a6 6 0 0 1-6-6v-1.5m6 7.5v3.75m-3.75 0h7.5M12 15.75a3 3 0 0 1-3-3V4.5a3 3 0 1 1 6 0v8.25a3 3 0 0 1-3 3Z',\n signal: 'M9.348 14.652a3.75 3.75 0 0 1 0-5.304m5.304 0a3.75 3.75 0 0 1 0 5.304m-7.425 2.121a6.75 6.75 0 0 1 0-9.546m9.546 0a6.75 6.75 0 0 1 0 9.546M5.106 18.894c-3.808-3.807-3.808-9.98 0-13.788m13.788 0c3.808 3.807 3.808 9.98 0 13.788M12.375 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z',\n checkCircle: 'M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z',\n warnCircle: 'M12 9v3.75m0 3.75h.008M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z',\n infoCircle: 'M11.25 11.25h1.5v5.25M12 7.5h.008M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z',\n discard: 'M9 13.5 12 9m0 0 3 4.5M3 12a9 9 0 1 0 18 0 9 9 0 0 0-18 0Z',\n micOff: ['M12 18.75a6 6 0 0 0 6-6v-1.5m-6 7.5a6 6 0 0 1-6-6v-1.5m6 7.5v3.75m-3.75 0h7.5M12 15.75a3 3 0 0 1-3-3V4.5a3 3 0 1 1 6 0v8.25a3 3 0 0 1-3 3Z', 'M3.75 3.75l16.5 16.5'],\n venus: 'M16.5 8.75a4.5 4.5 0 1 1-9 0 4.5 4.5 0 0 1 9 0ZM12 13.25v7.25m-3-3.5h6',\n mars: 'M14.75 14.25a4.5 4.5 0 1 1-9 0 4.5 4.5 0 0 1 9 0ZM14.2 10.8 19.5 5.5m0 0h-4.25M19.5 5.5v4.25',\n language: 'm10.5 21 5.25-11.25L21 21m-9-3h7.5M3 5.621a48.474 48.474 0 0 1 6-.371m0 0c1.12 0 2.233.038 3.334.114M9 5.25V3m3.334 2.364C11.176 10.658 7.69 15.08 3 17.502m9.334-12.138c.896.061 1.785.147 2.666.257m-4.589 8.495a18.023 18.023 0 0 1-3.827-5.802',\n langAuto: 'M10.5 21 15.75 9 21 21m-8.437-3h6.375M3 5.621a48.5 48.5 0 0 1 4.5-.368m0 0V3.75m0 1.503A50 50 0 0 1 10.5 5.62M7.5 5.253C6.9 9.02 5.06 12.35 2.4 14.85m3.6-3.6c.66 1.07 1.53 2.02 2.55 2.79m-4.35 3.6c1.67-.9 3.15-2.13 4.35-3.6',\n share: 'M7.217 10.907a2.25 2.25 0 1 0 0 2.186m0-2.186c.18.324.283.696.283 1.093s-.103.77-.283 1.093m0-2.186 9.566-5.314m-9.566 7.5 9.566 5.314m0 0a2.25 2.25 0 1 0 3.935 2.186 2.25 2.25 0 0 0-3.935-2.186Zm0-12.814a2.25 2.25 0 1 0 3.933-2.185 2.25 2.25 0 0 0-3.933 2.185Z',\n users: 'M15 19.128a9.38 9.38 0 0 0 2.625.372 9.337 9.337 0 0 0 4.121-.952 4.125 4.125 0 0 0-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 0 1 8.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0 1 11.964-3.07M12 6.375a3.375 3.375 0 1 1-6.75 0 3.375 3.375 0 0 1 6.75 0Zm8.25 2.25a2.625 2.625 0 1 1-5.25 0 2.625 2.625 0 0 1 5.25 0Z',\n globe: 'M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18Zm0 0c2.5-2.4 3.75-5.4 3.75-9S14.5 5.4 12 3m0 18c-2.5-2.4-3.75-5.4-3.75-9S9.5 5.4 12 3M3.6 9h16.8M3.6 15h16.8',\n clock: 'M12 6.75V12l3 2.25M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z',\n bolt: 'm3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z',\n sparkles: 'M9.813 15.904 9 18.75l-.813-2.846a4.5 4.5 0 0 0-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 0 0 3.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 0 0 3.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 0 0-3.09 3.09ZM18.259 8.715 18 9.75l-.259-1.035a3.375 3.375 0 0 0-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 0 0 2.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 0 0 2.456 2.456L21.75 6l-1.035.259a3.375 3.375 0 0 0-2.456 2.456Z',\n viewfinder: 'M7.5 3.75H6A2.25 2.25 0 0 0 3.75 6v1.5M16.5 3.75H18A2.25 2.25 0 0 1 20.25 6v1.5m0 9V18A2.25 2.25 0 0 1 18 20.25h-1.5m-9 0H6A2.25 2.25 0 0 1 3.75 18v-1.5M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z',\n speaker: 'M19.114 5.636a9 9 0 0 1 0 12.728M16.463 8.288a5.25 5.25 0 0 1 0 7.424M6.75 8.25l4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.7-.5-1.9-1.36a9.06 9.06 0 0 1 0-4.06c.2-.87 1.02-1.36 1.9-1.36h2.25Z',\n warnTri: ['m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3', 'M12 9v4', 'M12 17h.01'],\n checkThick: 'M20 6 9 17l-5-5',\n warn: 'M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z',\n link: 'M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244',\n archive: 'M20.25 7.5v10.5a2.25 2.25 0 0 1-2.25 2.25H6a2.25 2.25 0 0 1-2.25-2.25V7.5M9.75 12h4.5M3 4.5h18v3H3z',\n restore: 'M16.023 9.348h4.992V4.356m-.001 9.752A8.25 8.25 0 1 1 5.633 6.75',\n archiveDown: 'm20.25 7.5-.625 10.632a2.25 2.25 0 0 1-2.247 2.118H6.622a2.25 2.25 0 0 1-2.247-2.118L3.75 7.5m8.25 3v6.75m0 0-3-3m3 3 3-3M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125Z',\n lockRow: 'M16.5 10.5V6.75a4.5 4.5 0 1 0-9 0v3.75M6.75 21h10.5a2.25 2.25 0 0 0 2.25-2.25v-6a2.25 2.25 0 0 0-2.25-2.25H6.75A2.25 2.25 0 0 0 4.5 12.75v6A2.25 2.25 0 0 0 6.75 21Z',\n userRow: 'M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.5 20.25a7.5 7.5 0 0 1 15 0',\n usersRow: 'M18 18.72a9.09 9.09 0 0 0 3.74-.48 3 3 0 0 0-4.68-2.72M18 18.72a6 6 0 0 0-.94-3.2 6 6 0 0 0-10.12 0A6 6 0 0 0 6 18.72m12 0A12.32 12.32 0 0 1 12 21c-2.17 0-4.21-.58-5.96-1.58M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z',\n upload: 'M12 16.5V9.75m0 0 3 3m-3-3-3 3M6.75 19.5a4.5 4.5 0 0 1-1.41-8.78 5.25 5.25 0 0 1 10.23-2.14 3 3 0 0 1 3.75 3.75 4.5 4.5 0 0 1-1.32 7.17',\n music: 'M9 19.5a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm10.5-2.25a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0ZM9 19.5V7.5l10.5-2.25v12',\n trash: 'm14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0',\n qr: 'M3.75 4.875c0-.621.504-1.125 1.125-1.125h4.5c.621 0 1.125.504 1.125 1.125v4.5c0 .621-.504 1.125-1.125 1.125h-4.5A1.125 1.125 0 0 1 3.75 9.375v-4.5ZM3.75 14.625c0-.621.504-1.125 1.125-1.125h4.5c.621 0 1.125.504 1.125 1.125v4.5c0 .621-.504 1.125-1.125 1.125h-4.5a1.125 1.125 0 0 1-1.125-1.125v-4.5ZM13.5 4.875c0-.621.504-1.125 1.125-1.125h4.5c.621 0 1.125.504 1.125 1.125v4.5c0 .621-.504 1.125-1.125 1.125h-4.5A1.125 1.125 0 0 1 13.5 9.375v-4.5Z M6.75 6.75h.75v.75h-.75v-.75ZM6.75 16.5h.75v.75h-.75v-.75ZM16.5 6.75h.75v.75h-.75v-.75ZM13.5 13.5h.75v.75h-.75v-.75ZM13.5 19.5h.75v.75h-.75v-.75ZM19.5 13.5h.75v.75h-.75v-.75ZM19.5 19.5h.75v.75h-.75v-.75ZM16.5 16.5h.75v.75h-.75v-.75Z',\n lockOpen: 'M13.5 10.5V6.75a4.5 4.5 0 1 1 9 0v3.75M3.75 21.75h10.5a2.25 2.25 0 0 0 2.25-2.25v-6.75a2.25 2.25 0 0 0-2.25-2.25H3.75a2.25 2.25 0 0 0-2.25 2.25v6.75a2.25 2.25 0 0 0 2.25 2.25Z',\n calendar: 'M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5',\n lock: 'M16.5 10.5V6.75a4.5 4.5 0 1 0-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 0 0 2.25-2.25v-6.75a2.25 2.25 0 0 0-2.25-2.25H6.75a2.25 2.25 0 0 0-2.25 2.25v6.75a2.25 2.25 0 0 0 2.25 2.25Z',\n user: 'M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z',\n userGroup: 'M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.478m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z',\n home: 'm2.25 12 8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25',\n cog: 'M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.241-.438.613-.43.992a7.723 7.723 0 0 1 0 .255c-.008.378.137.75.43.991l1.004.827c.424.35.534.955.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.47 6.47 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.281c-.09.543-.56.94-1.11.94h-2.594c-.55 0-1.019-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.991a6.932 6.932 0 0 1 0-.255c.007-.38-.138-.751-.43-.992l-1.004-.827a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.28Z M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z',\n docs: 'M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z',\n speakerOne: 'M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z',\n cc: 'M4.5 4.5h15a2.5 2.5 0 0 1 2.5 2.5v10a2.5 2.5 0 0 1-2.5 2.5h-15A2.5 2.5 0 0 1 2 17V7a2.5 2.5 0 0 1 2.5-2.5ZM10.85 10.05a2.75 2.75 0 1 0 0 3.9M17.85 10.05a2.75 2.75 0 1 0 0 3.9',\n ccOff: 'M4.5 4.5h15a2.5 2.5 0 0 1 2.5 2.5v10a2.5 2.5 0 0 1-2.5 2.5h-15A2.5 2.5 0 0 1 2 17V7a2.5 2.5 0 0 1 2.5-2.5ZM10.85 10.05a2.75 2.75 0 1 0 0 3.9M17.85 10.05a2.75 2.75 0 1 0 0 3.9 M3 3l18 18',\n volume: 'M19.114 5.636a9 9 0 0 1 0 12.728M16.463 8.288a5.25 5.25 0 0 1 0 7.424M6.75 8.25l4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.7-.5-1.9-1.36a9.06 9.06 0 0 1 0-4.06c.2-.87 1.02-1.36 1.9-1.36h2.25Z',\n volumeOff: 'M17.25 9.75 19.5 12m0 0 2.25 2.25M19.5 12l2.25-2.25M19.5 12l-2.25 2.25M6.75 8.25l4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.7-.5-1.9-1.36a9.06 9.06 0 0 1 0-4.06c.2-.87 1.02-1.36 1.9-1.36h2.25Z',\n volumeSq: 'M19.114 5.636a9 9 0 0 1 0 12.728M16.463 8.288a5.25 5.25 0 0 1 0 7.424M4.5 8.25H6l5.25-4.5v16.5L6 15.75H4.5a1.5 1.5 0 0 1-1.5-1.5v-4.5a1.5 1.5 0 0 1 1.5-1.5Z',\n volumeOffSq: 'M17.25 9.75 22.5 15m0-5.25L17.25 15M4.5 8.25H6l5.25-4.5v16.5L6 15.75H4.5a1.5 1.5 0 0 1-1.5-1.5v-4.5a1.5 1.5 0 0 1 1.5-1.5Z',\n book: 'M12 6.042A8.967 8.967 0 0 0 6 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 0 1 6 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 0 1 6-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0 0 18 18a8.967 8.967 0 0 0-6 2.292m0-14.25v14.25',\n headphones: ['M3.75 16.5v-4.5a8.25 8.25 0 0 1 16.5 0v4.5', 'M3.75 14.25h1.5a1.5 1.5 0 0 1 1.5 1.5v3a1.5 1.5 0 0 1-1.5 1.5h-1.5a1.5 1.5 0 0 1-1.5-1.5v-3a1.5 1.5 0 0 1 1.5-1.5Z', 'M18.75 14.25h1.5a1.5 1.5 0 0 1 1.5 1.5v3a1.5 1.5 0 0 1-1.5 1.5h-1.5a1.5 1.5 0 0 1-1.5-1.5v-3a1.5 1.5 0 0 1 1.5-1.5Z'],\n video: 'm15.75 10.5 4.72-4.72a.75.75 0 0 1 1.28.53v11.38a.75.75 0 0 1-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25h-9A2.25 2.25 0 0 0 2.25 7.5v9a2.25 2.25 0 0 0 2.25 2.25Z',\n squares: 'M3.75 6A2.25 2.25 0 0 1 6 3.75h2.25A2.25 2.25 0 0 1 10.5 6v2.25a2.25 2.25 0 0 1-2.25 2.25H6a2.25 2.25 0 0 1-2.25-2.25V6ZM3.75 15.75A2.25 2.25 0 0 1 6 13.5h2.25a2.25 2.25 0 0 1 2.25 2.25V18a2.25 2.25 0 0 1-2.25 2.25H6A2.25 2.25 0 0 1 3.75 18v-2.25ZM13.5 6a2.25 2.25 0 0 1 2.25-2.25H18A2.25 2.25 0 0 1 20.25 6v2.25A2.25 2.25 0 0 1 18 10.5h-2.25a2.25 2.25 0 0 1-2.25-2.25V6ZM13.5 15.75a2.25 2.25 0 0 1 2.25-2.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-2.25A2.25 2.25 0 0 1 13.5 18v-2.25Z',\n code: 'M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5',\n card: 'M2.25 8.25h19.5M2.25 9h19.5m-16.5 5.25h6m-6 2.25h3m-3.75 3h15a2.25 2.25 0 0 0 2.25-2.25V6.75A2.25 2.25 0 0 0 19.5 4.5h-15a2.25 2.25 0 0 0-2.25 2.25v10.5A2.25 2.25 0 0 0 4.5 19.5Z',\n};\n\nexport function Icon({ d, ...rest }: Omit<P, 'd'> & { d: string | string[] }) {\n return (\n <I {...rest}>\n {(Array.isArray(d) ? d : [d]).map((p) => <path key={p} d={p} />)}\n </I>\n );\n}\n\nexport function AppsGlyph({ size = 20 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"currentColor\" aria-hidden=\"true\" style={{ color: 'var(--ink-96)' }}>\n {[5.5, 12, 18.5].map((cy) => [5.5, 12, 18.5].map((cx) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r={2.1} />))}\n </svg>\n );\n}\n\nexport function MenuGlyph({ size = 19, r = 1.85 }: { size?: number; r?: number }) {\n const spread = r > 1.85 ? 7 : 6.5;\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"12\" cy={12 - spread} r={r} />\n <circle cx=\"12\" cy=\"12\" r={r} />\n <circle cx=\"12\" cy={12 + spread} r={r} />\n </svg>\n );\n}\n\nexport function StopGlyph({ size = 15 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"currentColor\" aria-hidden=\"true\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2.5\" />\n </svg>\n );\n}\n\nexport function PlayGlyph({ size = 13 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"currentColor\" style={{ marginLeft: 2 }} aria-hidden=\"true\">\n <path d=\"M7.5 5.6a1 1 0 0 1 1.52-.85l9.1 5.55a1 1 0 0 1 0 1.7l-9.1 5.55a1 1 0 0 1-1.52-.85V5.6Z\" />\n </svg>\n );\n}\n\nexport function Spinner({ size = 15, color = 'currentColor', track = 'rgba(127,127,127,.35)', sw }: { size?: number; color?: string; track?: string; sw?: number }) {\n return (\n <span\n aria-hidden=\"true\"\n style={{\n flex: 'none',\n display: 'block',\n boxSizing: 'border-box',\n width: size,\n height: size,\n borderRadius: '50%',\n border: `${sw ?? Math.max(1.5, Math.round(size / 9))}px solid ${track}`,\n borderTopColor: color,\n animation: 'vs-spin .75s linear infinite',\n }}\n />\n );\n}\n\nexport function PauseGlyph({ size = 12 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"currentColor\" aria-hidden=\"true\">\n <rect x=\"6.5\" y=\"5\" width=\"3.75\" height=\"14\" rx=\"1.2\" />\n <rect x=\"13.75\" y=\"5\" width=\"3.75\" height=\"14\" rx=\"1.2\" />\n </svg>\n );\n}\n\nexport function EqBars({ bars = 4, height = 13, color = 'var(--brand)' }: { bars?: number; height?: number; color?: string }) {\n return (\n <span style={{ display: 'inline-flex', alignItems: 'flex-end', gap: 2, height }} aria-hidden=\"true\">\n {Array.from({ length: bars }, (_, i) => (\n <span key={i} style={{ width: 2.5, height, borderRadius: 1, background: color, animation: 'vs-eq .8s ease-in-out infinite', animationDelay: `${i * 0.11}s`, transformOrigin: 'bottom' }} />\n ))}\n </span>\n );\n}\n\nexport function Logo({ dark, height = 20, link = true }: { dark: boolean; height?: number; link?: boolean }) {\n const img = <img src={dark ? LOGO_DARK : LOGO_LIGHT} alt=\"VocalStack\" decoding=\"sync\" style={{ height, width: 'auto', display: 'block' }} />;\n return link ? <a href={SITE} style={{ display: 'block' }}>{img}</a> : img;\n}\n\nexport function Mark({ dark, size = 30 }: { dark: boolean; size?: number }) {\n return <img src={dark ? MARK_DARK : MARK_LIGHT} alt=\"VocalStack\" style={{ width: size, height: Math.round((size * 26) / 30 * 100) / 100, display: 'block' }} />;\n}\n","import { createContext, useContext, useEffect, useId, useLayoutEffect, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { D, Icon } from './Icons';\n\nexport function Card({ children, panel, inset, className = '', style }: { children: ReactNode; panel?: boolean; inset?: boolean; className?: string; style?: React.CSSProperties }) {\n return (\n <div className={`vs-card${panel ? ' panel' : ''}${inset ? ' vs-card--inset' : ''} ${className}`} style={style}>\n {children}\n </div>\n );\n}\n\nexport function Toggle({ checked, onChange, label, disabled }: { checked: boolean; onChange: (v: boolean) => void; label: string; disabled?: boolean }) {\n return (\n <button type=\"button\" role=\"switch\" aria-checked={checked} aria-label={label} className=\"vs-toggle\" disabled={disabled} onClick={() => onChange(!checked)}>\n <span className=\"vs-toggle__knob\" />\n </button>\n );\n}\n\nexport function TextField({ label, value, onChange, onKeyDown, type = 'text', placeholder, hint, error, mono, inputMode, autoComplete, ariaLabel }: { label?: string; value: string; onChange: (v: string) => void; onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void; type?: string; placeholder?: string; hint?: ReactNode; error?: string; mono?: boolean; inputMode?: React.HTMLAttributes<HTMLInputElement>['inputMode']; autoComplete?: string; ariaLabel?: string }) {\n const id = useId();\n return (\n <div className={`vs-field${error ? ' vs-field--invalid' : ''}`}>\n {label && <label htmlFor={id}>{label}</label>}\n <input id={id} className={`vs-input${mono ? ' vs-input--mono' : ''}`} type={type} value={value} placeholder={placeholder} inputMode={inputMode} autoComplete={autoComplete} aria-label={label ? undefined : ariaLabel} aria-invalid={error ? true : undefined}\n onChange={(e) => onChange(e.target.value)} onKeyDown={onKeyDown} />\n {error ? <span className=\"vs-field__error\" role=\"alert\">{error}</span> : hint ? <span className=\"vs-field__hint\">{hint}</span> : null}\n </div>\n );\n}\n\nexport interface SwitchOption<T extends string> {\n value: T;\n label: ReactNode;\n icon?: ReactNode;\n}\n\nexport function Checkbox({ checked, indeterminate, disabled, label, title, size, onChange }: { checked?: boolean; indeterminate?: boolean; disabled?: boolean; label?: string; title?: string; size?: 'sm'; onChange?: (v: boolean) => void }) {\n const on = !!checked, mixed = !!indeterminate;\n return (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={mixed ? 'mixed' : on}\n aria-disabled={disabled || undefined}\n aria-label={label ? undefined : title}\n title={title}\n className={`vs-check${size === 'sm' ? ' vs-check--sm' : ''}${disabled ? ' vs-check--disabled' : ''}`}\n onClick={disabled ? undefined : () => onChange?.(!on)}\n >\n <span className={`vs-check__box${mixed ? ' vs-check__box--mixed' : on ? ' vs-check__box--on' : ''}`}>\n {mixed ? <span className=\"vs-check__dash\" /> : on ? (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={3} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"m4.5 12.75 6 6 9-13.5\" /></svg>\n ) : null}\n </span>\n {label ? <span className=\"vs-check__label\">{label}</span> : null}\n </button>\n );\n}\n\nexport function Tooltip({ open, onDismiss, content, side = 'bottom', align = 'center', width, children }: { open: boolean; onDismiss: () => void; content: ReactNode; side?: 'top' | 'bottom'; align?: 'start' | 'center' | 'end'; width?: number; children: ReactNode }) {\n useEffect(() => {\n if (!open) return;\n const t = setTimeout(() => window.addEventListener('click', onDismiss, { once: true }), 0);\n return () => { clearTimeout(t); window.removeEventListener('click', onDismiss); };\n }, [open, onDismiss]);\n return (\n <span className=\"vs-tip\">\n {children}\n {open && (\n <span className={`vs-tip__bubble vs-tip__bubble--${side} vs-tip__bubble--${align}`} style={width ? { width } : undefined} onClick={(e) => e.stopPropagation()}>\n <span className=\"vs-tip__row\">\n <span className=\"vs-tip__copy\">{content}</span>\n <button type=\"button\" className=\"vs-tip__close\" aria-label=\"Dismiss\" onClick={onDismiss}><Icon d={D.close} size={12} sw={1.8} /></button>\n </span>\n <span className=\"vs-tip__arrow\" />\n </span>\n )}\n </span>\n );\n}\n\nexport function Switch<T extends string>({ value, onChange, options, size, bordered = true, fill }: { value: T; onChange: (v: T) => void; options: SwitchOption<T>[]; size?: 'sm'; bordered?: boolean; fill?: boolean }) {\n const ref = useRef<HTMLDivElement>(null);\n const [thumb, setThumb] = useState<{ left: number; width: number } | null>(null);\n const idx = Math.max(0, options.findIndex((o) => o.value === value));\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n const opt = el.querySelectorAll<HTMLElement>('.vs-switch__opt')[idx];\n if (opt) setThumb({ left: opt.offsetLeft, width: opt.offsetWidth });\n }, [idx, options.length]);\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => {\n const opt = el.querySelectorAll<HTMLElement>('.vs-switch__opt')[idx];\n if (opt) setThumb({ left: opt.offsetLeft, width: opt.offsetWidth });\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [idx]);\n return (\n <div ref={ref} role=\"tablist\" className={`vs-switch${size === 'sm' ? ' vs-switch--sm' : ''}${bordered ? '' : ' vs-switch--borderless'}${fill ? ' vs-switch--fill' : ''}`}>\n {thumb && <span className=\"vs-switch__thumb\" style={{ left: thumb.left, width: thumb.width }} aria-hidden=\"true\" />}\n {options.map((o) => (\n <button key={o.value} type=\"button\" role=\"tab\" aria-selected={o.value === value} className=\"vs-switch__opt\" onClick={() => onChange(o.value)}>\n {o.icon}\n {o.label}\n </button>\n ))}\n </div>\n );\n}\n\nexport function IconButton({ children, onClick, label, size, variant, bordered = true, active, title }: { children: ReactNode; onClick?: () => void; label: string; size?: 'sm'; variant?: 'default' | 'primary'; bordered?: boolean; active?: boolean; title?: string }) {\n return (\n <button type=\"button\" className={`vs-icon-btn${size === 'sm' ? ' vs-icon-btn--sm' : ''}${variant === 'primary' ? ' vs-icon-btn--primary' : ''}${active ? ' vs-icon-btn--primary' : ''}${bordered ? '' : ' vs-icon-btn--borderless'}`} onClick={onClick} aria-label={label} title={title ?? label}>\n {children}\n </button>\n );\n}\n\nexport function LanguageChip({ flag, code, label, onClick, variant, block, bordered = true, size, style, flagOnly }: { flag: ReactNode; code: string; label?: string; onClick?: () => void; variant?: 'primary'; block?: boolean; bordered?: boolean; size?: 'sm'; style?: React.CSSProperties; flagOnly?: boolean }) {\n if (flagOnly) {\n return (\n <button type=\"button\" className=\"mutebtn vs-flagbtn\" onClick={onClick} aria-label={label ? (code ? `${label} (${code})` : label) : code || 'Language'} title={label ?? code} style={style}>\n <span style={{ fontSize: 20, lineHeight: 1, display: 'flex' }}>{flag}</span>\n </button>\n );\n }\n const named = block && !!code;\n return (\n <button type=\"button\" className={`vs-lang-chip${variant ? ` vs-lang-chip--${variant}` : ''}${block ? ' vs-lang-chip--block' : ''}${block && !named ? ' vs-lang-chip--bare' : ''}${bordered ? '' : ' vs-lang-chip--borderless'}${size === 'sm' ? ' vs-lang-chip--sm' : ''}`} onClick={onClick} aria-label={label ? (code ? `${label} (${code})` : label) : code} style={style}>\n {flag ? <span className=\"vs-lang-chip__flag\">{flag}</span> : null}\n {named ? <span className=\"vs-lang-chip__name\">{label ?? code}</span> : block ? null : <span className=\"vs-lang-chip__code\">{code}</span>}\n <Icon d={D.chevronDown} size={13} className=\"vs-lang-chip__chevron\" style={{ color: variant === 'primary' ? 'currentColor' : 'var(--vs-text-muted)' }} />\n </button>\n );\n}\n\nexport function CopyButton({ value, label = 'Copy', onCopied }: { value: string; label?: string; onCopied?: () => void }) {\n const [copied, setCopied] = useState(false);\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopied?.();\n setTimeout(() => setCopied(false), 1400);\n } catch {\n }\n };\n return (\n <button\n type=\"button\"\n className=\"vs-copyable__btn\"\n data-copied={copied}\n aria-label={copied ? 'Copied' : label}\n title={copied ? 'Copied' : label}\n onClick={(e) => { e.stopPropagation(); void copy(); }}\n >\n <span className=\"vs-sr\" aria-live=\"polite\">{copied ? `Copied${label.replace(/^Copy\\b/, '')}` : ''}</span>\n {copied ? (\n <Icon d={D.check} size={13} sw={2.2} />\n ) : (\n <svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75\" />\n </svg>\n )}\n </button>\n );\n}\n\nexport function Copyable({ value, label = 'Copy' }: { value: string; label?: string }) {\n const copy = () => { void navigator.clipboard?.writeText(value).catch(() => {}); };\n return (\n <span className=\"vs-copyable\" onClick={copy} title={label}>\n <span className=\"vs-copyable__value\">{value}</span>\n <CopyButton value={value} label={label} />\n </span>\n );\n}\n\nfunction useVisualViewportInset(ref: React.RefObject<HTMLDivElement | null>, open: boolean) {\n useLayoutEffect(() => {\n const el = ref.current;\n const vv = window.visualViewport;\n if (!open || !el || !vv) return;\n let focusTimer = 0;\n const apply = () => {\n if (getComputedStyle(el).position === 'static') return;\n const r = el.getBoundingClientRect();\n const top = Math.max(0, Math.round(vv.offsetTop - r.top));\n const bottom = Math.max(0, Math.round(r.bottom - (vv.offsetTop + vv.height)));\n el.style.paddingTop = top ? `${top}px` : '';\n el.style.paddingBottom = bottom ? `${bottom}px` : '';\n el.classList.toggle('kb', bottom > 0);\n const a = document.activeElement;\n if (bottom > 0 && a instanceof HTMLElement && el.contains(a)) {\n window.clearTimeout(focusTimer);\n focusTimer = window.setTimeout(() => a.scrollIntoView({ block: 'nearest' }), 0);\n }\n };\n apply();\n vv.addEventListener('resize', apply);\n vv.addEventListener('scroll', apply);\n return () => {\n window.clearTimeout(focusTimer);\n vv.removeEventListener('resize', apply);\n vv.removeEventListener('scroll', apply);\n };\n }, [ref, open]);\n}\n\nexport function GrowBox({ children, ms = 220 }: { children: ReactNode; ms?: number }) {\n const [anim] = useState(() => typeof window !== 'undefined' && !!window.matchMedia?.('(hover: hover) and (pointer: fine)').matches);\n if (!anim) return <div>{children}</div>;\n return <GrowAnim ms={ms}>{children}</GrowAnim>;\n}\n\nfunction GrowAnim({ children, ms }: { children: ReactNode; ms: number }) {\n const outer = useRef<HTMLDivElement>(null);\n const inner = useRef<HTMLDivElement>(null);\n const [h, setH] = useState<number | null>(null);\n useLayoutEffect(() => {\n const el = inner.current;\n const box = outer.current;\n if (!el || !box) return;\n let settle: ReturnType<typeof setTimeout> | undefined;\n const room = () => {\n const sheet = box.closest<HTMLElement>('.vs-sheet');\n const max = sheet ? parseFloat(getComputedStyle(sheet).maxHeight) : NaN;\n if (!sheet || !Number.isFinite(max)) return Infinity;\n return Math.max(0, max - (sheet.offsetHeight - box.offsetHeight));\n };\n const measure = () => {\n const scrim = box.closest<HTMLElement>('.vs-sheet-scrim');\n if (scrim && scrim.clientHeight <= 460) { clearTimeout(settle); setH(null); return; }\n const full = el.offsetHeight;\n clearTimeout(settle);\n setH(Math.min(full, room()));\n if (full > room()) settle = setTimeout(() => setH(full), ms);\n };\n measure();\n if (typeof ResizeObserver === 'undefined') return () => clearTimeout(settle);\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => { ro.disconnect(); clearTimeout(settle); };\n }, [ms]);\n return (\n <div ref={outer} style={{ height: h ?? undefined, overflow: 'clip', transition: h == null ? undefined : `height ${ms}ms cubic-bezier(.32,.72,0,1)` }}>\n <div ref={inner}>{children}</div>\n </div>\n );\n}\n\nexport function Sheet({ open, onClose, title, titleNode, note, doneLabel = 'Done', children, drawer = false, header, kind, sticky = false }: { open: boolean; onClose: () => void; title: string; titleNode?: ReactNode; note?: string; doneLabel?: string; children: ReactNode; drawer?: boolean; header?: ReactNode; kind?: string; sticky?: boolean }) {\n const scrimRef = useRef<HTMLDivElement>(null);\n useVisualViewportInset(scrimRef, open);\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [open, onClose]);\n if (!open) return null;\n return (\n <div ref={scrimRef} className={`vs-sheet-scrim${drawer ? ' drawer' : ''}${sticky ? ' vs-sheet-scrim--sticky' : ''}`} onClick={sticky ? undefined : onClose}>\n <div className={`vs-sheet${kind ? ` vs-sheet--${kind}` : ''}`} role=\"dialog\" aria-modal=\"true\" aria-label={title} onClick={(e) => e.stopPropagation()}>\n <div className=\"vs-sheet__grip\" />\n <div className=\"vs-sheet__head\">\n {titleNode ?? <span className=\"vs-sheet__title\">{title}</span>}\n <button type=\"button\" className=\"vs-sheet__done\" onClick={onClose}>\n {doneLabel}\n </button>\n </div>\n {note && <div className=\"vs-sheet__note\">{note}</div>}\n {header && <div className=\"vs-sheet__header\">{header}</div>}\n <div className=\"vs-sheet__body\">{children}</div>\n </div>\n </div>\n );\n}\n\nexport interface ModalAction {\n label: string;\n variant?: 'primary' | 'danger' | 'ghost';\n onClick: () => void;\n}\n\nexport function Modal({ open, onClose, title, body, actions = [], children, dismissible = true, zIndex, width, page }: { open: boolean; onClose: () => void; title?: string; body?: ReactNode; actions?: ModalAction[]; children?: ReactNode; dismissible?: boolean; zIndex?: number; width?: number; page?: boolean }) {\n useEffect(() => {\n if (!open || !dismissible) return;\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [open, dismissible, onClose]);\n if (!open) return null;\n const scrim = (\n <div className=\"vs-modal-scrim\" style={{ ...(zIndex != null ? { zIndex } : {}), ...(page ? { position: 'fixed' } : {}) }} onClick={dismissible ? onClose : undefined}>\n <div className=\"vs-modal\" role=\"dialog\" aria-modal=\"true\" aria-label={title} style={width ? { maxWidth: width } : undefined} onClick={(e) => e.stopPropagation()}>\n {title && <div className=\"vs-modal__title\">{title}</div>}\n {body && <div className=\"vs-modal__body\">{body}</div>}\n {children && <div className=\"vs-modal__content\">{children}</div>}\n {actions.length > 0 && (\n <div className=\"vs-modal__actions\">\n {actions.map((a, i) => (\n <button key={i} type=\"button\" className={`vs-modal__action vs-modal__action--${a.variant ?? 'ghost'}`} onClick={a.onClick}>\n {a.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n return page ? createPortal(<div className=\"vsp vsp-portal\" data-theme={portalTheme()}>{scrim}</div>, document.body) : scrim;\n}\n\nexport function LiveBadge({ state, label, size, tone }: { state: 'live' | 'paused' | 'ended' | 'starting' | 'idle'; label?: string; size?: 'sm'; tone?: 'muted' }) {\n const copy = label ?? { live: 'LIVE', paused: 'PAUSED', ended: 'ENDED', starting: 'STARTING', idle: 'IDLE' }[state];\n const cls = ['vs-live-badge', `vs-live-badge--${state === 'starting' || state === 'idle' ? 'ended' : state}`, tone === 'muted' ? 'vs-live-badge--muted' : '', size === 'sm' ? 'vs-live-badge--sm' : ''].filter(Boolean).join(' ');\n return (\n <span className={cls}>\n <span className=\"vs-live-badge__slot\">\n {state === 'paused' ? (\n <span className=\"vs-live-badge__bars\">\n <span />\n <span />\n </span>\n ) : state === 'starting' ? (\n <span style={{ width: 9, height: 9, borderRadius: '50%', border: '1.5px solid var(--ink-22)', borderTopColor: 'var(--ink-70)', animation: 'vs-spin .8s linear infinite' }} />\n ) : state === 'idle' ? (\n <svg viewBox=\"0 0 24 24\" width={10} height={10} fill=\"none\" stroke=\"var(--ink-50)\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M12 6v6h4.5m4.5 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" /></svg>\n ) : (\n <span className=\"vs-live-badge__dot\" />\n )}\n </span>\n <span className=\"vs-live-badge__label\">{copy}</span>\n </span>\n );\n}\n\nlet recordingSince: number | null = null;\nconst REC_PULSE_MS = 60_000;\nfunction useRecPulse(recording: boolean): boolean {\n if (!recording) recordingSince = null;\n else if (recordingSince == null) recordingSince = Date.now();\n const left = recording && recordingSince != null ? REC_PULSE_MS - (Date.now() - recordingSince) : 0;\n const [, setTick] = useState(0);\n useEffect(() => {\n if (left <= 0) return;\n const id = window.setTimeout(() => setTick((n) => n + 1), left + 50);\n return () => window.clearTimeout(id);\n }, [recording, left > 0]); // eslint-disable-line react-hooks/exhaustive-deps\n return left > 0;\n}\nexport function RecordButton({ state, onClick, size, disabled, label }: { state: 'idle' | 'connecting' | 'recording' | 'paused' | 'captured' | 'warming' | 'ended'; onClick?: () => void; size?: 'sm' | 'md'; disabled?: boolean; label?: string }) {\n const pulsing = useRecPulse(state === 'recording');\n if (state === 'ended') {\n return (\n <div className={`vs-rec vs-rec--ended${size === 'sm' ? ' vs-rec--sm' : size === 'md' ? ' vs-rec--md' : ''}`}>\n <button type=\"button\" className=\"vs-rec__back\" onClick={onClick} aria-label={label ?? 'Back'}>\n <Icon d={D.arrowLeft} size={20} />\n </button>\n </div>\n );\n }\n return (\n <div className={`vs-rec vs-rec--${state}${state === 'recording' && !pulsing ? ' vs-rec--still' : ''}${size === 'sm' ? ' vs-rec--sm' : ''}`}>\n <span className=\"vs-rec__ring\" aria-hidden=\"true\" />\n <button type=\"button\" className=\"vs-rec__btn\" onClick={onClick} disabled={disabled} aria-pressed={state === 'recording'} aria-label={label ?? (state === 'recording' ? 'Pause recording' : state === 'paused' ? 'Resume recording' : 'Start recording')}>\n <span className=\"vs-rec__fill\" aria-hidden=\"true\" />\n <Icon d={state === 'captured' || state === 'warming' ? D.check : D.mic} size={24} sw={state === 'captured' || state === 'warming' ? 2.4 : undefined} className=\"vs-rec__mic\" />\n </button>\n </div>\n );\n}\n\nexport const MenuBadge = createContext(0);\nexport function MenuBadgeDot() {\n const n = useContext(MenuBadge);\n if (n <= 0) return null;\n return <span className=\"menubadge\" aria-label={`${n} unread notification${n === 1 ? '' : 's'}`}>{n > 99 ? '99+' : n}</span>;\n}\n\nexport function ScreenHeader({ onBack, backLabel = 'Back', leading, center, centerAlign, onCenter, centerLabel, title, avatar, badge, subtitle, actions, onMenu, menuActive, showMenu = true, headerRef, frost }: { onBack?: () => void; backLabel?: string; leading?: ReactNode; center?: ReactNode; centerAlign?: 'start' | 'center'; onCenter?: () => void; centerLabel?: string; title?: string; avatar?: ReactNode; badge?: ReactNode; subtitle?: ReactNode; actions?: ReactNode; onMenu?: () => void; menuActive?: boolean; showMenu?: boolean; headerRef?: React.Ref<HTMLDivElement>; frost?: boolean }) {\n const tappable = typeof onBack === 'function';\n return (\n <div className={`vs-hdr${frost ? ' vs-hdr--frost' : ''}`} ref={headerRef}>\n {tappable ? (\n <button type=\"button\" className=\"vs-hdr__caret\" onClick={(e) => { e.currentTarget.blur(); onBack?.(); }} aria-label={backLabel} title={backLabel}>\n <Icon d={D.chevronLeft} size={19} sw={1.7} />\n </button>\n ) : (\n leading ?? null\n )}\n {center ? (\n <div\n className={`vs-hdr__center${centerAlign === 'start' ? ' vs-hdr__center--start' : ''}${onCenter || tappable ? ' vs-hdr__center--tap' : ''}`}\n onClick={onCenter ?? (tappable ? onBack : undefined)}\n title={onCenter ? centerLabel : tappable ? backLabel : undefined}\n >\n {center}\n </div>\n ) : (\n <div className={`vs-hdr__title${tappable ? ' vs-hdr__title--tap' : ''}${avatar ? ' vs-hdr__title--av' : ''}`} onClick={tappable ? onBack : undefined} title={tappable ? backLabel : undefined}>\n <div className={`vs-hdr__name${avatar ? ' vs-hdr__name--av' : ''}`}>\n {avatar}\n <span className=\"vs-hdr__text\">{title}</span>\n {badge}\n </div>\n {subtitle && <div className=\"vs-hdr__sub\">{subtitle}</div>}\n </div>\n )}\n <div className=\"vs-hdr__actions\">\n {actions}\n {showMenu && (\n <button type=\"button\" className={`vs-icon-btn vs-icon-btn--sm vs-icon-btn--borderless has-badge${menuActive ? ' vs-icon-btn--primary' : ''}`} onClick={onMenu} aria-label=\"Options\" title=\"Options\">\n <svg viewBox=\"0 0 24 24\" width=\"19\" height=\"19\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"5.5\" r=\"1.85\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.85\" />\n <circle cx=\"12\" cy=\"18.5\" r=\"1.85\" />\n </svg>\n <MenuBadgeDot />\n </button>\n )}\n </div>\n </div>\n );\n}\n\nexport function Eyebrow({ children, style, className }: { children: ReactNode; style?: React.CSSProperties; className?: string }) {\n return <div className={className ? `eyebrow ${className}` : 'eyebrow'} style={style}>{children}</div>;\n}\n\nexport function portalTheme(): 'dark' | 'light' {\n if (typeof document === 'undefined') return 'dark';\n const el = document.querySelector<HTMLElement>('.vsp:not(.vsp-portal)');\n return el?.dataset.theme === 'light' ? 'light' : 'dark';\n}\n","let reporter: ((e: Error) => void) | null = null;\n\nexport function setErrorReporter(fn: ((e: Error) => void) | null): void {\n reporter = fn;\n}\n\nexport function reportError(e: Error): void {\n reporter?.(e);\n}\n\nexport function liveAudioSupported(): boolean {\n return typeof (window as any).AudioDecoder === 'function' && typeof AudioContext === 'function';\n}\n\nclass OggDemux {\n private buf = new Uint8Array(0);\n private pending: Uint8Array[] = [];\n private partial: Uint8Array | null = null;\n\n push(chunk: Uint8Array): Uint8Array[] {\n const joined = new Uint8Array(this.buf.length + chunk.length);\n joined.set(this.buf);\n joined.set(chunk, this.buf.length);\n this.buf = joined;\n const out: Uint8Array[] = [];\n for (;;) {\n const page = this.readPage();\n if (!page) break;\n out.push(...page);\n }\n return out;\n }\n\n private readPage(): Uint8Array[] | null {\n const b = this.buf;\n if (b.length < 27) return null;\n let start = 0;\n while (start + 27 <= b.length && !(b[start] === 0x4f && b[start + 1] === 0x67 && b[start + 2] === 0x67 && b[start + 3] === 0x53)) start++;\n if (start + 27 > b.length) {\n this.buf = b.subarray(start);\n return null;\n }\n const segCount = b[start + 26];\n const headerLen = 27 + segCount;\n if (start + headerLen > b.length) return null;\n const lacing = b.subarray(start + 27, start + headerLen);\n let bodyLen = 0;\n for (const l of lacing) bodyLen += l;\n if (start + headerLen + bodyLen > b.length) return null;\n const body = b.subarray(start + headerLen, start + headerLen + bodyLen);\n this.buf = b.subarray(start + headerLen + bodyLen);\n const packets: Uint8Array[] = [];\n let off = 0;\n let cur: Uint8Array[] = this.partial ? [this.partial] : [];\n this.partial = null;\n for (const l of lacing) {\n cur.push(body.subarray(off, off + l));\n off += l;\n if (l < 255) {\n packets.push(concat(cur));\n cur = [];\n }\n }\n if (cur.length) this.partial = concat(cur);\n return packets;\n }\n}\n\nfunction concat(parts: Uint8Array[]): Uint8Array {\n const n = parts.reduce((a, p) => a + p.length, 0);\n const out = new Uint8Array(n);\n let o = 0;\n for (const p of parts) {\n out.set(p, o);\n o += p.length;\n }\n return out;\n}\n\nexport class LivePlayer {\n private ctx: AudioContext | null = null;\n private decoder: any = null;\n private demux = new OggDemux();\n private nextTime = 0;\n private gain: GainNode | null = null;\n private headerSeen = false;\n private ts = 0;\n volume = 1;\n\n async start() {\n if (!liveAudioSupported()) throw new Error('Live audio needs WebCodecs (AudioDecoder)');\n this.ctx = new AudioContext({ sampleRate: 48000 });\n this.gain = this.ctx.createGain();\n this.gain.gain.value = this.volume;\n this.gain.connect(this.ctx.destination);\n await this.ctx.resume();\n const AD = (window as any).AudioDecoder;\n this.decoder = new AD({\n output: (data: any) => this.play(data),\n error: (e: unknown) => console.warn('opus decode', e),\n });\n this.decoder.configure({ codec: 'opus', sampleRate: 48000, numberOfChannels: 1 });\n this.nextTime = this.ctx.currentTime + 0.15;\n }\n\n setVolume(v: number) {\n this.volume = v;\n if (this.gain) this.gain.gain.value = v;\n }\n\n feed(bytes: ArrayBuffer) {\n if (!this.decoder) return;\n for (const pkt of this.demux.push(new Uint8Array(bytes))) {\n if (pkt.length >= 8 && pkt[0] === 0x4f && pkt[1] === 0x70 && pkt[2] === 0x75 && pkt[3] === 0x73) {\n this.headerSeen = true;\n continue;\n }\n if (pkt.length === 0) continue;\n const EAC = (window as any).EncodedAudioChunk;\n try {\n this.decoder.decode(new EAC({ type: 'key', timestamp: this.ts, data: pkt }));\n this.ts += 60_000;\n } catch (e) {\n console.warn('decode', e);\n }\n }\n }\n\n private play(data: any) {\n if (!this.ctx || !this.gain) return;\n const frames = data.numberOfFrames as number;\n const buf = this.ctx.createBuffer(1, frames, data.sampleRate ?? 48000);\n const f32 = new Float32Array(frames);\n data.copyTo(f32, { planeIndex: 0, format: 'f32-planar' });\n buf.getChannelData(0).set(f32);\n data.close();\n const src = this.ctx.createBufferSource();\n src.buffer = buf;\n src.connect(this.gain);\n const now = this.ctx.currentTime;\n if (this.nextTime < now) this.nextTime = now + 0.05;\n src.start(this.nextTime);\n this.nextTime += buf.duration;\n }\n\n async stop() {\n try {\n this.decoder?.close();\n } catch {\n }\n this.decoder = null;\n await this.ctx?.close().catch(() => {});\n this.ctx = null;\n }\n}\n\nexport function deliveryFormat(): 'ogg' | 'caf' {\n try {\n return document.createElement('audio').canPlayType('audio/x-caf; codecs=opus') === 'probably' ? 'caf' : 'ogg';\n } catch {\n return 'ogg';\n }\n}\n\nexport interface MediaCred {\n accessToken?: string | null; listenerToken?: string | null; shareCode?: string | null;\n media?: string | null;\n}\n\nexport function credParams(cred: MediaCred = {}): string {\n const q = new URLSearchParams();\n if (cred.media) q.set('media', cred.media);\n else if (cred.accessToken) q.set('access_token', cred.accessToken);\n if (cred.listenerToken) q.set('listenerToken', cred.listenerToken);\n if (cred.shareCode) q.set('shareCode', cred.shareCode);\n return q.toString();\n}\n\nexport function audioClipUrl(apiOrigin: string, recordingId: string, startS: number, endS: number, cred: MediaCred = {}, clean = false): string {\n const cp = credParams(cred);\n return `${apiOrigin}/v1/recordings/${recordingId}/audio/clip?startS=${startS.toFixed(2)}&endS=${endS.toFixed(2)}${clean ? '&clean=true' : ''}${cp ? `&${cp}` : ''}`;\n}\n\nexport async function explainAudioError(url: string): Promise<{ message: string; permanent: boolean } | null> {\n try {\n const res = await fetch(url, { redirect: 'manual', headers: { accept: 'application/json' } });\n if (res.type === 'opaqueredirect' || res.ok || (res.status >= 300 && res.status < 400)) return null;\n let body: any = null;\n try { body = await res.json(); } catch { }\n const message: unknown = body?.message;\n if (typeof message !== 'string' || !message) return null;\n return { message: message[0].toUpperCase() + message.slice(1) + (message.endsWith('.') ? '' : '.'), permanent: res.status === 404 || res.status === 403 };\n } catch {\n return null;\n }\n}\n\nexport async function audioSealed(url: string): Promise<boolean> {\n try {\n const res = await fetch(url, { redirect: 'manual', headers: { accept: 'application/json' } });\n return res.type === 'opaqueredirect' || (res.status >= 300 && res.status < 400);\n } catch {\n return false;\n }\n}\n\nexport function deliveryAudioUrl(apiOrigin: string, recordingId: string, cred: MediaCred = {}): string {\n const q = new URLSearchParams({ kind: 'delivery', format: deliveryFormat() });\n if (cred.media) q.set('media', cred.media);\n else if (cred.accessToken) q.set('access_token', cred.accessToken);\n if (cred.listenerToken) q.set('listenerToken', cred.listenerToken);\n if (cred.shareCode) q.set('shareCode', cred.shareCode);\n return `${apiOrigin}/v1/recordings/${recordingId}/audio?${q}`;\n}\n\nexport function backgroundAudioUrl(apiOrigin: string, recordingId: string, cred: MediaCred = {}, kind: 'background' | 'speech' = 'background'): string {\n const q = new URLSearchParams({ kind, format: deliveryFormat() });\n if (cred.media) q.set('media', cred.media);\n else if (cred.accessToken) q.set('access_token', cred.accessToken);\n if (cred.listenerToken) q.set('listenerToken', cred.listenerToken);\n if (cred.shareCode) q.set('shareCode', cred.shareCode);\n return `${apiOrigin}/v1/recordings/${recordingId}/audio?${q}`;\n}\n\nexport function audioDownloadUrl(apiOrigin: string, recordingId: string, kind: 'source' | 'delivery' | 'video', cred: MediaCred = {}): string {\n const q = new URLSearchParams({ kind });\n if (kind === 'delivery') q.set('format', 'mp3');\n if (cred.media) q.set('media', cred.media);\n else if (cred.accessToken) q.set('access_token', cred.accessToken);\n if (cred.listenerToken) q.set('listenerToken', cred.listenerToken);\n if (cred.shareCode) q.set('shareCode', cred.shareCode);\n return `${apiOrigin}/v1/recordings/${recordingId}/audio?${q}`;\n}\n\nexport function voiceTrackUrl(apiOrigin: string, recordingId: string, lang: string, voiceKey: string, cred: MediaCred = {}): string {\n return voiceTrackUrlAs(apiOrigin, recordingId, lang, voiceKey, deliveryFormat(), cred);\n}\n\nexport function voiceTrackDownloadUrl(apiOrigin: string, recordingId: string, lang: string, voiceKey: string, cred: MediaCred = {}): string {\n return voiceTrackUrlAs(apiOrigin, recordingId, lang, voiceKey, 'mp3', cred);\n}\n\nfunction voiceTrackUrlAs(apiOrigin: string, recordingId: string, lang: string, voiceKey: string, format: 'ogg' | 'caf' | 'mp3', cred: MediaCred): string {\n const q = new URLSearchParams({ kind: 'voice', lang, format });\n if (voiceKey) q.set('voice', voiceKey);\n if (cred.media) q.set('media', cred.media);\n else if (cred.accessToken) q.set('access_token', cred.accessToken);\n if (cred.listenerToken) q.set('listenerToken', cred.listenerToken);\n if (cred.shareCode) q.set('shareCode', cred.shareCode);\n return `${apiOrigin}/v1/recordings/${recordingId}/audio?${q}`;\n}\n\nexport function mediaErrorText(e: MediaError | null, report = true): string {\n const code = e?.code ?? 0;\n const what = code === 2 ? 'the download failed' : code === 3 ? 'this browser could not decode it' : code === 4 ? 'the file is not available, or this browser cannot play it' : code === 1 ? 'the load was stopped' : 'something went wrong';\n if (report) reportMediaError(e);\n return `The audio could not be played: ${what}.`;\n}\n\nexport function reportMediaError(e: MediaError | null): void {\n const code = e?.code ?? 0;\n if (code !== 1) reportError(new Error(`media error ${code}${e?.message ? `: ${e.message}` : ''}`));\n}\n","export const STARTING_DEFAULT_MS = 3_000;\n\nexport function startingRetryMs(status: number, retryAfter: string | null, body: unknown): number | null {\n if (status !== 503) return null;\n const ra = retryAfter == null || retryAfter.trim() === '' ? NaN : Number(retryAfter);\n if (Number.isFinite(ra)) return Math.min(15_000, Math.max(1_000, ra * 1000));\n const b = body as { retryable?: unknown; code?: unknown } | null;\n if (b && (b.retryable === true || b.code === 'engine_unavailable')) return STARTING_DEFAULT_MS;\n return null;\n}\n","export type Fetcher = (src: string, signal: AbortSignal) => Promise<{ ok: boolean; status: number; blob: () => Promise<Blob> }>;\n\ntype Entry = { state: 'loading'; ctl: AbortController } | { state: 'ready'; url: string } | { state: 'failed'; at: number };\n\nexport interface PrefetchOptions {\n fetcher?: Fetcher;\n concurrency?: number;\n keep?: number;\n retryMs?: number;\n now?: () => number;\n toUrl?: (b: Blob) => string;\n revoke?: (url: string) => void;\n}\n\nexport class ClipPrefetch {\n private entries = new Map<string, Entry>();\n private wanted: string[] = [];\n private used: string[] = [];\n private readonly fetcher: Fetcher | null;\n private readonly concurrency: number;\n private readonly keep: number;\n private readonly retryMs: number;\n private readonly now: () => number;\n private readonly toUrl: (b: Blob) => string;\n private readonly revoke: (url: string) => void;\n onReady: (src: string) => void = () => {};\n\n constructor(o: PrefetchOptions = {}) {\n this.fetcher = o.fetcher ?? (typeof fetch === 'function' ? (src, signal) => fetch(src, { signal }) : null);\n this.concurrency = Math.max(1, o.concurrency ?? 2);\n this.keep = Math.max(2, o.keep ?? 24);\n this.retryMs = o.retryMs ?? 4000;\n this.now = o.now ?? (() => Date.now());\n this.toUrl = o.toUrl ?? ((b) => URL.createObjectURL(b));\n this.revoke = o.revoke ?? ((u) => { try { URL.revokeObjectURL(u); } catch { } });\n }\n\n want(srcs: string[]) {\n this.wanted = [...new Set(srcs)];\n const keepSet = new Set(this.wanted);\n for (const [src, e] of this.entries) {\n if (e.state === 'loading' && !keepSet.has(src)) {\n e.ctl.abort();\n this.entries.delete(src);\n }\n }\n this.evict(keepSet);\n this.pump();\n }\n\n urlFor(src: string): string {\n const e = this.entries.get(src);\n if (e?.state !== 'ready') return src;\n this.used = [src, ...this.used.filter((s) => s !== src)];\n return e.url;\n }\n\n ready(src: string): boolean { return this.entries.get(src)?.state === 'ready'; }\n\n loading(): number {\n let n = 0;\n for (const e of this.entries.values()) if (e.state === 'loading') n++;\n return n;\n }\n\n forget(src: string) {\n const e = this.entries.get(src);\n if (!e) return;\n if (e.state === 'loading') e.ctl.abort();\n if (e.state === 'ready') this.revoke(e.url);\n this.entries.delete(src);\n }\n\n clear() {\n for (const src of [...this.entries.keys()]) this.forget(src);\n this.wanted = [];\n this.used = [];\n }\n\n private evict(keepSet: Set<string>) {\n const ready = [...this.entries].filter(([, e]) => e.state === 'ready').map(([s]) => s);\n if (ready.length <= this.keep) return;\n const recent = new Set(this.used.slice(0, 2));\n const spare = ready.filter((s) => !keepSet.has(s) && !recent.has(s));\n const order = spare.sort((a, b) => this.usedRank(b) - this.usedRank(a));\n let over = ready.length - this.keep;\n for (const s of order) {\n if (over <= 0) break;\n this.forget(s);\n over--;\n }\n }\n\n private usedRank(src: string): number {\n const i = this.used.indexOf(src);\n return i < 0 ? Number.MAX_SAFE_INTEGER : i;\n }\n\n private pump() {\n if (!this.fetcher) return;\n let busy = this.loading();\n for (const src of this.wanted) {\n if (busy >= this.concurrency) return;\n const e = this.entries.get(src);\n if (e?.state === 'loading' || e?.state === 'ready') continue;\n if (e?.state === 'failed' && this.now() - e.at < this.retryMs) continue;\n busy++;\n this.load(src);\n }\n }\n\n private load(src: string) {\n const ctl = new AbortController();\n this.entries.set(src, { state: 'loading', ctl });\n const done = (e: Entry | null) => {\n const cur = this.entries.get(src);\n if (cur?.state !== 'loading' || cur.ctl !== ctl) {\n if (e?.state === 'ready') this.revoke(e.url);\n return;\n }\n if (e) this.entries.set(src, e); else this.entries.delete(src);\n if (e?.state === 'ready') this.onReady(src);\n this.evict(new Set(this.wanted));\n this.pump();\n };\n this.fetcher!(src, ctl.signal)\n .then(async (r) => {\n if (!r.ok) { done({ state: 'failed', at: this.now() }); return; }\n const b = await r.blob();\n done(b.size > 0 ? { state: 'ready', url: this.toUrl(b) } : { state: 'failed', at: this.now() });\n })\n .catch(() => done(ctl.signal.aborted ? null : { state: 'failed', at: this.now() }));\n }\n}\n","import { startingRetryMs } from './voiceRetry';\nimport { ClipPrefetch } from './clipPrefetch';\n\nexport const mediaKind = { video: false };\n\nexport function newMediaElement(url?: string): HTMLMediaElement {\n if (!mediaKind.video) return new Audio(url);\n const v = document.createElement('video');\n v.playsInline = true;\n if (url) v.src = url;\n return v;\n}\n\nexport interface VoiceClip {\n sentenceId: number;\n lang: string;\n src: string;\n durationS: number;\n generation?: number;\n part: number;\n parts: number;\n voice?: string | null;\n cloned?: boolean;\n}\n\nexport class VoiceNotStarted extends Error {\n constructor() { super('The voice did not start in time.'); this.name = 'VoiceNotStarted'; }\n}\n\nexport class ClipQueue {\n private el: HTMLMediaElement | null = null;\n private clips = new Map<number, { total: number; got: Map<number, VoiceClip> }>();\n private order: number[] = [];\n current: number | null = null;\n private currentPart = 0;\n private partBase = 0;\n private within: { id: number; frac: number } | null = null;\n playing = false;\n muted = false;\n rate = 1;\n volume = 1;\n finite = false;\n onSentence: (id: number | null) => void = () => {};\n onWaiting: (id: number | null) => void = () => {};\n onStarting: (since: number | null) => void = () => {};\n speakable: (sentenceId: number) => boolean = () => true;\n coming: (sentenceId: number) => boolean = () => false;\n gapBefore: (prev: number | null, next: number) => number = () => 0;\n flow = false;\n silentSpan: (sentenceId: number) => { fromS: number; ms: number } | null = () => null;\n private lastDone: number | null = null;\n private rested = false;\n private rest: { prev: number; totalMs: number; doneMs: number; since: number | null; timer: ReturnType<typeof setTimeout> | null; silent?: boolean; fromS?: number } | null = null;\n private sequence: number[] = [];\n private seqAt = new Map<number, number>();\n setSequence(ids: number[]) {\n if (ids.length === this.sequence.length && ids.every((id, i) => this.sequence[i] === id)) return;\n this.sequence = ids;\n this.seqAt = new Map(ids.map((id, i) => [id, i]));\n this.order.sort((a, b) => this.rank(a) - this.rank(b));\n }\n\n private rank(id: number): number {\n if (!this.sequence.length) return id;\n const i = this.seqAt.get(id);\n return i == null ? Number.MAX_SAFE_INTEGER : i;\n }\n\n private expected(afterId: number): number | null {\n if (!this.sequence.length) return null;\n const i = this.seqAt.get(afterId);\n if (i == null) return afterId < 0 ? this.sequence[0] ?? null : null;\n return this.sequence[i + 1] ?? null;\n }\n static WAIT_MS = 15_000;\n static START_WAIT_MS = 4_000;\n static COMING_MS = 120_000;\n static SKEW_LINES = 3;\n private spoken = new Set<number>();\n private lastRead: number | null = null;\n private started = false;\n private awaiting: { id: number; part: number } | null = null;\n private waitTimer: ReturnType<typeof setTimeout> | null = null;\n onError: (e: unknown) => void = () => {};\n private floor = 0;\n private loading: number | null = null;\n readAhead = 0;\n readAheadS = 0;\n readonly prefetch = new ClipPrefetch();\n private warmed = new Set<string>();\n private static readonly RETRIES = 4;\n private static readonly RETRY_MS = 1200;\n private static readonly STARTING_MS = 300_000;\n private startingSince = new Map<number, number>();\n private retries = new Map<number, number>();\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n add(clip: VoiceClip) {\n if (!this.speakable(clip.sentenceId)) return;\n const c: VoiceClip = { ...clip, part: Math.max(0, clip.part || 0), parts: Math.max(1, clip.parts || 1) };\n let line = this.clips.get(c.sentenceId);\n if (!line) {\n line = { total: Math.max(1, c.parts), got: new Map() };\n this.clips.set(c.sentenceId, line);\n this.order = [...this.clips.keys()].sort((a, b) => this.rank(a) - this.rank(b));\n }\n line.total = Math.max(line.total, c.parts, c.part + 1);\n const held = line.got.get(c.part);\n if (held) {\n const newer = c.generation != null && (held.generation == null || c.generation > held.generation);\n if (!newer || held.src === c.src) return;\n line.got.set(c.part, c);\n if (this.current === c.sentenceId && this.currentPart === c.part && held.generation != null) this.swap(c);\n return;\n }\n line.got.set(c.part, c);\n if (this.current != null) this.warm(this.current);\n else if (this.awaiting) this.warm(this.awaiting.id, true);\n if (!this.playing || this.current != null || this.rest?.silent) return;\n const w = this.awaiting;\n if (w) {\n if (c.sentenceId === w.id && c.part === w.part) {\n this.stopWaiting();\n this.startPart(w.id, w.part);\n }\n return;\n }\n if (this.rank(c.sentenceId) < this.rank(this.floor)) return;\n this.follow();\n }\n\n private piecesOf(id: number): number[] {\n const line = this.clips.get(id);\n return line ? [...line.got.keys()].sort((a, b) => a - b) : [];\n }\n\n private due(): { start: number } | { wait: number } | { silent: number } | null {\n let exp = this.lastRead != null ? this.expected(this.lastRead) : this.floorOrBefore();\n while (exp != null && (this.spoken.has(exp) || !this.speakable(exp))) exp = this.expected(exp);\n const held = this.earliestHeld();\n if (exp != null && (held == null || this.rank(exp) < this.rank(held))) {\n if (this.piecesOf(exp).length) return { start: exp };\n if (this.flow) return { silent: exp };\n if (this.coming(exp)) return { wait: exp };\n if (this.started && held != null) return { wait: exp };\n if (held != null && this.rank(held) - this.rank(exp) <= ClipQueue.SKEW_LINES) return { wait: exp };\n }\n return held != null ? { start: held } : null;\n }\n\n private follow() {\n const d = this.due();\n const prev = this.lastDone;\n this.lastDone = null;\n if (d && 'start' in d) {\n const rested = this.rested;\n this.rested = false;\n const gap = this.playing && !rested ? this.gapBefore(prev, d.start) / (this.rate || 1) : 0;\n if (gap > 0.05) { this.restAfter(prev ?? d.start, gap * 1000); return; }\n this.start(d.start);\n return;\n }\n if (d && 'silent' in d) { this.silentLine(d.silent); return; }\n if (d && 'wait' in d) { this.waitFor(d.wait, 0); return; }\n if (this.finite) this.playing = false;\n this.current = null;\n this.onSentence(null);\n }\n\n private restAfter(prev: number, ms: number) {\n this.clearRest();\n this.current = null;\n this.rest = { prev, totalMs: ms, doneMs: 0, since: null, timer: null };\n this.runRest();\n this.onSentence(prev);\n }\n\n joinSilently(id: number) {\n this.stopWaiting();\n this.el?.pause();\n this.playing = true;\n this.floor = id;\n this.lastRead = null;\n this.lastDone = null;\n this.silentLine(id);\n }\n\n private silentLine(id: number) {\n const span = this.silentSpan(id);\n this.clearRest();\n this.finishLine(id);\n this.started = true;\n this.lastRead = this.lastRead == null ? id : Math.max(this.lastRead, id);\n this.rest = { prev: id, totalMs: Math.max(0, span?.ms ?? 0), doneMs: 0, since: null, timer: null, silent: true, fromS: span?.fromS ?? 0 };\n this.runRest();\n this.onSentence(id);\n }\n\n private runRest() {\n const r = this.rest;\n if (!r || r.timer) return;\n r.since = Date.now();\n r.timer = setTimeout(() => {\n if (this.rest !== r) return;\n this.rest = null;\n if (!this.playing) return;\n this.rested = true;\n this.follow();\n }, Math.max(0, r.totalMs - r.doneMs));\n }\n\n private holdRest() {\n const r = this.rest;\n if (!r || !r.timer) return;\n clearTimeout(r.timer);\n r.timer = null;\n if (r.since != null) r.doneMs += Date.now() - r.since;\n r.since = null;\n }\n\n private clearRest() {\n if (this.rest?.timer) clearTimeout(this.rest.timer);\n this.rest = null;\n }\n\n resting(): { sentenceId: number; s: number; silent: boolean } | null {\n const r = this.rest;\n if (!r) return null;\n const ms = r.doneMs + (r.since != null ? Date.now() - r.since : 0);\n const s = (Math.min(ms, r.totalMs) / 1000) * (this.rate || 1);\n return { sentenceId: r.prev, s: r.silent ? (r.fromS ?? 0) + s : s, silent: !!r.silent };\n }\n\n private finishLine(id: number) {\n this.lastDone = id;\n this.spoken.add(id);\n this.current = null;\n this.currentPart = 0;\n this.partBase = 0;\n }\n\n private earliestHeld(): number | null {\n const floor = this.rank(this.floor);\n for (const id of this.order) if (this.rank(id) >= floor && !this.spoken.has(id) && this.speakable(id) && this.piecesOf(id).length) return id;\n return null;\n }\n\n private floorOrBefore(): number | null {\n if (!this.sequence.length) return null;\n const i = this.seqAt.get(this.floor);\n if (i != null) return this.floor;\n return this.sequence.find((id) => this.rank(id) >= this.rank(this.floor)) ?? null;\n }\n\n private waitFor(id: number, part: number) {\n const beforeFirst = !this.started;\n this.warm(id, true);\n this.current = null;\n this.awaiting = { id, part };\n this.onSentence(id);\n this.onWaiting(id);\n if (this.waitTimer) clearTimeout(this.waitTimer);\n const patience = this.coming(id) ? ClipQueue.COMING_MS : beforeFirst ? ClipQueue.START_WAIT_MS : ClipQueue.WAIT_MS;\n this.waitTimer = setTimeout(() => {\n this.waitTimer = null;\n const w = this.awaiting;\n if (!w || w.id !== id || w.part !== part || !this.playing) return;\n this.awaiting = null;\n this.onWaiting(null);\n if (beforeFirst) {\n const first = this.earliestHeld();\n if (first != null) { this.floor = first; this.start(first); return; }\n this.follow();\n return;\n }\n this.finishLine(id);\n this.follow();\n }, patience);\n }\n\n private stopWaiting() {\n this.awaiting = null;\n if (this.waitTimer) { clearTimeout(this.waitTimer); this.waitTimer = null; }\n }\n\n has(sentenceId: number) { return this.clips.has(sentenceId); }\n get size() { return this.clips.size; }\n latest(): VoiceClip | null { return this.order.length ? this.clipAt(this.order[this.order.length - 1]) : null; }\n clipAt(sentenceId: number): VoiceClip | null {\n const line = this.clips.get(sentenceId);\n if (!line) return null;\n const first = [...line.got.keys()].sort((a, b) => a - b)[0];\n return first == null ? null : line.got.get(first) ?? null;\n }\n\n private from(sentenceId: number | null): number | null {\n if (sentenceId == null) return null;\n for (const id of this.order) if (id >= sentenceId && this.speakable(id)) return id;\n return null;\n }\n\n private edge(): number { return this.order.length ? this.order[this.order.length - 1] + 1 : 0; }\n\n play(sentenceId: number | null) {\n this.clearRest();\n this.lastDone = null;\n this.playing = true;\n this.floor = Math.min(sentenceId ?? this.edge(), this.edge());\n this.stopWaiting();\n for (const id of [...this.spoken]) if (this.rank(id) >= this.rank(this.floor)) this.spoken.delete(id);\n this.lastRead = null;\n this.follow();\n }\n\n pause() {\n this.holdRest();\n this.playing = false;\n this.onWaiting(null);\n this.onStarting(null);\n this.el?.pause();\n }\n\n resume(sentenceId: number | null): boolean {\n if (this.rest && this.rest.prev === sentenceId) {\n this.playing = true;\n this.runRest();\n this.onSentence(this.rest.prev);\n return true;\n }\n const el = this.el;\n if (!el || this.current == null || this.current !== sentenceId || !el.currentSrc || el.ended || el.error || this.startingSince.has(this.current)) return false;\n this.playing = true;\n this.stopWaiting();\n void el.play().catch((e) => {\n if ((e as { name?: string } | null)?.name === 'AbortError') return;\n this.failed(this.current ?? sentenceId!, e);\n });\n this.onSentence(this.current);\n return true;\n }\n\n private swap(c: VoiceClip) {\n const el = this.el;\n if (!el) return;\n const at = Math.max(0, el.currentTime - 0.3);\n const going = this.playing && !el.paused && !el.ended;\n this.loading = c.sentenceId;\n el.src = this.srcOf(c);\n el.addEventListener('loadedmetadata', () => {\n try { el.currentTime = Number.isFinite(el.duration) && el.duration > 0 ? Math.min(at, Math.max(0, el.duration - 0.1)) : at; } catch { }\n }, { once: true });\n if (!going) return;\n this.onWaiting(c.sentenceId);\n void el.play().catch((e) => {\n if ((e as { name?: string } | null)?.name === 'AbortError') return;\n this.failed(c.sentenceId, e);\n });\n }\n\n readingAt(): number | null { return this.current ?? this.awaiting?.id ?? (this.playing ? this.floor : null); }\n\n arm(sentenceId: number | null) {\n this.clearRest();\n this.lastDone = null;\n this.playing = true;\n this.current = null;\n this.floor = sentenceId ?? 0;\n this.stopWaiting();\n this.spoken.clear();\n this.lastRead = null;\n this.started = false;\n this.onSentence(null);\n this.warm(this.floor, true);\n }\n\n seekWithin(t: number) {\n const el = this.el;\n if (!el || this.current == null) return;\n const at = t - this.partBase;\n if (at < 0 || (Number.isFinite(el.duration) && el.duration > 0 && at >= el.duration)) return;\n try { el.currentTime = at; } catch { }\n }\n\n seek(sentenceId: number | null) {\n if (!this.playing) { this.clearRest(); this.lastDone = null; this.floor = Math.min(sentenceId ?? this.edge(), this.edge()); this.current = null; this.warm(this.floor, true); return; }\n this.play(sentenceId);\n }\n\n setMuted(m: boolean) { this.muted = m; if (this.el) this.el.muted = m; }\n setVolume(v: number) { this.volume = v; if (this.el) this.el.volume = v; }\n setRate(r: number) { this.rate = r; if (this.el) this.el.playbackRate = r; }\n\n private start(id: number) {\n const first = this.piecesOf(id)[0];\n this.partBase = 0;\n if (this.within && this.within.id !== id) this.within = null;\n this.startPart(id, first ?? 0);\n }\n\n private startPartAt(id: number, part: number, sec: number) {\n this.within = null;\n const base = this.partBase;\n this.startPart(id, part);\n this.partBase = base;\n const el = this.el;\n if (el && this.current === id && sec > 0.05) {\n el.addEventListener('loadedmetadata', () => {\n try { el.currentTime = Number.isFinite(el.duration) && el.duration > 0 ? Math.min(sec, Math.max(0, el.duration - 0.1)) : sec; } catch { }\n }, { once: true });\n }\n }\n\n startWithin(sentenceId: number, frac: number) {\n this.within = frac > 0.01 ? { id: sentenceId, frac: Math.min(0.98, frac) } : null;\n }\n\n private startPart(id: number, part: number) {\n const line = this.clips.get(id);\n const c = line?.got.get(part);\n if (!this.speakable(id)) {\n this.finishLine(id);\n this.follow();\n return;\n }\n if (!c) { this.waitFor(id, part); return; }\n const w = this.within && this.within.id === id && part === this.piecesOf(id)[0] ? this.within : null;\n let at = 0;\n if (w) {\n this.within = null;\n if (line!.total > 1) {\n const lens = Array.from({ length: line!.total }, (_, i) => line!.got.get(i)?.durationS ?? 0);\n const total = lens.reduce((x, y) => x + y, 0);\n if (total > 0 && lens.every((d) => d > 0)) {\n const target = w.frac * total;\n let k = 0, base = 0;\n while (k < lens.length - 1 && base + lens[k] <= target) base += lens[k++];\n at = -(target - base);\n if (k !== part) { this.partBase = base; this.startPartAt(id, k, target - base); return; }\n }\n } else at = w.frac;\n }\n this.stopWaiting();\n this.clearRest();\n this.started = true;\n this.lastRead = this.lastRead == null ? id : Math.max(this.lastRead, id);\n if (part === 0) this.partBase = 0;\n this.currentPart = part;\n this.current = id;\n this.loading = id;\n if (this.retryTimer) { clearTimeout(this.retryTimer); this.retryTimer = null; }\n const el = this.element();\n el.src = this.srcOf(c);\n this.warm(id);\n if (at !== 0) {\n el.addEventListener('loadedmetadata', () => {\n const len = Number.isFinite(el.duration) && el.duration > 0 ? el.duration : 0;\n const sec = at > 0 ? at * len : -at;\n try { if (sec > 0.05) el.currentTime = len ? Math.min(sec, Math.max(0, len - 0.1)) : sec; } catch { }\n }, { once: true });\n }\n el.muted = this.muted;\n el.volume = this.volume;\n el.playbackRate = this.rate;\n this.onSentence(id);\n this.onWaiting(id);\n void el.play().catch((e) => {\n if ((e as { name?: string } | null)?.name === 'AbortError') return;\n this.failed(id, e);\n });\n }\n\n upcoming(from: number, withFrom = false): VoiceClip[] {\n const out: VoiceClip[] = [];\n let secs = 0;\n const enough = () => out.length >= Math.max(this.readAhead, 1) && secs >= this.readAheadS;\n const cur = this.clips.get(from);\n if (cur) {\n for (const part of this.piecesOf(from)) {\n if (!withFrom && (this.current !== from || part <= this.currentPart)) continue;\n const c = cur.got.get(part);\n if (c) { out.push(c); secs += c.durationS || 0; }\n }\n }\n const at = this.rank(from);\n for (const id of this.order) {\n if (enough()) break;\n if (this.rank(id) <= at || !this.speakable(id)) continue;\n const line = this.clips.get(id);\n if (!line) continue;\n for (const part of [...line.got.keys()].sort((x, y) => x - y)) {\n const c = line.got.get(part)!;\n out.push(c);\n secs += c.durationS || 0;\n }\n }\n return out;\n }\n\n private warm(from: number, withFrom = false) {\n if (this.readAhead <= 0) return;\n this.prefetch.want(this.upcoming(from, withFrom).map((c) => c.src));\n }\n\n private srcOf(c: VoiceClip): string { return this.prefetch.urlFor(c.src); }\n\n private failed(id: number, e: unknown) {\n if (this.loading !== id) return;\n this.loading = null;\n const c = this.clips.get(id)?.got.get(this.currentPart);\n if (c) this.prefetch.forget(c.src);\n if (c && this.playing && this.current === id && (this.retries.get(id) ?? 0) < ClipQueue.RETRIES) {\n void this.classify(id, c.src);\n return;\n }\n this.onError(e);\n this.drop(id);\n }\n\n private async classify(id: number, src: string) {\n let again = false;\n let ready = false;\n let afterMs: number | null = null;\n try {\n const r = await fetch(src, { method: 'GET' });\n ready = r.ok;\n again = r.status === 202 || r.status === 503 || r.status === 429;\n const body = r.status === 503 ? await r.json().catch(() => null) : null;\n afterMs = startingRetryMs(r.status, r.headers.get('Retry-After'), body);\n } catch {\n again = true;\n }\n if (this.current !== id || !this.playing) return;\n if (ready) { this.retries.set(id, (this.retries.get(id) ?? 0) + 1); this.start(id); return; }\n if (!again) { this.drop(id); return; }\n if (afterMs != null) {\n const since = this.startingSince.get(id) ?? Date.now();\n this.startingSince.set(id, since);\n if (Date.now() - since < ClipQueue.STARTING_MS) {\n this.onStarting(since);\n this.retryTimer = setTimeout(() => { if (this.playing && this.current === id) this.start(id); }, afterMs);\n return;\n }\n this.startingSince.delete(id);\n this.playing = false;\n this.onStarting(null);\n this.onWaiting(null);\n this.onError(new VoiceNotStarted());\n this.onSentence(id);\n return;\n }\n const tries = (this.retries.get(id) ?? 0) + 1;\n this.retries.set(id, tries);\n this.retryTimer = setTimeout(() => { if (this.playing && this.current === id) this.start(id); }, ClipQueue.RETRY_MS * tries);\n }\n\n private drop(id: number) {\n this.onWaiting(null);\n this.onStarting(null);\n this.retries.delete(id);\n this.startingSince.delete(id);\n this.clips.delete(id);\n this.order = [...this.clips.keys()].sort((a, b) => this.rank(a) - this.rank(b));\n if (this.current !== id) return;\n this.finishLine(id);\n if (!this.playing) { this.onSentence(null); return; }\n this.follow();\n }\n\n position(): { sentenceId: number; t: number; dur: number } | null {\n const el = this.el;\n if (!el || this.current == null || el.ended) return null;\n const known = Number.isFinite(el.duration) && el.duration > 0 ? el.duration : 0;\n const line = this.clips.get(this.current);\n const piece = known || line?.got.get(this.currentPart)?.durationS || 0;\n let total = 0;\n if (line) for (const [i, c] of line.got) total += (i === this.currentPart ? piece : c.durationS) || 0;\n return { sentenceId: this.current, t: this.partBase + el.currentTime, dur: total || piece };\n }\n\n private element(): HTMLMediaElement {\n if (this.el) return this.el;\n const el = newMediaElement();\n el.preload = 'auto';\n const tagged = el as HTMLMediaElement & { dataset?: DOMStringMap };\n if (tagged.dataset) tagged.dataset.vsVoice = '1';\n (el as HTMLMediaElement & { playsInline?: boolean }).playsInline = true;\n el.onplaying = () => {\n this.onWaiting(null);\n this.onStarting(null);\n if (this.current != null) this.startingSince.delete(this.current);\n if (this.current == null) return;\n this.retries.delete(this.current);\n this.warm(this.current);\n };\n el.onended = () => {\n this.loading = null;\n if (!this.playing) return;\n const id = this.current;\n const line = id == null ? null : this.clips.get(id);\n if (id != null && line) {\n this.partBase += Number.isFinite(el.duration) && el.duration > 0\n ? el.duration\n : line.got.get(this.currentPart)?.durationS ?? 0;\n const next = this.currentPart + 1;\n if (next < line.total) { this.startPart(id, next); return; }\n this.finishLine(id);\n }\n this.follow();\n };\n el.onerror = () => { if (this.loading != null && el.error) this.failed(this.loading, el.error); };\n this.el = el;\n return el;\n }\n\n resync() {\n let dropped = false;\n for (const id of [...this.clips.keys()]) {\n if (this.speakable(id)) continue;\n this.clips.delete(id);\n dropped = true;\n }\n if (!dropped) return;\n this.order = [...this.clips.keys()].sort((a, b) => this.rank(a) - this.rank(b));\n if (this.awaiting && !this.speakable(this.awaiting.id)) {\n const w = this.awaiting.id;\n this.stopWaiting();\n this.finishLine(w);\n this.onWaiting(null);\n if (this.playing) this.follow();\n }\n const cur = this.current;\n if (cur == null || this.clips.has(cur)) return;\n this.el?.pause();\n this.finishLine(cur);\n if (this.playing) { this.follow(); return; }\n this.onSentence(null);\n }\n\n clear() {\n this.clearRest();\n this.el?.pause();\n this.loading = null;\n this.clips.clear();\n this.order = [];\n this.current = null;\n this.currentPart = 0;\n this.partBase = 0;\n this.stopWaiting();\n this.prefetch.clear();\n this.onWaiting(null);\n this.onSentence(null);\n }\n\n stop() {\n this.clearRest();\n this.lastDone = null;\n const el = this.el;\n this.onWaiting(null);\n this.onStarting(null);\n this.playing = false;\n this.current = null;\n this.currentPart = 0;\n this.partBase = 0;\n this.loading = null;\n this.floor = 0;\n this.lastRead = null;\n this.started = false;\n this.stopWaiting();\n this.spoken.clear();\n if (this.retryTimer) { clearTimeout(this.retryTimer); this.retryTimer = null; }\n this.retries.clear();\n this.prefetch.clear();\n if (el) { el.pause(); el.removeAttribute('src'); el.load(); }\n this.el = null;\n }\n}\n","import { credParams, deliveryFormat, type MediaCred } from './audio';\nimport type { VoiceClip } from './clipQueue';\n\nexport { ClipQueue, VoiceNotStarted, mediaKind, newMediaElement, type VoiceClip } from './clipQueue';\n\nexport function clipOf(f: any, apiOrigin: string, listenerToken?: string | null): VoiceClip | null {\n if (!f || f.type !== 'transcript.voice' || typeof f.sentenceId !== 'number') return null;\n let src: string | null = null;\n if (typeof f.url === 'string' && f.url) {\n const extra = [deliveryFormat() === 'caf' ? 'format=caf' : '', listenerToken ? `listenerToken=${encodeURIComponent(listenerToken)}` : ''].filter(Boolean).join('&');\n src = `${apiOrigin}${f.url}${extra ? `${f.url.includes('?') ? '&' : '?'}${extra}` : ''}`;\n } else if (typeof f.audio === 'string' && f.audio) {\n src = `data:audio/ogg;base64,${f.audio}`;\n }\n if (!src) return null;\n const part = Number(f.part ?? 0);\n return {\n sentenceId: f.sentenceId,\n lang: String(f.lang ?? ''),\n src,\n durationS: Number(f.durationS ?? 0),\n voice: f.voice ?? null,\n cloned: !!f.cloned,\n generation: typeof f.generation === 'number' ? f.generation : undefined,\n part: Number.isFinite(part) ? part : 0,\n parts: Math.max(1, Number(f.parts ?? 1) || 1),\n };\n}\n\nexport interface VoiceTrackRow {\n lang: string;\n voiceKey: string;\n state: string;\n durationS?: number | null;\n error?: string | null;\n clips: number[];\n voice?: string | null;\n wordTimes?: Record<string, [number, number][]>;\n clipRev?: Record<string, string>;\n clipDur?: Record<string, number>;\n clipParts?: Record<string, number>;\n}\n\nexport function rowForVoice(rows: VoiceTrackRow[], voiceId: string | null): VoiceTrackRow | null {\n if (voiceId == null) return rows.find((r) => !r.voiceKey) ?? null;\n return rows.find((r) => r.voiceKey === voiceId) ?? rows.find((r) => !r.voiceKey && r.voice === voiceId) ?? null;\n}\n\nexport function archiveClips(row: VoiceTrackRow | null | undefined, recordingId: string, apiOrigin: string, cred: MediaCred = {}, sentenceIds?: number[]): VoiceClip[] {\n if (!row) return [];\n const ids = sentenceIds?.length ? sentenceIds : row.clips;\n if (!ids?.length) return [];\n const cp = credParams(cred);\n const tk = cp ? `&${cp}` : '';\n const vk = row.voiceKey ? `&voice=${encodeURIComponent(row.voiceKey)}` : '';\n return ids.flatMap((sentenceId) => {\n const rev = row.clipRev?.[String(sentenceId)];\n const parts = Math.max(1, row.clipParts?.[String(sentenceId)] ?? 1);\n return Array.from({ length: parts }, (_, part) => ({\n sentenceId,\n lang: row.lang,\n src: `${apiOrigin}/v1/recordings/${recordingId}/voice/${sentenceId}?lang=${encodeURIComponent(row.lang)}${vk}&format=${deliveryFormat()}${part > 0 ? `&part=${part}` : ''}${rev ? `&v=${encodeURIComponent(rev)}` : ''}${tk}`,\n durationS: parts === 1 ? row.clipDur?.[String(sentenceId)] ?? 0 : 0,\n voice: row.voice ?? null,\n cloned: false,\n part,\n parts,\n }));\n });\n}\n\nexport interface ReadToken { t: string; sp: string }\n\nconst CJK = /[぀-ヿ㐀-䶿一-鿿豈-﫿가-힯]/;\n\nexport function readTokens(text: string): ReadToken[] {\n const out: ReadToken[] = [];\n let buf = '';\n let lead = '';\n const push = (t: string) => { out.push({ t: lead + t, sp: '' }); lead = ''; };\n const flush = (sp: string) => {\n if (buf && out.length && !/[\\p{L}\\p{N}]/u.test(buf)) { out[out.length - 1].sp += buf + sp; buf = ''; return; }\n if (buf) { push(buf); buf = ''; out[out.length - 1].sp = sp; }\n else if (sp) { if (out.length) out[out.length - 1].sp += sp; else lead += sp; }\n };\n for (const ch of text) {\n if (/\\s/.test(ch)) { flush(ch); continue; }\n if (CJK.test(ch)) { flush(''); push(ch); continue; }\n buf += ch;\n }\n flush('');\n return out;\n}\n\nexport interface ReadPos { t: number; dur: number; words?: [number, number][] | null }\n\nexport function readCursor(tokens: ReadToken[], pos: ReadPos): number | null {\n const w = pos.words;\n if (w && w.length === tokens.length && tokens.length > 0) {\n let at = 0;\n for (let i = 0; i < w.length; i++) if (pos.t >= w[i][0]) at = i; else break;\n return at;\n }\n if (!(pos.dur > 0)) return null;\n return tokenAt(tokens, pos.t, pos.dur);\n}\n\nexport function tokenAt(tokens: ReadToken[], pos: number, dur: number): number {\n if (tokens.length <= 1 || !(dur > 0)) return 0;\n const w = tokens.map((k) => k.t.length + 1.6);\n const total = w.reduce((a, b) => a + b, 0);\n let acc = 0;\n const want = Math.max(0, Math.min(1, pos / dur)) * total;\n for (let i = 0; i < w.length; i++) {\n acc += w[i];\n if (want < acc) return i;\n }\n return tokens.length - 1;\n}\n","import { useEffect, useState } from 'react';\nimport type { LanguageLists } from '@vocalstack/js-sdk';\n\nconst RECENT = 'vs.recentLangs';\nconst subs = new Set<() => void>();\n\nfunction read<T>(key: string, fallback: T): T {\n try {\n const raw = localStorage.getItem(key);\n return raw === null ? fallback : (JSON.parse(raw) as T);\n } catch {\n return fallback;\n }\n}\n\nfunction write(key: string, value: unknown) {\n try {\n if (value == null) localStorage.removeItem(key);\n else localStorage.setItem(key, JSON.stringify(value));\n } catch { }\n for (const s of subs) s();\n}\n\nexport function useStored<T>(key: string, fallback: T): [T, (v: T) => void] {\n const [v, setV] = useState<T>(() => read(key, fallback));\n useEffect(() => {\n const on = () => setV(read(key, fallback));\n subs.add(on);\n window.addEventListener('storage', on);\n return () => { subs.delete(on); window.removeEventListener('storage', on); };\n }, [key]); // eslint-disable-line react-hooks/exhaustive-deps\n return [v, (x: T) => { setV(x); write(key, x); }];\n}\n\nexport function forgetRecentLang(code: string) {\n const list = read<string[]>(RECENT, []);\n write(RECENT, Array.isArray(list) ? list.filter((c) => c !== code) : []);\n}\n\nexport function useRecentLangs(): [string[], (code: string | null) => void] {\n const [list, set] = useStored<string[]>(RECENT, []);\n const safe = Array.isArray(list) ? list : [];\n return [safe, (code: string | null) => { if (code) set([code, ...safe.filter((c) => c !== code)].slice(0, 3)); }];\n}\n\nexport function pickerLanguages(langs: LanguageLists | null, kind: 'transcription' | 'translation' | 'voice') {\n if (!langs) return [];\n const allowed = new Set(langs[kind]);\n return langs.languages.filter((l) => allowed.has(l.code)).map((l) => ({ code: l.code, label: l.name, native: l.native, flag: l.flag ?? '🌐', voice: !!l.voice }));\n}\n\nexport function useSidePins(id: string): [string[], (v: string[]) => void] {\n const [pins, setPins] = useStored<string[] | null>(`vs.pins.${id}`, null);\n return [Array.isArray(pins) ? pins : [], setPins];\n}\n\nexport const COL_W = 352;\nexport function useColW(id: string): [number, (v: number | null) => void] {\n const [w, set] = useStored<number | null>(id === 'ga' ? 'vs.colW.ga' : 'vs.colW', null);\n return [typeof w === 'number' && w > 0 ? w : id === 'ga' ? 560 : COL_W, set];\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { Sheet } from './Controls';\nimport { D, Icon, Spinner } from './Icons';\nimport { forgetRecentLang } from '../data/prefs';\n\nexport interface PickerLanguage {\n code: string;\n label: string;\n native: string;\n flag: string;\n voice?: boolean;\n live?: boolean;\n}\n\nexport interface LanguageListProps { value: string | null; onSelect: (code: string | null) => void; languages: PickerLanguage[]; searchPlaceholder?: string; none?: string; pinned?: string[]; recent?: string[]; requireVoice?: boolean; keepOpen?: boolean; busy?: string | null }\n\nexport function useLanguageList({ open, onClose, value, onSelect, languages, searchPlaceholder = 'Search languages', none, pinned = [], recent = [], requireVoice, keepOpen, busy }: LanguageListProps & { open: boolean; onClose: () => void }) {\n const [q, setQ] = useState('');\n const [showAll, setShowAll] = useState(false);\n const [refused, setRefused] = useState<string | null>(null);\n useEffect(() => { if (open) { setQ(''); setShowAll(false); setRefused(null); } }, [open]);\n const filtered = useMemo(() => {\n const needle = q.trim().toLowerCase();\n const list = needle\n ? languages.filter((l) => l.label.toLowerCase().includes(needle) || l.native.toLowerCase().includes(needle) || l.code.toLowerCase().includes(needle))\n : languages;\n const ordered = [...list].sort((a, b) => {\n const pa = pinned.indexOf(a.code), pb = pinned.indexOf(b.code);\n if (pa !== -1 || pb !== -1) return (pa === -1 ? 999 : pa) - (pb === -1 ? 999 : pb);\n return a.label.localeCompare(b.label);\n });\n return ordered;\n }, [languages, q, pinned]);\n const recents = useMemo(\n () => (q ? [] : recent.map((c) => filtered.find((l) => l.code === c)).filter((l): l is PickerLanguage => !!l).sort((a, b) => a.label.localeCompare(b.label))),\n [recent, filtered, q],\n );\n const rest = useMemo(() => (recents.length ? filtered.filter((l) => !recents.some((r) => r.code === l.code)) : filtered), [filtered, recents]);\n const cut = showAll || q ? rest.length : 12;\n const shown = rest;\n const more = rest.length - Math.min(cut, rest.length);\n const row = (l: PickerLanguage, inRecent = false, extra = false) => {\n const off = !!requireVoice && !l.voice;\n return (\n <button\n key={l.code}\n type=\"button\"\n className={`vs-picker__row${off ? ' vs-picker__row--off' : ''}${extra ? ' vs-picker__row--extra' : ''}`}\n aria-selected={value === l.code}\n onClick={() => { if (off) { setRefused(l.code); return; } onSelect(l.code); if (!keepOpen) onClose(); }}\n >\n <span className=\"vs-picker__flag\">{l.flag}</span>\n <span style={{ flex: 1, minWidth: 0 }}>\n <div className=\"vs-picker__label\">{l.label}</div>\n <div className=\"vs-picker__native\">{l.native}</div>\n </span>\n <span className=\"vs-picker__slot\">\n {inRecent && (\n <span className=\"vs-picker__forget\" role=\"button\" tabIndex={0} title={`Remove ${l.label} from recent`} aria-label={`Remove ${l.label} from recent`} onClick={(e) => { e.stopPropagation(); forgetRecentLang(l.code); }} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); e.stopPropagation(); forgetRecentLang(l.code); } }}>\n <Icon d={D.close} size={16} />\n </span>\n )}\n </span>\n <span className={`vs-picker__slot${off ? ' vs-picker__slot--wide' : ''}`} title={l.voice ? 'Voice available' : off ? 'No voice speaks this language yet' : undefined}>\n {off\n ? refused === l.code && <span className=\"vs-picker__off\">UNAVAILABLE</span>\n : l.voice && <Icon d={D.headphones} size={16} />}\n </span>\n <span className=\"vs-picker__check\">{value === l.code && (busy === l.code ? <Spinner size={15} color=\"var(--vs-link-hover)\" track=\"var(--vs-border)\" /> : <Icon d={D.check} size={16} sw={2.2} />)}</span>\n </button>\n );\n };\n const search = (\n <div className=\"vs-picker__search\">\n <Icon d={D.search} size={16} sw={1.7} style={{ color: 'var(--vs-text-muted)' }} />\n <input value={q} onChange={(e) => setQ(e.target.value)} placeholder={searchPlaceholder} aria-label={searchPlaceholder} />\n </div>\n );\n const list = (\n <div className=\"vs-picker__list\">\n {none && !q && (\n <button type=\"button\" className=\"vs-picker__row\" data-vs-original=\"\" aria-selected={value === null} onClick={() => { onSelect(null); if (!keepOpen) onClose(); }}>\n <span className=\"vs-picker__flag\"><Icon d={D.mic} size={19} sw={1.6} style={{ color: 'var(--vs-text-muted)' }} /></span>\n <span style={{ flex: 1, minWidth: 0 }}>\n <div className=\"vs-picker__label\">{none}</div>\n <div className=\"vs-picker__native\">As spoken · no translation</div>\n </span>\n <span className=\"vs-picker__slot\" />\n <span className=\"vs-picker__slot\" />\n <span className=\"vs-picker__check\">{value === null && <Icon d={D.check} size={16} sw={2.2} />}</span>\n </button>\n )}\n {recents.length > 0 && (\n <>\n <div className=\"vs-picker__head\">RECENT</div>\n {recents.map((l) => row(l, true))}\n <div className=\"vs-picker__rule\" />\n </>\n )}\n {shown.map((l, i) => row(l, false, i >= cut))}\n {more > 0 && (\n <button type=\"button\" className=\"vs-picker__more vs-picker__more--btn\" style={{ background: 'none', border: 0, cursor: 'pointer', width: '100%', textAlign: 'left' }} onClick={() => setShowAll(true)}>\n + {more} MORE LANGUAGES\n </button>\n )}\n {filtered.length === 0 && <div className=\"vs-picker__more\">No match for “{q}”</div>}\n </div>\n );\n return { search, list };\n}\n\nexport function LanguagePicker({ open, onClose, title, note, sticky, ...rest }: LanguageListProps & { open: boolean; onClose: () => void; title: string; note?: string; sticky?: boolean }) {\n const { search, list } = useLanguageList({ ...rest, open, onClose });\n return (\n <Sheet open={open} onClose={onClose} title={title} note={note} drawer={false} sticky={sticky} kind=\"picker\" header={search}>\n {list}\n </Sheet>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { PlayGlyph } from '../ds/Icons';\n\nexport type FollowSetup = (v: HTMLVideoElement, fail: () => void) => (() => void) | void;\n\nexport function FileFollow({ src, setup, t, playing, seekN, onToggle, seekOver = 0.4 }: { src?: string; setup?: FollowSetup; t: number; playing: boolean; seekN: number; onToggle?: () => void; seekOver?: number }) {\n const ref = useRef<HTMLVideoElement>(null);\n const [ready, setReady] = useState(false);\n const [gone, setGone] = useState(false);\n const tRef = useRef(t); tRef.current = t;\n useEffect(() => { setReady(false); setGone(false); }, [src, setup]);\n useEffect(() => {\n const v = ref.current;\n if (!v || !setup) return;\n return setup(v, () => setGone(true)) ?? undefined;\n }, [setup]);\n useEffect(() => {\n const v = ref.current;\n if (!v || !ready) return;\n if (playing) v.play().catch(() => {}); else v.pause();\n }, [playing, ready]);\n useEffect(() => {\n const v = ref.current;\n if (!v || !ready) return;\n const want = Math.max(0, tRef.current);\n if (Math.abs(v.currentTime - want) > (playing ? seekOver : 0.08)) v.currentTime = want;\n }, [t, seekN, ready, playing]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n const v = ref.current;\n if (!v || !ready || !playing) return;\n const h = setInterval(() => {\n if (v.seeking) return;\n const d = v.currentTime - tRef.current;\n if (Math.abs(d) > seekOver) v.currentTime = Math.max(0, tRef.current);\n else v.playbackRate = Math.abs(d) < 0.03 ? 1 : Math.min(1.1, Math.max(0.9, 1 - 0.5 * d));\n }, 250);\n return () => { clearInterval(h); v.playbackRate = 1; };\n }, [ready, playing, seekOver]);\n if (gone) return null;\n return (\n <div className=\"txyt vsp-follow\" style={ready ? { background: '#000' } : undefined}>\n <video\n ref={ref}\n className=\"vsp-file\"\n style={{ opacity: ready ? 1 : 0 }}\n src={src}\n muted\n playsInline\n preload=\"auto\"\n disablePictureInPicture\n onLoadedData={() => setReady(true)}\n onError={() => { if (src) setGone(true); }}\n aria-hidden=\"true\"\n />\n {ready && <div aria-hidden=\"true\" className=\"txyt__tap\" onClick={onToggle} style={{ cursor: onToggle ? 'pointer' : 'default' }} />}\n {ready && <div className={`txyt__paused${!playing ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div>}\n </div>\n );\n}\n","export type SiteId = 'youtube' | 'loom' | 'vimeo' | 'twitch' | 'facebook' | 'instagram' | 'dailymotion' | 'tiktok' | 'x' | 'soundcloud' | 'kick' | 'mixcloud' | 'bandcamp' | 'streamable' | 'ted' | 'linkedin' | 'archive' | 'odysee' | 'niconico' | 'vk' | 'bitchute' | 'wistia' | 'vidyard' | 'kaltura' | 'jwplayer' | 'pinterest' | 'bluesky' | 'gdrive' | 'spreaker' | 'iheart' | 'audioboom' | 'cnn';\n\nexport interface Site {\n id: SiteId;\n name: string;\n color: string;\n hosts: RegExp;\n glyph: string;\n audioOnly?: boolean;\n}\n\nexport const SITES: Site[] = [\n { id: 'youtube', name: 'YouTube', color: '#ff3b30', hosts: /(^|\\.)(youtube\\.com|youtu\\.be|youtube-nocookie\\.com)$/, glyph: 'M21.6 7.2a2.7 2.7 0 0 0-1.9-1.9C18 4.8 12 4.8 12 4.8s-6 0-7.7.5a2.7 2.7 0 0 0-1.9 1.9C2 8.9 2 12 2 12s0 3.1.4 4.8a2.7 2.7 0 0 0 1.9 1.9c1.7.5 7.7.5 7.7.5s6 0 7.7-.5a2.7 2.7 0 0 0 1.9-1.9c.4-1.7.4-4.8.4-4.8s0-3.1-.4-4.8ZM10 15.1V8.9l5.3 3.1L10 15.1Z' },\n { id: 'loom', name: 'Loom', color: '#8f7bff', hosts: /(^|\\.)loom\\.com$/, glyph: 'M21 11h-5.2l4.5-2.6-1-1.7-4.5 2.6 2.6-4.5-1.7-1-2.6 4.5V3h-2v5.3L8.5 3.8l-1.7 1 2.6 4.5-4.5-2.6-1 1.7L8.2 11H3v2h5.2l-4.5 2.6 1 1.7 4.5-2.6-2.6 4.5 1.7 1 2.6-4.5V21h2v-5.2l2.6 4.5 1.7-1-2.6-4.5 4.5 2.6 1-1.7-4.5-2.6H21v-2Zm-9 3.4a2.4 2.4 0 1 1 0-4.8 2.4 2.4 0 0 1 0 4.8Z' },\n { id: 'vimeo', name: 'Vimeo', color: '#1ab7ea', hosts: /(^|\\.)vimeo\\.com$/, glyph: 'M22 7.4c-.1 2-1.5 4.7-4.2 8.1-2.8 3.6-5.1 5.4-7 5.4-1.2 0-2.2-1.1-3-3.3L6.2 11.6C5.6 9.4 5 8.3 4.3 8.3c-.1 0-.6.3-1.4.9L2 8l2.7-2.4C5.9 4.6 6.8 4 7.4 4c1.4-.1 2.3.9 2.6 2.9.4 2.2.6 3.6.8 4.1.4 1.8.9 2.7 1.4 2.7.4 0 1-.6 1.8-1.9.8-1.2 1.2-2.2 1.3-2.8.1-1.1-.3-1.6-1.3-1.6-.5 0-.9.1-1.4.3.9-3 2.7-4.5 5.3-4.4 1.9.1 2.8 1.3 2.7 3.7Z' },\n { id: 'twitch', name: 'Twitch', color: '#a970ff', hosts: /(^|\\.)twitch\\.tv$/, glyph: 'M5 2.5 3 6.5v13h4.5V22H10l2.5-2.5h3.8L21 14.8V2.5H5Zm14 11.4-2.9 2.9h-4.3L9.4 19.2v-2.4H6V4.5h13v9.4ZM15.2 7.4h1.9v5.2h-1.9V7.4Zm-5 0h1.9v5.2h-1.9V7.4Z' },\n { id: 'facebook', name: 'Facebook', color: '#3b82f6', hosts: /(^|\\.)(facebook\\.com|fb\\.watch|fb\\.com)$/, glyph: 'M13.9 21.5v-8h2.7l.4-3.1h-3.1V8.4c0-.9.3-1.5 1.6-1.5H17V4.1c-.3 0-1.3-.1-2.4-.1-2.4 0-4 1.4-4 4.1v2.3H7.9v3.1h2.7v8h3.3Z' },\n { id: 'instagram', name: 'Instagram', color: '#f56aa0', hosts: /(^|\\.)instagram\\.com$/, glyph: 'M7.5 2.5h9a5 5 0 0 1 5 5v9a5 5 0 0 1-5 5h-9a5 5 0 0 1-5-5v-9a5 5 0 0 1 5-5Zm0 1.8a3.2 3.2 0 0 0-3.2 3.2v9a3.2 3.2 0 0 0 3.2 3.2h9a3.2 3.2 0 0 0 3.2-3.2v-9a3.2 3.2 0 0 0-3.2-3.2h-9ZM12 7.5a4.5 4.5 0 1 1 0 9 4.5 4.5 0 0 1 0-9Zm0 1.8a2.7 2.7 0 1 0 0 5.4 2.7 2.7 0 0 0 0-5.4Zm5.1-3.4a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z' },\n { id: 'dailymotion', name: 'Dailymotion', color: '#4aa3ff', hosts: /(^|\\.)(dailymotion\\.com|dai\\.ly)$/, glyph: 'M14.6 3.5h3.2V20h-3v-1.2a5.4 5.4 0 0 1-3.6 1.4c-3.3 0-5.9-2.7-5.9-6.1S7.9 8 11.2 8c1.3 0 2.5.4 3.4 1.2V3.5Zm-3.1 7.4a3.2 3.2 0 1 0 0 6.4 3.2 3.2 0 0 0 0-6.4Z' },\n { id: 'tiktok', name: 'TikTok', color: '#25f4ee', hosts: /(^|\\.)tiktok\\.com$/, glyph: 'M16.6 2.5c.3 2.3 1.7 3.8 3.9 4v2.7a6.8 6.8 0 0 1-3.9-1.3v6.5a5.7 5.7 0 1 1-5.7-5.7l.9.1v2.8a2.9 2.9 0 1 0 2 2.8V2.5h2.8Z' },\n { id: 'x', name: 'X', color: '#e8eaf2', hosts: /(^|\\.)(x\\.com|twitter\\.com)$/, glyph: 'M17.8 3h3.1l-6.7 7.7L22 21h-6.2l-4.8-6.3L5.5 21H2.4l7.2-8.2L2.1 3h6.3l4.4 5.8L17.8 3Zm-1.1 16.2h1.7L7.4 4.7H5.6l11.1 14.5Z' },\n { id: 'soundcloud', name: 'SoundCloud', color: '#ff7a1a', hosts: /(^|\\.)soundcloud\\.com$/, audioOnly: true, glyph: 'M11 8.6a5 5 0 0 1 7.8 3.1 3 3 0 0 1-.3 6H11V8.6ZM8.6 9.4h1.3v8.3H8.6V9.4Zm-2.4 1.2h1.3v7.1H6.2v-7.1Zm-2.4 1.6h1.3v5.5H3.8v-5.5Zm-2.4 1.6h1.3v3.9H1.4v-3.9Z' },\n { id: 'kick', name: 'Kick', color: '#53fc18', hosts: /(^|\\.)kick\\.com$/, glyph: 'M4 3h5.5v5H11V6h2V3h5.5v6.5h-2V11h-2v2h2v1.5h2V21H13v-3h-2v-2H9.5v5H4V3Z' },\n { id: 'mixcloud', name: 'Mixcloud', color: '#7f8cff', hosts: /(^|\\.)mixcloud\\.com$/, audioOnly: true, glyph: 'M17.5 9.5a5.5 5.5 0 0 0-10.6 1.2A3.8 3.8 0 0 0 7.3 18h10.2a4.25 4.25 0 0 0 0-8.5Z' },\n { id: 'streamable', name: 'Streamable', color: '#0f90fa', hosts: /(^|\\.)streamable\\.com$/, glyph: 'M4 6.5A2.5 2.5 0 0 1 6.5 4h11A2.5 2.5 0 0 1 20 6.5v11a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 4 17.5v-11Zm6 2.3v6.4l5.2-3.2L10 8.8Z' },\n { id: 'bandcamp', name: 'Bandcamp', color: '#1da0c3', hosts: /(^|\\.)bandcamp\\.com$/, audioOnly: true, glyph: 'M2 18 8.5 6H22l-6.5 12H2Z' },\n { id: 'ted', name: 'TED', color: '#e62b1e', hosts: /(^|\\.)ted\\.com$/, glyph: 'M2 6h6.5v2.3H6.4V18H4V8.3H2V6Zm7.5 0h5.3v2.3h-2.9v2.6h2.6v2.3h-2.6v2.5h2.9V18H9.5V6Zm6.4 0h2.3A3.8 3.8 0 0 1 22 9.8v4.4a3.8 3.8 0 0 1-3.8 3.8h-2.3V6Zm2.4 2.3v7.4c.9 0 1.4-.7 1.4-1.6v-4.2c0-.9-.5-1.6-1.4-1.6Z' },\n { id: 'linkedin', name: 'LinkedIn', color: '#0a66c2', hosts: /(^|\\.)linkedin\\.com$/, glyph: 'M5 3.5a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5ZM3 9.5h4V21H3V9.5Zm6.5 0h3.8v1.6h.1c.5-1 1.8-2 3.8-2 4 0 4.8 2.6 4.8 6V21h-4v-5.2c0-1.2 0-2.8-1.7-2.8s-2 1.3-2 2.7V21h-4V9.5Z' },\n { id: 'archive', name: 'Internet Archive', color: '#c8c8c8', hosts: /(^|\\.)archive\\.org$/, glyph: 'M3 19h18v2H3v-2Zm1-2h16v1.2H4V17Zm1.5-9h2v8h-2V8Zm5.5 0h2v8h-2V8Zm5.5 0h2v8h-2V8ZM3 5.5 12 3l9 2.5V7H3V5.5Z' },\n { id: 'odysee', name: 'Odysee', color: '#ef1970', hosts: /(^|\\.)(odysee\\.com|lbry\\.tv)$/, glyph: 'M12 3a9 9 0 1 1 0 18 9 9 0 0 1 0-18Zm0 4a5 5 0 1 0 0 10 5 5 0 0 0 0-10Z' },\n { id: 'niconico', name: 'Niconico', color: '#e6e6e6', hosts: /(^|\\.)(nicovideo\\.jp|nico\\.ms)$/, glyph: 'M4 8h16a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2Zm3.5-5L11 7H9.3L6.5 4.2 7.5 3Zm9 0 1 1.2L14.7 7H13l3.5-4Z' },\n { id: 'vk', name: 'VK', color: '#0077ff', hosts: /(^|\\.)(vk\\.com|vkvideo\\.ru)$/, glyph: 'M12.8 17.5c-5.5 0-8.6-3.8-8.8-10h2.8c.1 4.6 2.1 6.5 3.7 6.9V7.5h2.6v3.9c1.6-.2 3.3-2 3.8-3.9h2.6c-.4 2.4-2.2 4.2-3.4 4.9 1.3.6 3.3 2.1 4.1 5.1h-2.9c-.6-1.9-2.2-3.4-4.2-3.6v3.6h-.3Z' },\n { id: 'bitchute', name: 'BitChute', color: '#ef4137', hosts: /(^|\\.)bitchute\\.com$/, glyph: 'M12 3a9 9 0 1 1 0 18 9 9 0 0 1 0-18Zm-2 5.5v7l6-3.5-6-3.5Z' },\n { id: 'wistia', name: 'Wistia', color: '#54bbff', hosts: /(^|\\.)(wistia\\.com|wistia\\.net|wi\\.st)$/, glyph: 'M3 7h13l-2.5 4H3V7Zm0 6h15.5L21 9v4.5L18.5 17H3v-4Z' },\n { id: 'vidyard', name: 'Vidyard', color: '#38c172', hosts: /(^|\\.)vidyard\\.com$/, glyph: 'M3 5h4l5 9 5-9h4l-9 15L3 5Z' },\n { id: 'kaltura', name: 'Kaltura', color: '#00a8e1', hosts: /(^|\\.)kaltura\\.com$/, glyph: 'M5 4h3v7l6-7h4l-6.5 7.3L18.5 20h-4l-5-6.4L8 15.3V20H5V4Z' },\n { id: 'jwplayer', name: 'JW Player', color: '#ff0046', hosts: /(^|\\.)(jwplayer\\.com|jwplatform\\.com)$/, glyph: 'M6 5h3v9.5a4 4 0 0 1-4 4H4v-2.8h1c.6 0 1-.5 1-1.2V5Zm5 0h3l1.5 7L17 5h3l-3 13h-3l-1.5-6.5L11.9 18H9.5L11 5Z' },\n { id: 'pinterest', name: 'Pinterest', color: '#e60023', hosts: /(^|\\.)(pinterest\\.[a-z.]+|pin\\.it)$/, glyph: 'M12 2.5a9.5 9.5 0 0 0-3.5 18.3c-.1-.8-.2-2 0-2.9l1.3-5.4s-.3-.7-.3-1.6c0-1.5.9-2.7 2-2.7.9 0 1.4.7 1.4 1.6 0 1-.6 2.4-.9 3.7-.3 1.1.6 2 1.7 2 2 0 3.5-2.1 3.5-5.2 0-2.7-2-4.6-4.8-4.6-3.3 0-5.2 2.5-5.2 5 0 1 .4 2.1.9 2.7l.1.4-.3 1.3c0 .2-.2.3-.4.2-1.4-.7-2.3-2.7-2.3-4.4 0-3.6 2.6-6.9 7.5-6.9 3.9 0 7 2.8 7 6.6 0 3.9-2.5 7.1-5.9 7.1-1.2 0-2.2-.6-2.6-1.3l-.7 2.7c-.3 1-.9 2.2-1.4 2.9A9.5 9.5 0 1 0 12 2.5Z' },\n { id: 'bluesky', name: 'Bluesky', color: '#1185fe', hosts: /(^|\\.)bsky\\.app$/, glyph: 'M6.3 4.4c2.3 1.7 4.7 5.2 5.7 7 1-1.8 3.4-5.3 5.7-7 1.6-1.2 4.3-2.2 4.3.9 0 .6-.4 5.2-.6 5.9-.7 2.6-3.3 3.2-5.6 2.8 4 .7 5 2.9 2.8 5.2-4.2 4.3-6-1.1-6.5-2.5l-.1-.4-.1.4c-.5 1.4-2.3 6.8-6.5 2.5-2.2-2.3-1.2-4.5 2.8-5.2-2.3.4-4.9-.2-5.6-2.8C2.4 10.5 2 5.9 2 5.3c0-3.1 2.7-2.1 4.3-.9Z' },\n { id: 'gdrive', name: 'Google Drive', color: '#34a853', hosts: /^drive\\.google\\.com$/, glyph: 'M8.2 3h7.6l6.2 10.8-3.8 6.6H5.8L2 13.8 8.2 3Zm1.2 2L5 12.6h4.4L13.8 5H9.4Zm6.4 1.2-2.2 3.8 4 6.8 2.2-3.8-4-6.8ZM4.4 14.6l2.2 3.8h8.8l2.2-3.8H4.4Z' },\n { id: 'spreaker', name: 'Spreaker', color: '#f5c300', hosts: /(^|\\.)spreaker\\.com$/, audioOnly: true, glyph: 'M12 9a3 3 0 1 1 0 6 3 3 0 0 1 0-6ZM6.3 6.3l1.4 1.4a6 6 0 0 0 0 8.6l-1.4 1.4a8 8 0 0 1 0-11.4Zm11.4 0a8 8 0 0 1 0 11.4l-1.4-1.4a6 6 0 0 0 0-8.6l1.4-1.4Z' },\n { id: 'iheart', name: 'iHeartRadio', color: '#c6002b', hosts: /(^|\\.)iheart\\.com$/, audioOnly: true, glyph: 'M12 21s-7.5-4.6-9.4-9.4C1.2 8 3.4 4 7.3 4c2 0 3.6 1.1 4.7 2.6C13.1 5.1 14.7 4 16.7 4c3.9 0 6.1 4 4.7 7.6C19.5 16.4 12 21 12 21Z' },\n { id: 'audioboom', name: 'Audioboom', color: '#1ea2e0', hosts: /(^|\\.)audioboom\\.com$/, audioOnly: true, glyph: 'M12 3a9 9 0 1 1 0 18 9 9 0 0 1 0-18Zm-4 6v6h2V9H8Zm3-2v10h2V7h-2Zm3 3v4h2v-4h-2Z' },\n { id: 'cnn', name: 'CNN', color: '#cc0000', hosts: /(^|\\.)cnn\\.com$/, glyph: 'M2 7h20v10H2V7Zm3.5 2.2a2.8 2.8 0 1 0 0 5.6h1.4v-1.6H5.6a1.2 1.2 0 1 1 0-2.4h1.3V9.2H5.5Zm3 0v5.6h1.6v-3.3l2.4 3.3H14V9.2h-1.6v3.3L10 9.2H8.5Zm6.2 0v5.6h1.6v-3.3l2.4 3.3h1.5V9.2h-1.6v3.3l-2.4-3.3h-1.5Z' },\n];\n\nconst BY_ID = new Map(SITES.map((s) => [s.id, s]));\n\nexport function siteById(id: string | null | undefined): Site | null {\n return id ? BY_ID.get(id as SiteId) ?? null : null;\n}\n\nexport function hostOfUrl(url: string | null | undefined): string | null {\n const raw = url?.trim();\n if (!raw) return null;\n try { return new URL(/^[a-z][a-z0-9+.-]*:\\/\\//i.test(raw) ? raw : `https://${raw}`).hostname.toLowerCase().replace(/^www\\./, ''); } catch { return null; }\n}\n\nexport function siteOf(url: string | null | undefined): Site | null {\n const host = hostOfUrl(url);\n if (!host) return null;\n return SITES.find((s) => s.hosts.test(host)) ?? null;\n}\n","import { siteOf } from './sites';\n\nexport interface EmbedAt { t: number; play: boolean; host?: string }\n\nfunction u(raw: string): URL | null {\n try { return new URL(/^[a-z][a-z0-9+.-]*:\\/\\//i.test(raw) ? raw : `https://${raw}`); } catch { return null; }\n}\n\nconst secs = (t: number) => Math.max(0, Math.floor(t));\n\nexport function loomId(raw: string): string | null {\n const m = /\\/(?:share|embed)\\/(?:[^/?#]*-)?([0-9a-f]{32})(?:[/?#]|$)/i.exec(u(raw)?.pathname ?? '');\n return m ? m[1].toLowerCase() : null;\n}\n\nexport function vimeoIds(raw: string): { id: string; h: string | null } | null {\n const x = u(raw);\n if (!x) return null;\n const parts = x.pathname.split('/').filter(Boolean);\n const at = parts.map((p, i) => (/^\\d+$/.test(p) ? i : -1)).filter((i) => i >= 0).pop();\n if (at == null) return null;\n const next = parts[at + 1];\n return { id: parts[at], h: x.searchParams.get('h') ?? (next && /^[0-9a-f]{6,}$/i.test(next) ? next : null) };\n}\n\nexport function dailymotionId(raw: string): string | null {\n const x = u(raw);\n if (!x) return null;\n if (/(^|\\.)dai\\.ly$/i.test(x.hostname)) return x.pathname.split('/').filter(Boolean)[0] ?? null;\n const m = /\\/video\\/([a-z0-9]+)/i.exec(x.pathname);\n return m ? m[1] : null;\n}\n\nexport function twitchTarget(raw: string): { video?: string; channel?: string; clip?: string } | null {\n const x = u(raw);\n if (!x) return null;\n const parts = x.pathname.split('/').filter(Boolean);\n if (/^clips\\.twitch\\.tv$/i.test(x.hostname)) return parts[0] ? { clip: parts[0] } : null;\n const v = parts.indexOf('videos');\n if (v >= 0 && parts[v + 1]) return { video: parts[v + 1].replace(/^v/, '') };\n const c = parts.indexOf('clip');\n if (c >= 0 && parts[c + 1]) return { clip: parts[c + 1] };\n return parts[0] ? { channel: parts[0] } : null;\n}\n\nconst hms = (t: number) => { const s = secs(t); return `${Math.floor(s / 3600)}h${Math.floor((s % 3600) / 60)}m${s % 60}s`; };\n\nexport function embedUrl(raw: string, at: EmbedAt): string | null {\n const site = siteOf(raw);\n if (!site) return null;\n const play = at.play ? 1 : 0;\n switch (site.id) {\n case 'loom': {\n const id = loomId(raw);\n if (!id) return null;\n const q = new URLSearchParams({ hide_owner: 'true', hide_share: 'true', hide_title: 'true', hideEmbedTopBar: 'true', hide_speed: 'true', muted: 'true', autoplay: at.play ? 'true' : 'false', t: String(secs(at.t)) });\n return `https://www.loom.com/embed/${id}?${q}`;\n }\n case 'vimeo': {\n const v = vimeoIds(raw);\n if (!v) return null;\n const q = new URLSearchParams({ autoplay: String(play), muted: '1', controls: '0', title: '0', byline: '0', portrait: '0', dnt: '1' });\n if (v.h) q.set('h', v.h);\n return `https://player.vimeo.com/video/${v.id}?${q}#t=${secs(at.t)}s`;\n }\n case 'dailymotion': {\n const id = dailymotionId(raw);\n if (!id) return null;\n const q = new URLSearchParams({ autoplay: String(play), mute: '1', controls: '0', 'queue-enable': '0', 'sharing-enable': '0', 'ui-start-screen-info': '0', start: String(secs(at.t)), api: 'postMessage' });\n return `https://www.dailymotion.com/embed/video/${id}?${q}`;\n }\n case 'twitch': {\n const tg = twitchTarget(raw);\n if (!tg || !at.host) return null;\n if (tg.clip) return `https://clips.twitch.tv/embed?${new URLSearchParams({ clip: tg.clip, parent: at.host, autoplay: String(!!at.play), muted: 'true' })}`;\n const q = new URLSearchParams({ parent: at.host, autoplay: String(!!at.play), muted: 'true' });\n if (tg.video) { q.set('video', `v${tg.video}`); q.set('time', hms(at.t)); } else if (tg.channel) q.set('channel', tg.channel);\n return `https://player.twitch.tv/?${q}`;\n }\n case 'facebook':\n return `https://www.facebook.com/plugins/video.php?${new URLSearchParams({ href: raw, autoplay: String(!!at.play), mute: '1', show_text: 'false', show_captions: 'false' })}`;\n case 'tiktok': {\n const m = /\\/video\\/(\\d+)/.exec(u(raw)?.pathname ?? '');\n return m ? `https://www.tiktok.com/embed/v2/${m[1]}?${new URLSearchParams({ autoplay: String(play), muted: '1', controls: '0' })}` : null;\n }\n case 'x': {\n const m = /\\/status(?:es)?\\/(\\d+)/.exec(u(raw)?.pathname ?? '');\n return m ? `https://platform.twitter.com/embed/Tweet.html?${new URLSearchParams({ id: m[1], theme: 'dark', dnt: 'true' })}` : null;\n }\n case 'instagram': {\n const m = /\\/(?:p|reel|reels|tv)\\/([\\w-]+)/.exec(u(raw)?.pathname ?? '');\n return m ? `https://www.instagram.com/p/${m[1]}/embed` : null;\n }\n case 'kick': {\n const name = u(raw)?.pathname.split('/').filter(Boolean)[0];\n return name ? `https://player.kick.com/${encodeURIComponent(name.toLowerCase())}?${new URLSearchParams({ autoplay: String(!!at.play), muted: 'true' })}` : null;\n }\n case 'ted': {\n const m = /\\/talks\\/([\\w-]+)/.exec(u(raw)?.pathname ?? '');\n return m ? `https://embed.ted.com/talks/${m[1]}` : null;\n }\n case 'wistia': {\n const x = u(raw);\n const m = /\\/(?:medias|embed\\/iframe|embed\\/medias)\\/([a-z0-9]+)/i.exec(x?.pathname ?? '') ?? (x && /(^|\\.)wi\\.st$/i.test(x.hostname) ? /\\/([a-z0-9]+)/i.exec(x.pathname) : null);\n return m ? `https://fast.wistia.net/embed/iframe/${m[1]}?${new URLSearchParams({ autoPlay: String(!!at.play), muted: 'true', playbar: 'false', controlsVisibleOnLoad: 'false', time: String(secs(at.t)) })}` : null;\n }\n case 'vidyard': {\n const m = /\\/(?:watch\\/)?([A-Za-z0-9_-]{16,})(?:\\.html)?\\/?$/.exec(u(raw)?.pathname ?? '');\n return m ? `https://play.vidyard.com/${m[1]}.html?${new URLSearchParams({ autoplay: String(play), muted: '1', hidden_controls: '1' })}` : null;\n }\n case 'archive': {\n const m = /\\/(?:details|embed)\\/([^/?#]+)/.exec(u(raw)?.pathname ?? '');\n return m ? `https://archive.org/embed/${m[1]}` : null;\n }\n case 'odysee': {\n const x = u(raw);\n const path = x?.pathname.replace(/^\\/\\$\\/embed\\//, '/').replace(/^\\//, '');\n return path && path.includes(':') ? `https://odysee.com/$/embed/${path}?${new URLSearchParams({ autoplay: 'false', t: String(secs(at.t)) })}` : null;\n }\n case 'bluesky': {\n const m = /\\/profile\\/([^/]+)\\/post\\/([^/?#]+)/.exec(u(raw)?.pathname ?? '');\n return m ? `https://embed.bsky.app/embed/${m[1]}/app.bsky.feed.post/${m[2]}` : null;\n }\n case 'gdrive': {\n const x = u(raw);\n const id = /\\/file\\/d\\/([\\w-]+)/.exec(x?.pathname ?? '')?.[1] ?? x?.searchParams.get('id');\n return id ? `https://drive.google.com/file/d/${id}/preview` : null;\n }\n case 'streamable': {\n const id = u(raw)?.pathname.split('/').filter(Boolean).pop();\n return id ? `https://streamable.com/e/${id}?${new URLSearchParams({ autoplay: String(play), muted: '1', nocontrols: '1' })}${at.t ? `#t=${secs(at.t)}` : ''}` : null;\n }\n default:\n return null;\n }\n}\n\nconst FOLLOWS = new Set(['loom', 'vimeo', 'dailymotion', 'twitch', 'facebook', 'tiktok', 'kick', 'streamable', 'wistia', 'vidyard']);\n\nexport function hasEmbed(raw: string | null | undefined): boolean {\n const site = siteOf(raw);\n return !!raw && !!site && FOLLOWS.has(site.id) && embedUrl(raw, { t: 0, play: false, host: 'localhost' }) != null;\n}\n\nexport function urlFromEmbed(site: string | null | undefined, id: string | null | undefined): string | null {\n const v = id?.trim();\n if (!site || !v) return null;\n switch (site) {\n case 'loom': return /^[0-9a-f]{32}$/i.test(v) ? `https://www.loom.com/share/${v}` : null;\n case 'vimeo': return /^\\d+(\\/[0-9a-z]+)?$/i.test(v) ? `https://vimeo.com/${v}` : null;\n case 'dailymotion': return /^[a-z0-9]+$/i.test(v) ? `https://www.dailymotion.com/video/${v}` : null;\n case 'youtube': return /^[\\w-]{6,}$/.test(v) ? `https://www.youtube.com/watch?v=${v}` : null;\n case 'tiktok': return /^\\d+$/.test(v) ? `https://www.tiktok.com/@_/video/${v}` : null;\n case 'x': return /^\\d+$/.test(v) ? `https://x.com/i/status/${v}` : null;\n case 'instagram': return /^[\\w-]+$/.test(v) ? `https://www.instagram.com/p/${v}/` : null;\n case 'kick': return v.startsWith('channel:') ? `https://kick.com/${encodeURIComponent(v.slice(8))}` : null;\n case 'streamable': return /^\\w+$/.test(v) ? `https://streamable.com/${v}` : null;\n case 'facebook': return /^\\d+$/.test(v) ? `https://www.facebook.com/watch/?v=${v}` : null;\n case 'ted': return /^[\\w-]+$/.test(v) ? `https://www.ted.com/talks/${v}` : null;\n case 'wistia': return /^[a-z0-9]+$/i.test(v) ? `https://fast.wistia.net/embed/iframe/${v}` : null;\n case 'vidyard': return /^[\\w-]{16,}$/.test(v) ? `https://play.vidyard.com/${v}.html` : null;\n case 'archive': return /^[^/?#\\s]+$/.test(v) ? `https://archive.org/details/${v}` : null;\n case 'odysee': return /^[^?#\\s]+:[^?#\\s]+$/.test(v) ? `https://odysee.com/${v}` : null;\n case 'bluesky': return /^[^/\\s]+\\/[^/\\s]+$/.test(v) ? `https://bsky.app/profile/${v.split('/')[0]}/post/${v.split('/')[1]}` : null;\n case 'gdrive': return /^[\\w-]+$/.test(v) ? `https://drive.google.com/file/d/${v}/view` : null;\n case 'twitch':\n if (/^v\\d+$/.test(v)) return `https://www.twitch.tv/videos/${v.slice(1)}`;\n if (v.startsWith('clip:')) return `https://clips.twitch.tv/${encodeURIComponent(v.slice(5))}`;\n if (v.startsWith('channel:')) return `https://www.twitch.tv/${encodeURIComponent(v.slice(8))}`;\n return null;\n default: return null;\n }\n}\n\nexport function sourceVideoUrl(src: { kind?: string; url?: string | null; site?: string | null; embedId?: string | null } | null | undefined): string | null {\n if (!src || src.kind !== 'url') return null;\n return urlFromEmbed(src.site, src.embedId) ?? src.url ?? null;\n}\n\nexport function wistiaId(raw: string): string | null {\n const x = u(raw);\n if (!x) return null;\n const m = /\\/(?:medias|embed\\/iframe|embed\\/medias)\\/([a-z0-9]+)/i.exec(x.pathname) ?? (/(^|\\.)wi\\.st$/i.test(x.hostname) ? /\\/([a-z0-9]+)/i.exec(x.pathname) : null);\n return m ? m[1] : null;\n}\n\nexport function vidyardId(raw: string): string | null {\n const m = /\\/(?:watch\\/)?([A-Za-z0-9_-]{16,})(?:\\.html)?\\/?$/.exec(u(raw)?.pathname ?? '');\n return m ? m[1] : null;\n}\n\nconst SIGNALS: Record<string, RegExp> = { dailymotion: /(^|\\.)dailymotion\\.com$/ };\n\nexport function embedSignal(raw: string | null | undefined): RegExp | null {\n const site = siteOf(raw);\n return site ? SIGNALS[site.id] ?? null : null;\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { embedSignal, embedUrl } from '../core/embeds';\nimport { PlayGlyph } from '../ds/Icons';\n\nexport function EmbedFollow({ url, t, playing, seekN, title, onToggle }: { url: string; t: number; playing: boolean; seekN: number; title: string; onToggle?: () => void }) {\n const tRef = useRef(t); tRef.current = t;\n const [ready, setReady] = useState(false);\n const host = typeof window !== 'undefined' ? window.location.hostname : 'localhost';\n const src = useMemo(() => embedUrl(url, { t: tRef.current, play: playing, host }), [url, playing, seekN, host]); // eslint-disable-line react-hooks/exhaustive-deps\n const [failed, setFailed] = useState(false);\n const heard = useRef(false);\n useEffect(() => {\n const sig = embedSignal(url);\n if (!sig) return;\n heard.current = false;\n setFailed(false);\n const onMsg = (e: MessageEvent) => { try { if (sig.test(new URL(e.origin).hostname)) heard.current = true; } catch { } };\n window.addEventListener('message', onMsg);\n const h = window.setTimeout(() => { if (!heard.current) setFailed(true); }, 8000);\n return () => { window.removeEventListener('message', onMsg); window.clearTimeout(h); };\n }, [url]);\n if (!src || failed) return null;\n return (\n <div className=\"txyt vsp-follow\" style={ready ? { background: '#000' } : undefined}>\n <iframe\n key={src}\n className=\"vsp-embed\"\n src={src}\n title={title}\n style={{ opacity: ready ? 1 : 0, pointerEvents: playing ? 'auto' : 'none' }}\n onLoad={() => setReady(true)}\n allow=\"autoplay; encrypted-media; picture-in-picture; fullscreen\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n {!playing && <div aria-hidden=\"true\" className=\"txyt__tap\" onClick={onToggle} style={{ cursor: onToggle ? 'pointer' : 'default' }} />}\n {ready && <div className={`txyt__paused${!playing ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div>}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { PlayGlyph } from '../ds/Icons';\n\ninterface FbPlayer { play(): void; pause(): void; seek(s: number): void; mute(): void; unmute(): void; setVolume(v: number): void; getCurrentPosition(): number }\ninterface FbSdk { init(o: object): void; XFBML: { parse(el?: Element): void }; Event: { subscribe(e: string, cb: (m: { type: string; id: string; instance: FbPlayer }) => void): void; unsubscribe(e: string, cb: unknown): void } }\ntype W = Window & { FB?: FbSdk; fbAsyncInit?: () => void };\n\nlet sdk: Promise<FbSdk | null> | null = null;\n\nfunction loadSdk(): Promise<FbSdk | null> {\n if (sdk) return sdk;\n sdk = new Promise((resolve) => {\n const w = window as W;\n if (w.FB) { resolve(w.FB); return; }\n const prev = w.fbAsyncInit;\n w.fbAsyncInit = () => { prev?.(); w.FB?.init({ xfbml: false, version: 'v19.0' }); resolve(w.FB ?? null); };\n const s = document.createElement('script');\n s.src = 'https://connect.facebook.net/en_US/sdk.js';\n s.async = true;\n s.crossOrigin = 'anonymous';\n s.onerror = () => resolve(null);\n document.body.appendChild(s);\n });\n return sdk;\n}\n\nlet seq = 0;\n\nexport function FacebookFollow({ url, t, playing, seekN, onToggle }: { url: string; t: number; playing: boolean; seekN: number; onToggle?: () => void }) {\n const box = useRef<HTMLDivElement>(null);\n const player = useRef<FbPlayer | null>(null);\n const tRef = useRef(t); tRef.current = t;\n const [ready, setReady] = useState(false);\n const [id] = useState(() => `vsp-fb-${++seq}`);\n useEffect(() => {\n let live = true;\n const el = box.current;\n if (!el) return;\n el.innerHTML = '';\n const host = document.createElement('div');\n host.className = 'fb-video';\n host.id = id;\n host.setAttribute('data-href', url);\n host.setAttribute('data-width', String(Math.max(320, Math.round(el.clientWidth))));\n host.setAttribute('data-allowfullscreen', 'false');\n host.setAttribute('data-show-text', 'false');\n host.setAttribute('data-show-captions', 'false');\n el.appendChild(host);\n let fb: FbSdk | null = null;\n const onReady = (m: { type: string; id: string; instance: FbPlayer }) => {\n if (!live || m.type !== 'video' || m.id !== id) return;\n player.current = m.instance;\n try { m.instance.setVolume(0); m.instance.unmute(); m.instance.setVolume(0); m.instance.seek(Math.max(0, tRef.current)); } catch { }\n setReady(true);\n };\n void loadSdk().then((f) => {\n if (!live || !f) return;\n fb = f;\n f.Event.subscribe('xfbml.ready', onReady);\n f.XFBML.parse(el);\n });\n return () => { live = false; player.current = null; setReady(false); try { fb?.Event.unsubscribe('xfbml.ready', onReady); } catch { } el.innerHTML = ''; };\n }, [url, id]);\n useEffect(() => {\n const p = player.current;\n if (!p || !ready) return;\n try { if (playing) { p.setVolume(0); p.play(); } else p.pause(); } catch { }\n }, [playing, ready]);\n useEffect(() => {\n const p = player.current;\n if (!p || !ready) return;\n try { p.seek(Math.max(0, tRef.current)); } catch { }\n }, [seekN, ready]);\n useEffect(() => {\n const p = player.current;\n if (!p || !ready || !playing) return;\n const h = setInterval(() => {\n try { if (Math.abs(p.getCurrentPosition() - tRef.current) > 1) p.seek(Math.max(0, tRef.current)); } catch { }\n }, 1000);\n return () => clearInterval(h);\n }, [ready, playing]);\n return (\n <div className=\"txyt vsp-follow vsp-fb\" style={ready ? { background: '#000' } : undefined}>\n <div ref={box} className={`vsp-fb__box${playing ? ' vsp-fb__box--live' : ''}`} style={{ opacity: ready ? 1 : 0 }} />\n {ready && !playing && <div aria-hidden=\"true\" className=\"txyt__tap\" onClick={onToggle} style={{ cursor: onToggle ? 'pointer' : 'default' }} />}\n {ready && <div className={`txyt__paused${!playing ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div>}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { PlayGlyph } from '../ds/Icons';\n\ninterface WVideo { play(): void; pause(): void; time(t?: number): number; mute(): void; volume(v?: number): number; hashedId(): string }\ntype W = Window & { _wq?: unknown[] };\n\nlet script: Promise<void> | null = null;\n\nfunction loadScript(): Promise<void> {\n if (script) return script;\n script = new Promise((resolve) => {\n const s = document.createElement('script');\n s.src = 'https://fast.wistia.net/assets/external/E-v1.js';\n s.async = true;\n s.onload = () => resolve();\n s.onerror = () => resolve();\n document.head.appendChild(s);\n });\n return script;\n}\n\nexport function WistiaFollow({ id, t, playing, seekN, onToggle }: { id: string; t: number; playing: boolean; seekN: number; onToggle?: () => void }) {\n const video = useRef<WVideo | null>(null);\n const tRef = useRef(t); tRef.current = t;\n const playRef = useRef(playing); playRef.current = playing;\n const [ready, setReady] = useState(false);\n useEffect(() => {\n let live = true;\n const w = window as W;\n w._wq = w._wq || [];\n w._wq.push({\n id,\n onReady: (v: WVideo) => {\n if (!live) return;\n video.current = v;\n try { v.mute(); v.time(Math.max(0, tRef.current)); if (playRef.current) v.play(); } catch { }\n setReady(true);\n },\n });\n void loadScript();\n return () => { live = false; video.current = null; setReady(false); };\n }, [id]);\n useEffect(() => {\n const v = video.current;\n if (!v || !ready) return;\n try { if (playing) { v.time(Math.max(0, tRef.current)); v.play(); } else v.pause(); } catch { }\n }, [playing, ready]);\n useEffect(() => {\n const v = video.current;\n if (!v || !ready) return;\n try { v.time(Math.max(0, tRef.current)); } catch { }\n }, [seekN, ready]);\n useEffect(() => {\n const v = video.current;\n if (!v || !ready || !playing) return;\n const h = setInterval(() => {\n try { if (Math.abs(v.time() - tRef.current) > 0.5) v.time(Math.max(0, tRef.current)); } catch { }\n }, 500);\n return () => clearInterval(h);\n }, [ready, playing]);\n const src = `https://fast.wistia.net/embed/iframe/${encodeURIComponent(id)}?${new URLSearchParams({ muted: 'true', playbar: 'false', controlsVisibleOnLoad: 'false', playButton: 'false', smallPlayButton: 'false', volumeControl: 'false', fullscreenButton: 'false', settingsControl: 'false', endVideoBehavior: 'reset' })}`;\n return (\n <div className=\"txyt vsp-follow\" style={ready ? { background: '#000' } : undefined}>\n <iframe src={src} className=\"wistia_embed vsp-embed\" name=\"wistia_embed\" title=\"Video\" allow=\"autoplay; fullscreen\" style={{ opacity: ready ? 1 : 0, pointerEvents: playing ? 'auto' : 'none' }} tabIndex={-1} aria-hidden=\"true\" />\n {!playing && <div aria-hidden=\"true\" className=\"txyt__tap\" onClick={onToggle} style={{ cursor: onToggle ? 'pointer' : 'default' }} />}\n {ready && <div className={`txyt__paused${!playing ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div>}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { PlayGlyph } from '../ds/Icons';\n\ninterface VPlayer { play(): void; pause(): void; seek(s: number): void; currentTime(): number; setVolume(v: number): void; uuid: string }\ninterface VApi { renderPlayer(o: { uuid: string; container: HTMLElement; type?: string; autoplay?: number; muted?: number; controls?: number }): Promise<VPlayer> }\ntype W = Window & { VidyardV4?: { api: VApi } };\n\nlet script: Promise<VApi | null> | null = null;\n\nfunction loadApi(): Promise<VApi | null> {\n if (script) return script;\n script = new Promise((resolve) => {\n const w = window as W;\n if (w.VidyardV4) { resolve(w.VidyardV4.api); return; }\n const s = document.createElement('script');\n s.src = 'https://play.vidyard.com/embed/v4.js';\n s.async = true;\n s.onload = () => {\n const started = Date.now();\n const wait = () => { if (w.VidyardV4) resolve(w.VidyardV4.api); else if (Date.now() - started > 8000) resolve(null); else setTimeout(wait, 50); };\n wait();\n };\n s.onerror = () => resolve(null);\n document.head.appendChild(s);\n });\n return script;\n}\n\nexport function VidyardFollow({ uuid, t, playing, seekN, onToggle }: { uuid: string; t: number; playing: boolean; seekN: number; onToggle?: () => void }) {\n const box = useRef<HTMLDivElement>(null);\n const player = useRef<VPlayer | null>(null);\n const tRef = useRef(t); tRef.current = t;\n const playRef = useRef(playing); playRef.current = playing;\n const [ready, setReady] = useState(false);\n useEffect(() => {\n let live = true;\n const el = box.current;\n if (!el) return;\n el.innerHTML = '';\n void loadApi().then((api) => {\n if (!live || !api) return;\n return api.renderPlayer({ uuid, container: el, type: 'inline', autoplay: 0, muted: 1, controls: 0 }).then((p) => {\n if (!live) return;\n player.current = p;\n try { p.setVolume(0); p.seek(Math.max(0, tRef.current)); if (playRef.current) p.play(); } catch { }\n setReady(true);\n });\n }).catch(() => {});\n return () => { live = false; player.current = null; setReady(false); el.innerHTML = ''; };\n }, [uuid]);\n useEffect(() => {\n const p = player.current;\n if (!p || !ready) return;\n try { if (playing) { p.seek(Math.max(0, tRef.current)); p.play(); } else p.pause(); } catch { }\n }, [playing, ready]);\n useEffect(() => {\n const p = player.current;\n if (!p || !ready) return;\n try { p.seek(Math.max(0, tRef.current)); } catch { }\n }, [seekN, ready]);\n useEffect(() => {\n const p = player.current;\n if (!p || !ready || !playing) return;\n const h = setInterval(() => {\n try { if (Math.abs(p.currentTime() - tRef.current) > 0.5) p.seek(Math.max(0, tRef.current)); } catch { }\n }, 500);\n return () => clearInterval(h);\n }, [ready, playing]);\n return (\n <div className=\"txyt vsp-follow\" style={ready ? { background: '#000' } : undefined}>\n <div ref={box} className={`vsp-fb__box${playing ? ' vsp-fb__box--live' : ''}`} style={{ opacity: ready ? 1 : 0 }} />\n {!playing && <div aria-hidden=\"true\" className=\"txyt__tap\" onClick={onToggle} style={{ cursor: onToggle ? 'pointer' : 'default' }} />}\n {ready && <div className={`txyt__paused${!playing ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div>}\n </div>\n );\n}\n","import type { FollowSetup } from '../ui/FileFollow';\n\nexport async function loomStreamUrl(id: string): Promise<string | null> {\n try {\n const r = await fetch(`https://www.loom.com/api/campaigns/sessions/${id}/raw-url`, { method: 'POST' });\n if (!r.ok || r.status === 204) return null;\n const j = await r.json() as { url?: unknown };\n return typeof j.url === 'string' && /^https:\\/\\//.test(j.url) ? j.url : null;\n } catch {\n return null;\n }\n}\n\nexport function signedLoader(master: string) {\n const query = master.includes('?') ? master.slice(master.indexOf('?') + 1) : '';\n return (xhr: XMLHttpRequest, u: string) => { if (query && !u.includes('Signature=')) xhr.open('GET', u + (u.includes('?') ? '&' : '?') + query, true); };\n}\n\nexport function loomSetup(id: string): FollowSetup {\n return (v, fail) => {\n let live = true;\n let destroy: (() => void) | null = null;\n void (async () => {\n const url = await loomStreamUrl(id);\n if (!live) return;\n if (!url) { fail(); return; }\n const mod = await import('hls.js').catch(() => null);\n if (!live) return;\n const Hls = mod?.default;\n if (!Hls || !Hls.isSupported()) { fail(); return; }\n const hls = new Hls({ xhrSetup: signedLoader(url), capLevelToPlayerSize: true, startLevel: 0, maxBufferLength: 20 });\n hls.on(Hls.Events.ERROR, (_e, d) => { if (d.fatal) { hls.destroy(); fail(); } });\n hls.loadSource(url);\n hls.attachMedia(v);\n destroy = () => hls.destroy();\n })();\n return () => { live = false; destroy?.(); };\n };\n}\n","import { useEffect, useState } from 'react';\n\nconst cache = new Map<string, string | null>();\n\nexport function useYtTitle(ytId: string | null): string | null {\n const [title, setTitle] = useState<string | null>(() => (ytId ? cache.get(ytId) ?? null : null));\n useEffect(() => {\n if (!ytId) { setTitle(null); return; }\n if (cache.has(ytId)) { setTitle(cache.get(ytId) ?? null); return; }\n let live = true;\n fetch(`https://www.youtube.com/oembed?format=json&url=${encodeURIComponent(`https://www.youtube.com/watch?v=${ytId}`)}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((j: { title?: unknown } | null) => {\n const t = j && typeof j.title === 'string' && j.title.trim() ? j.title.trim() : null;\n cache.set(ytId, t);\n if (live) setTitle(t);\n })\n .catch(() => { cache.set(ytId, null); });\n return () => { live = false; };\n }, [ytId]);\n return title;\n}\n\nconst HASH = /^(?:[0-9a-f]{16,}|(?:https?:\\/\\/)?(?:[\\w-]+\\.)+[a-z]{2,}(?::\\d+)?\\/\\S*)$/i;\nconst ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport function displayName(parts: { name?: string | null; sourceName?: string | null; ytTitle?: string | null; url?: string | null; id: string }): string {\n const clean = (s?: string | null) => { const t = s?.trim(); return t && t !== parts.id && !ID.test(t) && !HASH.test(t) ? t : null; };\n const host = (() => { if (!parts.url) return null; try { return new URL(parts.url).hostname.replace(/^www\\./, ''); } catch { return null; } })();\n return clean(parts.name) ?? clean(parts.sourceName) ?? clean(parts.ytTitle) ?? host ?? (ID.test(parts.id) ? 'VocalStack' : parts.id);\n}\n","import { useEffect, useRef, useState } from 'react';\n\nexport type BedState = 'off' | 'making' | 'ready' | 'unavailable';\n\nexport const BED_DRIFT_S = 0.3;\n\nexport interface BedMedia {\n currentTime: number;\n paused: boolean;\n muted: boolean;\n play: () => Promise<void> | void;\n pause: () => void;\n}\n\nexport function followBed(a: BedMedia, want: { t: number; playing: boolean; muted: boolean }): void {\n a.muted = want.muted;\n if (Math.abs(a.currentTime - want.t) > BED_DRIFT_S) a.currentTime = Math.max(0, want.t);\n if (want.playing) {\n if (a.paused) void Promise.resolve(a.play()).catch(() => {});\n } else if (!a.paused) a.pause();\n}\n\nexport const REMOVE_BG_LABEL = 'Remove background sound';\nexport const REMOVE_BG_NOTE = \"Takes out everything that isn't speech: music, ambience and noise.\";\n\nfunction clockOf(s: number): string {\n const t = Math.max(0, Math.floor(s));\n const h = Math.floor(t / 3600);\n const m = Math.floor((t % 3600) / 60);\n const sec = String(t % 60).padStart(2, '0');\n return h ? `${h}:${String(m).padStart(2, '0')}:${sec}` : `${m}:${sec}`;\n}\n\nexport function bedNote(on: boolean, state: BedState, what: 'transcription' | 'video' = 'transcription', untilS = 0): string {\n if (state === 'unavailable') return `Not available for this ${what}`;\n if (state === 'making') return untilS > 0 ? `Separating the speech from the background… ready up to ${clockOf(untilS)}` : 'Separating the speech from the background…';\n return REMOVE_BG_NOTE;\n}\n\nexport interface TrackPlan {\n bed: boolean;\n speech: boolean;\n}\n\nexport function trackPlan(removeBg: boolean, voiceOn: boolean): TrackPlan {\n return { bed: voiceOn && !removeBg, speech: !voiceOn && removeBg };\n}\n\nexport function removeBgOf(stored: boolean | null, oldKeep: boolean | null): boolean {\n if (typeof stored === 'boolean') return stored;\n return oldKeep === false;\n}\n\nexport function removeBgFromQuery(q: URLSearchParams): boolean {\n const v = q.get('bg');\n return v === 'off' || v === 'remove';\n}\n\nexport function withRemoveBg(u: URL, removeBg: boolean): void {\n if (removeBg) u.searchParams.set('bg', 'remove'); else u.searchParams.delete('bg');\n}\n\nexport function bedRetryS(status: number, body: unknown): number | null {\n if (status !== 503) return null;\n const s = (body as { data?: { details?: { retryAfterS?: unknown } } } | null)?.data?.details?.retryAfterS;\n return typeof s === 'number' && s > 0 ? Math.max(2, s) : 3;\n}\n\nexport interface SepPart {\n startS: number;\n endS: number;\n url: string;\n}\n\nexport const SEAM_S = 0.05;\n\nexport function partsOf(body: unknown): { untilS: number; parts: SepPart[] } {\n const d = (body as { data?: { details?: { parts?: unknown } } } | null)?.data?.details?.parts;\n const parts: SepPart[] = [];\n if (Array.isArray(d)) {\n for (const x of d as Array<Partial<SepPart>>) {\n if (!x || typeof x.startS !== 'number' || typeof x.endS !== 'number' || typeof x.url !== 'string' || !(x.endS > x.startS)) break;\n const at = parts.length ? parts[parts.length - 1].endS : 0;\n if (Math.abs(x.startS - at) > 0.01) break;\n parts.push({ startS: x.startS, endS: x.endS, url: x.url });\n }\n }\n return { untilS: parts.length ? parts[parts.length - 1].endS : 0, parts };\n}\n\nexport function partAt(parts: SepPart[], t: number): number {\n if (!parts.length || t < 0 || t >= parts[parts.length - 1].endS - SEAM_S) return -1;\n let lo = 0;\n let hi = parts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (parts[mid].startS <= t) lo = mid; else hi = mid - 1;\n }\n return lo;\n}\n\nexport function slotsFor(parts: SepPart[], i: number, held: [number, number], cur: 0 | 1): { play: 0 | 1; load: Array<[0 | 1, number]> } {\n const want = parts[i].startS;\n const play: 0 | 1 = held[cur] === want ? cur : held[1 - cur] === want ? ((1 - cur) as 0 | 1) : cur;\n const load: Array<[0 | 1, number]> = [];\n if (held[play] !== want) load.push([play, i]);\n const other = (1 - play) as 0 | 1;\n if (i + 1 < parts.length && held[other] !== parts[i + 1].startS) load.push([other, i + 1]);\n return { play, load };\n}\n\ntype Probe = { ready: true } | { ready: false; retryS: number | null; untilS: number; parts: SepPart[] };\n\nasync function probe(url: string): Promise<Probe> {\n const r = await fetch(url, { redirect: 'manual', credentials: 'omit' });\n if (r.type === 'opaqueredirect' || (r.status >= 300 && r.status < 400) || r.ok) return { ready: true };\n const body = await r.json().catch(() => null);\n return { ready: false, retryS: bedRetryS(r.status, body), ...partsOf(body) };\n}\n\nexport interface Separated {\n state: BedState;\n on: boolean;\n untilS: number;\n}\n\ntype Want = { t: number; playing: boolean; muted: boolean };\n\nfunction release(a: HTMLAudioElement | null): void {\n if (!a) return;\n a.pause();\n a.removeAttribute('src');\n a.load();\n}\n\nexport function useSeparatedTrack(url: string | null, want: Want): Separated {\n const [state, setState] = useState<BedState>('off');\n const [parts, setParts] = useState<SepPart[]>([]);\n const [on, setOn] = useState(false);\n const full = useRef<HTMLAudioElement | null>(null);\n const els = useRef<[HTMLAudioElement | null, HTMLAudioElement | null]>([null, null]);\n const held = useRef<[number, number]>([NaN, NaN]);\n const cur = useRef<0 | 1>(0);\n useEffect(() => {\n setParts([]);\n setOn(false);\n if (!url) { setState('off'); return; }\n let stop = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n setState('making');\n const check = () => {\n probe(url).then((r) => {\n if (stop) return;\n if (r.ready) {\n const a = new Audio();\n a.preload = 'auto';\n const done = () => { if (!stop && full.current === a) setState('ready'); };\n a.addEventListener('canplay', done, { once: true });\n a.addEventListener('error', done, { once: true });\n a.src = url;\n full.current = a;\n return;\n }\n if (r.retryS == null) { setState('unavailable'); setParts([]); return; }\n setParts((old) => (old.length === r.parts.length && old.every((p, i) => p.startS === r.parts[i].startS) ? old : r.parts));\n timer = setTimeout(check, r.retryS * 1000);\n }).catch(() => { if (!stop) timer = setTimeout(check, 5000); });\n };\n check();\n return () => {\n stop = true;\n if (timer) clearTimeout(timer);\n release(full.current);\n full.current = null;\n release(els.current[0]);\n release(els.current[1]);\n els.current = [null, null];\n held.current = [NaN, NaN];\n };\n }, [url]);\n useEffect(() => {\n const pauseParts = () => { for (const a of els.current) if (a && !a.paused) a.pause(); };\n if (state === 'ready' && full.current) {\n pauseParts();\n followBed(full.current, want);\n setOn(true);\n return;\n }\n const i = state === 'making' ? partAt(parts, want.t) : -1;\n if (i < 0) { pauseParts(); setOn(false); return; }\n const plan = slotsFor(parts, i, held.current, cur.current);\n for (const [slot, n] of plan.load) {\n let a = els.current[slot];\n if (!a) { a = new Audio(); a.preload = 'auto'; els.current[slot] = a; }\n a.pause();\n a.src = parts[n].url;\n held.current[slot] = parts[n].startS;\n }\n cur.current = plan.play;\n const a = els.current[plan.play]!;\n const other = els.current[(1 - plan.play) as 0 | 1];\n if (other && !other.paused) other.pause();\n followBed(a, { ...want, t: want.t - parts[i].startS });\n setOn(!want.playing || a.readyState >= 3);\n }, [state, parts, want.t, want.playing, want.muted]); // eslint-disable-line react-hooks/exhaustive-deps\n return { state, on, untilS: state === 'ready' ? Infinity : parts.length ? parts[parts.length - 1].endS : 0 };\n}\n\nexport function useBackgroundBed(url: string | null, want: Want): BedState {\n return useSeparatedTrack(url, want).state;\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\n\nexport interface FollowLine { sid: number; start: number; end: number }\nexport interface FollowClip { src: string; part: number; parts: number; durationS?: number | null }\n\nexport type FollowTarget =\n | { kind: 'play'; sid: number; src: string; offset: number }\n | { kind: 'missing'; sid: number }\n | { kind: 'done'; sid: number }\n | { kind: 'none' };\n\nexport const FOLLOW_DRIFT_S = 0.5;\nexport const FOLLOW_AHEAD = 3;\n\nexport function lineAt(lines: readonly FollowLine[], t: number): number {\n let k = -1;\n for (let i = 0; i < lines.length && lines[i].start <= t + 0.02; i++) k = i;\n return k;\n}\n\nexport function followTarget(lines: readonly FollowLine[], clips: ReadonlyMap<number, readonly FollowClip[]>, t: number): FollowTarget {\n const k = lineAt(lines, t);\n if (k < 0) return { kind: 'none' };\n const line = lines[k];\n if (t >= line.end) return { kind: 'none' };\n const parts = [...(clips.get(line.sid) ?? [])].sort((a, b) => a.part - b.part);\n if (!parts.length) return { kind: 'missing', sid: line.sid };\n const total = Math.max(1, ...parts.map((p) => p.parts));\n let elapsed = Math.max(0, t - line.start);\n for (let p = 0; p < total; p++) {\n const c = parts.find((x) => x.part === p);\n if (!c) return { kind: 'missing', sid: line.sid };\n const d = c.durationS && c.durationS > 0 ? c.durationS : Infinity;\n if (elapsed < d) return { kind: 'play', sid: line.sid, src: c.src, offset: elapsed };\n elapsed -= d;\n }\n return { kind: 'done', sid: line.sid };\n}\n\nexport function mayRunOn(lines: readonly FollowLine[], t: number, playingSid: number | null): boolean {\n if (playingSid == null) return false;\n const k = lineAt(lines, t);\n if (k < 0) return false;\n const line = lines[k];\n if (t >= line.end) return line.sid === playingSid;\n return k > 0 && lines[k - 1].sid === playingSid && t - line.start < 1.5;\n}\n\nexport function upcomingSrcs(lines: readonly FollowLine[], clips: ReadonlyMap<number, readonly FollowClip[]>, t: number, n = FOLLOW_AHEAD): string[] {\n const k = Math.max(0, lineAt(lines, t));\n const out: string[] = [];\n for (let i = k; i < lines.length && i <= k + n; i++) {\n const first = (clips.get(lines[i].sid) ?? []).find((c) => c.part === 0);\n if (first) out.push(first.src);\n }\n return out;\n}\n\nexport interface FollowState { missing: number | null; sid: number | null }\n\nexport function useVoiceFollow(o: { on: boolean; lines: readonly FollowLine[]; clips: readonly (FollowClip & { sentenceId: number })[]; t: number; playing: boolean; muted: boolean }): FollowState {\n const bySid = useMemo(() => {\n const m = new Map<number, FollowClip[]>();\n for (const c of o.clips) m.set(c.sentenceId, [...(m.get(c.sentenceId) ?? []), c]);\n return m;\n }, [o.clips]);\n const cache = useRef(new Map<string, HTMLAudioElement>());\n const cur = useRef<{ src: string; sid: number; el: HTMLAudioElement } | null>(null);\n const [state, setState] = useState<FollowState>({ missing: null, sid: null });\n const el = (src: string) => {\n let a = cache.current.get(src);\n if (!a) {\n a = new Audio();\n a.preload = 'auto';\n a.src = src;\n cache.current.set(src, a);\n }\n return a;\n };\n const stopCurrent = () => { cur.current?.el.pause(); cur.current = null; };\n useEffect(() => () => { for (const a of cache.current.values()) { a.pause(); a.removeAttribute('src'); } cache.current.clear(); cur.current = null; }, []);\n useEffect(() => {\n if (!o.on) { stopCurrent(); setState((s) => (s.missing == null && s.sid == null ? s : { missing: null, sid: null })); return; }\n const want = followTarget(o.lines, bySid, o.t);\n const missing = want.kind === 'missing' ? want.sid : null;\n const sid = want.kind === 'none' ? null : want.sid;\n setState((s) => (s.missing === missing && s.sid === sid ? s : { missing, sid }));\n const keep = new Set(upcomingSrcs(o.lines, bySid, o.t));\n for (const src of keep) el(src);\n const c = cur.current;\n if (c) keep.add(c.src);\n for (const [src, a] of cache.current) if (!keep.has(src) && (!c || c.el !== a)) { a.pause(); cache.current.delete(src); }\n if (!o.playing) { c?.el.pause(); return; }\n if (want.kind !== 'play') {\n const stillSpeaking = c && !c.el.paused && !c.el.ended;\n if (stillSpeaking && mayRunOn(o.lines, o.t, c.sid)) return;\n if (c) c.el.pause();\n cur.current = null;\n return;\n }\n if (c && c.src === want.src) {\n c.el.muted = o.muted;\n if (!c.el.ended && Math.abs(c.el.currentTime - want.offset) > FOLLOW_DRIFT_S) { try { c.el.currentTime = want.offset; } catch { } }\n if (c.el.paused && !c.el.ended) void c.el.play().catch(() => {});\n return;\n }\n c?.el.pause();\n const a = el(want.src);\n a.muted = o.muted;\n try { a.currentTime = want.offset; } catch { }\n cur.current = { src: want.src, sid: want.sid, el: a };\n void a.play().catch(() => {});\n }, [o.on, o.t, o.playing, o.muted, o.lines, bySid]); // eslint-disable-line react-hooks/exhaustive-deps\n return state;\n}\n","import { useEffect, useRef } from 'react';\n\nexport type MediaKey = 'play' | 'pause' | 'stop' | 'nexttrack' | 'previoustrack';\n\nexport interface MediaKeyTarget {\n playing: boolean;\n toggle: () => void;\n next?: () => void;\n prev?: () => void;\n}\n\nexport const MEDIA_KEYS: MediaKey[] = ['play', 'pause', 'stop', 'nexttrack', 'previoustrack'];\n\nexport function onMediaKey(key: MediaKey, t: MediaKeyTarget): void {\n if (key === 'play') { if (!t.playing) t.toggle(); return; }\n if (key === 'pause' || key === 'stop') { if (t.playing) t.toggle(); return; }\n if (key === 'nexttrack') { t.next?.(); return; }\n t.prev?.();\n}\n\nexport interface MediaSessionLike {\n setActionHandler: (action: MediaKey, handler: (() => void) | null) => void;\n}\n\nexport function bindMediaKeys(ms: MediaSessionLike, get: () => MediaKeyTarget | null): () => void {\n for (const k of MEDIA_KEYS) {\n try { ms.setActionHandler(k, () => { const t = get(); if (t) onMediaKey(k, t); }); } catch { }\n }\n return () => {\n for (const k of MEDIA_KEYS) {\n try { ms.setActionHandler(k, null); } catch { }\n }\n };\n}\n\nexport function useMediaKeys(target: MediaKeyTarget | null, title?: string | null): void {\n const ref = useRef(target);\n ref.current = target;\n const on = !!target;\n useEffect(() => {\n const ms = typeof navigator !== 'undefined' ? navigator.mediaSession : undefined;\n if (!ms || !on) return;\n return bindMediaKeys(ms, () => ref.current);\n }, [on]);\n const playing = !!target?.playing;\n useEffect(() => {\n const ms = typeof navigator !== 'undefined' ? navigator.mediaSession : undefined;\n if (!ms || !on) return;\n ms.playbackState = playing ? 'playing' : 'paused';\n }, [on, playing]);\n useEffect(() => {\n const ms = typeof navigator !== 'undefined' ? navigator.mediaSession : undefined;\n if (!ms || !on || !title || typeof MediaMetadata === 'undefined') return;\n try { ms.metadata = new MediaMetadata({ title, artist: 'VocalStack' }); } catch { }\n }, [on, title]);\n}\n","export function clock(s: number): string {\n const t = Math.max(0, Math.floor(s));\n const h = Math.floor(t / 3600), m = Math.floor((t % 3600) / 60), sec = t % 60;\n const mm = String(m).padStart(2, '0'), ss = String(sec).padStart(2, '0');\n return h > 0 ? `${h}:${mm}:${ss}` : `${mm}:${ss}`;\n}\n\nexport function durationLabel(s?: number | null): string {\n if (!s || s <= 0) return '—';\n const m = Math.round(s / 60);\n if (m < 1) return `${Math.round(s)}s`;\n if (m < 60) return `${m} min`;\n const h = Math.floor(m / 60), r = m % 60;\n return `${h} h ${String(r).padStart(2, '0')} min`;\n}\n\nconst WD = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MON = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'];\n\nexport function monDay(iso?: string | null): { mon: string; day: string } {\n if (!iso) return { mon: '—', day: '' };\n const d = new Date(iso);\n return { mon: MON[d.getMonth()], day: String(d.getDate()).padStart(2, '0') };\n}\n\nexport function timeOfDay(iso?: string | null): string {\n if (!iso) return '';\n const d = new Date(iso);\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;\n}\n\nexport function recordingWhen(iso?: string | null): string {\n if (!iso) return '';\n const d = new Date(iso);\n const mon = MON[d.getMonth()];\n return `${WD[d.getDay()]}, ${String(d.getDate()).padStart(2, '0')} ${mon[0]}${mon.slice(1).toLowerCase()} · ${timeOfDay(iso)}`;\n}\n\nfunction sameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\nexport function dayGroup(iso?: string | null): string {\n if (!iso) return 'UNDATED';\n const d = new Date(iso), now = new Date();\n if (sameDay(d, now)) return 'TODAY';\n const y = new Date(now); y.setDate(y.getDate() - 1);\n if (sameDay(d, y)) return 'YESTERDAY';\n const days = (now.getTime() - d.getTime()) / 86400000;\n if (days < 7) return 'LAST WEEK';\n if (days < 31) return 'LAST MONTH';\n return 'OLDER';\n}\n\nexport function whenLabel(iso?: string | null): string {\n if (!iso) return 'Recording';\n const d = new Date(iso), now = new Date();\n const t = timeOfDay(iso);\n if (sameDay(d, now)) return `Today at ${t}`;\n return `${d.toLocaleDateString(undefined, { day: 'numeric', month: 'short' })} at ${t}`;\n}\n\nexport function ago(iso?: string | null): string {\n if (!iso) return '';\n const s = Math.max(0, (Date.now() - new Date(iso).getTime()) / 1000);\n if (s < 60) return 'just now';\n if (s < 3600) return `${Math.round(s / 60)} min ago`;\n if (s < 86400) return `${Math.round(s / 3600)} h ago`;\n const d = Math.round(s / 86400);\n return d === 1 ? 'yesterday' : `${d} days ago`;\n}\n\nexport function dwell(s: number): string {\n const m = Math.floor(s / 60), sec = Math.floor(s % 60);\n return `${String(m).padStart(2, '0')}:${String(sec).padStart(2, '0')}`;\n}\n\nexport function highlightParts(text: string, query: string): { t: string; hit: boolean }[] {\n const q = query.trim();\n if (!q) return [{ t: text, hit: false }];\n const tokens = q.toLowerCase().split(/\\s+/).filter((t) => t.length > 1);\n if (!tokens.length) return [{ t: text, hit: false }];\n const re = new RegExp(`(${tokens.map((t) => t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|')})`, 'ig');\n const out: { t: string; hit: boolean }[] = [];\n let last = 0;\n for (const m of text.matchAll(re)) {\n const i = m.index ?? 0;\n if (i > last) out.push({ t: text.slice(last, i), hit: false });\n out.push({ t: m[0], hit: true });\n last = i + m[0].length;\n }\n if (last < text.length) out.push({ t: text.slice(last), hit: false });\n return out;\n}\n\nexport function pluralize(n: number, one: string, many = `${one}s`) {\n return `${n} ${n === 1 ? one : many}`;\n}\n","import type { Correction, TranscriptSnapshot } from '@vocalstack/js-sdk';\n\nexport function fixedSlots(corrections: Correction[]): Set<string> {\n const evs: { at: string; c: Correction; undo: boolean }[] = [];\n for (const c of corrections) {\n if (c.kind !== 'word' || c.seq == null || c.wordIdx == null) continue;\n evs.push({ at: c.appliedAt, c, undo: false });\n if (c.revertedAt) evs.push({ at: c.revertedAt, c, undo: true });\n }\n evs.sort((a, b) => (a.at < b.at ? -1 : a.at > b.at ? 1 : a.undo === b.undo ? 0 : a.undo ? 1 : -1));\n const slots = new Map<string, { seq: number; idx: number; n: number }>();\n for (const { c, undo } of evs) {\n const seq = c.seq as number, idx = c.wordIdx as number;\n const n = Math.max(1, c.to.split(/\\s+/).filter(Boolean).length);\n if (undo) {\n const s = slots.get(c.id);\n if (!s) continue;\n slots.delete(c.id);\n for (const o of slots.values()) if (o.seq === s.seq && o.idx > s.idx) o.idx -= s.n - 1;\n } else {\n for (const o of slots.values()) if (o.seq === seq && o.idx > idx) o.idx += n - 1;\n slots.set(c.id, { seq, idx, n });\n }\n }\n const out = new Set<string>();\n for (const s of slots.values()) for (let k = 0; k < s.n; k++) out.add(`${s.seq}:${s.idx + k}`);\n return out;\n}\n\nexport interface Word {\n text: string;\n prob?: number | null;\n start: number;\n end: number;\n alts?: { text: string; prob: number }[];\n script?: boolean;\n recognized?: string;\n seq: number;\n idx: number;\n}\n\nexport interface Row {\n id: string;\n sentenceId?: number;\n seqs: number[];\n speaker: number;\n start: number;\n end?: number;\n wallStart: number;\n text: string;\n words: Word[];\n status: 'open' | 'closed';\n settled: boolean;\n corrected: boolean;\n catchup: boolean;\n suppressed: boolean;\n unclear?: boolean;\n confidence?: number;\n latencyS?: number;\n language?: string;\n translations: Record<string, string>;\n provisional: boolean;\n translationLatencyS?: Record<string, number>;\n}\n\nexport interface Segment {\n seq: number;\n speaker: number;\n start: number;\n end: number;\n text: string;\n words: Word[];\n catchup: boolean;\n corrected: boolean;\n settled: boolean;\n suppressed: boolean;\n unclear?: boolean;\n confidence?: number;\n latencyS?: number;\n language?: string;\n translations: Record<string, string>;\n scriptPos?: number;\n scriptFrom?: number;\n}\n\nexport interface Model {\n segments: Map<number, Segment>;\n sentences: Map<number, Omit<Row, 'words' | 'text' | 'seqs'> & { text: string; seqs: number[] }>;\n speakers: Record<number, string>;\n speakerSpeechS: Record<number, number>;\n speakerSex: Record<number, 'male' | 'female'>;\n speakerIds: Record<number, { name: string; voiceId?: string; color?: string; confidence?: number; tone?: boolean }>;\n labels?: 'auto' | 'on' | 'off';\n lastSeq: number;\n state: string;\n spans: { wallStart: number; wallEnd?: number | null; mediaStart: number; mediaEnd?: number | null }[];\n held?: { fromMediaS: number; language?: string } | null;\n numbers?: Map<number, number>;\n}\n\nexport function empty(): Model {\n return {\n segments: new Map(),\n sentences: new Map(),\n speakers: {},\n speakerSpeechS: {},\n speakerSex: {},\n speakerIds: {},\n lastSeq: -1,\n state: 'pending',\n spans: [],\n };\n}\n\nexport function mediaToWall(m: Model, media: number): number {\n for (const s of m.spans) {\n const end = s.mediaEnd ?? Infinity;\n if (media < end || s.mediaEnd == null) return s.wallStart + Math.max(0, media - s.mediaStart);\n }\n const last = m.spans[m.spans.length - 1];\n return last ? (last.wallEnd ?? last.wallStart) + Math.max(0, media - (last.mediaEnd ?? last.mediaStart)) : media;\n}\n\nfunction toWords(seq: number, raw: any[] | undefined): Word[] {\n return (raw ?? []).map((w, i) => ({ text: String(w.text ?? ''), prob: w.prob ?? null, start: w.start ?? 0, end: w.end ?? 0, alts: w.alts, ...(w.script === true ? { script: true } : {}), ...(w.script === true && typeof w.recognized === 'string' ? { recognized: w.recognized } : {}), seq, idx: i }));\n}\n\nexport function fromSnapshot(snap: TranscriptSnapshot, base?: Model): Model {\n const m = base ?? empty();\n delete m.numbers;\n m.state = snap.state;\n if (snap.speakerLabels) m.labels = snap.speakerLabels;\n m.lastSeq = Math.max(m.lastSeq, snap.lastSeq);\n m.spans = snap.spans.map((s) => ({ wallStart: s.wallStart, wallEnd: s.wallEnd ?? null, mediaStart: s.mediaStart, mediaEnd: s.mediaEnd ?? null }));\n for (const s of snap.segments) {\n const sp = (s as { scriptPos?: number | null }).scriptPos;\n m.segments.set(s.seq, {\n scriptPos: sp ?? undefined,\n scriptFrom: (s as { scriptFrom?: number | null }).scriptFrom ?? undefined,\n seq: s.seq,\n speaker: s.speaker,\n start: s.start,\n end: s.end,\n text: s.text,\n words: toWords(s.seq, s.words as any),\n catchup: !!s.catchup,\n corrected: !!s.corrected,\n settled: !!s.settled,\n suppressed: !!s.suppressed,\n unclear: !!s.unclear,\n confidence: s.confidence ?? undefined,\n latencyS: s.latencyS ?? undefined,\n language: s.language ?? undefined,\n translations: (s.translations as Record<string, string>) ?? {},\n });\n }\n for (const s of snap.sentences) {\n m.sentences.set(s.sentenceId, {\n id: `s:${s.sentenceId}`,\n sentenceId: s.sentenceId,\n seqs: s.seqs,\n speaker: s.speaker,\n start: s.start,\n wallStart: s.wallStart,\n text: s.text,\n status: s.status === 'open' ? 'open' : 'closed',\n settled: !!s.settled,\n corrected: false,\n catchup: false,\n suppressed: !!s.suppressed,\n unclear: !!s.unclear,\n language: s.language ?? undefined,\n translations: (s.translations as Record<string, string>) ?? {},\n provisional: !!s.provisional,\n });\n }\n m.speakers = Object.fromEntries(\n snap.speakers.filter((s) => !!s.name).map((s) => [s.speaker, s.name]),\n );\n m.speakerSpeechS = Object.fromEntries(\n snap.speakers.filter((s) => typeof s.speechS === 'number').map((s) => [s.speaker, s.speechS as number]),\n );\n m.speakerSex = Object.fromEntries(\n snap.speakers.filter((s) => s.gender === 'male' || s.gender === 'female').map((s) => [s.speaker, s.gender as 'male' | 'female']),\n );\n m.speakerIds = Object.fromEntries(\n snap.speakers\n .filter((s) => !!s.identified || !!s.voiceId || !!s.voiceColor)\n .map((s) => [\n s.speaker,\n {\n name: s.name ?? '',\n voiceId: s.voiceId ?? undefined,\n color: s.voiceColor ?? undefined,\n confidence: s.identifiedConfidence ?? undefined,\n },\n ]),\n );\n return m;\n}\n\nexport function scriptPosAt(m: Model, at?: number): number | undefined {\n let best: Segment | undefined;\n for (const s of m.segments.values()) {\n if (s.scriptPos == null) continue;\n if (at != null && s.end > at) continue;\n if (!best || s.seq > best.seq) best = s;\n }\n if (best) return best.scriptPos;\n return at != null && [...m.segments.values()].some((s) => s.scriptPos != null) ? 0 : undefined;\n}\n\nexport function scriptSpan(m: Model, seqs: number[]): [number, number] | null {\n let from = Infinity, to = -Infinity;\n for (const q of seqs) {\n const s = m.segments.get(q);\n if (s?.scriptFrom == null || s.scriptPos == null) continue;\n from = Math.min(from, s.scriptFrom);\n to = Math.max(to, s.scriptPos);\n }\n return from < to ? [from, to] : null;\n}\n\nfunction foldTr(prev: Record<string, string> | undefined, next: unknown): Record<string, string> {\n const n = (next ?? {}) as Record<string, string>;\n if (!prev || !Object.keys(prev).length) return n;\n if (!Object.keys(n).length) return prev;\n return { ...prev, ...n };\n}\n\nfunction undoesAutoFix(words: Word[], f: any): boolean {\n const tail = f.tail;\n if (!tail || !Array.isArray(tail.words) || tail.replaced !== words.length || tail.words.length !== words.length) return false;\n let changed = false;\n for (let i = 0; i < words.length; i++) {\n const o = words[i], n = tail.words[i];\n const marked = !!o.script;\n if (n.script) { if (n.text !== o.text) return false; continue; }\n if (n.text === o.text && !marked) continue;\n if (!marked) return false;\n changed = true;\n }\n return changed;\n}\n\nexport function applyFrame(m: Model, f: any): Model {\n delete m.numbers;\n switch (f.type) {\n case 'transcript.committed': {\n const seg = f.segment;\n const prev = m.segments.get(seg.seq);\n m.segments.set(seg.seq, {\n seq: seg.seq,\n speaker: seg.speaker,\n start: seg.start,\n end: seg.end,\n text: seg.text,\n words: seg.words ? toWords(seg.seq, seg.words) : prev?.words ?? [],\n catchup: !!seg.catchup,\n corrected: prev?.corrected ?? false,\n settled: prev?.settled ?? false,\n suppressed: !!seg.suppressed,\n unclear: !!seg.unclear,\n confidence: seg.confidence ?? prev?.confidence,\n latencyS: seg.latencyS,\n language: seg.language,\n translations: foldTr(prev?.translations, seg.translations),\n scriptPos: seg.scriptPos ?? prev?.scriptPos,\n scriptFrom: seg.scriptPos != null ? seg.scriptFrom ?? undefined : prev?.scriptFrom,\n });\n if (seg.speakerName) m.speakers[seg.speaker] = seg.speakerName;\n break;\n }\n case 'transcript.held': {\n m.held = f.held ? { fromMediaS: f.fromMediaS ?? 0, language: f.language ?? undefined } : null;\n break;\n }\n case 'transcript.retracted': {\n for (const seq of f.seqs ?? []) m.segments.delete(seq);\n break;\n }\n case 'transcript.translated': {\n const s = m.segments.get(f.seq);\n if (s) s.translations = { ...s.translations, ...(f.translations ?? {}) };\n break;\n }\n case 'transcript.amended': {\n const s = m.segments.get(f.seq);\n if (s && s.corrected && undoesAutoFix(s.words, f)) {\n s.text = f.text;\n s.words = toWords(f.seq, f.tail.words);\n break;\n }\n if (s && !s.corrected) {\n s.text = f.text;\n if (f.speaker >= 0) s.speaker = f.speaker;\n const parts = String(f.text).split(/\\s+/).filter(Boolean);\n if (f.tail && f.tail.replaced <= s.words.length) {\n const kept = s.words.slice(0, s.words.length - f.tail.replaced);\n s.words = toWords(f.seq, [...kept, ...f.tail.words]);\n } else if (parts.length === s.words.length) {\n s.words = s.words.map((w, i) => ({ ...w, text: parts[i] }));\n }\n if (f.scriptWords?.length) {\n const norm = (t: string) => t.toLowerCase().replace(/[^\\p{L}\\p{N}]/gu, '');\n const fixes = ((f.fixes ?? []) as { orig?: string; repl?: string; kind?: string }[]).filter((x) => String(x.kind ?? '').endsWith('script') && String(x.orig ?? '').trim());\n const heard = (w: Word) => w.recognized ?? fixes.find((x) => String(x.repl ?? '').split(/\\s+/).map(norm).includes(norm(w.text)))?.orig?.trim();\n s.words = s.words.map((w, i) => {\n if (!f.scriptWords!.includes(i)) return w;\n const h = heard(w);\n return { ...w, script: true, ...(h ? { recognized: h } : {}) };\n });\n }\n }\n break;\n }\n case 'transcript.latency': {\n const s = m.segments.get(f.seq);\n if (s) s.latencyS = f.latencyS;\n break;\n }\n case 'transcript.speaker': {\n const s = m.segments.get(f.seq);\n if (s && f.speaker >= 0) s.speaker = f.speaker;\n break;\n }\n case 'transcript.sentence': {\n const s = f.sentence;\n if (s.status === 'dropped') {\n m.sentences.delete(s.sentenceId);\n break;\n }\n const prev = m.sentences.get(s.sentenceId);\n const keep = !!prev?.corrected && !s.corrected;\n m.sentences.set(s.sentenceId, {\n id: `s:${s.sentenceId}`,\n sentenceId: s.sentenceId,\n seqs: s.seqs,\n speaker: s.speaker,\n start: s.start,\n wallStart: mediaToWall(m, s.start),\n text: keep ? prev!.text : s.text,\n status: s.status === 'open' ? 'open' : 'closed',\n settled: !!s.settled,\n corrected: !!s.corrected || (prev?.corrected ?? false),\n catchup: false,\n suppressed: !!s.suppressed,\n unclear: !!s.unclear,\n language: s.language,\n translations: keep ? prev!.translations : foldTr(prev?.translations, s.translations),\n provisional: !!s.provisional,\n translationLatencyS: s.translationLatencyS,\n });\n if (s.speakerName) m.speakers[s.speaker] = s.speakerName;\n if (s.settled) for (const q of s.seqs as number[]) { const g = m.segments.get(q); if (g) g.settled = true; }\n break;\n }\n case 'transcript.corrected': {\n const s = m.segments.get(f.seq);\n if (s) {\n s.text = f.text;\n s.corrected = !f.reverted || s.corrected;\n const parts = String(f.text).split(/\\s+/).filter(Boolean);\n if (Array.isArray((f as any).words)) s.words = toWords(f.seq, (f as any).words);\n else if (parts.length === s.words.length) s.words = s.words.map((w, i) => ({ ...w, text: parts[i], prob: i === f.wordIdx ? 1 : w.prob }));\n s.translations = {};\n }\n if (typeof f.sentenceId === 'number') {\n const t = m.sentences.get(f.sentenceId);\n if (t) {\n if (f.sentenceText) t.text = f.sentenceText;\n t.corrected = true;\n t.translations = {};\n }\n }\n break;\n }\n case 'transcript.speakerNamed':\n if (f.name) m.speakers[f.speaker] = f.name;\n else delete m.speakers[f.speaker];\n break;\n case 'transcript.speakerGender':\n if (f.gender === 'male' || f.gender === 'female') m.speakerSex[f.speaker] = f.gender;\n break;\n case 'transcript.speakerIdentified':\n if (f.name) {\n m.speakerIds[f.speaker] = {\n name: f.name,\n voiceId: f.voiceId,\n color: f.color,\n confidence: f.confidence,\n tone: !!f.tone,\n };\n } else delete m.speakerIds[f.speaker];\n break;\n case 'recording.state':\n m.state = f.state;\n break;\n default:\n break;\n }\n if (typeof f.seq === 'number') m.lastSeq = Math.max(m.lastSeq, f.seq);\n return m;\n}\n\nexport function rows(m: Model): Row[] {\n const out: Row[] = [];\n const sentences = [...m.sentences.values()].sort((a, b) => a.start - b.start || (a.sentenceId ?? 0) - (b.sentenceId ?? 0));\n for (const s of sentences) {\n const segs = s.seqs.map((q) => m.segments.get(q)).filter(Boolean) as Segment[];\n const words = segs.length === s.seqs.length || !s.text ? segs.flatMap((g) => g.words) : [];\n const last = segs[segs.length - 1];\n out.push({\n ...s,\n words,\n ...(segs.length ? { end: Math.max(...segs.map((g) => g.end)) } : {}),\n text: s.text || segs.map((g) => g.text).join(' '),\n corrected: s.corrected || segs.some((g) => g.corrected),\n catchup: segs.some((g) => g.catchup),\n suppressed: s.suppressed || (segs.length > 0 && segs.every((g) => g.suppressed)),\n unclear: s.unclear || (segs.length > 0 && segs.every((g) => g.unclear)),\n confidence: sentenceConfidence(segs),\n latencyS: last?.latencyS,\n settled: s.settled || (segs.length > 0 && segs.every((g) => g.settled)),\n translations: Object.keys(s.translations).length ? s.translations : mergeSegTranslations(segs),\n speaker: s.speaker >= 0 ? s.speaker : last?.speaker ?? -1,\n });\n }\n out.sort((a, b) => a.start - b.start);\n return out;\n}\n\nfunction languageName(code?: string): string | undefined {\n if (!code) return undefined;\n try {\n return new Intl.DisplayNames(['en'], { type: 'language' }).of(code) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function heldLine(m: Model): string | null {\n if (!m.held) return null;\n const name = languageName(m.held.language);\n return name ? `${name} · transcribing…` : 'Transcribing…';\n}\n\nfunction sentenceConfidence(segs: Segment[]): number | undefined {\n let sum = 0;\n let n = 0;\n for (const g of segs) {\n if (g.confidence == null) continue;\n const w = Math.max(1, g.words.length);\n sum += g.confidence * w;\n n += w;\n }\n return n ? sum / n : undefined;\n}\n\nfunction mergeSegTranslations(segs: Segment[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const g of segs) for (const [k, v] of Object.entries(g.translations)) out[k] = out[k] ? `${out[k]} ${v}` : v;\n return out;\n}\n\nexport const CONF_MID = 0.85;\nexport const CONF_LOW = 0.75;\n\nexport function confClass(p?: number | null): '' | 'mid' | 'low' {\n if (p == null) return '';\n if (p < CONF_LOW) return 'low';\n if (p < CONF_MID) return 'mid';\n return '';\n}\n\nexport function lowWords(r: Row, threshold = CONF_LOW): Word[] {\n return r.words.filter((w) => w.prob != null && w.prob < threshold);\n}\n\nexport const LANES = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] as const;\nexport type Lane = (typeof LANES)[number];\n\nexport function lane(speaker: number): Lane {\n return LANES[((speaker % LANES.length) + LANES.length) % LANES.length];\n}\n\nexport function speakerNumbers(m: Model): Map<number, number> {\n if (m.numbers) return m.numbers;\n const first = new Map<number, number>();\n const see = (speaker: number, at: number) => {\n if (speaker < 0) return;\n const was = first.get(speaker);\n if (was === undefined || at < was) first.set(speaker, at);\n };\n for (const s of m.sentences.values()) {\n const last = s.seqs.length ? m.segments.get(s.seqs[s.seqs.length - 1]) : undefined;\n see(s.speaker >= 0 ? s.speaker : last?.speaker ?? -1, s.start);\n }\n const order = [...first].sort((a, b) => a[1] - b[1] || a[0] - b[0]).map(([k]) => k);\n const rest = [...new Set([...Object.keys(m.speakers), ...Object.keys(m.speakerIds)].map(Number))]\n .filter((k) => k >= 0 && !first.has(k))\n .sort((a, b) => a - b);\n m.numbers = new Map([...order, ...rest].map((k, i) => [k, i + 1]));\n return m.numbers;\n}\n\nexport function speakerNumber(m: Model, speaker: number): number {\n if (speaker < 0) return 0;\n const n = speakerNumbers(m);\n return n.get(speaker) ?? n.size + 1 + speaker;\n}\n\nconst GENERIC_NAME = /^\\s*speaker\\s+\\d+\\s*$/i;\n\nfunction given(name?: string): string | undefined {\n return name && name.trim() && !GENERIC_NAME.test(name) ? name : undefined;\n}\n\nexport function speakerName(m: Model, speaker: number): string | undefined {\n return given(m.speakers[speaker]) ?? given(m.speakerIds[speaker]?.name);\n}\n\nexport function speakerLabel(m: Model, speaker: number): string {\n if (speaker < 0) return '';\n return speakerName(m, speaker) ?? `Speaker ${speakerNumber(m, speaker)}`;\n}\n\nexport function speakerInitial(m: Model, speaker: number): string {\n if (speaker < 0) return '?';\n const named = speakerName(m, speaker);\n if (!named) return `S${speakerNumber(m, speaker)}`;\n const initials = named\n .split(' ')\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0])\n .join('');\n return (initials || `S${speakerNumber(m, speaker)}`).toUpperCase();\n}\n\nexport function speakerColor(voiceColor?: string | null): { fg: string; soft: string } | undefined {\n if (!voiceColor) return undefined;\n if (voiceColor.startsWith('#')) {\n return { fg: voiceColor, soft: `color-mix(in srgb, ${voiceColor} 16%, transparent)` };\n }\n if (!/^[1-6]$/.test(voiceColor)) return undefined;\n return { fg: `var(--vx-${voiceColor})`, soft: `var(--vx-${voiceColor}-soft)` };\n}\n\nexport function speakerLook(m: Model, speaker: number): {\n fg?: string;\n soft?: string;\n lane: Lane;\n hasVoice: boolean;\n} {\n const id = m.speakerIds[speaker];\n const c = speakerColor(id?.color);\n return { fg: c?.fg, soft: c?.soft, lane: lane(speakerNumber(m, speaker) - 1), hasVoice: !!id };\n}\n\nexport function latestLatency(m: Model): number | undefined {\n let best: Segment | undefined;\n for (const g of m.segments.values()) if (!best || g.seq > best.seq) best = g;\n return best?.latencyS;\n}\n\nexport function peakLatency(m: Model): number {\n let p = 0;\n for (const g of m.segments.values()) p = Math.max(p, g.latencyS ?? 0);\n return p;\n}\n\nexport function showLabels(m: Model, rows: { speaker: number }[], fallback?: { speakerLabels?: 'auto' | 'on' | 'off' | null } | null, own = false): boolean {\n const said = fallback ? fallback.speakerLabels ?? 'auto' : null;\n const mode = (own ? said : null) ?? m.labels ?? said ?? 'on';\n if (mode !== 'auto') return mode === 'on';\n const seen = new Set<number>();\n for (const r of rows) if (r.speaker >= 0) { seen.add(r.speaker); if (seen.size > 1) return true; }\n return false;\n}\n","import { VocalStackError } from '@vocalstack/js-sdk';\nimport { reportError } from '../core/audio';\n\nexport interface ErrorLike { message: string; code?: string; status?: number; details?: any; requestId?: string }\n\nconst THEIRS = new Set([\n 'invalid_audio', 'invalid_options', 'invalid_token', 'invalid_body', 'session_expired', 'forbidden',\n 'not_found', 'conflict', 'invalid_state', 'password_required', 'rate_limited', 'language_unavailable', 'suspended',\n 'key_expired', 'key_revoked', 'key_from_browser', 'insufficient_credit', 'usage_cap_reached', 'payment_method_required',\n 'range_too_long', 'quota_exceeded', 'invalid_request', 'aborted', 'unauthorized',\n]);\n\nconst OURS: Record<string, string> = {\n internal: 'Something went wrong on our side. Please try again.',\n unavailable: 'VocalStack is briefly unavailable. Please try again in a moment.',\n engine_unavailable: 'No transcription engine is available right now. Please try again in a moment.',\n engine_lost: 'The transcription engine stopped. Please try again.',\n capacity_exceeded: 'Every transcription engine is busy right now. Please try again in a moment.',\n timeout: 'That took too long. Please try again.',\n};\nexport const GENERIC = OURS.internal;\nexport const OFFLINE = \"Can't reach VocalStack. Check your connection.\";\n\nconst BROWSER: Record<string, string> = {\n NotAllowedError: 'The browser blocked this. Allow it for this site, then try again.',\n NotSupportedError: \"The audio couldn't be loaded. Try again in a moment.\",\n AbortError: 'It was cancelled.',\n};\n\nexport function describe(e: unknown): ErrorLike {\n const any = e as any;\n const code: string | undefined = typeof any?.code === 'string' ? any.code : undefined;\n const status: number | undefined = typeof any?.status === 'number' ? any.status : undefined;\n const details = any?.details;\n if (code || (status && status >= 400)) {\n const rid = typeof any?.requestId === 'string' && any.requestId ? { requestId: any.requestId as string } : {};\n if (code && THEIRS.has(code) && typeof any?.message === 'string') return { message: any.message, code, status, details, ...rid };\n if (code === 'unavailable' && status === undefined) return { message: OFFLINE, code, details, ...rid };\n if (status === 0) return { message: typeof any?.message === 'string' ? any.message : OFFLINE, code, status, details, ...rid };\n return { message: (code && OURS[code]) || GENERIC, code, status, details, ...rid };\n }\n const name: string = any?.name ?? '';\n if (name === 'TypeError' && /fetch|network|load failed/i.test(String(any?.message ?? ''))) {\n if (typeof navigator !== 'undefined' && navigator.onLine !== false) reportError(e instanceof Error ? e : new Error(String(e)));\n return { message: OFFLINE };\n }\n if (BROWSER[name]) return { message: BROWSER[name] };\n if (e instanceof Error && name === 'Error' && !(e instanceof VocalStackError)) return { message: e.message };\n return { message: GENERIC };\n}\n","import { createContext, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { VocalStack, type Recording, type TranscriptionJob, type ReadAs } from '@vocalstack/js-sdk';\nimport type { MediaCred } from '../core/audio';\nimport { describe, type ErrorLike } from './errors';\n\nexport const DEFAULT_API = 'https://api.vocalstack.com';\n\nexport interface PlayerApi {\n client: VocalStack;\n origin: string;\n owner: boolean;\n shareCode: string | null;\n listen: Listen | null;\n bearer: () => Promise<string | undefined>;\n cred: MediaCred;\n readAs: ReadAs;\n}\n\nexport interface PlayerSource {\n key: string;\n code: string | null;\n transcriptionId: string | null;\n name: string;\n recording: Recording;\n job: TranscriptionJob | null;\n allowDownload: boolean;\n allowExport: boolean;\n allowTranslate: boolean;\n sharedBy: string | null;\n}\n\nconst Ctx = createContext<PlayerApi | null>(null);\n\nexport function usePlayerApi(): PlayerApi {\n const v = useContext(Ctx);\n if (!v) throw new Error('VocalStack player hooks must be used inside <VocalStackPlayer> or <PlayerApiProvider>');\n return v;\n}\n\nexport type PlayerApiProviderProps = { children: ReactNode } & ({ value: PlayerApi } | (Partial<ApiOptions> & { value?: undefined }));\n\nexport function PlayerApiProvider(props: PlayerApiProviderProps) {\n if (props.value) return <Ctx.Provider value={props.value}>{props.children}</Ctx.Provider>;\n return <OwnApi {...props} />;\n}\n\nfunction OwnApi({ children, ...o }: Partial<ApiOptions> & { children: ReactNode }) {\n const api = useApi(o);\n return <Ctx.Provider value={api}>{children}</Ctx.Provider>;\n}\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport function isTranscriptionId(id: string): boolean {\n return UUID.test(id);\n}\n\nexport type TokenSource = string | (() => string | undefined | null | Promise<string | undefined | null>);\n\nexport interface Listen { transcriptionId: string; recordingId: string; token: string }\n\nexport interface ApiOptions { id?: string | null; token?: TokenSource | null; baseUrl?: string | null; listen?: Listen | null; listenerToken?: string | null; client?: VocalStack | null }\n\nexport function useApi(o: ApiOptions): PlayerApi {\n const listen = o.listen ?? null;\n const listenerToken = listen ? null : o.listenerToken ?? null;\n const owner = !listen && !listenerToken && !!o.token && (!o.id || isTranscriptionId(o.id));\n const origin = (o.baseUrl ?? DEFAULT_API).replace(/\\/$/, '');\n const tokRef = useRef(o.token);\n tokRef.current = o.token;\n const hasToken = !!o.token;\n const bearer = useMemo(() => async () => {\n const t = tokRef.current;\n const v = typeof t === 'function' ? await t() : t;\n return v || undefined;\n }, []);\n const [ownerTok, setOwnerTok] = useState<string | null>(() => {\n const t = o.token;\n const v = typeof t === 'function' ? t() : t;\n return typeof v === 'string' && v ? v : null;\n });\n useEffect(() => {\n if (!owner) return;\n let live = true;\n void bearer().then((v) => { if (live && v) setOwnerTok((cur) => cur ?? v); });\n return () => { live = false; };\n }, [owner, bearer]);\n const given = o.client ?? null;\n const client = useMemo(() => given ?? new VocalStack({ baseUrl: origin, token: hasToken && !listen ? bearer : undefined }), [given, origin, hasToken, bearer, listen]);\n return useMemo(() => {\n if (listen) return { client, origin, owner: false, shareCode: null, listen, bearer, cred: { listenerToken: listen.token }, readAs: { listenerToken: listen.token } };\n if (listenerToken) return { client, origin, owner: false, shareCode: null, listen: null, bearer, cred: { listenerToken }, readAs: { listenerToken } };\n const shareCode = owner ? null : o.id || null;\n const readAs: ReadAs = shareCode ? { shareCode } : {};\n return { client, origin, owner, shareCode, listen: null, bearer, cred: owner ? { accessToken: ownerTok ?? undefined } : { shareCode }, readAs };\n }, [client, origin, owner, o.id, bearer, listen, listenerToken, ownerTok]);\n}\n\nexport function withMedia(api: PlayerApi, media: string | null): PlayerApi {\n return media ? { ...api, cred: { ...api.cred, media } } : api;\n}\n\nexport async function loadSource(api: PlayerApi, id: string): Promise<PlayerSource> {\n if (api.listen) {\n const recording = await api.client.recordings.get(api.listen.recordingId, api.readAs);\n const r: any = recording;\n return { key: id, code: null, transcriptionId: api.listen.transcriptionId, name: r.name ?? r.title ?? '', recording, job: r.job ?? (r.source ? { source: r.source } : null), allowDownload: true, allowExport: true, allowTranslate: true, sharedBy: null };\n }\n if (api.owner) {\n const tx = await api.client.transcriptions.get(id);\n const job = (tx as any).job ?? null;\n const rid: string | null = job?.recordingId ?? null;\n if (!rid) throw Object.assign(new Error('This transcription has no recording yet.'), { code: 'not_found', status: 404 });\n const recording = await api.client.recordings.get(rid);\n return { key: id, code: null, transcriptionId: tx.id, name: tx.name ?? '', recording, job, allowDownload: true, allowExport: true, allowTranslate: true, sharedBy: null };\n }\n const s = await api.client.shareLinks.open(id);\n return {\n key: id, code: s.code ?? id, transcriptionId: s.transcriptionId ?? null, name: s.name ?? '', recording: s.recording, job: s.job ?? null,\n allowDownload: !!s.allowDownload, allowExport: !!s.allowExport, allowTranslate: !!s.allowTranslate, sharedBy: s.sharedBy ?? null,\n };\n}\n\nexport function useSource(api: PlayerApi, id: string): { source: PlayerSource | null; gone: boolean; error: ErrorLike | null; reload: () => void } {\n const [source, setSource] = useState<PlayerSource | null>(null);\n const [gone, setGone] = useState(false);\n const [error, setError] = useState<ErrorLike | null>(null);\n const [n, setN] = useState(0);\n useEffect(() => {\n let alive = true;\n loadSource(api, id)\n .then((s) => { if (alive) { setSource(s); setGone(false); setError(null); } })\n .catch((e) => { if (!alive) return; const d = describe(e); if (d.code === 'not_found' || d.status === 404) setGone(true); else setError(d); });\n return () => { alive = false; };\n }, [api, id, n]);\n return { source, gone, error, reload: () => setN((x) => x + 1) };\n}\n\nexport function useMediaToken(api: PlayerApi, recordingId: string | null): string | null {\n const [tok, setTok] = useState<string | null>(null);\n useEffect(() => {\n if (!api.owner || !recordingId) { setTok(null); return; }\n let alive = true;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const get = () => api.client.recordings.mediaToken(recordingId).then((t) => {\n if (!alive) return;\n setTok(t.token);\n const left = Date.parse(t.expiresAt) - Date.now();\n timer = setTimeout(get, Math.max(60_000, left - 10 * 60_000));\n }).catch(() => { if (alive) timer = setTimeout(get, 30_000); });\n void get();\n return () => { alive = false; clearTimeout(timer); };\n }, [api, recordingId]);\n return tok;\n}\n\nexport async function apiFetch(api: PlayerApi, path: string, init: { method?: string; body?: unknown; query?: Record<string, string | undefined> } = {}): Promise<Response> {\n const q = new URLSearchParams();\n for (const [k, v] of Object.entries(init.query ?? {})) if (v != null) q.set(k, v);\n if (api.shareCode) q.set('shareCode', api.shareCode);\n if (api.listen) q.set('listenerToken', api.listen.token);\n const headers: Record<string, string> = {};\n if (init.body !== undefined) headers['content-type'] = 'application/json';\n if (api.owner) { const t = await api.bearer(); if (t) headers.authorization = `Bearer ${t}`; }\n const qs = q.toString();\n return fetch(`${api.origin}${path}${qs ? `${path.includes('?') ? '&' : '?'}${qs}` : ''}`, { method: init.method ?? 'GET', headers, body: init.body === undefined ? undefined : JSON.stringify(init.body) });\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { LanguageLists, Subscription } from '@vocalstack/js-sdk';\nimport { applyFrame, empty, fromSnapshot, type Model } from '../core/transcript';\nimport { describe, type ErrorLike } from './errors';\nimport { usePlayerApi, type PlayerApi } from './context';\n\nexport { describe, type ErrorLike };\n\nconst langCache = new Map<string, LanguageLists>();\nexport function useLanguages(): LanguageLists | null {\n const api = usePlayerApi();\n const [l, setL] = useState<LanguageLists | null>(langCache.get(api.origin) ?? null);\n useEffect(() => {\n if (langCache.has(api.origin)) return;\n api.client.languages.list().then((x) => { langCache.set(api.origin, x); setL(x); }).catch(() => {});\n }, [api]);\n return l;\n}\n\nexport function useAsync<T>(fn: () => Promise<T>, deps: unknown[]): { data: T | null; error: ErrorLike | null; reload: () => void } {\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<ErrorLike | null>(null);\n const [n, setN] = useState(0);\n useEffect(() => {\n let alive = true;\n fn().then((d) => alive && setData(d)).catch((e) => alive && setError(describe(e)));\n return () => { alive = false; };\n }, [...deps, n]); // eslint-disable-line react-hooks/exhaustive-deps\n return { data, error, reload: () => setN((x) => x + 1) };\n}\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nconst PENDING_REFETCH_MS = 2500;\nconst PENDING_REFETCHES = 72;\n\nexport function useTranscript(recordingId: string | null, opts: { lang?: string | null; voice?: string | null; onState?: (s: string, reason?: string) => void; onFrame?: (f: any) => void }) {\n const api: PlayerApi = usePlayerApi();\n const apiRef = useRef(api);\n apiRef.current = api;\n const [model, setModel] = useState<Model>(empty);\n const modelRef = useRef<Model>(empty());\n const subRef = useRef<Subscription | null>(null);\n const langRef = useRef<string | null>(opts.lang ?? null);\n const [connected, setConnected] = useState(false);\n const [error, setError] = useState<ErrorLike | null>(null);\n const [notFound, setNotFound] = useState(false);\n const bump = useCallback(() => {\n const m = modelRef.current;\n setModel({ ...m });\n }, []);\n const optsRef = useRef(opts);\n optsRef.current = opts;\n\n useEffect(() => {\n if (!recordingId) return;\n let alive = true;\n let attempt = 0;\n modelRef.current = empty();\n setModel(empty());\n setNotFound(false);\n const client = api.client;\n let announced = modelRef.current.state;\n const announceState = () => {\n const s = modelRef.current.state;\n if (s === announced) return;\n announced = s;\n optsRef.current.onState?.(s);\n };\n (async () => {\n while (alive) {\n let sub: Subscription | null = null;\n try {\n const asked = langRef.current;\n sub = await client.recordings.subscribe(recordingId, { lang: asked ?? undefined, ...api.readAs, asOwner: api.owner, voice: opts.voice ?? undefined });\n if (!alive) { sub.close(); return; }\n attempt = 0;\n subRef.current = sub;\n if (langRef.current !== asked) sub.setLanguage(langRef.current);\n setConnected(true);\n setError(null);\n modelRef.current = fromSnapshot(sub.snapshot!, modelRef.current);\n bump();\n announceState();\n for await (const ev of sub) {\n if (!alive) break;\n if (ev.type === 'snapshot') { modelRef.current = fromSnapshot(ev.snapshot, ev.reason === 'gap' ? modelRef.current : empty()); bump(); announceState(); }\n else if (ev.type === 'frame') {\n applyFrame(modelRef.current, ev.frame);\n const f: any = ev.frame;\n if (f.type === 'recording.state') { announced = modelRef.current.state; optsRef.current.onState?.(f.state, f.reason); }\n optsRef.current.onFrame?.(f);\n bump();\n } else if (ev.type === 'closed') {\n setConnected(false);\n }\n }\n } catch (e) {\n if (!alive) return;\n const d = describe(e);\n if (d.code === 'not_found' || d.status === 404) { setNotFound(true); setError(d); return; }\n try {\n await client.recordings.get(recordingId, api.readAs);\n } catch (pe) {\n const pd = describe(pe);\n if (pd.code === 'not_found' || pd.status === 404) { setNotFound(true); setError(pd); return; }\n if (pd.code === 'forbidden' || pd.code === 'invalid_token' || pd.code === 'password_required' || pd.status === 401 || pd.status === 403) { setError(pd); return; }\n }\n if (d.code === 'forbidden' || d.code === 'invalid_token' || d.code === 'password_required' || d.status === 401 || d.status === 403) { setError(d); return; }\n setError(d);\n } finally {\n if (subRef.current === sub) subRef.current = null;\n setConnected(false);\n }\n const st = modelRef.current.state;\n if (!alive || st === 'ended' || st === 'finalized' || st === 'processing') return;\n attempt += 1;\n await sleep(Math.min(15000, 1000 * 2 ** Math.min(attempt, 4)));\n }\n })();\n return () => {\n alive = false;\n subRef.current?.close();\n subRef.current = null;\n setConnected(false);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recordingId, api, opts.voice]);\n\n const [translating, setTranslating] = useState(false);\n const [translateFailed, setTranslateFailed] = useState<string | null>(null);\n const langTurn = useRef(0);\n const [shownLang, setShownLang] = useState<string | null>(null);\n const setLanguage = useCallback((lang: string | null) => {\n langRef.current = lang;\n subRef.current?.setLanguage(lang);\n if (!recordingId) return;\n const client = apiRef.current.client;\n const turn = ++langTurn.current;\n setTranslating(true);\n setTranslateFailed(null);\n const fetchOnce = (again: number) => client.recordings.transcript(recordingId, { lang: lang ?? undefined, ...apiRef.current.readAs, asListener: !apiRef.current.owner })\n .then((snap) => {\n if (turn !== langTurn.current) return;\n modelRef.current = fromSnapshot(snap, modelRef.current);\n setShownLang(lang);\n bump();\n if (snap.translationPending && again > 0) window.setTimeout(() => { if (turn === langTurn.current) void fetchOnce(again - 1).catch(() => {}); }, PENDING_REFETCH_MS);\n });\n fetchOnce(PENDING_REFETCHES)\n .catch(() => { if (turn === langTurn.current && lang) setTranslateFailed(lang); })\n .finally(() => { if (turn === langTurn.current) setTranslating(false); });\n }, [bump, recordingId]);\n\n const mergeTranslations = useCallback((lang: string, made: Record<string, string>) => {\n const m = modelRef.current;\n let touched = false;\n for (const [id, text] of Object.entries(made)) {\n const s = m.sentences.get(Number(id));\n if (!s) continue;\n s.translations = { ...s.translations, [lang]: text };\n touched = true;\n }\n if (touched) bump();\n }, [bump]);\n const clearError = useCallback(() => setError(null), []);\n\n\n return { model, connected, error, notFound, clearError, setLanguage, mergeTranslations, translating, translateFailed, shownLang };\n}\n","export type I18nKey = keyof typeof I18N.English;\nexport type Strings = Record<I18nKey, string>;\nexport const I18N = {\n English: { vcFor: 'Voice for', vcMute: 'Mute', vcUnmute: 'Unmute', vcMuted: 'MUTED', vcShared: 'Also used by', vcUsedBy: 'Used by', vcUnknownSpk: 'Unknown', vcUse: 'Use this voice', vcGetting: 'Downloading…', vcSample: 'Here’s how it sounds.', vcPreview: 'PREVIEW', vcMale: 'Male', vcFemale: 'Female', vcSynth: 'SYNTHETIC', origAudio: 'ORIGINAL AUDIO', vcCloned: 'VOICES', vcBadge: 'CLONED', vcNone: 'TEXT ONLY', vcNoVoice: 'No voice for ', vcSheet: 'VOICE', vcNeutral: 'SYNTHETIC VOICE', vcWarm: 'SYNTHETIC VOICE', searchPlaceholder: 'Search this broadcast', noise: 'Audio unclear', newLines: 'new', live: 'LIVE', ended: 'ENDED', waiting: 'WAITING', corrected: 'CORRECTED', hostLine: 'Hosted by Marcus Reed · 4 speakers', langLabel: 'LANGUAGE', langCount: '100+ languages', read: 'Read', listen: 'Listen', watch: 'Watch', waitTitle: 'The broadcast hasn’t started yet', waitBody: 'The transcript appears here as soon as the host starts speaking.', english: 'ENGLISH', playing: 'Playing the live audio', ready: 'Tap to start audio', readyNote: 'Set your volume first', voiceMeta: 'ORIGINAL AUDIO', voice: 'Voice', sheetTitle: 'APP LANGUAGE', done: 'Done', search: 'Search 100+ languages', sheetNote: 'Follow along in your language.', moreLangs: 'more', confTitle: 'Some words weren\\'t heard clearly', confBody: 'The transcript marks words the model is unsure about with a dashed underline. The words keep their colour, so only the underline tells you where to look.', confMid: 'Slightly unsure — probably right', confHigh: 'Low confidence — may be wrong', settings: 'BROADCAST', setOrig: 'Show original language', setTheme: 'Appearance', light: 'Light', dark: 'Dark', setConf: 'Show uncertain words', setConfHint1: 'Colours words the model is unsure about — ', setConfMid: 'amber', setConfSep: ' or ', setConfLow: 'red', setConfHint2: '', behindLive: 'TRANSLATION LATENCY', behindNote: 'How far the translation trails the speaker right now.', shareLabel: 'LIVE TRANSLATION LINK', copy: 'Copy', copied: 'Copied' },\n Spanish: { vcFor: 'Voz de', vcMute: 'Silenciar', vcUnmute: 'Activar', vcMuted: 'SILENCIADO', vcShared: 'También la usa', vcUsedBy: 'La usa', vcUnknownSpk: 'Desconocido', vcUse: 'Usar esta voz', vcGetting: 'Descargando…', vcSample: 'Así suena esta voz.', vcPreview: 'MUESTRA', vcMale: 'Hombre', vcFemale: 'Mujer', vcSynth: 'SINTÉTICA', origAudio: 'AUDIO ORIGINAL', vcCloned: 'VOCES', vcBadge: 'CLONADA', vcNone: 'SOLO TEXTO', vcNoVoice: 'Sin voz para ', vcSheet: 'VOZ', vcNeutral: 'VOZ SINTÉTICA', vcWarm: 'VOZ SINTÉTICA', searchPlaceholder: 'Buscar en esta emisión', noise: 'Audio poco claro', newLines: 'nuevas', live: 'EN VIVO', ended: 'FINALIZADA', waiting: 'EN ESPERA', corrected: 'CORREGIDO', hostLine: 'Presenta Marcus Reed · 4 hablantes', langLabel: 'IDIOMA', langCount: '100+ idiomas', read: 'Leer', listen: 'Escuchar', watch: 'Ver', waitTitle: 'La emisión aún no ha comenzado', waitBody: 'La transcripción aparecerá aquí en cuanto el anfitrión empiece a hablar.', english: 'INGLÉS', playing: 'Reproduciendo la traducción al español', ready: 'Toca para iniciar el audio', readyNote: 'Ajusta el volumen primero', voiceMeta: 'VOZ NEUTRA', voice: 'Voz', sheetTitle: 'IDIOMA DE LA APP', done: 'Listo', search: 'Buscar entre 100+ idiomas', sheetNote: 'Sigue la emisión en tu idioma.', moreLangs: 'más', confTitle: 'Algunas palabras no se oyeron bien', confBody: 'La transcripción marca las palabras dudosas con un subrayado discontinuo. Las palabras conservan su color, así que solo el subrayado te indica dónde mirar.', confMid: 'Poca duda: probablemente correcta', confHigh: 'Baja confianza: puede estar mal', settings: 'EMISIÓN', setOrig: 'Mostrar idioma original', setTheme: 'Apariencia', light: 'Claro', dark: 'Oscuro', setConf: 'Mostrar palabras dudosas', setConfHint1: 'Colorea las palabras dudosas: ', setConfMid: 'ámbar', setConfSep: ' o ', setConfLow: 'rojo', setConfHint2: '', behindLive: 'LATENCIA DE TRADUCCIÓN', behindNote: 'Cuánto se retrasa la traducción respecto a quien habla.', shareLabel: 'ENLACE PARA SEGUIR', copy: 'Copiar', copied: 'Copiado' },\n French: { vcFor: 'Voix de', vcMute: 'Couper', vcUnmute: 'Réactiver', vcMuted: 'COUPÉ', vcShared: 'Aussi utilisée par', vcUsedBy: 'Utilisée par', vcUnknownSpk: 'Inconnu', vcUse: 'Utiliser cette voix', vcGetting: 'Téléchargement…', vcSample: 'Voici le rendu.', vcPreview: 'APERÇU', vcMale: 'Homme', vcFemale: 'Femme', vcSynth: 'SYNTHÉTIQUE', origAudio: 'AUDIO ORIGINAL', vcCloned: 'VOIX', vcBadge: 'CLONÉE', vcNone: 'TEXTE SEUL', vcNoVoice: 'Aucune voix pour ', vcSheet: 'VOIX', vcNeutral: 'VOIX SYNTHÉTIQUE', vcWarm: 'VOIX SYNTHÉTIQUE', searchPlaceholder: 'Rechercher dans la diffusion', noise: 'Audio peu clair', newLines: 'nouvelles', live: 'EN DIRECT', ended: 'TERMINÉ', waiting: 'EN ATTENTE', corrected: 'CORRIGÉ', hostLine: 'Animé par Marcus Reed · 4 intervenants', langLabel: 'LANGUE', langCount: '100+ langues', read: 'Lire', listen: 'Écouter', watch: 'Regarder', waitTitle: 'La diffusion n’a pas encore commencé', waitBody: 'La transcription s’affichera ici dès que l’animateur prendra la parole.', english: 'ANGLAIS', playing: 'Lecture de la traduction française', ready: \"Touchez pour lancer l'audio\", readyNote: \"Réglez le volume d'abord\", voiceMeta: 'VOIX NEUTRE', voice: 'Voix', sheetTitle: 'LANGUE DE L\\'APP', done: 'Terminé', search: 'Rechercher parmi 100+ langues', sheetNote: 'Suivez la diffusion dans votre langue.', moreLangs: 'autres', confTitle: 'Certains mots n\\'ont pas été bien entendus', confBody: 'La transcription marque les mots incertains d\\'un soulignement en pointillés. Les mots gardent leur couleur : seul le soulignement attire l\\'attention.', confMid: 'Léger doute — probablement juste', confHigh: 'Faible confiance — peut être faux', settings: 'DIFFUSION', setOrig: 'Afficher la langue d\\'origine', setTheme: 'Apparence', light: 'Clair', dark: 'Sombre', setConf: 'Afficher les mots incertains', setConfHint1: 'Colore les mots incertains — ', setConfMid: 'ambre', setConfSep: ' ou ', setConfLow: 'rouge', setConfHint2: '', behindLive: 'LATENCE DE TRADUCTION', behindNote: 'De combien la traduction suit le locuteur en ce moment.', shareLabel: 'LIEN DE SUIVI', copy: 'Copier', copied: 'Copié' },\n Japanese: { vcFor: '話者の音声', vcMute: 'ミュート', vcUnmute: '解除', vcMuted: 'ミュート', vcShared: '同じ音声', vcUsedBy: '使用中', vcUnknownSpk: '不明', vcUse: 'この音声を使う', vcGetting: 'ダウンロード中…', vcSample: 'こう聞こえます。', vcPreview: 'プレビュー', vcMale: '男性', vcFemale: '女性', vcSynth: '合成', origAudio: '元の音声', vcCloned: '音声', vcBadge: 'クローン', vcNone: 'テキストのみ', vcNoVoice: '音声がありません: ', vcSheet: '音声', vcNeutral: '合成音声', vcWarm: '合成音声', searchPlaceholder: 'この配信を検索', noise: '音声が不明瞭です', newLines: '件', live: 'ライブ', ended: '終了', waiting: '待機中', corrected: '修正済み', hostLine: '主催 Marcus Reed · 話者4人', langLabel: '言語', langCount: '100以上の言語', read: '読む', listen: '聞く', watch: '視聴', waitTitle: '配信はまだ始まっていません', waitBody: 'ホストが話し始めると、ここに文字起こしが表示されます。', english: '英語', playing: '日本語の翻訳を再生中', ready: 'タップして音声を再生', readyNote: '先に音量を調整してください', voiceMeta: 'ニュートラル音声', voice: '音声', sheetTitle: 'アプリの言語', done: '完了', search: '100以上の言語を検索', sheetNote: 'あなたの言語で追いかけられます。', moreLangs: '言語', confTitle: '聞き取りが不明瞭な語があります', confBody: 'モデルが自信を持てない語には破線の下線が付きます。文字色は変わらないため、注目すべき箇所は下線だけが示します。', confMid: 'やや不確か — おおむね正しい', confHigh: '信頼度が低い — 誤りの可能性', settings: '配信', setOrig: '原文の言語を表示', setTheme: '外観', light: 'ライト', dark: 'ダーク', setConf: '不確かな語を表示', setConfHint1: '自信のない語に色を付けます — ', setConfMid: '黄', setConfSep: ' か ', setConfLow: '赤', setConfHint2: '', behindLive: '翻訳のレイテンシ', behindNote: '現在、翻訳が話者からどれだけ遅れているか。', shareLabel: '共有リンク', copy: 'コピー', copied: 'コピー済み' },\n Romanian: { vcFor: 'Vocea pentru', vcMute: 'Oprește', vcUnmute: 'Pornește', vcMuted: 'OPRIT', vcShared: 'Folosită și de', vcUsedBy: 'Folosită de', vcUnknownSpk: 'Necunoscut', vcUse: 'Folosește această voce', vcGetting: 'Se descarcă…', vcSample: 'Așa sună această voce.', vcPreview: 'MOSTRĂ', vcMale: 'Bărbat', vcFemale: 'Femeie', vcSynth: 'SINTETICĂ', origAudio: 'AUDIO ORIGINAL', vcCloned: 'VOCI', vcBadge: 'CLONATĂ', vcNone: 'DOAR TEXT', vcNoVoice: 'Nicio voce pentru ', vcSheet: 'VOCE', vcNeutral: 'VOCE SINTETICĂ', vcWarm: 'VOCE SINTETICĂ', searchPlaceholder: 'Caută în transmisiune', noise: 'Sunet neclar', newLines: 'noi', live: 'ÎN DIRECT', ended: 'ÎNCHEIAT', waiting: 'ÎN AȘTEPTARE', corrected: 'CORECTAT', hostLine: 'Prezentat de Marcus Reed · 4 vorbitori', langLabel: 'LIMBĂ', langCount: '100+ de limbi', read: 'Citește', listen: 'Ascultă', watch: 'Vizionează', waitTitle: 'Transmisiunea nu a început încă', waitBody: 'Transcrierea va apărea aici imediat ce gazda începe să vorbească.', english: 'ENGLEZĂ', playing: 'Se redă traducerea în română', ready: 'Atinge pentru a porni audio', readyNote: 'Reglează întâi volumul', voiceMeta: 'VOCE NEUTRĂ', voice: 'Voce', sheetTitle: 'LIMBA APLICAȚIEI', done: 'Gata', search: 'Caută printre 100+ de limbi', sheetNote: 'Urmărește transmisiunea în limba ta.', moreLangs: 'în plus', confTitle: 'Unele cuvinte nu s-au auzit clar', confBody: 'Transcrierea marchează cuvintele incerte cu o subliniere întreruptă. Cuvintele își păstrează culoarea, doar sublinierea îți arată unde să te uiți.', confMid: 'Ușoară nesiguranță — probabil corect', confHigh: 'Încredere scăzută — poate fi greșit', settings: 'TRANSMISIUNE', setOrig: 'Arată limba originală', setTheme: 'Aspect', light: 'Luminos', dark: 'Întunecat', setConf: 'Arată cuvintele incerte', setConfHint1: 'Colorează cuvintele incerte — ', setConfMid: 'galben', setConfSep: ' sau ', setConfLow: 'roșu', setConfHint2: '', behindLive: 'LATENȚA TRADUCERII', behindNote: 'Cu cât urmează traducerea vorbitorul în acest moment.', shareLabel: 'LINK DE URMĂRIRE', copy: 'Copiază', copied: 'Copiat' },\n Portuguese: { vcFor: 'Voz de', vcMute: 'Silenciar', vcUnmute: 'Ativar', vcMuted: 'SILENCIADO', vcShared: 'Também usada por', vcUsedBy: 'Usada por', vcUnknownSpk: 'Desconhecido', vcUse: 'Usar esta voz', vcGetting: 'Baixando…', vcSample: 'É assim que soa.', vcPreview: 'AMOSTRA', vcMale: 'Homem', vcFemale: 'Mulher', vcSynth: 'SINTÉTICA', origAudio: 'ÁUDIO ORIGINAL', vcCloned: 'VOZES', vcBadge: 'CLONADA', vcNone: 'SÓ TEXTO', vcNoVoice: 'Sem voz para ', vcSheet: 'VOZ', vcNeutral: 'VOZ SINTÉTICA', vcWarm: 'VOZ SINTÉTICA', searchPlaceholder: 'Pesquisar nesta transmissão', noise: 'Áudio pouco claro', newLines: 'novas', live: 'AO VIVO', ended: 'ENCERRADA', waiting: 'AGUARDANDO', corrected: 'CORRIGIDO', hostLine: 'Apresentado por Marcus Reed · 4 falantes', langLabel: 'IDIOMA', langCount: '100+ idiomas', read: 'Ler', listen: 'Ouvir', watch: 'Assistir', waitTitle: 'A transmissão ainda não começou', waitBody: 'A transcrição aparece aqui assim que o apresentador começar a falar.', english: 'INGLÊS', playing: 'Reproduzindo a tradução em português', ready: 'Toque para iniciar o áudio', readyNote: 'Ajuste o volume primeiro', voiceMeta: 'VOZ NEUTRA', voice: 'Voz', sheetTitle: 'IDIOMA DO APP', done: 'Concluído', search: 'Pesquisar entre 100+ idiomas', sheetNote: 'Acompanhe a transmissão no seu idioma.', moreLangs: 'mais', confTitle: 'Algumas palavras não foram bem ouvidas', confBody: 'A transcrição marca as palavras duvidosas com um sublinhado tracejado. As palavras mantêm a sua cor, por isso só o sublinhado indica onde olhar.', confMid: 'Pouca dúvida — provavelmente certa', confHigh: 'Baixa confiança — pode estar errada', settings: 'TRANSMISSÃO', setOrig: 'Mostrar idioma original', setTheme: 'Aparência', light: 'Claro', dark: 'Escuro', setConf: 'Mostrar palavras duvidosas', setConfHint1: 'Colore as palavras duvidosas: ', setConfMid: 'âmbar', setConfSep: ' ou ', setConfLow: 'vermelho', setConfHint2: '', behindLive: 'LATÊNCIA DE TRADUÇÃO', behindNote: 'Quanto a tradução está atrás de quem fala agora.', shareLabel: 'LINK PARA ACOMPANHAR', copy: 'Copiar', copied: 'Copiado' },\n};\n\nexport function strings(name?: string | null): Strings {\n return (name && (I18N as Record<string, Strings>)[name]) || I18N.English;\n}\n","import type { ExportFormat, TranscriptionJob } from '@vocalstack/js-sdk';\nimport { VocalStackError } from '@vocalstack/js-sdk';\nimport { voiceTrackDownloadUrl, type MediaCred } from '../core/audio';\nimport { rowForVoice, type VoiceTrackRow } from '../core/voiceplayer';\nimport type { PlayerApi } from './context';\nimport { GENERIC } from './errors';\n\nasync function answerError(r: Response): Promise<VocalStackError> {\n const j: any = await r.json().catch(() => null);\n const code = j?.error?.code ?? j?.code;\n const message = j?.error?.message ?? j?.message;\n return new VocalStackError(typeof code === 'string' ? code as never : 'internal', typeof message === 'string' ? message : GENERIC, { status: r.status, details: j?.error?.data?.details ?? j?.data?.details });\n}\n\nexport type TxRowStatus = 'queued' | 'cropping' | 'transcribing' | 'done' | 'failed' | 'stopped' | 'live';\n\nexport interface TxProgress {\n state: TranscriptionJob['state'];\n processedS: number;\n totalS: number | null;\n segmentsDone: number;\n segmentsTotal: number | null;\n pct: number;\n error?: string | null;\n}\n\nexport function rowStatusOf(state: TranscriptionJob['state'] | undefined | null): TxRowStatus {\n switch (state) {\n case 'transcribing': return 'transcribing';\n case 'cropping': return 'cropping';\n case 'done': return 'done';\n case 'failed': return 'failed';\n case 'stopped': return 'stopped';\n default: return 'queued';\n }\n}\n\nexport function progressOf(job: TranscriptionJob | null): TxProgress | null {\n if (!job) return null;\n if (!job.progress) return job.state ? { state: job.state, processedS: 0, totalS: null, segmentsDone: 0, segmentsTotal: null, pct: 0, error: job.error ?? null } : null;\n return { state: job.state, processedS: job.progress.processedS, totalS: job.progress.totalS ?? null, segmentsDone: job.progress.segmentsDone, segmentsTotal: job.progress.segmentsTotal ?? null, pct: job.progress.pct, error: job.error ?? null };\n}\n\nexport const segsLabel = (p: TxProgress | null, fallbackDone: number) => {\n const done = p?.segmentsDone ?? fallbackDone;\n const total = Math.max(done, p?.segmentsTotal ?? done);\n return `${done} / ${total} SEGMENTS`;\n};\n\nexport function jobLengthS(job: TranscriptionJob | null | undefined, progress?: TxProgress | null): number | null {\n const full = job?.source?.durationS ?? progress?.totalS ?? null;\n const c = job?.crop;\n if (c && (c.startS != null || c.endS != null)) {\n const end = c.endS ?? full;\n if (end != null) return Math.max(0, end - (c.startS ?? 0));\n }\n return full;\n}\n\nexport const TX_FORMATS: { key: ExportFormat; name: string; ext: string; note: string; icon: string }[] = [\n { key: 'pdf', name: 'PDF', ext: 'PDF', note: 'Formatted transcript in paragraphs, with timestamps and speaker labels.', icon: 'M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z' },\n { key: 'xlsx', name: 'Excel', ext: 'XLSX', note: 'One row per segment: start, end, speaker, text, confidence.', icon: 'M3.375 19.5h17.25m-17.25 0a1.125 1.125 0 0 1-1.125-1.125M3.375 19.5h7.5c.621 0 1.125-.504 1.125-1.125m-9.75 0V5.625m0 12.75v-1.5c0-.621.504-1.125 1.125-1.125m18.375 2.625V5.625m0 12.75c0 .621-.504 1.125-1.125 1.125m1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125m0 3.75h-7.5A1.125 1.125 0 0 1 12 18.375m9.75-12.75c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125m19.5 0v1.5c0 .621-.504 1.125-1.125 1.125M2.25 5.625v1.5c0 .621.504 1.125 1.125 1.125m0 0h17.25m-17.25 0h7.5c.621 0 1.125.504 1.125 1.125M3.375 8.25c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125m17.25-3.75h-7.5c-.621 0-1.125.504-1.125 1.125m8.625-1.125c.621 0 1.125.504 1.125 1.125v1.5c0 .621-.504 1.125-1.125 1.125m0 0h-7.5m-9 0h7.5m0 0c.621 0 1.125.504 1.125 1.125M12 10.875v-1.5m0 1.5c0 .621-.504 1.125-1.125 1.125M12 10.875c0 .621.504 1.125 1.125 1.125m-2.25 0c.621 0 1.125.504 1.125 1.125M13.125 12h7.5m-7.5 0c-.621 0-1.125.504-1.125 1.125M20.625 12c.621 0 1.125.504 1.125 1.125v1.5c0 .621-.504 1.125-1.125 1.125m-17.25 0h7.5M12 14.625v-1.5m0 1.5c0 .621-.504 1.125-1.125 1.125M12 14.625c0 .621.504 1.125 1.125 1.125m-2.25 0c.621 0 1.125.504 1.125 1.125m0 1.5v-1.5m0 0c0-.621.504-1.125 1.125-1.125m0 0h7.5' },\n { key: 'srt', name: 'Subtitles', ext: 'SRT / VTT', note: 'Timed caption cues, ready for a video editor or a player.', icon: 'M2.25 15.75V8.25A2.25 2.25 0 0 1 4.5 6h15a2.25 2.25 0 0 1 2.25 2.25v7.5A2.25 2.25 0 0 1 19.5 18h-15a2.25 2.25 0 0 1-2.25-2.25Zm4.5-4.5h4.5m-4.5 3h1.5m3 0h6m-3-3h3' },\n { key: 'json', name: 'JSON', ext: 'JSON', note: 'Word-level timings, confidence scores and speaker turns.', icon: 'M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5' },\n];\n\nexport function saveUrl(url: string) {\n const a = document.createElement('a');\n a.href = url; a.style.display = 'none';\n document.body.appendChild(a); a.click(); a.remove();\n}\n\nexport async function saveWhenReady(url: string) {\n const r = await fetch(url, { redirect: 'manual' });\n if (r.type !== 'opaqueredirect' && !r.ok) throw await answerError(r);\n saveUrl(url);\n}\n\nexport async function exportTranscript(api: PlayerApi, recordingId: string, key: ExportFormat, opts: { lang?: string | null } = {}) {\n const res = await api.client.recordings.export(recordingId, key, { lang: opts.lang ?? undefined, ...api.readAs });\n if (!res.ok) throw await answerError(res);\n const blob = await res.blob();\n const cd = res.headers.get('content-disposition') ?? '';\n const star = /filename\\*=UTF-8''([^;]+)/i.exec(cd)?.[1];\n const plain = /filename=\"([^\"]+)\"/i.exec(cd)?.[1];\n const name = star ? decodeURIComponent(star) : plain ?? `transcript.${key}`;\n const href = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = href; a.download = name; a.style.display = 'none';\n document.body.appendChild(a); a.click(); a.remove();\n window.setTimeout(() => URL.revokeObjectURL(href), 60_000);\n}\n\nexport async function downloadVoiceTrack(api: PlayerApi, opts: {\n recordingId: string;\n lang: string;\n voiceKey: string;\n cred: MediaCred;\n request: () => Promise<unknown>;\n timeoutMs?: number;\n}) {\n const { recordingId, lang, voiceKey, cred } = opts;\n const list = async (): Promise<VoiceTrackRow[]> => {\n const got = (await api.client.recordings.voice(recordingId, lang, api.readAs)) as unknown as VoiceTrackRow[];\n return got.filter((x) => x.lang === lang);\n };\n const mine = (rows: VoiceTrackRow[]) => rowForVoice(rows, voiceKey);\n let row = mine(await list());\n if (!row || row.state === 'clips' || row.state === 'failed') await opts.request();\n const until = Date.now() + (opts.timeoutMs ?? 10 * 60_000);\n while (!row || row.state !== 'sealed') {\n if (row?.state === 'failed') throw new Error(row.error || 'The spoken track could not be made.');\n if (Date.now() > until) throw new Error('The spoken track is taking too long; try again in a moment.');\n await new Promise((r) => setTimeout(r, 4000));\n row = mine(await list());\n }\n saveUrl(voiceTrackDownloadUrl(api.origin, recordingId, lang, row.voiceKey, cred));\n}\n","export const ytIdOf = (u: string | null | undefined) => u?.match(/(?:youtu\\.be\\/|[?&]v=|\\/shorts\\/|\\/embed\\/|\\/live\\/)([\\w-]{11})/)?.[1] ?? null;\n\nexport const YOUTUBE_LINK = /(youtube\\.com|youtu\\.be)/i;\n\nexport const isLiveRefusal = (url: string | null | undefined, error: string | null | undefined) =>\n !!ytIdOf(url) && /live stream/i.test(error ?? '');\n\nexport const previewEmbedUrl = (id: string) =>\n `https://www.youtube-nocookie.com/embed/${id}?modestbranding=1&rel=0&playsinline=1`;\n\nexport const ytThumbUrl = (id: string) => `https://i.ytimg.com/vi/${id}/mqdefault.jpg`;\n\nexport const YT_D = 'M2.25 12c0-2.6.2-4.3.5-5.2a2.3 2.3 0 0 1 1.6-1.6C5.8 4.8 12 4.8 12 4.8s6.2 0 7.65.4a2.3 2.3 0 0 1 1.6 1.6c.3.9.5 2.6.5 5.2s-.2 4.3-.5 5.2a2.3 2.3 0 0 1-1.6 1.6c-1.45.4-7.65.4-7.65.4s-6.2 0-7.65-.4a2.3 2.3 0 0 1-1.6-1.6c-.3-.9-.5-2.6-.5-5.2ZM10 9.25v5.5L14.75 12 10 9.25Z';\n\nexport async function youtubeTitle(id: string, signal?: AbortSignal): Promise<string | null> {\n try {\n const watch = `https://www.youtube.com/watch?v=${id}`;\n const res = await fetch(`https://www.youtube.com/oembed?format=json&url=${encodeURIComponent(watch)}`, { signal });\n if (!res.ok) return null;\n const j = (await res.json()) as { title?: unknown };\n return typeof j.title === 'string' && j.title.trim() ? j.title.trim() : null;\n } catch {\n return null;\n }\n}\n\nexport async function youtubeChannel(id: string, signal?: AbortSignal): Promise<string | null> {\n try {\n const watch = `https://www.youtube.com/watch?v=${id}`;\n const res = await fetch(`https://www.youtube.com/oembed?format=json&url=${encodeURIComponent(watch)}`, { signal });\n if (!res.ok) return null;\n const j = (await res.json()) as { author_name?: unknown; title?: unknown };\n const name = typeof j.author_name === 'string' && j.author_name.trim() ? j.author_name : typeof j.title === 'string' ? j.title : '';\n return name.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport const liveEmbedUrl = (id: string) =>\n `https://www.youtube-nocookie.com/embed/${id}?autoplay=1&mute=1&controls=0&rel=0&modestbranding=1&playsinline=1&iv_load_policy=3`;\n","export const SUB_LEAD_S = 0.3;\nexport const SUB_LINGER_S = 1.5;\n\nexport interface Timed { start: number; end?: number; words: { start: number; end: number }[] }\n\nexport function lineSpeechEnd(r: Timed, next: Timed | undefined, fallback: number): number {\n const w = r.words[r.words.length - 1]?.end;\n if (w != null && w > r.start) return w;\n if (r.end != null && r.end > r.start) return r.end;\n return next?.start ?? fallback;\n}\n\nexport function subtitleShown(rows: Timed[], i: number, t: number): boolean {\n const r = rows[i];\n if (!r) return false;\n const from = (r.words[0]?.start ?? r.start) - SUB_LEAD_S;\n const next = rows[i + 1];\n const end = lineSpeechEnd(r, next, r.start + 4) + SUB_LINGER_S;\n const until = next ? Math.min(end, (next.words[0]?.start ?? next.start) - SUB_LEAD_S) : end;\n return t >= from && t < Math.max(until, from + 0.5);\n}\n\nexport function spreadWords(tokens: string[], from: number, to: number): { text: string; start: number; end: number }[] {\n const span = Math.max(0, to - from);\n const weight = tokens.map((w) => Math.max(1, [...w.replace(/[^\\p{L}\\p{N}]/gu, '')].length));\n const total = weight.reduce((a, b) => a + b, 0) || 1;\n let at = from;\n return tokens.map((text, k) => {\n const start = at;\n at += (span * weight[k]) / total;\n return { text, start, end: at };\n });\n}\n","import { Fragment, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { liveEmbedUrl } from '../core/youtube';\nimport type { Correction, LanguageLists, ExportFormat, Voice } from '@vocalstack/js-sdk';\nimport { Card, CopyButton, Eyebrow, IconButton, Sheet, Switch, Toggle, Tooltip } from '../ds/Controls';\nimport { D, EqBars, Icon, PauseGlyph, PlayGlyph, Spinner, StopGlyph } from '../ds/Icons';\nimport { clock } from '../core/format';\nimport { confClass, fixedSlots, lane, speakerInitial, speakerNumber, speakerLabel, speakerLook, speakerName, type Lane, type Model, type Row, type Word } from '../core/transcript';\nimport { audioClipUrl, type MediaCred } from '../core/audio';\nimport { archiveClips, readCursor, readTokens, rowForVoice, type ReadPos, type VoiceTrackRow } from '../core/voiceplayer';\nimport { TX_FORMATS } from '../data/tx';\nimport { describe, useAsync, type ErrorLike } from '../data/transcript';\nimport { apiFetch, usePlayerApi } from '../data/context';\nimport type { Strings } from '../data/i18n';\n\nexport function feedInset(el: HTMLElement): { top: number; bottom: number } {\n const cs = getComputedStyle(el);\n const cap = el.clientHeight * 0.45;\n return {\n top: Math.min(parseFloat(cs.paddingTop) || 0, cap),\n bottom: Math.min(parseFloat(cs.paddingBottom) || 0, cap),\n };\n}\n\nexport const NO_VOICE_TIP = 'This language has no synthetic voice yet, so you can read it but not listen.';\n\nexport function rowKey(onClick: () => void) {\n return (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick(); }\n };\n}\n\n\nexport function useFeedBar(ref: React.RefObject<HTMLDivElement>, thumbRef: React.RefObject<HTMLDivElement>, extra = 0) {\n const paintRef = useRef<() => void>(() => {});\n useEffect(() => { paintRef.current(); }, [extra]);\n useEffect(() => {\n const el = ref.current, thumb = thumbRef.current;\n if (!el || !thumb) return;\n const glassBar = (): HTMLElement | null => {\n let n: HTMLElement | null = el.parentElement;\n for (let i = 0; i < 4 && n; i++) {\n const b = n.querySelector<HTMLElement>('[data-transport]');\n if (b) return b;\n n = n.parentElement;\n }\n return null;\n };\n const geom = () => {\n const bar = glassBar();\n const covered = bar ? bar.offsetHeight : 0;\n const vis = el.clientHeight - covered - 36;\n const max = el.scrollHeight - el.clientHeight;\n const size = vis > 0 ? Math.max(30, Math.round(vis * (el.clientHeight - covered) / el.scrollHeight)) : 0;\n return { vis, max, size };\n };\n let want = -1;\n let hide: any = null;\n let dragging = false, from = 0, at = 0;\n const clearGlass = () => {\n const bar = glassBar();\n if (!bar) return;\n const extra = parseFloat(el.dataset.glassExtra || '0') || 0;\n const w = bar.offsetHeight + 14 + extra;\n if (w === want) return;\n want = w;\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40;\n el.style.paddingBottom = w + 'px';\n if (atBottom) el.scrollTop = el.scrollHeight;\n };\n const show = () => {\n thumb.style.opacity = '1';\n clearTimeout(hide);\n hide = setTimeout(() => { if (!dragging) thumb.style.opacity = '0'; }, 900);\n };\n let barRO: ResizeObserver | null = null;\n let watched: HTMLElement | null = null;\n const paint = (reveal?: boolean) => {\n clearGlass();\n const bar = glassBar();\n if (bar && bar !== watched && barRO) { watched = bar; barRO.observe(bar); }\n const g = geom();\n if (g.vis < 60 || g.max < 6) { thumb.style.opacity = '0'; thumb.style.pointerEvents = 'none'; return; }\n thumb.style.pointerEvents = 'auto';\n thumb.style.height = g.size + 'px';\n thumb.style.transform = 'translateY(' + Math.round((el.scrollTop / g.max) * (g.vis - g.size)) + 'px)';\n if (reveal) show();\n };\n const gutter = parseFloat(getComputedStyle(el).paddingRight) || 0;\n thumb.style.right = (gutter >= 12 ? -(gutter - 6) : 2) + 'px';\n const onScroll = () => paint(true);\n const down = (e: PointerEvent) => {\n const g = geom();\n if (g.vis - g.size <= 0) return;\n e.preventDefault();\n e.stopPropagation();\n thumb.setPointerCapture(e.pointerId);\n dragging = true;\n from = e.clientY;\n at = el.scrollTop;\n thumb.style.cursor = 'grabbing';\n show();\n };\n const move = (e: PointerEvent) => {\n if (!dragging) return;\n const g = geom();\n el.scrollTop = at + ((e.clientY - from) / (g.vis - g.size)) * g.max;\n show();\n };\n const end = () => {\n if (!dragging) return;\n dragging = false;\n thumb.style.cursor = 'grab';\n show();\n };\n el.addEventListener('scroll', onScroll, { passive: true });\n thumb.addEventListener('pointerdown', down);\n thumb.addEventListener('pointermove', move);\n thumb.addEventListener('pointerup', end);\n thumb.addEventListener('pointercancel', end);\n if (typeof ResizeObserver !== 'undefined') {\n barRO = new ResizeObserver(() => paint());\n barRO.observe(el);\n }\n paintRef.current = () => paint();\n paint();\n return () => {\n paintRef.current = () => {};\n el.removeEventListener('scroll', onScroll);\n thumb.removeEventListener('pointerdown', down);\n thumb.removeEventListener('pointermove', move);\n thumb.removeEventListener('pointerup', end);\n thumb.removeEventListener('pointercancel', end);\n barRO?.disconnect();\n clearTimeout(hide);\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\nexport function FeedBar({ thumbRef }: { thumbRef: React.RefObject<HTMLDivElement> }) {\n return <div className=\"feedbar\" aria-hidden=\"true\"><div ref={thumbRef} className=\"feedbar__thumb\" /></div>;\n}\n\nexport function Toast({ error, onClose }: { error: ErrorLike | null; onClose: () => void }) {\n const closeRef = useRef(onClose);\n closeRef.current = onClose;\n const [hover, setHover] = useState(false);\n const [copied, setCopied] = useState(false);\n const copiedT = useRef<number>();\n useEffect(() => { setCopied(false); setHover(false); window.clearTimeout(copiedT.current); }, [error]);\n useEffect(() => () => window.clearTimeout(copiedT.current), []);\n useEffect(() => {\n if (!error || hover || copied) return;\n const t = setTimeout(() => closeRef.current(), 10500);\n return () => clearTimeout(t);\n }, [error, hover, copied]);\n if (!error) return null;\n const copy = () => {\n const text = error.requestId ? `${error.message}\\nRequest id: ${error.requestId}` : error.message;\n void navigator.clipboard?.writeText(text).then(() => { setCopied(true); window.clearTimeout(copiedT.current); copiedT.current = window.setTimeout(() => setCopied(false), 1800); }, () => {});\n };\n const credit = error.code === 'insufficient_credit' || error.code === 'quota_exceeded' || error.status === 402;\n return (\n <div className=\"toast\" role=\"alert\" onPointerEnter={() => setHover(true)} onPointerLeave={() => setHover(false)}>\n <Icon d={D.warn} size={16} style={{ color: 'var(--conf-low)', flex: 'none' }} />\n <span style={{ flex: 1 }}>{error.message}{credit && <> <a href=\"https://app.vocalstack.com/billing\" target=\"_blank\" rel=\"noopener\" className=\"dev-link\" style={{ fontSize: 'inherit', fontWeight: 600, whiteSpace: 'nowrap' }}>Add credit</a></>}</span>\n <button type=\"button\" onClick={copy} aria-label={copied ? 'Copied' : 'Copy error'} title={copied ? 'Copied' : 'Copy error'}><Icon d={copied ? D.check : D.copy} size={14} /></button>\n <button type=\"button\" onClick={onClose} aria-label=\"Dismiss\"><Icon d={D.close} size={14} /></button>\n </div>\n );\n}\n\n\nexport function SpeakerTag({ model, speaker, showLabels, pending, diarized }: { model: Model; speaker: number; showLabels: boolean; pending?: boolean; diarized?: boolean }) {\n if (speaker < 0) {\n if (!showLabels) return null;\n if (!pending) {\n if (!diarized) return null;\n return (\n <>\n <span className=\"lanechip lanechip--unknown\">?</span>\n <span className=\"line__who line__who--unknown\">Unknown Speaker</span>\n </>\n );\n }\n return (\n <span className=\"whopending\" aria-hidden=\"true\">\n <span className=\"whopending__ghost\"><span style={{ width: 9, height: 9 }} /><span className=\"line__who\">Speaker 1</span></span>\n <span className=\"whopending__live\"><span className=\"whopending__chip\" /><span className=\"whopending__pill\" /></span>\n </span>\n );\n }\n if (!showLabels) return null;\n const look = speakerLook(model, speaker);\n const l = look.lane;\n return (\n <>\n <span className={`lanechip bg-lane-${l}`} style={look.soft ? { background: look.soft, color: look.fg } : undefined}>\n {speakerInitial(model, speaker)}\n </span>\n <span className={`line__who lane-${l}`} style={look.fg ? { color: look.fg } : undefined}>\n {speakerLabel(model, speaker)}\n </span>\n {look.hasVoice && <VoiceIdGlyph color={look.fg ?? `var(--lane-${l})`} />}\n </>\n );\n}\n\nexport function VoiceIdGlyph({ color }: { color: string }) {\n return (\n <span title=\"Cloned voice\" style={{ flex: 'none', display: 'inline-flex' }}>\n <Icon d={D.voiceClone} size={13} sw={1.7} stroke={color} />\n </span>\n );\n}\n\nexport function Transport({ chip, note, scrub, mute, voice, prev, play, next }: { chip: ReactNode; note?: ReactNode; scrub: ReactNode; mute: ReactNode; voice: ReactNode; prev: ReactNode; play: ReactNode; next: ReactNode }) {\n return (\n <div className=\"vs-tt\">\n <div className=\"vs-tt__r1\">\n <div className=\"vs-tt__chip\">{chip}</div>\n {note ? <div className=\"vs-tt__scrub\">{note}</div> : (\n <>\n <div className=\"vs-tt__scrub\">{scrub}</div>\n <div className=\"vs-tt__spk\">{mute}</div>\n <div className=\"vs-tt__voice\">{voice}</div>\n </>\n )}\n </div>\n {!note && (\n <div className=\"vs-tt__r2\">\n <div className=\"vs-tt__side\" style={{ justifyContent: 'flex-end' }}><div className=\"vs-tt__prev\">{prev}</div></div>\n <div className=\"vs-tt__play\">{play}</div>\n <div className=\"vs-tt__side\" style={{ justifyContent: 'flex-start' }}><div className=\"vs-tt__next\">{next}</div></div>\n </div>\n )}\n </div>\n );\n}\n\nexport function ReplayScrub({ index, total, atLabel, durLabel, stepLabel, onSeek, onSeekFrac, onScrubStart, onScrubEnd, frac, glideMs = 260 }: { index: number; total: number; atLabel: string; durLabel: string; stepLabel: string; onSeek: (i: number) => void; onSeekFrac?: (f: number) => void; onScrubStart?: () => void; onScrubEnd?: () => void; frac?: number; glideMs?: number }) {\n const track = useRef<HTMLDivElement>(null);\n const drag = useRef(false);\n const [held, setHeld] = useState<number | null>(null);\n const n = Math.max(1, total);\n const shown = held ?? frac;\n const pct = shown != null ? Math.min(100, Math.max(0, shown * 100)) : (index / Math.max(1, n - 1)) * 100;\n const glide = frac != null && glideMs > 0 && held == null ? `width ${glideMs}ms linear, left ${glideMs}ms linear` : 'none';\n const emit = (e: React.PointerEvent) => {\n const r = track.current?.getBoundingClientRect();\n if (!r) return;\n const f = Math.min(1, Math.max(0, (e.clientX - r.left) / Math.max(1, r.width)));\n if (onSeekFrac) { setHeld(f); onSeekFrac(f); return; }\n const i = Math.round(f * (n - 1));\n if (i !== index) onSeek(i);\n };\n const up = () => { if (!drag.current) return; drag.current = false; setHeld(null); onScrubEnd?.(); };\n return (\n <div className=\"rscrub\">\n <div ref={track} className=\"rscrub__track\"\n onPointerDown={(e) => { drag.current = true; track.current?.setPointerCapture(e.pointerId); onScrubStart?.(); emit(e); e.preventDefault(); }}\n onPointerMove={(e) => { if (drag.current) emit(e); }}\n onPointerUp={up} onPointerCancel={up}>\n <div className=\"rscrub__rail\" />\n <div className=\"rscrub__fill\" style={{ width: `${pct}%`, transition: glide }} />\n <div className=\"rscrub__knob\" style={{ left: `${pct}%`, transition: glide }} />\n </div>\n <div className=\"rscrub__labels\"><span className=\"at\">{atLabel}</span><span className=\"step\">{stepLabel}</span><span className=\"dur\">{durLabel}</span></div>\n </div>\n );\n}\n\n\nexport interface RowFixes { script: number; manual: boolean; manualCount: number }\n\nexport function rowFixes(r: Row, corrections: Correction[] | undefined, slots?: Set<string>): RowFixes {\n const seqs = new Set(r.seqs ?? r.words.map((w) => w.seq));\n const live = (corrections ?? []).filter((c) => !c.revertedAt && c.seq != null && seqs.has(c.seq) && (c.kind === 'word' || c.kind === 'line'));\n const rewritten = live.some((c) => c.kind === 'line');\n const mine = (w: Word) => !!slots?.has(`${w.seq}:${w.idx}`);\n return {\n script: rewritten ? 0 : r.words.filter((w) => w.script && !mine(w)).length,\n manual: live.length > 0 || (corrections === undefined && r.corrected),\n manualCount: rewritten ? 0 : live.filter((c) => c.kind === 'word').length,\n };\n}\n\nexport const isFixedWord = (w: Word, slots?: Set<string>, listener = false) => (!listener && !!w.script) || !!slots?.has(`${w.seq}:${w.idx}`);\n\nexport function FixBadges({ f, desk, onOpen }: { f: RowFixes; desk?: boolean; onOpen?: () => void }) {\n const one = (label: string, n: number, first: boolean) => (\n <span key={label} role=\"button\" title=\"Open this line in Fix\" className=\"badge badge--fix\" style={{ marginLeft: first ? 'auto' : 0 }} onClick={(e) => { e.stopPropagation(); onOpen?.(); }}>\n <Icon d={D.pencilFix} size={desk ? 10 : 9} sw={2} />{label}{n > 0 && <span className=\"badge__n\">{n}</span>}\n </span>\n );\n return (\n <>\n {f.script > 0 && one(desk ? 'SCRIPT FIX' : 'SCRIPT', f.script, true)}\n {f.manual && one(desk ? 'MANUAL FIX' : 'MANUAL', f.manualCount, f.script === 0)}\n </>\n );\n}\n\nexport function FixPen({ onOpen, alone }: { onOpen: () => void; alone: boolean }) {\n const [over, setOver] = useState(false);\n return (\n <span role=\"button\" title=\"Fix this line\" className={`badge badge--pen${over ? ' is-over' : ''}`} style={{ marginLeft: alone ? 'auto' : 0 }} onMouseEnter={() => setOver(true)} onMouseLeave={() => setOver(false)} onClick={(e) => { e.stopPropagation(); onOpen(); }}>\n <Icon d={D.pencilFix} size={11} sw={2} />{over && 'FIX'}\n </span>\n );\n}\n\nexport function CorrectedBadge({ desk }: { desk?: boolean }) {\n return <span className=\"badge badge--corrected\"><Icon d={D.check} size={desk ? 10 : 9} sw={desk ? 2.6 : 3} />CORRECTED</span>;\n}\n\nfunction readStyle(j: number, cursor: number | null, warm: boolean, reading: boolean): React.CSSProperties | undefined {\n if (warm) {\n return { color: 'transparent', WebkitTextFillColor: 'transparent', background: 'var(--fill-10)', borderRadius: '99px', textShadow: 'none', opacity: 1 };\n }\n if (cursor == null) return reading ? { color: 'var(--ink-40)', WebkitTextFillColor: 'var(--ink-40)', opacity: 1 } : undefined;\n if (j > cursor) return { color: 'var(--ink-40)', WebkitTextFillColor: 'var(--ink-40)', opacity: 1 };\n if (j === cursor) return { color: 'var(--ink-96)', WebkitTextFillColor: 'var(--ink-96)', opacity: 1, textShadow: '0 0 2px currentColor, 0 0 4px currentColor' };\n return { color: 'var(--ink-96)', WebkitTextFillColor: 'var(--ink-96)', opacity: 1 };\n}\n\nexport function TrText({ text, query, pos, warm }: { text: string; query?: string; pos?: ReadPos | null; warm: boolean }) {\n const tokens = useMemo(() => readTokens(text), [text]);\n const cursor = pos ? readCursor(tokens, pos) : null;\n const q = (query ?? '').trim().toLowerCase().split(/\\s+/).filter((t) => t.length > 1);\n return (\n <>\n {tokens.map((k, j) => {\n const hit = q.length > 0 && q.some((n) => k.t.toLowerCase().includes(n));\n return <span key={j} className={`rw${hit ? ' w--hit' : ''}`} style={readStyle(j, cursor, warm, !!pos)}>{k.t}{k.sp}</span>;\n })}\n </>\n );\n}\n\nexport function Words({ words, text, query, colour, tappable, tapAll = false, onWord, corrected, pos = null, warm = false, slots, listener = false, fixes = true }: { fixes?: boolean; slots?: Set<string>; listener?: boolean; words: Word[]; text: string; query?: string; colour: boolean; tappable?: boolean; tapAll?: boolean; onWord?: (w: Word) => void; corrected?: boolean; pos?: ReadPos | null; warm?: boolean }) {\n const cursor = pos ? readCursor(words.length ? words.map((w) => ({ t: w.text, sp: ' ' })) : readTokens(text), pos) : null;\n if (!words.length || (corrected && words.map((w) => w.text).join(' ') !== text)) {\n return <TrText text={text} query={query} pos={pos} warm={warm} />;\n }\n const q = (query ?? '').trim().toLowerCase().split(/\\s+/).filter((t) => t.length > 1);\n return (\n <>\n {words.map((w, i) => {\n const fx = fixes && isFixedWord(w, slots, listener);\n const cls = fx ? 'fixed' : colour ? confClass(w.prob) : '';\n const hit = q.length > 0 && q.some((t) => w.text.toLowerCase().includes(t));\n const tap = tapAll || (tappable && cls !== '');\n return (\n <span key={`${w.seq}:${w.idx}`}>\n {i > 0 ? ' ' : ''}\n <span className={`w rw${cls ? ` w--${cls}` : ''}${hit ? ' w--hit' : ''}${tap ? ' w--tap' : ''}`} style={readStyle(i, cursor, warm, !!pos)} onClick={tap && onWord ? (e) => { e.stopPropagation(); onWord(w); } : undefined}>{w.text}</span>\n </span>\n );\n })}\n </>\n );\n}\n\nexport function worstConf(r: Row): '' | 'mid' | 'low' {\n let worst: '' | 'mid' | 'low' = '';\n for (const w of r.words) {\n const c = confClass(w.prob);\n if (c === 'low') return 'low';\n if (c === 'mid') worst = 'mid';\n }\n return worst;\n}\n\n\nconst SETTLE_MS = 400;\n\nexport function useViewportTranslation(\n recordingId: string | null,\n lang: string | null,\n rows: Row[],\n merge: (lang: string, made: Record<string, string>) => void,\n) {\n const api = usePlayerApi();\n const [visible, setVisible] = useState<number[]>([]);\n const [tick, setTick] = useState(0);\n const asked = useRef<Set<string>>(new Set());\n const busy = useRef(false);\n const byId = useMemo(() => new Map(rows.filter((r) => r.sentenceId != null).map((r) => [r.sentenceId!, r])), [rows]);\n useEffect(() => { asked.current = new Set(); }, [recordingId, lang]);\n const onVisible = useCallback((ids: number[]) => setVisible(ids), []);\n useEffect(() => {\n if (!recordingId || !lang || !visible.length || busy.current) return;\n void tick;\n const want = visible.filter((id) => {\n const r = byId.get(id);\n if (!r || !r.text.trim()) return false;\n if (!r.settled) return false;\n if (r.translations[lang]) return false;\n if (r.language && r.language.slice(0, 2).toLowerCase() === lang.slice(0, 2).toLowerCase()) return false;\n return !asked.current.has(`${lang}:${id}`);\n }).slice(0, 40);\n if (!want.length) return;\n busy.current = true;\n for (const id of want) asked.current.add(`${lang}:${id}`);\n api.client.recordings.translation(recordingId, lang, want, api.readAs)\n .then((r) => { if (r.translations && Object.keys(r.translations).length) merge(lang, r.translations); })\n .catch((e: unknown) => { const st = (e as { status?: number })?.status; if (st && st >= 400 && st < 500) return; for (const id of want) asked.current.delete(`${lang}:${id}`); })\n .finally(() => { busy.current = false; setTick((n) => n + 1); });\n }, [recordingId, lang, visible, tick, byId, merge]); // eslint-disable-line react-hooks/exhaustive-deps\n return onVisible;\n}\n\n\nexport interface AvailableVoice {\n id: string;\n name: string;\n cloned: boolean;\n default: boolean;\n previewUrl?: string;\n quality?: 1 | 2 | 3 | null;\n lagS?: number | null;\n accent?: string | null;\n gender?: 'male' | 'female' | null;\n ready?: boolean;\n consent?: 'pending' | 'granted' | null;\n speaker?: number | null;\n auto?: boolean;\n library?: boolean;\n live?: boolean;\n}\n\nexport function voiceDetail(v: AvailableVoice): string {\n return v.live || v.auto ? 'From this session' : v.cloned ? (v.library === false ? 'This transcription only' : 'Saved in Voices') : '';\n}\n\nfunction groupOf(v: AvailableVoice, t: Strings): { rank: number; head: string } {\n if (v.cloned) return { rank: 0, head: t.vcSheet };\n if (v.gender === 'male') return { rank: 1, head: t.vcMale.toUpperCase() };\n if (v.gender === 'female') return { rank: 2, head: t.vcFemale.toUpperCase() };\n return { rank: 3, head: t.vcSynth };\n}\n\ninterface VoiceGroupRow {\n v: AvailableVoice;\n headOn: boolean;\n head: string;\n headCount: number;\n rule: string;\n}\n\nexport function voiceGroups(list: AvailableVoice[], t: Strings): VoiceGroupRow[] {\n const shown = list.slice().sort((a, b) =>\n groupOf(a, t).rank - groupOf(b, t).rank\n || a.name.localeCompare(b.name, undefined, { numeric: true }));\n const counts: Record<string, number> = {};\n for (const v of shown) { const g = groupOf(v, t).head; counts[g] = (counts[g] ?? 0) + 1; }\n return shown.map((v, i) => {\n const head = groupOf(v, t).head;\n const headOn = i === 0 || groupOf(shown[i - 1], t).head !== head;\n return { v, headOn, head, headCount: counts[head], rule: headOn ? '0' : '1px solid var(--hair)' };\n });\n}\n\nexport interface CastMember {\n key: number;\n voiceId?: string | null;\n name: string;\n initial: string;\n lane: Lane | null;\n sex?: 'male' | 'female' | null;\n fg?: string;\n soft?: string;\n hasVoice?: boolean;\n}\n\nexport function speakerRoster(rows: { speaker: number }[], model: Model, unknownLabel: string): CastMember[] {\n const seen = new Set<number>();\n let unknown = false;\n for (const r of rows) { if (r.speaker < 0) unknown = true; else seen.add(r.speaker); }\n const out: CastMember[] = [...seen].sort((a, b) => a - b)\n .map((sp) => {\n const look = speakerLook(model, sp);\n return {\n key: sp,\n name: speakerLabel(model, sp),\n initial: speakerInitial(model, sp),\n lane: look.lane,\n sex: model.speakerSex[sp] ?? null,\n voiceId: model.speakerIds[sp]?.voiceId ?? null,\n fg: look.fg,\n soft: look.soft,\n hasVoice: look.hasVoice,\n };\n });\n if (unknown) out.push({ key: -1, name: unknownLabel, initial: '?', lane: null, sex: null });\n return out;\n}\n\nexport function castKey(map: Map<number, string>): string {\n const body = [...map.entries()]\n .filter(([, v]) => v.trim())\n .sort((a, b) => a[0] - b[0])\n .map(([k, v]) => `${k}=${v.trim()}`)\n .join(';');\n return body ? `cast:${body}` : '';\n}\n\nexport function parseCast(key: string | null | undefined): Map<number, string> | null {\n if (!key || !key.startsWith('cast:')) return null;\n const out = new Map<number, string>();\n for (const part of key.slice(5).split(';')) {\n const at = part.indexOf('=');\n if (at < 1) continue;\n const spk = Number(part.slice(0, at));\n const voice = part.slice(at + 1).trim();\n if (Number.isInteger(spk) && voice) out.set(spk, voice);\n }\n return out.size ? out : null;\n}\n\nexport function autoCast(roster: CastMember[], voices: AvailableVoice[], clones = true): Map<number, string> {\n const pool = voices.filter((v) => !v.cloned);\n const used = new Set<string>();\n const out = new Map<number, string>();\n for (const sp of roster) {\n const saved = sp.voiceId ? voices.find((v) => v.cloned && !v.auto && v.consent !== 'pending' && v.id === `clone:${sp.voiceId}`) : undefined;\n const own = saved ?? (!clones ? undefined : (sp.voiceId ? voices.find((v) => v.cloned && v.consent !== 'pending' && v.id === `clone:${sp.voiceId}`) : undefined)\n ?? (sp.key >= 0 ? voices.find((v) => v.cloned && v.auto && v.consent !== 'pending' && v.speaker === sp.key) : undefined));\n if (own) {\n out.set(sp.key, own.id);\n used.add(own.id);\n continue;\n }\n const free = pool.filter((v) => !used.has(v.id));\n const suits = sp.sex ? free.filter((v) => v.gender === sp.sex) : [];\n const pick = suits[0] ?? free[0] ?? pool[0];\n if (!pick) continue;\n out.set(sp.key, pick.id);\n used.add(pick.id);\n }\n return out;\n}\n\nexport function SpeakerCast({ roster, selected, onSelect, noClone, building, short, warn, sexOf, t }: {\n roster: CastMember[];\n selected: number | null;\n onSelect: (key: number) => void;\n noClone: (p: CastMember) => boolean;\n building?: (p: CastMember) => boolean;\n short?: (p: CastMember) => boolean;\n warn?: (p: CastMember) => string | null;\n sexOf: (p: CastMember) => 'male' | 'female' | null;\n t: Strings;\n}) {\n const sel = roster.find((p) => p.key === selected) ?? roster[0] ?? null;\n if (!sel) return null;\n return (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, padding: '0 2px 9px', margin: '0 -2px' }}>\n {roster.map((p) => {\n const on = p.key === sel.key;\n const alert = p.key >= 0 ? warn?.(p) ?? null : null;\n const busy = p.key >= 0 && !alert && !!building?.(p);\n const dot = p.key >= 0 && !alert && !busy && noClone(p);\n const few = p.key >= 0 && !alert && !busy && !dot && !p.hasVoice && !!short?.(p);\n return (\n <button\n type=\"button\"\n key={p.key}\n aria-selected={on}\n onClick={() => onSelect(p.key)}\n title={p.name}\n style={{ flex: 'none', boxSizing: 'border-box', display: 'flex', alignItems: 'center', gap: 7, minHeight: 34, padding: '5px 11px', borderRadius: 9, font: 'inherit', background: on ? 'var(--brand-tint)' : 'var(--fill-05)', border: `1px solid ${on ? 'var(--brand-line)' : 'transparent'}`, cursor: 'pointer' }}\n >\n <span\n className={`lanechip${p.lane ? ` bg-lane-${p.lane}` : ' lanechip--unknown'}`}\n style={{ width: 19, height: 19, border: 'none', ...(p.soft ? { background: p.soft, color: p.fg } : null) }}\n >\n {p.initial}\n </span>\n <span style={{ fontSize: 12.5, fontWeight: 500, color: on ? 'var(--ink-96)' : 'var(--ink-62)', whiteSpace: 'nowrap' }}>{p.name}</span>\n {p.hasVoice && !alert && <VoiceIdGlyph color={p.fg ?? (on ? 'var(--ink-62)' : 'var(--ink-45)')} />}\n {alert && <span title={alert} aria-label={alert} style={{ flex: 'none', width: 15, height: 15, marginRight: -2, borderRadius: '50%', background: '#c27c00', color: '#fff', font: '900 10.5px/1 system-ui, sans-serif', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>!</span>}\n {few && <span title=\"Not enough audio to clone\" aria-label=\"Not enough audio to clone\" style={{ flex: 'none', display: 'flex', marginRight: -2, color: on ? 'var(--ink-45)' : 'var(--ink-35)' }}><Icon d={D.micOff} size={13} sw={1.7} /></span>}\n {(dot || busy) && (\n <span title={busy ? 'Cloning this voice…' : 'No voice clone yet'} aria-label={busy ? 'Cloning this voice' : 'No voice clone yet'} style={{ flex: 'none', width: 10, height: 10, marginRight: -2, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {busy ? <Spinner size={10} color=\"var(--brand)\" track=\"var(--fill-10)\" sw={1.6} /> : <span style={{ width: 7, height: 7, borderRadius: '50%', background: 'var(--brand)' }} />}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n}\n\n\nexport function VoiceSheetBody({ cast, voices, currentId, armedId = null, sampleId = null, dlId = null, onPick, onAdd, onUse, usedBy, foldKey, foldFor = null, problem, noClone = null, t }: {\n cast?: ReactNode;\n voices: AvailableVoice[];\n currentId: string | null;\n armedId?: string | null;\n sampleId?: string | null;\n dlId?: string | null;\n problem?: string | null;\n noClone?: { title: string; sub: string; tip?: string; busy?: boolean; action?: () => void } | null;\n onPick: (v: AvailableVoice) => void;\n onAdd?: (v: AvailableVoice) => void;\n onUse: (id: string) => void;\n usedBy?: (v: AvailableVoice) => string | null;\n foldKey?: string | number | null;\n foldFor?: 'male' | 'female' | null;\n t: Strings;\n}) {\n const rows = useMemo(() => voiceGroups(voices, t), [voices, t]);\n const [fold, setFold] = useState<Record<string, boolean>>({});\n useEffect(() => { setFold({}); }, [foldKey, foldFor]);\n const gendered = (g: string) => g === t.vcMale.toUpperCase() || g === t.vcFemale.toUpperCase();\n const open = (g: string) => {\n if (g === t.vcSheet) return true;\n const said = fold[g];\n if (said != null) return !said;\n if (!foldFor || !gendered(g)) return true;\n return g === (foldFor === 'female' ? t.vcFemale : t.vcMale).toUpperCase();\n };\n const useOn = !!armedId && armedId !== currentId;\n return (\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n {problem && (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 9, padding: '10px 11px', marginBottom: 10, borderRadius: 11, background: 'var(--conf-low-soft)' }}>\n <Icon d={D.warnTri} size={15} sw={1.7} style={{ flex: 'none', marginTop: 1, color: 'var(--conf-low)' }} />\n <span style={{ flex: 1, minWidth: 0, fontSize: 12.5, fontWeight: 300, lineHeight: 1.45, color: 'var(--ink-80)', textWrap: 'pretty' } as React.CSSProperties}>{problem}</span>\n <span style={{ flex: 'none', marginTop: -1 }}><CopyButton value={problem} label=\"Copy this error\" /></span>\n </div>\n )}\n {cast}\n {noClone && (\n <>\n <div style={{ display: 'flex', alignItems: 'center', gap: 7, padding: '14px 2px 6px', userSelect: 'none' }}>\n <span style={{ font: '600 9px var(--vs-font-mono)', letterSpacing: '.13em', color: 'var(--ink-62)' }}>{t.vcSheet}</span>\n </div>\n <div role={noClone.action ? 'button' : 'status'} tabIndex={noClone.action ? 0 : undefined} title={noClone.tip} onClick={noClone.action} onKeyDown={noClone.action ? (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); noClone.action!(); } } : undefined} style={{ display: 'flex', alignItems: 'center', gap: 11, padding: '11px 8px', margin: '0 -6px', borderRadius: 10, cursor: noClone.action ? 'pointer' : 'default' }}>\n <span style={{ flex: 'none', width: 32, height: 32, boxSizing: 'border-box', borderRadius: '50%', border: noClone.busy ? 0 : noClone.action ? '1.5px solid var(--brand)' : '1.5px dashed var(--fill-20)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {noClone.busy\n ? <span style={{ width: 16, height: 16, borderRadius: '50%', border: '2px solid var(--fill-10)', borderTopColor: 'var(--brand)', animation: 'vs-spin .7s linear infinite' }} />\n : <Icon d={noClone.action ? D.plus : D.mic} size={15} sw={noClone.action ? 2 : 1.6} style={{ color: noClone.action ? 'var(--brand)' : 'var(--ink-45)' }} />}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 14.5, fontWeight: noClone.action ? 500 : 400, color: noClone.action ? 'var(--brand)' : 'var(--ink-62)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{noClone.title}</div>\n <div style={{ fontSize: 12, fontWeight: 300, color: 'var(--ink-62)', marginTop: 2, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{noClone.sub}</div>\n </div>\n </div>\n </>\n )}\n {rows.map(({ v, headOn, head, headCount, rule }, i) => {\n const detail = voiceDetail(v);\n const dling = dlId === v.id;\n const shown = open(head);\n const shares = usedBy?.(v) ?? null;\n return (\n <Fragment key={v.id}>\n {headOn && head === t.vcSheet && (\n <div style={{ display: 'flex', alignItems: 'center', padding: '14px 2px 6px', borderTop: i === 0 && !noClone ? '0' : '1px solid var(--hair)', userSelect: 'none' }}>\n <span style={{ font: '600 9px var(--vs-font-mono)', letterSpacing: '.13em', color: 'var(--ink-62)' }}>{head}</span>\n </div>\n )}\n {headOn && head !== t.vcSheet && (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); setFold((f) => ({ ...f, [head]: open(head) })); }}\n title={`${shown ? 'Hide ' : 'Show '}${head.toLowerCase()} voices`}\n aria-expanded={shown}\n style={{ width: '100%', textAlign: 'left', font: 'inherit', display: 'flex', alignItems: 'center', gap: 7, padding: shown ? '14px 2px 6px' : '14px 2px 14px', border: 0, borderTop: i === 0 && !noClone ? '0' : '1px solid var(--hair)', background: 'transparent', cursor: 'pointer', userSelect: 'none' }}\n >\n <Icon d={D.chevronDown} size={12} sw={2.4} style={{ flex: 'none', color: 'var(--ink-45)', transform: `rotate(${shown ? '0deg' : '-90deg'})`, transition: 'transform .18s ease' }} />\n <span style={{ font: '600 9px var(--vs-font-mono)', letterSpacing: '.13em', color: 'var(--ink-62)' }}>{head}</span>\n <span style={{ font: '600 9px var(--vs-font-mono)', color: 'var(--ink-62)' }}>{headCount}</span>\n </button>\n )}\n <button\n type=\"button\"\n aria-selected={v.id === currentId}\n aria-hidden={!shown}\n tabIndex={shown ? undefined : -1}\n onClick={() => onPick(v)}\n style={{ width: '100%', textAlign: 'left', font: 'inherit', border: 0, borderTop: shown ? rule : '0', display: 'flex', alignItems: 'center', gap: 11, padding: shown ? '11px 8px' : '0px 8px', margin: '0 -6px', borderRadius: 10, background: armedId === v.id ? 'var(--brand-tint)' : 'transparent', cursor: 'pointer', opacity: shown ? 1 : 0, maxHeight: shown ? 120 : 0, overflow: 'hidden', transition: 'max-height 280ms cubic-bezier(.32,.72,0,1),padding 280ms cubic-bezier(.32,.72,0,1),opacity 200ms ease' }}\n >\n <span title={dling ? 'Downloading this voice' : undefined} style={{ flex: 'none', width: 32, height: 32, borderRadius: '50%', background: dling ? 'transparent' : v.cloned ? 'var(--brand-soft)' : 'var(--fill-06)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {dling\n ? <span style={{ width: 16, height: 16, borderRadius: '50%', border: '2px solid var(--fill-10)', borderTopColor: 'var(--brand)', animation: 'vs-spin .7s linear infinite' }} />\n : sampleId === v.id\n ? <span className=\"vcplay\"><span className=\"vcplay__eq\"><Equaliser height={13} width={2.5} /></span><span className=\"vcplay__stop\"><StopGlyph size={11} /></span></span>\n : <Icon d={v.cloned ? D.voiceClone : v.gender === 'female' ? D.venus : v.gender === 'male' ? D.mars : D.mic} size={15} sw={1.6} style={{ color: v.cloned ? 'var(--brand)' : 'var(--ink-55)' }} />}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 7, minWidth: 0 }}>\n <span style={{ minWidth: 0, fontSize: 14.5, fontWeight: v.id === currentId ? 600 : 400, color: 'var(--ink-96)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{v.name}</span>\n </div>\n {detail && <div style={{ fontSize: 12, fontWeight: 300, color: 'var(--ink-62)', marginTop: 2, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{detail}</div>}\n {shares && (v.id === currentId ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: 5, marginTop: 3, minWidth: 0 }}>\n <Icon d={D.notice} size={12} sw={1.7} style={{ flex: 'none', color: 'var(--conf-mid)' }} />\n <span style={{ minWidth: 0, fontSize: 11, fontWeight: 300, color: 'var(--conf-mid)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{`${t.vcShared} ${shares}`}</span>\n </div>\n ) : (\n <div style={{ marginTop: 2, minWidth: 0, fontSize: 12, fontWeight: 300, color: 'var(--ink-50)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{`${t.vcUsedBy} ${shares}`}</div>\n ))}\n </div>\n <div style={{ flex: 'none', width: v.live ? (v.id === currentId ? 18 : 0) : 42, overflow: 'hidden', display: 'flex', alignItems: 'center', justifyContent: 'flex-end', gap: 6 }}>\n <span style={{ flex: 'none', width: 18, height: 18 }} />\n <span style={{ flex: 'none', width: 18, height: 18, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {v.id === currentId && <Icon d={D.check} size={17} sw={2.2} style={{ flex: 'none', color: 'var(--brand)' }} />}\n </span>\n </div>\n {(v.live || (v.cloned && v.library === false && !v.auto && !!onAdd)) && (\n <span className=\"gvadd\" role=\"button\" title={v.live ? `Save ${v.name}’s voice from this session` : `Add ${v.name} to My voices`} onClick={onAdd ? (e) => { e.stopPropagation(); onAdd(v); } : undefined}>\n <Icon d={D.plus} size={14} sw={2} />Add\n </span>\n )}\n </button>\n </Fragment>\n );\n })}\n {useOn && (\n <div style={{ position: 'sticky', bottom: 0, zIndex: 3, marginTop: 6, padding: '11px 0 3px', animation: 'vs-slide-up .18s ease-out' }}>\n <button type=\"button\" className=\"vcuse\" title=\"Apply this voice\" onClick={() => armedId && onUse(armedId)}>\n <span>{t.vcUse}</span>\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport function Equaliser({ height, width = 2 }: { height: number; width?: number }) {\n const bar = { width, height: '100%', borderRadius: 1, background: 'var(--brand)' } as const;\n return (\n <span style={{ flex: 'none', display: 'flex', alignItems: 'flex-end', gap: 2, height }}>\n <span style={{ ...bar, animation: 'vs-eq .62s ease-in-out infinite' }} />\n <span style={{ ...bar, animation: 'vs-eq .62s ease-in-out .2s infinite' }} />\n <span style={{ ...bar, animation: 'vs-eq .62s ease-in-out .38s infinite' }} />\n </span>\n );\n}\n\nconst ORIGINAL_FLAG = (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 3 }}>\n <Icon d={D.langAuto} size={19} sw={1.7} style={{ color: 'var(--ink-62)', display: 'block' }} />\n <Icon d={D.globe} size={18} sw={1.6} style={{ color: 'var(--ink-62)', display: 'block' }} />\n </span>\n);\n\nexport function langMeta(langs: LanguageLists | null, code: string | null) {\n const l = code ? langs?.languages.find((x) => x.code === code) : null;\n return { flag: code ? (l?.flag ?? '\\u{1F310}') : ORIGINAL_FLAG, code: code ? code.toUpperCase() : '', label: l?.native ?? 'As spoken', name: l?.name ?? 'Original' };\n}\n\nexport const PLAIN_CHIP: React.CSSProperties = { background: 'transparent', minHeight: 38, height: 38, width: 'auto' };\n\nexport const BAR_CHIP: React.CSSProperties = { minHeight: 36, height: 36, padding: '0 11px', background: 'var(--fill-06)' };\n\nexport function useVoiceCatalogue(\n lang: string | null,\n active: boolean,\n version: number = 0,\n rec?: { id: string | null; token?: string | null; shareCode?: string | null },\n) {\n const recId = rec?.id ?? null;\n const recToken = rec?.token ?? null;\n const recShare = rec?.shareCode ?? null;\n const api = usePlayerApi();\n const { data } = useAsync(async () => {\n if (!lang || !active) return null;\n try {\n return (await api.client.voices.available(lang, { recording: recId ?? undefined, shareCode: recId ? recShare ?? undefined : undefined, asOwner: api.owner })) as unknown as { voices: AvailableVoice[] };\n } catch {\n return null;\n }\n }, [lang, active, version, recId, recToken, recShare]);\n return data;\n}\n\nexport function namedCount(model: Model): number {\n return new Set([...Object.keys(model.speakers), ...Object.keys(model.speakerIds)]).size;\n}\n\n\nexport function useArchiveVoice({ recordingId, lang, ended, cred, pickedVoice, sentenceIds }: {\n recordingId: string | null;\n lang: string | null;\n ended: boolean;\n cred: MediaCred;\n pickedVoice: string | null;\n sentenceIds?: number[];\n}) {\n const api = usePlayerApi();\n const { data: listed, reload } = useAsync(async () => {\n if (!recordingId || !lang) return null;\n const got = (await api.client.recordings.voice(recordingId, lang, api.readAs).catch(() => [])) as unknown as VoiceTrackRow[];\n return { recordingId, lang, rows: got.filter((x) => x.lang === lang) };\n }, [recordingId, lang, api, ended]);\n const rows = useMemo(\n () => (listed && listed.lang === lang && listed.recordingId === recordingId ? listed.rows : []),\n [listed, lang, recordingId],\n );\n const track = useMemo(() => rowForVoice(rows, pickedVoice), [rows, pickedVoice]);\n const renderVoiceId = track ? track.voiceKey || null : pickedVoice;\n const [asking, setAsking] = useState<string | null>(null);\n const [renderError, setRenderError] = useState<string | null>(null);\n const asked = useRef(new Set<string>());\n const renderKey = `${recordingId ?? ''}|${lang ?? ''}|${renderVoiceId ?? ''}`;\n const requestRender = useCallback(async (voiceId: string | null, cast?: Map<number, string> | null) => {\n if (!recordingId || !lang || !ended) return;\n const fromKey = cast?.size ? null : parseCast(voiceId);\n const use = cast?.size ? cast : fromKey;\n const castObj = use && use.size ? Object.fromEntries([...use].map(([k2, v]) => [String(k2), v])) : null;\n const k = `${recordingId}|${lang}|${castObj ? JSON.stringify(castObj) : voiceId ?? ''}`;\n if (asked.current.has(k)) return;\n asked.current.add(k);\n setAsking(k);\n setRenderError(null);\n const body: { langs: string[]; voice?: string; voiceBySpeaker?: Record<string, string> } = { langs: [lang] };\n if (castObj) body.voiceBySpeaker = castObj;\n else if (voiceId) body.voice = voiceId;\n const r = await apiFetch(api, `/v1/recordings/${recordingId}/voice`, { method: 'POST', body }).catch(() => null);\n setAsking((a) => (a === k ? null : a));\n if (!r?.ok) {\n asked.current.delete(k);\n const e = r ? await r.json().catch(() => null) : null;\n setRenderError((e?.message as string) || 'This voice could not be prepared.');\n return;\n }\n reload();\n }, [recordingId, lang, ended, api, reload]);\n const forget = useCallback(() => {\n const prefix = `${recordingId ?? ''}|${lang ?? ''}|`;\n for (const k of [...asked.current]) if (k.startsWith(prefix)) asked.current.delete(k);\n setRenderError(null);\n }, [recordingId, lang]);\n const rendering = (!!track && (track.state === 'queued' || track.state === 'running')) || asking === renderKey;\n const failed = track?.state === 'failed' ? track.error || 'the render failed' : renderError;\n const sentenceKey = sentenceIds?.join(',') ?? '';\n const [near, setNear] = useState<number | null>(null);\n const made = useMemo(() => new Set(track?.clips ?? []), [track]);\n const missing = useMemo(() => (ended && sentenceKey ? sentenceKey.split(',').map(Number).filter((id) => !made.has(id)) : []), [ended, sentenceKey, made]);\n const kicked = useRef<{ key: string; near: number; at: number } | null>(null);\n useEffect(() => {\n if (!ended || !recordingId || !lang || !missing.length) return;\n const at = near ?? missing[0];\n const target = missing.find((id) => id >= at) ?? missing[0];\n const key = `${recordingId}|${lang}|${renderVoiceId ?? ''}`;\n const prev = kicked.current;\n if (prev && prev.key === key && Math.abs(prev.near - target) < 12 && Date.now() - prev.at < 60_000) return;\n kicked.current = { key, near: target, at: Date.now() };\n const castMap = parseCast(renderVoiceId);\n const body: { langs: string[]; near: number; voice?: string; voiceBySpeaker?: Record<string, string> } = { langs: [lang], near: target };\n if (castMap && castMap.size) body.voiceBySpeaker = Object.fromEntries([...castMap].map(([k2, v]) => [String(k2), v]));\n else if (renderVoiceId) body.voice = renderVoiceId;\n void apiFetch(api, `/v1/recordings/${recordingId}/voice`, { method: 'POST', body })\n .then((r) => { if (!r.ok) kicked.current = null; })\n .catch(() => { kicked.current = null; });\n }, [ended, recordingId, lang, renderVoiceId, near, missing, api]);\n const missingNow = missing.length > 0;\n const lastCount = useRef({ n: -1, at: 0 });\n useEffect(() => {\n if (!missingNow) return;\n const t = setInterval(() => {\n const n = made.size;\n if (n !== lastCount.current.n) lastCount.current = { n, at: Date.now() };\n if (Date.now() - lastCount.current.at > 10 * 60_000) return;\n reload();\n }, 3000);\n return () => clearInterval(t);\n }, [missingNow, reload, made]);\n const clips = useMemo(() => {\n if (!recordingId) return [];\n const ids = sentenceKey ? sentenceKey.split(',').map(Number).filter((id) => !ended || made.has(id)) : undefined;\n const row = track ?? (ids?.length && lang\n ? { lang, voiceKey: pickedVoice ?? '', state: 'clips', clips: [], voice: null } as VoiceTrackRow\n : null);\n return archiveClips(row, recordingId, api.origin, cred, ids);\n }, [track, recordingId, api, cred, sentenceKey, lang, pickedVoice, ended, made]);\n const coming = useMemo(() => new Set(missing), [missing]);\n return { listed, rows, track, renderVoiceId, rendering, failed, clips, requestRender, forget, reload, setNear, missing: missing.length, coming };\n}\n\nexport interface TabSpec<K extends string> { key: K; label: string; icon?: string; sw?: number }\nexport function HeadTap({ onBack, children }: { onBack: () => void; children: React.ReactNode }) {\n const lead = useRef<HTMLDivElement>(null);\n useLayoutEffect(() => {\n const el = lead.current, head = el?.parentElement;\n if (!el || !head) return;\n const ro = new ResizeObserver(() => fit());\n const watched = new Set<Element>();\n const sideCol = () => {\n for (let a: HTMLElement | null = head.parentElement; a; a = a.parentElement) {\n const c = [...a.querySelectorAll<HTMLElement>('[data-tab-col]')].find((x) => x.offsetWidth > 0);\n if (c) return c;\n }\n return null;\n };\n const fit = () => {\n const pins = [...head.querySelectorAll<HTMLElement>('.dhead__clock--pin, .dhead__lib')];\n const col = pins.length ? sideCol() : null;\n if (col && !watched.has(col)) { watched.add(col); ro.observe(col); }\n const right = col ? `${Math.round(head.getBoundingClientRect().right - col.getBoundingClientRect().left + 20)}px` : '';\n pins.forEach((p) => { if (p.style.right !== right) p.style.right = right; });\n const left = Math.min(...pins.map((p) => p.getBoundingClientRect().left));\n const mw = pins.length ? `${Math.max(160, Math.floor(left - el.getBoundingClientRect().left - 16))}px` : '';\n if (el.style.maxWidth !== mw) el.style.maxWidth = mw;\n };\n fit();\n ro.observe(head);\n const mo = new MutationObserver(fit);\n mo.observe(document.documentElement, { attributes: true, attributeFilter: ['style'] });\n mo.observe(head, { childList: true });\n return () => { ro.disconnect(); mo.disconnect(); };\n }, []);\n return (\n <div className=\"dhead__lead\" ref={lead}>\n <div className=\"dhead__tap\" role=\"button\" tabIndex={0} title=\"Back\" aria-label=\"Back\" onClick={(e) => { e.currentTarget.blur(); onBack(); }} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onBack(); } }}>\n <span className=\"dhead__back\" aria-hidden=\"true\"><Icon d={D.chevronLeft} size={19} sw={1.7} /></span>\n {children}\n </div>\n </div>\n );\n}\n\nconst TAB_ICON: Record<string, string> = { share: D.share, delay: D.tabGauge, video: D.video, source: D.tabSources, script: D.tabScript, fix: D.tabFix, ending: D.tabEnding, summary: D.tabSummary, export: D.tabExport, settings: D.tabSettings, sources: D.tabSources, recs: D.mic };\n\nexport function TabBar<K extends string>({ tabs, current, onPick, gap, fold = true, side = !fold }: { tabs: TabSpec<K>[]; current: K | 'none'; onPick: (k: K | 'none') => void; side?: boolean; gap?: boolean; fold?: boolean }) {\n const few = fold && tabs.length <= 3;\n const anyOn = tabs.some((t) => t.key === current);\n const [tip, setTip] = useState<{ k: K; label: string; x: number; y: number } | null>(null);\n const tipRef = useRef<HTMLDivElement>(null);\n const [tipW, setTipW] = useState(0);\n useEffect(() => { if (tipRef.current) setTipW(tipRef.current.offsetWidth); }, [tip?.k]);\n const showTip = (e: React.MouseEvent<HTMLElement>, t: TabSpec<K>) => {\n const l = e.currentTarget.querySelector<HTMLElement>('.tabbar__label');\n if (few || fold || t.key === current || (l && getComputedStyle(l).opacity === '1')) { if (tip) setTip(null); return; }\n if (tip?.k === t.key) return;\n const tab = e.currentTarget.getBoundingClientRect();\n const strip = (e.currentTarget.parentElement as HTMLElement).getBoundingClientRect();\n setTip({ k: t.key, label: t.label, x: tab.left + tab.width / 2, y: strip.top });\n };\n const hideTip = () => setTip(null);\n let tipEl: ReactNode = null;\n if (tip) {\n const strip = { l: 0, r: typeof window !== 'undefined' ? window.innerWidth : 0 };\n const w = tipW || 80;\n const left = Math.max(strip.l + 8, Math.min(strip.r - w - 8, tip.x - w / 2));\n tipEl = createPortal(\n <div className=\"vsp vsp-portal\" data-theme=\"dark\"><div ref={tipRef} data-theme=\"dark\" className=\"vs-tip__bubble vs-tip__bubble--top tabtip\" style={{ position: 'fixed', left, top: tip.y - 8, bottom: 'auto', width: 'auto', whiteSpace: 'nowrap', transform: 'translateY(-100%)', zIndex: 2147483000, pointerEvents: 'none' }}>\n <span className=\"vs-tip__row\"><span className=\"vs-tip__copy\">{tip.label}</span></span>\n <span className=\"vs-tip__arrow\" style={{ left: Math.round(Math.max(8, Math.min(w - 19, tip.x - left - 5.5))) }} />\n </div></div>,\n document.body,\n );\n }\n return (\n <div role=\"tablist\" className={`tabbar tabbar--icons${fold ? '' : ' tabbar--desk'}`} data-desk-tabs={side ? '' : undefined} data-tab-n={side ? tabs.length : undefined} style={{ marginBottom: gap ? 12 : 0 }} onMouseLeave={hideTip}>\n {tabs.map((t) => {\n const on = current === t.key;\n const labelled = few || on;\n const flex = few ? '1 1 0' : on ? '1 1 auto' : fold && !anyOn ? '1 1 0' : '0 0 auto';\n const icon = t.icon ?? TAB_ICON[t.key];\n const pick = () => { hideTip(); onPick(fold && on ? 'none' : t.key); };\n return fold ? (\n <button key={t.key} type=\"button\" role=\"tab\" aria-selected={on} title={t.label} className={`tabbar__tab${on ? ' is-on' : ''}`} style={{ flex }} onClick={pick}>\n {icon && <Icon d={icon} size={15} sw={t.sw ?? 2} style={{ flex: 'none' }} />}\n {labelled && <span className=\"tabbar__label\">{t.label}</span>}\n </button>\n ) : (\n <div key={t.key} className=\"tabbar__slot\" data-tab-cell=\"\" style={{ flex }} onMouseEnter={(e) => showTip(e, t)} onMouseMove={(e) => showTip(e, t)} onClick={pick}>\n <button type=\"button\" role=\"tab\" aria-selected={on} aria-label={t.label} className={`tabbar__tab${on ? ' is-on' : ''}${tip?.k === t.key ? ' is-tip' : ''}`}>\n {icon && <Icon d={icon} size={15} sw={t.sw ?? 2} className=\"tabbar__icon\" style={{ flex: 'none', transform: on && !few ? 'scale(1.12)' : 'none' }} />}\n <span className=\"tabbar__grow\" data-tab-lw=\"\" style={{ gridTemplateColumns: labelled ? '1fr' : '0fr', marginLeft: labelled && icon ? 6 : 0 }}>\n <span className=\"tabbar__label\" data-tab-l=\"\" style={{ opacity: labelled ? 1 : 0, transform: labelled ? 'none' : 'translateX(-6px)' }}>{t.label}</span>\n </span>\n </button>\n </div>\n );\n })}\n {tipEl}\n </div>\n );\n}\n\nconst DL_D = 'M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3';\nconst MUSIC_D = 'm9 9 10.5-3m0 6.553v3.75a2.25 2.25 0 0 1-1.632 2.163l-1.32.377a1.803 1.803 0 1 1-.99-3.467l2.31-.66a2.25 2.25 0 0 0 1.632-2.163Zm0 0V2.25L9 5.25v10.303m0 0v3.75a2.25 2.25 0 0 1-1.632 2.163l-1.32.377a1.803 1.803 0 0 1-.99-3.467l2.31-.66A2.25 2.25 0 0 0 9 15.553Z';\n\ntype Download = { name: string; meta: string; onClick: () => void | Promise<unknown> };\n\nexport function ExportPanel({ audio, video, formats, onExport }: { audio?: Download | null; video?: Download | null; formats?: boolean; onExport: (k: ExportFormat) => void | Promise<unknown> }) {\n const [done, setDone] = useState<string | null>(null);\n const [busy, setBusy] = useState<string | null>(null);\n const timer = useRef<number | undefined>(undefined);\n const alive = useRef(true);\n useEffect(() => { alive.current = true; return () => { alive.current = false; window.clearTimeout(timer.current); }; }, []);\n const flash = (k: string) => { window.clearTimeout(timer.current); setDone(k); timer.current = window.setTimeout(() => setDone(null), 1600); };\n const exportAs = (k: ExportFormat) => {\n if (busy) return;\n setBusy(k);\n Promise.resolve()\n .then(() => onExport(k))\n .then(() => { if (alive.current) flash(k); })\n .catch(() => { })\n .finally(() => { if (alive.current) setBusy(null); });\n };\n const save = (k: 'audio' | 'video', dl: Download) => {\n if (busy) return;\n setBusy(k);\n Promise.resolve()\n .then(() => dl.onClick())\n .then(() => { if (alive.current) flash(k); })\n .catch(() => { })\n .finally(() => { if (alive.current) setBusy(null); });\n };\n const row = (k: 'audio' | 'video', dl: Download, icon: string, label: string) => (\n <>\n <Eyebrow style={{ letterSpacing: '.12em', color: 'var(--ink-35)' }}>{label}</Eyebrow>\n <button type=\"button\" className=\"dlrow\" disabled={busy != null} aria-busy={busy === k || undefined} onClick={() => save(k, dl)} style={busy && busy !== k ? { opacity: 0.45 } : undefined}>\n {busy === k\n ? <Spinner size={17} color=\"var(--brand)\" track=\"var(--fill-12)\" />\n : <Icon d={icon} size={17} sw={1.5} style={{ flex: 'none', color: 'var(--ink-70)' }} />}\n <span style={{ flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column', gap: 1, textAlign: 'left' }}>\n <span style={{ fontSize: 13, fontWeight: 500, color: 'var(--ink-96)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{dl.name}</span>\n <span style={{ font: '500 9.5px var(--vs-font-mono)', color: 'var(--ink-40)', letterSpacing: '.04em' }}>{dl.meta}</span>\n </span>\n <Icon d={done === k ? D.check : DL_D} size={17} sw={1.6} style={{ flex: 'none', color: done === k ? 'var(--brand)' : 'var(--ink-62)' }} />\n </button>\n </>\n );\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n {audio && row('audio', audio, MUSIC_D, 'DOWNLOAD AUDIO')}\n {video && row('video', video, D.video, 'DOWNLOAD VIDEO')}\n {formats !== false && (\n <>\n <Eyebrow style={{ letterSpacing: '.12em', color: 'var(--ink-35)' }}>EXPORT AS</Eyebrow>\n <div className=\"fmtgrid\">\n {TX_FORMATS.map((f) => (\n <button key={f.key} type=\"button\" className=\"fmtgrid__cell\" title={busy === f.key ? `Building the ${f.name}…` : f.note} disabled={busy != null} aria-busy={busy === f.key || undefined} onClick={() => exportAs(f.key)} style={busy && busy !== f.key ? { opacity: 0.45 } : undefined}>\n {busy === f.key\n ? <Spinner size={16} color=\"var(--brand)\" track=\"var(--fill-12)\" />\n : <Icon d={done === f.key ? D.check : f.icon} size={16} sw={1.6} style={{ color: done === f.key ? 'var(--brand)' : 'var(--ink-62)' }} />}\n <span>{f.name}</span>\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n );\n}\n\n\n\nexport function shareLink(url: string, title: string, onCopied?: () => void) {\n const copy = () => { void navigator.clipboard?.writeText(url).then(() => onCopied?.(), () => {}); };\n if (navigator.share) { navigator.share({ title, url }).catch((e) => { if (!e || (e as Error).name !== 'AbortError') copy(); }); return; }\n copy();\n}\n\n\nexport type SummaryState = {\n state: 'idle' | 'pending' | 'ready' | 'unavailable' | 'not_requested';\n request?: () => void;\n title?: string;\n summary?: string;\n slow?: boolean;\n retry: () => void;\n};\n\nconst SUMMARY_POLL_MS = 4000;\nconst SUMMARY_REASK_MS = 60_000;\nconst SUMMARY_SLOW_MS = 180_000;\n\nexport function useSummaryIn(base: SummaryState, recordingId: string | null, lang: string | null): SummaryState {\n const [got, setGot] = useState<{ key: string; s: SummaryState } | null>(null);\n const ready = base.state === 'ready';\n const key = `${recordingId ?? ''}|${lang ?? ''}|${ready ? `${base.title}\\n${base.summary}` : ''}`;\n const api = usePlayerApi();\n useEffect(() => {\n if (!recordingId || !lang || !ready) return;\n let alive = true;\n api.client.recordings.summary(recordingId, { lang, ...api.readAs })\n .then((r) => r as unknown as { state: string; title?: string; summary?: string })\n .then((r) => {\n if (!alive) return;\n const s: SummaryState = r?.state === 'ready' && r.title && r.summary ? { state: 'ready', title: r.title, summary: r.summary, retry: base.retry } : base;\n setGot({ key, s });\n })\n .catch(() => { if (alive) setGot({ key, s: base }); });\n return () => { alive = false; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, api]);\n if (!lang || !ready) return base;\n if (got?.key === key) return got.s;\n return { state: 'pending', retry: base.retry };\n}\n\nexport function summaryOf(rec: { title?: string | null; summary?: string | null } | null | undefined): SummaryState {\n return rec?.title && rec?.summary ? { state: 'ready', title: rec.title, summary: rec.summary, retry: () => {} } : { state: 'unavailable', retry: () => {} };\n}\n\nexport function SummaryPanel({ s }: { s: SummaryState }) {\n const [copied, setCopied] = useState(false);\n const timer = useRef<number | undefined>(undefined);\n useEffect(() => () => window.clearTimeout(timer.current), []);\n const title = s.title ?? '';\n const body = s.summary ?? '';\n const copy = () => {\n void navigator.clipboard?.writeText(`${title}\\n\\n${body}`).catch(() => {});\n window.clearTimeout(timer.current);\n setCopied(true);\n timer.current = window.setTimeout(() => setCopied(false), 1600);\n };\n const note = (text: string, action?: { label: string; onClick: () => void }) => (\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, fontSize: 13, fontWeight: 300, lineHeight: 1.45, color: 'var(--ink-45)' }}>\n <span style={{ flex: 1 }}>{text}</span>\n {action && <button type=\"button\" className=\"txlinks__manage\" onClick={action.onClick}>{action.label}</button>}\n </div>\n );\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8, minHeight: 24 }}>\n <Eyebrow style={{ letterSpacing: '.12em', color: 'var(--ink-35)' }}>SUMMARY</Eyebrow>\n {s.state === 'ready' && (\n <button type=\"button\" className=\"sumcopy\" title=\"Copy title and summary\" style={{ color: copied ? 'var(--brand)' : 'var(--ink-70)' }} onClick={copy}>\n <Icon d={copied ? D.check : COPY_D} size={13} sw={1.6} />{copied ? 'Copied' : 'Copy'}\n </button>\n )}\n </div>\n {s.state === 'ready' ? (\n <>\n <div style={{ fontSize: 15, fontWeight: 600, lineHeight: 1.3, letterSpacing: '-.15px', color: 'var(--ink-96)', textWrap: 'pretty' } as React.CSSProperties}>{title}</div>\n <div style={{ fontSize: 13, fontWeight: 300, lineHeight: 1.55, color: 'var(--ink-80)', textWrap: 'pretty', whiteSpace: 'pre-line' } as React.CSSProperties}>{body}</div>\n </>\n ) : s.state === 'unavailable' ? (\n note('No summary for this recording.')\n ) : s.state === 'not_requested' ? (\n s.request ? note('This recording was made without a summary.', { label: 'Summarize', onClick: s.request }) : note('Recordings under a minute and files of a batch are not summarised.')\n ) : (\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, fontSize: 13, fontWeight: 300, color: 'var(--ink-45)' }}>\n <Spinner size={14} color=\"var(--brand)\" track=\"var(--fill-12)\" />{s.slow ? 'Still writing the summary…' : 'Writing the summary…'}\n </div>\n )}\n </div>\n );\n}\n\nexport function LiveVideo({ ytId, title, timeLabel, radius, style, large, children, picture }: { ytId: string; title: string; timeLabel?: string | null; radius?: number; style?: React.CSSProperties; large?: boolean; children?: React.ReactNode; picture?: React.ReactNode }) {\n return (\n <div className=\"livevid\" style={{ ...(radius != null ? { borderRadius: radius } : null), ...style }}>\n <Icon d=\"m15.75 10.5 4.72-4.72a.75.75 0 0 1 1.28.53v11.38a.75.75 0 0 1-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25h-9A2.25 2.25 0 0 0 2.25 7.5v9a2.25 2.25 0 0 0 2.25 2.25Z\" size={large ? 34 : 30} sw={1.2} />\n {picture ?? <iframe src={liveEmbedUrl(ytId)} title={title} referrerPolicy=\"strict-origin-when-cross-origin\" allow=\"autoplay; encrypted-media; picture-in-picture\" />}\n {timeLabel && <span className=\"livevid__t\" style={large ? { bottom: 10, right: 10 } : undefined}>{timeLabel}</span>}\n {children}\n </div>\n );\n}\n\n\n\nexport function useDragScroll(enabled = true, external?: React.RefObject<HTMLDivElement>) {\n const own = useRef<HTMLDivElement | null>(null);\n const ref = (external ?? own) as React.MutableRefObject<HTMLDivElement | null>;\n useEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return;\n let startY = 0, startTop = 0, dragging = false;\n const down = (e: PointerEvent) => {\n if (e.button !== 0 || (e.target as HTMLElement).closest('button,a,input,textarea,select')) return;\n dragging = true;\n startY = e.clientY;\n startTop = el.scrollTop;\n el.classList.add('is-dragging');\n };\n const move = (e: PointerEvent) => {\n if (!dragging) return;\n const dy = e.clientY - startY;\n if (Math.abs(dy) > 2) el.setPointerCapture?.(e.pointerId);\n el.scrollTop = startTop - dy;\n };\n const up = () => { dragging = false; el.classList.remove('is-dragging'); };\n el.addEventListener('pointerdown', down);\n el.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => {\n el.removeEventListener('pointerdown', down);\n el.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n };\n }, [enabled]);\n return ref;\n}\n\nconst COPY_D = 'M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75';\n","import { useEffect, useRef, type CSSProperties, type ReactNode } from 'react';\nimport { D, Icon } from '../ds/Icons';\nimport { useColW, useSidePins } from '../data/prefs';\nimport { TabBar, type TabSpec } from './shared';\n\nexport interface SideTabsOpts<K extends string> {\n tabs: TabSpec<K>[];\n tabbed?: boolean;\n pinnable?: K[];\n autoPin?: K[];\n forcePin?: K[];\n cur: K | 'none' | null;\n pref?: K;\n onPick: (k: K) => void;\n}\n\nexport interface SidePanelState { show: boolean; pinned: boolean; order: number; pill: boolean; title: string; toggle: () => void }\n\nexport interface SideTabs<K extends string> {\n id: string;\n tabbed: boolean;\n cur: K | null;\n seq: K[];\n pinnable: K[];\n tabKeys: K[];\n stripTabs: TabSpec<K>[];\n panel: (k: K) => SidePanelState;\n pin: (k: K, at?: number) => void;\n unpin: (k: K) => void;\n}\n\nexport function useSideTabs<K extends string>(id: string, o: SideTabsOpts<K>): SideTabs<K> {\n const [stored, setStored] = useSidePins(id);\n const keys = o.tabs.map((t) => t.key);\n const tabbed = o.tabbed !== false;\n const pinnable = o.pinnable ?? keys;\n let list = stored;\n [...(o.autoPin ?? [])].reverse().forEach((k) => { if (keys.includes(k) && !list.includes(k) && !list.includes(`!${k}`)) list = [k, ...list]; });\n const kept = list;\n (o.forcePin ?? []).forEach((k) => { list = list.filter((x) => x !== `!${k}`); if (keys.includes(k) && !list.includes(k)) list = [k, ...list]; });\n const forced = (k: string) => (o.forcePin ?? []).includes(k as K) && !kept.includes(k);\n const seq = tabbed ? (list.filter((k) => keys.includes(k as K) && pinnable.includes(k as K)) as K[]) : [];\n const tabKeys = keys.filter((k) => !seq.includes(k));\n const cur = o.cur && o.cur !== 'none' && tabKeys.includes(o.cur) ? o.cur : o.pref && tabKeys.includes(o.pref) ? o.pref : (tabKeys[0] ?? null);\n const after = (k: K) => { const rest = tabKeys.filter((x) => x !== k); return rest[tabKeys.indexOf(k)] ?? rest[rest.length - 1] ?? null; };\n const pin = (k: K, at?: number) => {\n if (!pinnable.includes(k)) return;\n const next = seq.filter((x) => x !== k);\n next.splice(at == null ? next.length : at, 0, k);\n if (cur === k) { const n = after(k); if (n) o.onPick(n); }\n setStored([...next.filter((x) => !forced(x) || x === k), ...kept.filter((x) => !next.includes(x as K) && x !== `!${k}`)]);\n };\n const unpin = (k: K) => {\n setStored([...kept.filter((x) => x !== k && x !== `!${k}`), ...((o.autoPin ?? []).includes(k) ? [`!${k}`] : [])]);\n o.onPick(k);\n };\n const label = (k: K) => o.tabs.find((t) => t.key === k)?.label ?? k;\n const panel = (k: K): SidePanelState => {\n const p = seq.includes(k), avail = keys.includes(k);\n return {\n show: avail && (!tabbed || p || cur === k), pinned: p, order: p ? seq.indexOf(k) + 1 : 1000,\n pill: tabbed && avail && pinnable.includes(k) && tabKeys.length > 0 && (p || tabKeys.length > 1),\n title: p ? `Unpin — return ${label(k)} to the tabs` : `Pin ${label(k)} open above the tabs`,\n toggle: () => (p ? unpin(k) : pin(k)),\n };\n };\n return { id, tabbed: tabbed && tabKeys.length > 1, cur, seq, pinnable, tabKeys, stripTabs: o.tabs.filter((t) => tabKeys.includes(t.key)), panel, pin, unpin };\n}\n\nexport function SidePanels<K extends string>({ col, order, render, grip, onPick, wrapClass }: {\n col: SideTabs<K>; order: K[]; render: (k: K) => ReactNode; grip?: Partial<Record<K, number>>; onPick?: (k: K) => void;\n wrapClass?: (k: K, pinned: boolean) => string;\n}) {\n usePanelGrip(col);\n return (\n <>\n {order.map((k) => {\n const p = col.panel(k);\n if (!p.show) return null;\n const body = render(k);\n if (!body) return null;\n return (\n <div key={k} data-panel-key={k} data-pinned={p.pinned ? 'true' : 'false'} className={`pinwrap sidepanel ${wrapClass?.(k, p.pinned) ?? ''}`} style={{ order: p.order, ['--grip-h' as string]: `${grip?.[k] ?? 30}px` }}>\n {body}\n {p.pill && <button type=\"button\" data-pin-pill=\"\" className={`pinpill${p.pinned ? ' is-on' : ''}`} title={p.title} aria-label={p.title} aria-pressed={p.pinned} onClick={p.toggle}><Icon d={D.pin} size={12} sw={2} /></button>}\n </div>\n );\n })}\n {col.tabbed && col.cur && (\n <div className=\"deskstrip\" style={{ order: 999 }}>\n <TabBar tabs={col.stripTabs} current={col.cur} onPick={(k) => { if (k !== 'none') (onPick ?? (() => {}))(k); }} fold={false} />\n </div>\n )}\n </>\n );\n}\n\nfunction usePanelGrip<K extends string>(col: SideTabs<K>) {\n const live = useRef(col);\n live.current = col;\n const id = col.id;\n useEffect(() => {\n let hot: HTMLElement | null = null;\n type Drag = { el: HTMLElement; col: HTMLElement; key: K; x0: number; y0: number; on: boolean; px?: number; py?: number; raf?: number; clone?: HTMLElement;\n grid?: boolean; orig?: [HTMLElement, string][]; snap?: Record<string, DOMRect>; tabsSnap?: DOMRect | null; sig?: string; target?: { zone: 'pin' | 'tabs'; idx?: number } | null };\n let drag: Drag | null = null;\n const set = (w: HTMLElement | null) => {\n if (hot === w) return;\n if (hot) hot.removeAttribute('data-grip-hot');\n hot = w;\n if (w) w.setAttribute('data-grip-hot', '');\n };\n const tabsEl = (d: Drag) => d.col.querySelector<HTMLElement>('[data-desk-tabs]');\n const begin = (d: Drag) => {\n const r = d.el.getBoundingClientRect();\n const c = d.el.cloneNode(true) as HTMLElement;\n c.querySelectorAll<HTMLElement>('*').forEach((x) => { x.style.animation = 'none'; x.style.transition = 'none'; });\n c.querySelectorAll('iframe,video').forEach((f) => { const b = document.createElement('div'); b.style.cssText = 'width:100%;height:100%;background:#000'; f.replaceWith(b); });\n c.removeAttribute('data-panel-key');\n c.querySelectorAll('[data-panel-key],[data-pin-pill]').forEach((x) => (x.hasAttribute('data-pin-pill') ? x.remove() : x.removeAttribute('data-panel-key')));\n Object.assign(c.style, { position: 'fixed', left: `${r.left}px`, top: `${r.top}px`, width: `${r.width}px`, height: `${r.height}px`, margin: '0', zIndex: '1000', pointerEvents: 'none', opacity: '.95', borderRadius: '14px', boxShadow: '0 14px 36px rgba(0,0,0,.3)', animation: 'none', transition: 'none', cursor: 'move', willChange: 'transform', contain: 'layout paint', overflow: 'hidden' });\n const cs = getComputedStyle(d.el);\n for (let i = 0; i < cs.length; i++) { const p = cs[i]; if (p.startsWith('--')) c.style.setProperty(p, cs.getPropertyValue(p)); }\n c.style.fontFamily = cs.fontFamily; c.style.color = cs.color;\n let g: HTMLElement | null = d.el.parentElement, ground = '';\n while (g && !ground) { const bg = getComputedStyle(g).backgroundColor; if (bg && !/rgba?\\(0, 0, 0, 0\\)|transparent/.test(bg) && !/\\/ 0\\.|, 0\\.\\d+\\)$/.test(bg)) ground = bg; g = g.parentElement; }\n c.style.background = ground || getComputedStyle(document.body).backgroundColor;\n document.body.appendChild(c);\n d.orig = [...d.col.querySelectorAll<HTMLElement>('[data-panel-key]')].map((x) => [x, x.style.order]);\n d.snap = {}; d.orig.forEach(([x]) => { d.snap![x.getAttribute('data-panel-key')!] = x.getBoundingClientRect(); });\n d.tabsSnap = tabsEl(d)?.getBoundingClientRect() ?? null;\n const pg = d.col.querySelector('[data-panel-grid]'); d.grid = !!pg && getComputedStyle(pg).display === 'grid';\n d.el.classList.add('is-dragging');\n document.documentElement.style.cursor = 'move'; document.body.style.userSelect = 'none'; document.body.style.webkitUserSelect = 'none';\n Object.assign(d, { on: true, clone: c });\n set(null);\n };\n const frame = () => {\n const d = drag;\n if (!d || !d.on || d.px == null || d.py == null) return;\n d.raf = 0;\n d.clone!.style.transform = `translate3d(${d.px - d.x0}px,${d.py - d.y0}px,0)`;\n const c = live.current, k = d.key, tabs = tabsEl(d);\n const pinned = c.seq.includes(k), canPin = pinned || c.tabKeys.length > 1;\n const tr = tabs && d.tabsSnap;\n const zone = !tr || d.py < tr.top + tr.height / 2 ? (canPin ? 'pin' : null) : 'tabs';\n let t: Drag['target'] = null;\n if (zone === 'pin') {\n const rs = c.seq.filter((x) => x !== k).map((x) => d.snap![x]).filter(Boolean);\n const idx = d.grid\n ? rs.filter((r) => r.bottom < d.py! || (r.top <= d.py! && r.left + r.width / 2 < d.px!)).length\n : rs.filter((r) => r.top + r.height / 2 < d.py!).length;\n if (!(pinned && c.seq.indexOf(k) === idx)) t = { zone, idx };\n } else if (zone === 'tabs' && pinned) t = { zone };\n const sig = t ? t.zone + (t.idx ?? '') : '';\n if (sig === d.sig) return;\n d.sig = sig; d.target = t;\n d.orig!.forEach(([x, o]) => { x.style.order = o; });\n if (t?.zone === 'pin') {\n const next = c.seq.filter((x) => x !== k); next.splice(t.idx!, 0, k);\n next.forEach((x, i) => { const n = d.col.querySelector<HTMLElement>(`[data-panel-key=\"${x}\"]`); if (n) n.style.order = String(i + 1); });\n } else if (t?.zone === 'tabs') d.el.style.order = '998';\n if (tabs) { if (t?.zone === 'tabs') tabs.setAttribute('data-drop-hot', ''); else tabs.removeAttribute('data-drop-hot'); }\n };\n const end = (commit: boolean) => {\n const d = drag; drag = null;\n if (!d || !d.on) return;\n if (d.raf) cancelAnimationFrame(d.raf);\n d.clone!.remove(); d.orig!.forEach(([x, o]) => { x.style.order = o; });\n d.el.classList.remove('is-dragging');\n document.documentElement.style.cursor = ''; document.body.style.userSelect = ''; document.body.style.webkitUserSelect = '';\n tabsEl(d)?.removeAttribute('data-drop-hot');\n if (commit && d.target) { const c = live.current; if (d.target.zone === 'tabs') { if (c.seq.includes(d.key)) c.unpin(d.key); } else c.pin(d.key, d.target.idx); }\n };\n const myCol = (t: EventTarget | null) => { const el = t instanceof Element ? t.closest<HTMLElement>('[data-tab-col]') : null; return el && el.getAttribute('data-tab-col') === id ? el : null; };\n const onMove = (e: PointerEvent) => {\n if (drag) {\n if (!drag.on) { if (Math.hypot(e.clientX - drag.x0, e.clientY - drag.y0) < 4) return; begin(drag); }\n drag.px = e.clientX; drag.py = e.clientY;\n if (!drag.raf) drag.raf = requestAnimationFrame(frame);\n return;\n }\n const t = e.target as Element | null;\n if (!myCol(t)) { if (hot && hot.closest('[data-tab-col]')?.getAttribute('data-tab-col') === id) set(null); return; }\n const w = t!.closest<HTMLElement>('[data-panel-key]');\n const surf = w?.firstElementChild;\n if (!w || !surf || !live.current.tabbed || !live.current.pinnable.includes(w.getAttribute('data-panel-key') as K) || t!.closest('[role=button],[role=tab],button,a,input,textarea,select,iframe,[data-pin-pill],[contenteditable=true]')) return set(null);\n const r = surf.getBoundingClientRect(), h = parseFloat(getComputedStyle(w).getPropertyValue('--grip-h')) || 30;\n set(e.clientY >= r.top && e.clientY <= r.top + h ? w : null);\n };\n const onDown = (e: PointerEvent) => {\n if (!hot || e.button !== 0) return;\n const c = myCol(hot); if (!c) return;\n e.preventDefault(); e.stopImmediatePropagation();\n drag = { el: hot, col: c, key: hot.getAttribute('data-panel-key') as K, x0: e.clientX, y0: e.clientY, on: false };\n };\n const onUp = () => end(true);\n const onCancel = () => end(false);\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape' && drag) { e.preventDefault(); e.stopImmediatePropagation(); end(false); } };\n const onLeave = () => { if (!drag) set(null); };\n document.addEventListener('pointermove', onMove, true);\n document.addEventListener('pointerdown', onDown, true);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onCancel);\n window.addEventListener('keydown', onKey, true);\n document.addEventListener('pointerleave', onLeave);\n return () => {\n end(false); set(null);\n document.removeEventListener('pointermove', onMove, true);\n document.removeEventListener('pointerdown', onDown, true);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onCancel);\n window.removeEventListener('keydown', onKey, true);\n document.removeEventListener('pointerleave', onLeave);\n };\n }, [id]);\n}\n\nexport function SideFrame({ id, className, gap, hidden, plain, children }: { id: string; className: string; gap: number; hidden?: boolean; plain?: boolean; children: ReactNode }) {\n const [w, setW] = useColW(id);\n const col = useRef<HTMLDivElement | null>(null);\n const grid = useRef<HTMLDivElement | null>(null);\n useMasonry(grid);\n useEffect(() => { document.documentElement.style.setProperty('--colw', `${w}px`); }, [w]);\n const onGrip = (e: React.PointerEvent<HTMLDivElement>) => {\n const el = col.current, row = el?.parentElement;\n if (e.button !== 0 || !el || !row) return;\n e.preventDefault();\n const g = e.currentTarget;\n const cs = getComputedStyle(row);\n const avail = row.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight) - (parseFloat(cs.columnGap) || 0);\n const MIN = 320, CONTENT = 320, max = Math.max(MIN, avail - CONTENT);\n const x0 = e.clientX, w0 = el.getBoundingClientRect().width;\n let nw = w0;\n g.classList.add('is-on');\n const prev = { cur: document.body.style.cursor, sel: document.body.style.userSelect };\n document.body.style.cursor = 'col-resize'; document.body.style.userSelect = 'none';\n const move = (ev: PointerEvent) => { nw = Math.round(Math.min(max, Math.max(MIN, w0 + (x0 - ev.clientX)))); el.style.flexBasis = `${nw}px`; document.documentElement.style.setProperty('--colw', `${nw}px`); };\n const up = () => {\n window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); window.removeEventListener('pointercancel', up);\n document.body.style.cursor = prev.cur; document.body.style.userSelect = prev.sel; g.classList.remove('is-on');\n setW(nw);\n };\n window.addEventListener('pointermove', move); window.addEventListener('pointerup', up); window.addEventListener('pointercancel', up);\n };\n const shown: CSSProperties | undefined = hidden ? { display: 'none' } : undefined;\n return (\n <>\n <div aria-hidden=\"true\" className=\"colgrip\" style={{ marginRight: -gap, ...shown }}>\n <div className=\"colgrip__bar\" style={{ left: -(gap / 2 + 6) }} title=\"Drag to resize · double-click to reset\" onPointerDown={onGrip} onDoubleClick={() => setW(null)} />\n </div>\n <div ref={col} data-tab-col={id} className={`${className} sidecol`} style={{ flex: `0 0 ${w}px`, ...shown }}>\n {plain ? children : <div ref={grid} data-panel-grid=\"\" className=\"panelgrid\">{children}</div>}\n </div>\n </>\n );\n}\n\nfunction useMasonry(ref: React.RefObject<HTMLDivElement | null>) {\n useEffect(() => {\n const g = ref.current;\n if (!g) return;\n const GAP = 16;\n let raf = 0;\n const layout = () => {\n raf = 0;\n const on = getComputedStyle(g).display === 'grid';\n [...g.children].forEach((c) => {\n const el = c as HTMLElement;\n if (!on) { if (el.style.gridRowEnd) el.style.gridRowEnd = ''; return; }\n const h = el.getBoundingClientRect().height;\n const v = h > 0 ? `span ${Math.ceil(h + GAP)}` : 'span 1';\n if (el.style.gridRowEnd !== v) el.style.gridRowEnd = v;\n });\n };\n const mark = () => { if (!raf) raf = requestAnimationFrame(layout); };\n const ro = new ResizeObserver(mark);\n const watch = () => { ro.disconnect(); ro.observe(g); [...g.children].forEach((c) => ro.observe(c)); mark(); };\n const mo = new MutationObserver(watch);\n mo.observe(g, { childList: true });\n watch();\n return () => { ro.disconnect(); mo.disconnect(); if (raf) cancelAnimationFrame(raf); };\n }, [ref]);\n}\n","export interface AudioFacts {\n state?: string | null;\n mediaDurationS?: number | null;\n ingest?: { state?: string | null; error?: string | null; startedAt?: string | null } | null;\n}\n\nexport type NoAudio = { none: false } | { none: true; message: string };\n\nexport function recordingAudio(rec: AudioFacts | null | undefined, lines: number): NoAudio {\n if (!rec || (rec.state !== 'ended' && rec.state !== 'finalized')) return { none: false };\n if (lines > 0 || (rec.mediaDurationS ?? 0) > 0) return { none: false };\n const i = rec.ingest;\n if (i && i.startedAt && i.state !== 'failed') return { none: false };\n if (!i && rec.state !== 'finalized') return { none: false };\n return { none: true, message: noAudioMessage(i?.error) };\n}\n\nexport function noAudioMessage(reason?: string | null): string {\n const r = (reason ?? '').trim().replace(/\\.$/, '');\n return r ? `No audio was recorded: ${r[0].toLowerCase()}${r.slice(1)}.` : 'No audio was recorded: the recording ended before any audio arrived.';\n}\n\nexport function isNotCaptured(message?: string | null): boolean {\n return /\\bwas not captured\\b/i.test(message ?? '');\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { deliveryFormat } from '../core/audio';\nimport { describe, type ErrorLike } from './errors';\nimport { usePlayerApi } from './context';\n\nexport interface PreviewableVoice { id: string; previewUrl?: string }\nconst SAMPLE_RETRY_MS = 1500;\nconst SAMPLE_GIVE_UP_MS = 300_000;\n\nexport function useVoicePreview(lang: string | null) {\n const api = usePlayerApi();\n const [armId, setArmId] = useState<string | null>(null);\n const [sampleId, setSampleId] = useState<string | null>(null);\n const [dlId, setDlId] = useState<string | null>(null);\n const [error, setError] = useState<ErrorLike | null>(null);\n const el = useRef<HTMLAudioElement | null>(null);\n const url = useRef<string | null>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const run = useRef(0);\n\n const release = useCallback(() => {\n if (timer.current) { clearTimeout(timer.current); timer.current = null; }\n if (el.current) { el.current.pause(); el.current.removeAttribute('src'); el.current.load(); el.current = null; }\n if (url.current) { URL.revokeObjectURL(url.current); url.current = null; }\n }, []);\n\n const stop = useCallback(() => {\n run.current += 1;\n release();\n setSampleId(null);\n setDlId(null);\n }, [release]);\n\n const reset = useCallback(() => { stop(); setArmId(null); }, [stop]);\n\n useEffect(() => () => { run.current += 1; release(); }, [release]);\n\n const arm = useCallback((v: PreviewableVoice) => {\n run.current += 1;\n const mine = run.current;\n release();\n setArmId(v.id);\n setSampleId(null);\n setDlId(null);\n setError(null);\n if (!lang) return;\n let src = v.previewUrl\n ? `${api.origin}${v.previewUrl}`\n : `${api.origin}/v1/voices/preview?voice=${encodeURIComponent(v.id)}&lang=${encodeURIComponent(lang)}`;\n if (deliveryFormat() === 'caf') src += `${src.includes('?') ? '&' : '?'}format=caf`;\n const started = Date.now();\n if (api.shareCode && src.includes('recording=')) src += `&shareCode=${encodeURIComponent(api.shareCode)}`;\n const ask = async () => {\n if (run.current !== mine) return;\n let res: Response;\n try {\n const token = api.owner ? await api.bearer() : undefined;\n res = await fetch(src, { headers: token ? { Authorization: `Bearer ${token}` } : {} });\n } catch (e) {\n if (run.current !== mine) return;\n setDlId(null);\n setError(describe(e));\n return;\n }\n if (run.current !== mine) return;\n if (res.status === 202 || res.status === 503) {\n if (Date.now() - started > SAMPLE_GIVE_UP_MS) {\n setDlId(null);\n setError({ message: 'This voice is still being fetched. Try it again in a moment.' });\n return;\n }\n setDlId(v.id);\n timer.current = setTimeout(() => { void ask(); }, SAMPLE_RETRY_MS);\n return;\n }\n if (!res.ok) {\n setDlId(null);\n const body = await res.json().catch(() => null) as { code?: string } | null;\n setError(body?.code === 'language_unavailable'\n ? { message: 'No voice can speak this language yet.', status: res.status }\n : { message: `This voice could not be previewed (${res.status}).`, status: res.status });\n return;\n }\n const blob = await res.blob();\n if (run.current !== mine) return;\n setDlId(null);\n url.current = URL.createObjectURL(blob);\n const a = new Audio(url.current);\n (a as HTMLAudioElement & { playsInline?: boolean }).playsInline = true;\n const done = () => { if (run.current === mine) { release(); setSampleId(null); } };\n a.onended = done;\n a.onerror = done;\n el.current = a;\n void a.play().then(() => { if (run.current === mine) setSampleId(v.id); }).catch(done);\n };\n void ask();\n }, [lang, release, api]);\n\n return { armId, sampleId, dlId, error, clearError: () => setError(null), arm, stop, reset };\n}\n","export interface PlaySlot { sentenceId?: number | null; start: number }\n\nexport interface PlayPos {\n t: number;\n playing: boolean;\n sentenceId: number | null;\n offset: number;\n ended: boolean;\n}\n\nexport interface PlayPlace { t: number; playing: boolean; index: number }\n\nconst EPS = 0.05;\n\nconst indexAt = (rows: readonly PlaySlot[], t: number): number => {\n let i = 0;\n for (let k = 0; k < rows.length; k++) if (rows[k].start <= t + 1e-6) i = k;\n return i;\n};\n\nexport function snapPosition(rows: readonly PlaySlot[], t: number, playing: boolean, dur: number): PlayPos {\n const at = Math.max(0, t);\n const ended = dur > 0 && at >= dur - EPS;\n const i = rows.length && rows[0].start <= at + 1e-6 ? indexAt(rows, at) : -1;\n if (i < 0) return { t: at, playing: playing && !ended, sentenceId: null, offset: 0, ended };\n return { t: at, playing: playing && !ended, sentenceId: rows[i].sentenceId ?? null, offset: Math.max(0, at - rows[i].start), ended };\n}\n\nexport function placePosition(pos: PlayPos, rows: readonly PlaySlot[], dur: number): PlayPlace {\n const end = Math.max(0, dur);\n if (pos.ended) return { t: end, playing: false, index: Math.max(0, rows.length - 1) };\n const j = pos.sentenceId == null ? -1 : rows.findIndex((r) => r.sentenceId === pos.sentenceId);\n let t = pos.t;\n if (j >= 0) {\n const from = rows[j].start;\n const len = Math.max(0, Math.min(rows[j + 1]?.start ?? end, end) - from);\n t = from + Math.min(pos.offset, Math.max(0, len - EPS));\n }\n t = Math.max(0, Math.min(end, t));\n const atEnd = end > 0 && t >= end - EPS && j < 0;\n return { t, playing: pos.playing && !atEnd, index: j >= 0 ? j : indexAt(rows, t) };\n}\n","export type VoiceWait = 'asked' | 'line' | null;\n\nexport function voiceWait(o: { on: boolean; want: boolean; relang: boolean; playing: boolean; preparing: boolean; starting: number | null | undefined }): VoiceWait {\n if (!o.on) return null;\n if (o.want || o.relang) return 'asked';\n if (o.playing && (o.preparing || o.starting != null)) return 'line';\n return null;\n}\n\nexport const VOICE_WAIT_TITLE = 'Preparing the voice…';\n","import { useEffect, useState } from 'react';\nimport { D, Icon } from '../ds/Icons';\n\n\nexport type PlayerWaitKind = 'translating' | 'voice' | 'starting' | 'translateFailed' | 'voiceFailed';\nexport interface PlayerWaitState {\n kind: PlayerWaitKind;\n lang: string;\n since?: number | null;\n}\n\nexport function playerWaitOf(o: {\n lang: string | null; langName: string;\n translating: boolean; translateFailed: string | null;\n voiceFailed: boolean; relang: boolean; starting: number | null | undefined;\n slowLine: boolean; lineSince: number | null;\n}): PlayerWaitState | null {\n if (!o.lang) return null;\n const lang = o.langName;\n if (o.translateFailed === o.lang) return { kind: 'translateFailed', lang };\n if (o.voiceFailed) return { kind: 'voiceFailed', lang };\n if (o.translating) return { kind: 'translating', lang };\n if (o.starting != null) return { kind: 'starting', lang, since: o.starting };\n if (o.relang || o.slowLine) return { kind: 'voice', lang, since: o.lineSince };\n return null;\n}\n\nexport function useHeld(on: boolean, ms: number): [boolean, number | null] {\n const [since, setSince] = useState<number | null>(null);\n const [held, setHeld] = useState(false);\n useEffect(() => {\n if (!on) { setSince(null); setHeld(false); return; }\n const at = Date.now();\n setSince(at);\n const h = setTimeout(() => setHeld(true), ms);\n return () => clearTimeout(h);\n }, [on, ms]);\n return [held, since];\n}\n\nconst clockOf = (s: number) => `${Math.floor(s / 60)}:${String(s % 60).padStart(2, '0')}`;\n\nexport function PlayerWait({ state, line, onRetry, onOriginal }: {\n state: PlayerWaitState;\n line?: string | null;\n onRetry: () => void;\n onOriginal: () => void;\n}) {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (state.since == null) return;\n const h = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(h);\n }, [state.since]);\n const elapsed = state.since != null ? Math.max(0, Math.floor((now - state.since) / 1000)) : null;\n const failed = state.kind === 'translateFailed' || state.kind === 'voiceFailed';\n const title = {\n translating: `Translating into ${state.lang}`,\n voice: `Preparing the ${state.lang} voice`,\n starting: `Starting the ${state.lang} voice`,\n translateFailed: `Couldn’t translate into ${state.lang}`,\n voiceFailed: `The ${state.lang} voice didn’t start`,\n }[state.kind];\n const note = {\n translating: 'The video carries on in the new language as soon as the words are ready — usually a few seconds.',\n voice: 'It plays on its own as soon as the first line is ready.',\n starting: 'The voice is waking up. The first line can take up to a minute; after that it reads straight on.',\n translateFailed: 'Something went wrong on our side. Try again, or watch with the original sound.',\n voiceFailed: 'It took too long to start. Try again, or watch with the original sound.',\n }[state.kind];\n return (\n <div className={`pwait${failed ? ' pwait--failed' : ''}`} data-kind={state.kind} role={failed ? 'alert' : 'status'} aria-live={failed ? 'assertive' : 'polite'}\n onClick={(e) => e.stopPropagation()} onPointerDown={(e) => e.stopPropagation()}>\n <div className=\"pwait__head\">\n {failed\n ? <div className=\"pwait__mark\" aria-hidden=\"true\"><Icon d={D.warnCircle} size={18} sw={1.8} /></div>\n : <div className=\"pwait__spin\" aria-hidden=\"true\" />}\n <div className=\"pwait__t\">{title}</div>\n {!failed && elapsed != null && elapsed >= 3 && <div className=\"pwait__clock\" aria-label={`${elapsed} seconds`}>{clockOf(elapsed)}</div>}\n </div>\n <div className=\"pwait__note\">{note}</div>\n {!failed && <div className=\"pwait__bar\" aria-hidden=\"true\"><div /></div>}\n {failed && (\n <div className=\"pwait__acts\">\n <button type=\"button\" className=\"vs-btn vs-btn--primary vs-btn--sm\" onClick={onRetry}>Try again</button>\n <button type=\"button\" className=\"vs-btn vs-btn--ghost vs-btn--sm\" onClick={onOriginal}>Watch in the original</button>\n </div>\n )}\n {!failed && line && <div className=\"pwait__line\" aria-hidden=\"true\">{line}</div>}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, useLayoutEffect } from 'react';\nimport type { Correction, LanguageLists } from '@vocalstack/js-sdk';\nimport { LanguageChip, Sheet, Switch } from '../ds/Controls';\nimport { D, Icon, PlayGlyph, Spinner } from '../ds/Icons';\nimport { isNotCaptured } from '../core/noAudio';\nimport { pickerLanguages, useRecentLangs } from '../data/prefs';\nimport { useVoicePreview } from '../data/voicePreview';\nimport { LanguagePicker, type LanguageListProps } from '../ds/LanguagePicker';\nimport { explainAudioError, mediaErrorText, reportMediaError, type MediaCred } from '../core/audio';\nimport { clock } from '../core/format';\nimport { describe, useAsync, type ErrorLike } from '../data/transcript';\nimport { usePlayerApi } from '../data/context';\nimport { strings } from '../data/i18n';\nimport { confClass, fixedSlots, lane, speakerInitial, speakerLabel, speakerLook, type Model, type Row, type Word } from '../core/transcript';\nimport { ClipQueue, newMediaElement, readCursor, VoiceNotStarted, type ReadPos, type VoiceClip } from '../core/voiceplayer';\nimport { placePosition, snapPosition, type PlayPos } from '../core/playPosition';\nimport { voiceWait, VOICE_WAIT_TITLE } from '../core/voiceWait';\nimport { useHeld } from './wait';\nimport { lineSpeechEnd, spreadWords } from '../core/readalong';\nimport { type AvailableVoice, type CastMember, FixBadges, FixPen, rowFixes, FeedBar, NO_VOICE_TIP, feedInset, SpeakerCast, VoiceIdGlyph, VoiceSheetBody, autoCast, castKey, langMeta, namedCount, rowKey, speakerRoster, useArchiveVoice, useFeedBar, useVoiceCatalogue, useDragScroll } from './shared';\n\nexport function lineWords(rows: Row[], i: number, lang?: string | null): Word[] {\n const r = rows[i];\n const tr = lang && r.translations[lang] && r.language !== lang ? r.translations[lang] : null;\n if (!tr && r.words.length) return r.words;\n const ws = (tr ?? r.text).split(/\\s+/).filter(Boolean);\n const from = r.words[0]?.start ?? r.start;\n const to = lineSpeechEnd(r, rows[i + 1], r.start + Math.max(2, ws.length * 0.4));\n return spreadWords(ws, from, to).map((w, k) => ({ ...w, seq: r.seqs[0] ?? 0, idx: k } as Word));\n}\n\nexport function spokenWordOf(player: Pick<TxPlayer, 't' | 'idx' | 'engaged' | 'wordSync' | 'clipPos'>, i: number, words: Word[]): number | null {\n if (!player.engaged || i !== player.idx || !words.length) return null;\n if (!player.wordSync) return player.clipPos ? readCursor(words.map((w) => ({ t: w.text, sp: ' ' })), player.clipPos) : null;\n const t = player.t;\n let at = -1;\n for (let j = 0; j < words.length && words[j].start <= t; j++) at = j;\n return at;\n}\n\nexport function pictureT(player: Pick<TxPlayer, 't' | 'idx' | 'wordSync' | 'clipPos' | 'dur' | 'timed'>, rows: Row[]): number {\n const cp = player.clipPos;\n if (player.wordSync || player.timed || !cp || !(cp.dur > 0)) return player.t;\n const r = rows[player.idx];\n const from = r?.start ?? player.t;\n const next = rows[player.idx + 1]?.start ?? lineEnd(r, from, player.dur);\n const span = Math.max(0, next - from);\n return from + Math.min(span, (cp.t / cp.dur) * span);\n}\n\nexport function lineEnd(r: Row | undefined, from: number, dur: number): number {\n const w = r?.words[r.words.length - 1]?.end;\n if (w != null && w > from) return w;\n if (r?.end != null && r.end > from) return r.end;\n return dur > from ? dur : from + 4;\n}\n\nexport interface YtLead { muted: boolean; onInfo: (i: { t?: number; state?: number; ready?: boolean; muted?: boolean }) => void; bind: (cmd: ((func: string, args?: unknown[]) => void) | null) => void }\n\nexport function YtFollow({ ytId, title, t, playing: wantPlay, seekN, onToggle, onAd, endT, onGone, onKnown, lead, onTime, waiting = false }: { waiting?: boolean; onTime?: (t: number) => void; lead?: YtLead; ytId: string; title: string; t: number; playing: boolean; seekN: number; onToggle?: () => void; onAd?: (on: boolean) => void; endT?: number | null; onGone?: () => void; onKnown?: (gone: boolean) => void }) {\n const ref = useRef<HTMLIFrameElement>(null);\n const [held, setHeld] = useState(false);\n useEffect(() => {\n if (!waiting) { setHeld(false); return; }\n const h = setTimeout(() => setHeld(true), 300);\n return () => clearTimeout(h);\n }, [waiting]);\n const playing = wantPlay && !held;\n const adRef = useRef(false);\n const [ad, setAd] = useState(false);\n const cmd = (func: string, args: unknown[] = []) => {\n if (adRef.current && (func === 'pauseVideo' || func === 'seekTo' || func === 'setPlaybackRate')) return;\n try { ref.current?.contentWindow?.postMessage(JSON.stringify({ event: 'command', func, args }), '*'); } catch { }\n };\n const contentDur = useRef<number | null>(null);\n const liveVideo = useRef(false);\n const adByDur = useRef(false);\n const adByStall = useRef(false);\n const toggleRef = useRef(onToggle); toggleRef.current = onToggle;\n const leadRef = useRef(lead); leadRef.current = lead;\n const adCb = useRef(onAd); adCb.current = onAd;\n const resumeAfterAd = useRef(false);\n const adCheck = () => {\n const now = adByDur.current || adByStall.current;\n if (now === adRef.current) return;\n adRef.current = now;\n setAd(now);\n adCb.current?.(now);\n if (now) {\n cmd('playVideo');\n if (leadRef.current) return;\n if (playingRef.current && toggleRef.current) { resumeAfterAd.current = true; toggleRef.current(); }\n } else if (resumeAfterAd.current && !leadRef.current) {\n resumeAfterAd.current = false;\n if (!playingRef.current) toggleRef.current?.();\n }\n };\n const tRef = useRef(t); tRef.current = t;\n const timeCb = useRef(onTime); timeCb.current = onTime;\n const ytT = useRef<number | null>(null);\n const ytState = useRef<number | null>(null);\n const [ytPaused, setYtPaused] = useState(true);\n const [ready, setReady] = useState(false);\n const noCaptions = () => { cmd('unloadModule', ['captions']); cmd('unloadModule', ['cc']); };\n const capT = useRef<number[]>([]);\n const noCaptionsSoon = () => { noCaptions(); capT.current.forEach(clearTimeout); capT.current = [400, 1200, 2500, 5000].map((ms) => window.setTimeout(noCaptions, ms)); };\n useEffect(() => () => capT.current.forEach(clearTimeout), []);\n const onLoad = () => {\n try { ref.current?.contentWindow?.postMessage(JSON.stringify({ event: 'listening', id: 'reader' }), '*'); } catch { }\n if (!leadRef.current || leadRef.current.muted) cmd('mute');\n setReady(true);\n };\n useEffect(() => { lead?.bind(cmd); return () => lead?.bind(null); }, [!!lead]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => { if (!lead && ready) cmd('mute'); }, [!!lead]); // eslint-disable-line react-hooks/exhaustive-deps\n const win = useRef<{ start: number; end: number } | null>(null);\n const endRef = useRef(endT); endRef.current = endT;\n const playingRef = useRef(playing); playingRef.current = playing;\n const probed = useRef(false);\n const goneRef = useRef(onGone); goneRef.current = onGone;\n const knownRef = useRef(onKnown); knownRef.current = onKnown;\n const goneSaid = useRef(false);\n const [gone, setGone] = useState(false);\n const outside = (x: number) => { const w = win.current; return !!w && (x < w.start - 1 || x > w.end + 5); };\n const seek = () => { if (!outside(tRef.current)) cmd('seekTo', [tRef.current, true]); };\n const at = () => ytT.current;\n useEffect(() => {\n const on = (m: MessageEvent) => {\n if (m.source !== ref.current?.contentWindow || typeof m.data !== 'string') return;\n let d: { event?: string; info?: { currentTime?: number; duration?: number; videoData?: { isLive?: boolean }; muted?: boolean; playerState?: number; progressState?: { seekableStart?: number; seekableEnd?: number } | null } } | null = null;\n try { d = JSON.parse(m.data); } catch { return; }\n if (d?.info?.videoData?.isLive) liveVideo.current = true;\n const dur = d?.info?.duration;\n if (typeof dur === 'number' && dur > 0 && !liveVideo.current) {\n if (contentDur.current == null) contentDur.current = dur;\n else { adByDur.current = Math.abs(dur - contentDur.current) > 1.5; adCheck(); }\n }\n if (d?.event === 'onReady') { if (!leadRef.current || leadRef.current.muted) cmd('mute'); noCaptionsSoon(); leadRef.current?.onInfo({ ready: true }); }\n if (typeof d?.info?.playerState === 'number') { if (d.info.playerState !== ytState.current && (d.info.playerState === 1 || d.info.playerState === 2)) noCaptionsSoon(); ytState.current = d.info.playerState; setYtPaused(d.info.playerState !== 1 && d.info.playerState !== 3); leadRef.current?.onInfo({ state: d.info.playerState }); }\n const ps = d?.info?.progressState;\n if (ps && typeof ps.seekableStart === 'number' && typeof ps.seekableEnd === 'number' && ps.seekableEnd > ps.seekableStart) {\n const first = win.current == null;\n win.current = { start: ps.seekableStart, end: ps.seekableEnd };\n if (first && !playingRef.current) { cmd('pauseVideo'); if (!outside(tRef.current)) cmd('seekTo', [tRef.current, true]); }\n if (!goneSaid.current && endRef.current != null) {\n goneSaid.current = true;\n const all = endRef.current < ps.seekableStart - 1;\n knownRef.current?.(all);\n if (all) goneRef.current?.();\n }\n }\n if (typeof d?.info?.currentTime === 'number') { ytT.current = d.info.currentTime; leadRef.current?.onInfo({ t: d.info.currentTime }); if (!adRef.current && ytState.current === 1) timeCb.current?.(d.info.currentTime); }\n if (d?.info?.muted === false && !leadRef.current) cmd('mute');\n if (typeof d?.info?.muted === 'boolean') leadRef.current?.onInfo({ muted: d.info.muted });\n };\n window.addEventListener('message', on);\n return () => window.removeEventListener('message', on);\n }, []);\n useEffect(() => {\n if (lead) return;\n const now = outside(t);\n if (now !== gone) { setGone(now); if (now) cmd('pauseVideo'); else if (ready) { cmd('seekTo', [t, true]); if (playing) cmd('playVideo'); } }\n }); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!ready || gone || lead) return;\n if (!playing && win.current == null && !probed.current) { probed.current = true; cmd('seekTo', [tRef.current, true]); cmd('playVideo'); return; }\n const y = at();\n if (playing && (y == null || Math.abs(y - tRef.current) > 1.5)) seek();\n if (playing) cmd('playVideo'); else cmd('pauseVideo');\n }, [playing, ready, gone]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!ready || seekN === 0 || gone || lead) return;\n const y = at();\n if (y == null || Math.abs(y - tRef.current) > 0.5) seek();\n if (!playing) cmd('pauseVideo');\n }, [seekN, ready]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!ready) return;\n let last: number | null = null;\n let still = 0;\n const h = setInterval(() => {\n const y = ytT.current;\n still = ytState.current === 1 && y != null && last != null && Math.abs(y - last) < 0.05 ? still + 1 : 0;\n last = y;\n const now = still >= 3;\n if (now !== adByStall.current) { adByStall.current = now; adCheck(); }\n }, 1000);\n return () => clearInterval(h);\n }, [ready]); // eslint-disable-line react-hooks/exhaustive-deps\n return (\n <div className={`txyt${ad ? ' txyt--ad' : ''}`}>\n <iframe ref={ref} onLoad={onLoad} referrerPolicy=\"strict-origin-when-cross-origin\" src={`https://www.youtube-nocookie.com/embed/${ytId}?enablejsapi=1&mute=1&controls=0&rel=0&modestbranding=1&playsinline=1&iv_load_policy=3`} title={title} allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" />\n {!ad && <div aria-hidden=\"true\" className=\"txyt__tap\" onClick={onToggle} style={{ cursor: onToggle ? 'pointer' : 'default' }} />}\n <div className={`txyt__paused${ytPaused && !ad && !gone ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div>\n {ad && <div className=\"txyt__ad\" aria-live=\"polite\">Ad on YouTube · the transcript carries on after it</div>}\n {gone && <div className=\"txyt__gone\"><span>YouTube no longer has this part of the broadcast</span><small>A live stream can be rewound only 12 hours</small></div>}\n </div>\n );\n}\nexport const PAUSE_D = <><rect x=\"6.5\" y=\"5\" width=\"3.75\" height=\"14\" rx=\"1.2\" /><rect x=\"13.75\" y=\"5\" width=\"3.75\" height=\"14\" rx=\"1.2\" /></>;\nexport const PLAY_D = <path d=\"M7.5 5.6a1 1 0 0 1 1.52-.85l9.1 5.55a1 1 0 0 1 0 1.7l-9.1 5.55a1 1 0 0 1-1.52-.85V5.6Z\" />;\n\nexport function MuteButton({ player, size }: { player: Pick<TxPlayer, 'muted' | 'toggleMute'>; size: number }) {\n const label = player.muted ? 'Unmute' : 'Mute';\n return (\n <button type=\"button\" className={`mutebtn${size < 36 ? ' mutebtn--sm' : size > 36 ? ' mutebtn--lg' : ''}`} aria-label={label} title={label} aria-pressed={player.muted} onClick={player.toggleMute}>\n <Icon d={player.muted ? D.volumeOff : D.volume} size={17} sw={1.6} style={{ color: player.muted ? 'var(--ink-38)' : 'var(--ink-70)' }} />\n </button>\n );\n}\nexport function useFlash(): [string, (m: string) => void] {\n const [msg, setMsg] = useState('');\n const t = useRef<any>(null);\n const flash = useCallback((m: string) => { clearTimeout(t.current); setMsg(m); t.current = setTimeout(() => setMsg(''), 3000); }, []);\n useEffect(() => () => clearTimeout(t.current), []);\n return [msg, flash];\n}\n\nexport interface TxPlayer {\n ended?: boolean;\n playing: boolean;\n t: number;\n idx: number;\n dur: number;\n muted: boolean;\n wordSync: boolean;\n timed?: boolean;\n videoAt?: (t: number) => void;\n engaged: boolean;\n clipPos?: ReadPos | null;\n has: boolean;\n preparing?: boolean;\n starting?: number | null;\n autoplay?: () => Promise<boolean | null>;\n edgeWait?: boolean;\n silent?: boolean;\n joinAt?: (t: number) => void;\n error: ErrorLike | null;\n seekN: number;\n toggleMute: () => void;\n stop: () => void;\n toggle: () => void;\n pause: () => void;\n seekRow: (i: number) => void;\n seekFrac?: (f: number) => void;\n resumeAt?: (p: PlayPos) => void;\n seekWord?: (w: Word) => void;\n playRow: (i: number) => void;\n prev: () => void;\n next: () => void;\n hold: () => void;\n release: () => void;\n clearError: () => void;\n setVolume: (v: number) => void;\n silence?: (on: boolean) => void;\n}\n\nconst DUCK = 0.2;\nconst DUCK_MS = 140;\nconst UNDUCK_MS = 320;\n\nexport function useDuck(players: TxPlayer[], ducked: boolean) {\n const live = useRef(players);\n live.current = players;\n const raf = useRef(0);\n const at = useRef(1);\n const fade = useCallback((to: number, ms: number) => {\n cancelAnimationFrame(raf.current);\n const from = at.current;\n const t0 = performance.now();\n const step = () => {\n const k = ms > 0 ? Math.min(1, (performance.now() - t0) / ms) : 1;\n at.current = from + (to - from) * k;\n for (const p of live.current) p.setVolume(at.current);\n if (k < 1) raf.current = requestAnimationFrame(step);\n };\n step();\n }, []);\n useEffect(() => { fade(ducked ? DUCK : 1, ducked ? DUCK_MS : UNDUCK_MS); }, [ducked, fade]);\n useEffect(() => () => { cancelAnimationFrame(raf.current); at.current = 1; for (const p of live.current) p.setVolume(1); }, []);\n}\nexport function useYtLead(rows: Row[], lenS: number | null, offsetS: number, edgeS: number | null): { player: TxPlayer; lead: YtLead; setVideoSound: (on: boolean) => void } {\n const cmdRef = useRef<((func: string, args?: unknown[]) => void) | null>(null);\n const readyRef = useRef(false);\n const pending = useRef(false);\n const [state, setState] = useState<number | null>(null);\n const [muted, setMuted] = useState(true);\n const mutedRef = useRef(true);\n const soundOff = useRef(false);\n const [t, setT] = useState(0);\n const tRef = useRef(0); tRef.current = t;\n const base = useRef<{ t: number; at: number }>({ t: 0, at: 0 });\n const offset = useRef(offsetS); offset.current = offsetS;\n const edgeRef = useRef(edgeS); edgeRef.current = edgeS;\n const [edgeWait, setEdgeWait] = useState(false);\n const edgeWaitRef = useRef(false);\n const setWait = (w: boolean) => { edgeWaitRef.current = w; setEdgeWait(w); };\n const send = (func: string, args?: unknown[]) => cmdRef.current?.(func, args);\n const playing = state === 1 || state === 3;\n const stateRef = useRef<number | null>(null);\n const ytMuted = useRef<boolean | null>(null);\n const lead = useMemo<YtLead>(() => ({\n muted: true,\n bind: (c) => { cmdRef.current = c; if (!c) readyRef.current = false; },\n onInfo: (i) => {\n if (i.ready && !readyRef.current) { readyRef.current = true; if (pending.current) { pending.current = false; send(lead.muted ? 'mute' : 'unMute'); send('playVideo'); } }\n if (typeof i.state === 'number') { stateRef.current = i.state; setState(i.state); }\n if (typeof i.muted === 'boolean') ytMuted.current = i.muted;\n if (typeof i.t === 'number') {\n const at = i.t - offset.current;\n base.current = { t: at, at: performance.now() };\n if (!(at < tRef.current && tRef.current - at < 0.35)) setT(Math.max(0, at));\n }\n },\n }), []); // eslint-disable-line react-hooks/exhaustive-deps\n lead.muted = mutedRef.current || soundOff.current;\n useEffect(() => {\n if (state !== 1) return;\n let raf = 0;\n const tick = () => {\n const b = base.current;\n const at = b.t + Math.min(1.2, (performance.now() - b.at) / 1000);\n if (edgeRef.current != null && at >= edgeRef.current) { setWait(true); send('pauseVideo'); setT(at); return; }\n if (at > tRef.current) setT(at);\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [state]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!edgeWait || edgeS == null || edgeS < t + 1.5) return;\n setWait(false);\n send('playVideo');\n }, [edgeWait, edgeS, t]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => { if (edgeS == null && edgeWaitRef.current) { setWait(false); send('playVideo'); } }, [edgeS]); // eslint-disable-line react-hooks/exhaustive-deps\n const lastEnd = rows.length ? rows[rows.length - 1].words[rows[rows.length - 1].words.length - 1]?.end ?? rows[rows.length - 1].start + 4 : 0;\n const dur = lenS || lastEnd || 1;\n const idx = useMemo(() => {\n if (!rows.length) return 0;\n let i = 0;\n for (let k = 0; k < rows.length; k++) if (rows[k].start <= t + 0.05) i = k;\n return i;\n }, [rows, t]);\n const [seekN, setSeekN] = useState(0);\n const seek = (s0: number) => {\n const s = Math.max(0, edgeRef.current != null ? Math.min(s0, Math.max(0, edgeRef.current - 0.5)) : s0);\n send('seekTo', [s + offset.current, true]);\n base.current = { t: s, at: performance.now() };\n setT(s); setSeekN((n) => n + 1);\n };\n const wantPlay = useRef(false);\n const playRetry = useRef<number | undefined>(undefined);\n const nudgePlay = (n: number) => {\n window.clearTimeout(playRetry.current);\n playRetry.current = window.setTimeout(() => {\n if (!wantPlay.current || n <= 0 || stateRef.current === 1 || stateRef.current === 3) return;\n send('playVideo');\n nudgePlay(n - 1);\n }, 1200);\n };\n useEffect(() => () => window.clearTimeout(playRetry.current), []);\n const play = () => { wantPlay.current = true; if (!chosen.current && mutedRef.current) soundUp(); if (!readyRef.current) { pending.current = true; return; } send('playVideo'); nudgePlay(3); };\n const pause = () => { wantPlay.current = false; window.clearTimeout(playRetry.current); pending.current = false; setWait(false); send('pauseVideo'); };\n const toggle = () => {\n if (!readyRef.current) { if (!chosen.current && mutedRef.current) soundUp(); wantPlay.current = true; pending.current = true; return; }\n if (playing) { pause(); return; }\n if (edgeWaitRef.current) { setWait(false); return; }\n if (t >= dur - 0.25) seek(0);\n play();\n };\n const seekRow = (i: number) => { const r = rows[Math.max(0, Math.min(rows.length - 1, i))]; if (r) seek(r.start); };\n const held = useRef(false);\n const applyMute = () => { const v = mutedRef.current || soundOff.current; lead.muted = v; send(v ? 'mute' : 'unMute'); };\n const setMute = (m: boolean) => { mutedRef.current = m; setMuted(m); applyMute(); };\n const chosen = useRef(false);\n const soundUp = () => { setMute(false); if (soundOff.current) return; setTimeout(() => { if (stateRef.current === 2 && wantPlay.current && !mutedRef.current) { setMute(true); send('playVideo'); } }, 900); };\n const setVideoSound = (on: boolean) => { if (soundOff.current === !on) return; soundOff.current = !on; applyMute(); };\n const autoplay = async () => {\n const wait = (ms: number) => new Promise((r) => setTimeout(r, ms));\n const until = async (ok: () => boolean, ms: number) => { for (let i = 0; i < ms / 250 && !ok(); i++) await wait(250); return ok(); };\n if (!await until(() => readyRef.current, 10000)) return null;\n setMute(true);\n for (let i = 0; i < 5 && stateRef.current !== 1; i++) { send('playVideo'); await until(() => stateRef.current === 1, 1500); }\n if (stateRef.current !== 1) return null;\n if (soundOff.current) { setMute(true); return false; }\n setMute(false);\n await wait(1200);\n if (stateRef.current === 1 && ytMuted.current === false) return true;\n setMute(true); send('playVideo');\n return false;\n };\n const player: TxPlayer = {\n autoplay,\n playing, ended: state === 0, t, idx, dur, muted, seekN, toggle, seekRow,\n toggleMute: () => { chosen.current = true; const m = !mutedRef.current; setMute(m); if (!m && !soundOff.current && stateRef.current === 1) setTimeout(() => { if (stateRef.current === 2 && !mutedRef.current) { setMute(true); send('playVideo'); } }, 900); },\n seekFrac: (f: number) => seek(Math.max(0, Math.min(1, f)) * dur),\n seekWord: (w: Word) => seek(w.start),\n playRow: (i: number) => { seekRow(i); if (!playing) play(); },\n stop: () => { pause(); seek(0); },\n engaged: playing || t > 0,\n prev: () => seekRow(idx - 1), next: () => seekRow(idx + 1),\n hold: () => { if (playing) { send('pauseVideo'); held.current = true; } },\n release: () => { if (held.current) { held.current = false; play(); } },\n error: null, clearError: () => {}, has: true, edgeWait, wordSync: true,\n pause,\n setVolume: (v: number) => send('setVolume', [Math.round(v * 100)]),\n };\n return { player, lead, setVideoSound };\n}\n\nexport function useTxPlayer(url: string | null, available: boolean, rows: Row[], lenS: number | null, offsetS = 0, edgeS: number | null = null): TxPlayer {\n const audio = useRef<HTMLMediaElement | null>(null);\n const [playing, setPlaying] = useState(false);\n const [t, setT] = useState(0);\n const [muted, setMuted] = useState(false);\n const mutedRef = useRef(muted); mutedRef.current = muted;\n const silenced = useRef(false);\n const [error, setError] = useState<ErrorLike | null>(null);\n const [ready, setReady] = useState(false);\n const offset = useRef(offsetS); offset.current = offsetS;\n const carry = useRef<{ t: number; playing: boolean; asked?: boolean } | null>(null);\n const [attempt, setAttempt] = useState(0);\n useEffect(() => {\n setReady(false);\n const from = carry.current;\n carry.current = null;\n if (!from) setT(0);\n if (!url) { setPlaying(false); audio.current = null; return; }\n const a = newMediaElement(url);\n const off = offset.current;\n a.preload = 'metadata';\n a.muted = mutedRef.current || silenced.current;\n a.onplay = () => setPlaying(true);\n a.onpause = () => setPlaying(false);\n a.onended = () => setPlaying(false);\n a.onloadedmetadata = () => {\n setReady(true);\n a.currentTime = (from?.t ?? 0) + off;\n if (from?.playing) void a.play().catch((e) => { if (!(from.asked && e?.name === 'NotAllowedError')) setError(describe(e)); });\n };\n a.onerror = () => {\n setPlaying(false);\n const err = a.error;\n const fallback = mediaErrorText(err, false);\n void explainAudioError(url).then((why) => {\n if (!isNotCaptured(why?.message)) reportMediaError(err);\n if (audio.current !== a) return;\n setError({ message: why?.message ?? fallback });\n if (!why?.permanent) audio.current = null;\n });\n };\n audio.current = a;\n return () => {\n carry.current = { t: Math.max(0, a.currentTime - off), playing: !a.paused && !a.ended };\n a.pause(); a.onplay = a.onpause = a.onended = a.onloadedmetadata = a.onerror = null; audio.current = null;\n };\n }, [url, attempt]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => () => { carry.current = null; }, []);\n const lastEnd = rows.length ? rows[rows.length - 1].words[rows[rows.length - 1].words.length - 1]?.end ?? rows[rows.length - 1].start + 4 : 0;\n const windowed = offsetS > 0 || (lenS != null && ready && audio.current != null && Number.isFinite(audio.current.duration) && audio.current.duration > lenS + 1);\n const dur = (!windowed && ready && audio.current && Number.isFinite(audio.current.duration) && audio.current.duration) || lenS || lastEnd || 1;\n const durRef = useRef(dur); durRef.current = dur;\n const windowedRef = useRef(windowed); windowedRef.current = windowed;\n const edgeRef = useRef(edgeS); edgeRef.current = edgeS;\n const [edgeWait, setEdgeWait] = useState(false);\n const edgeWaitRef = useRef(false);\n const setWait = (w: boolean) => { edgeWaitRef.current = w; setEdgeWait(w); };\n useEffect(() => { if (edgeS == null && edgeWaitRef.current) { setWait(false); void audio.current?.play().catch(() => {}); } }, [edgeS]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!edgeWait || edgeS == null || edgeS < t + 1.5) return;\n setWait(false);\n void audio.current?.play().catch(() => {});\n }, [edgeWait, edgeS, t]);\n useEffect(() => {\n if (!playing) return;\n let raf = 0;\n const tick = () => {\n const a = audio.current;\n if (a) {\n const at = a.currentTime - offset.current;\n if (windowedRef.current && at >= durRef.current) { a.pause(); setT(durRef.current); return; }\n if (edgeRef.current != null && at >= edgeRef.current) { setWait(true); a.pause(); setT(at); return; }\n setT(at);\n }\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [playing]);\n const idx = useMemo(() => {\n if (!rows.length) return 0;\n let i = 0;\n for (let k = 0; k < rows.length; k++) if (rows[k].start <= t + 0.05) i = k;\n return i;\n }, [rows, t]);\n const [seekN, setSeekN] = useState(0);\n const seek = (s0: number) => { const s = edgeRef.current != null ? Math.min(s0, Math.max(0, edgeRef.current - 0.5)) : s0; const a = audio.current; setT(s); if (a) a.currentTime = s + offset.current; setSeekN((n) => n + 1); };\n const playFailed = (e: unknown) => { if ((e as { name?: string } | null)?.name !== 'AbortError') setError(describe(e)); };\n const toggle = () => {\n const a = audio.current;\n if (!a) {\n if (!url && available) { carry.current = carry.current?.asked ? null : { t, playing: true, asked: true }; return; }\n if (url) setAttempt((n) => n + 1);\n setError({ message: available ? 'The audio player is not ready yet — try again in a moment.' : 'There is no audio for this transcription.' });\n return;\n }\n if (playing) { a.pause(); return; }\n if (edgeWaitRef.current) { setWait(false); return; }\n if (a.currentTime < offset.current) a.currentTime = offset.current;\n if (t >= dur - 0.25) seek(0);\n void a.play().catch(playFailed);\n };\n const seekRow = (i: number) => { const r = rows[Math.max(0, Math.min(rows.length - 1, i))]; if (r) seek(r.start); };\n const seekFrac = (f: number) => seek(Math.max(0, Math.min(1, f)) * dur);\n const resumeAt = (p: PlayPos) => {\n const at = placePosition(p, rows, dur);\n seek(at.t);\n const a = audio.current;\n if (!a) return;\n if (!at.playing) { a.pause(); return; }\n setWait(false);\n void a.play().catch(playFailed);\n };\n const seekWord = (w: Word) => seek(w.start);\n const playRow = (i: number) => {\n seekRow(i);\n const a = audio.current;\n if (a && a.paused) void a.play().catch(playFailed);\n };\n const held = useRef(false);\n const lastNudge = useRef(0);\n const hold = () => { if (playing) { audio.current?.pause(); held.current = true; } };\n const release = () => { if (held.current) { held.current = false; void audio.current?.play().catch(playFailed); } };\n const toggleMute = () => { const m = !mutedRef.current; mutedRef.current = m; if (audio.current) audio.current.muted = m || silenced.current; setMuted(m); };\n const autoplay = async (): Promise<boolean | null> => {\n const a = audio.current;\n if (!a) return null;\n if (a.currentTime < offset.current) a.currentTime = offset.current;\n const mute = (m: boolean) => { mutedRef.current = m; a.muted = m || silenced.current; setMuted(m); };\n try { mute(false); await a.play(); return true; } catch (e) {\n if ((e as { name?: string } | null)?.name !== 'NotAllowedError') { mute(true); return null; }\n }\n try { mute(true); await a.play(); return false; } catch { return null; }\n };\n return {\n autoplay,\n playing, t, idx, dur, muted, toggleMute, toggle, seekRow, seekFrac, resumeAt, seekWord, playRow, seekN,\n stop: () => { const a = audio.current; if (a) { a.pause(); a.currentTime = offset.current; } setT(0); },\n videoAt: (vt: number) => {\n const a = audio.current;\n if (!a || a.paused || a.ended || held.current || Date.now() - lastNudge.current < 3000) return;\n const want = vt + offset.current;\n if (Math.abs(a.currentTime - want) <= 0.2) return;\n lastNudge.current = Date.now();\n a.currentTime = want;\n },\n engaged: playing || t > 0,\n prev: () => seekRow(idx - 1), next: () => seekRow(idx + 1), hold, release,\n error, clearError: () => setError(null), has: available, edgeWait,\n wordSync: true,\n pause: () => { setWait(false); if (carry.current?.asked) carry.current = null; audio.current?.pause(); },\n setVolume: (v: number) => { if (audio.current) audio.current.volume = v; },\n silence: (on: boolean) => { silenced.current = on; if (audio.current) audio.current.muted = mutedRef.current || on; },\n };\n}\n\nfunction useTxVoicePlayer(clips: VoiceClip[], rows: Row[], lenS: number | null, key: string, muted?: Set<number>, wordTimes?: Record<string, [number, number][]>, timed = false, coming?: ReadonlySet<number>): TxPlayer {\n const comingRef = useRef<ReadonlySet<number>>(new Set());\n comingRef.current = coming ?? comingRef.current;\n const q = useRef<ClipQueue | null>(null);\n const [playing, setPlaying] = useState(false);\n const [pos, setPos] = useState(0);\n const [seekN, setSeekN] = useState(0);\n const [quiet, setQuiet] = useState(false);\n const quietRef = useRef(quiet); quietRef.current = quiet;\n const [error, setError] = useState<ErrorLike | null>(null);\n const [waiting, setWaiting] = useState<number | null>(null);\n const [starting, setStarting] = useState<number | null>(null);\n const [aim, setAim] = useState<{ t: number; sid: number | null } | null>(null);\n const aimRef = useRef(aim); aimRef.current = aim;\n const [clipPos, setClipPos] = useState<ReadPos | null>(null);\n const [restS, setRestS] = useState<number | null>(null);\n const [restBase, setRestBase] = useState<number | null>(null);\n const [silent, setSilent] = useState(false);\n const rowsRef = useRef(rows);\n rowsRef.current = rows;\n const timedRef = useRef(timed);\n const lineIdsRef = useRef<number[]>([]);\n timedRef.current = timed;\n if (q.current) q.current.flow = timed;\n const videoRef = useRef<{ t: number; at: number } | null>(null);\n const mutedRef = useRef(muted);\n mutedRef.current = muted;\n const timesRef = useRef(wordTimes);\n timesRef.current = wordTimes;\n const wire = useCallback((queue: ClipQueue) => {\n queue.finite = true;\n queue.coming = (id) => comingRef.current.has(id);\n queue.readAhead = 6;\n queue.readAheadS = 45;\n queue.onWaiting = (id) => setWaiting(id);\n queue.onStarting = (since) => setStarting(since);\n queue.onSentence = (id) => {\n setPlaying(queue.playing);\n if (id == null) return;\n const i = rowsRef.current.findIndex((r) => r.sentenceId === id);\n if (i >= 0) setPos(i);\n };\n queue.onError = (e) => { setPlaying(queue.playing); setError(e instanceof VoiceNotStarted ? { message: 'The voice could not be started. Press Play to try again.', code: 'voice_not_started' } : { message: 'A line of this reading could not be played.' }); };\n queue.gapBefore = (prev, next) => {\n if (!timedRef.current) return 0;\n const rs = rowsRef.current;\n const a = rs.find((r) => r.sentenceId === prev);\n const b = rs.find((r) => r.sentenceId === next);\n if (!b) return 0;\n const aimed = aimRef.current;\n if (prev == null) return aimed && aimed.sid === next ? Math.max(0, b.start - aimed.t) : 0;\n const v = videoRef.current;\n if (v && Date.now() - v.at < 2000) return Math.max(0, b.start - (v.t + (Date.now() - v.at) / 1000 * queue.rate));\n if (!a || b.start <= a.start) return 0;\n return Math.max(0, b.start - lineEnd(a, a.start, a.start + 4));\n };\n queue.flow = timedRef.current;\n queue.silentSpan = (id) => {\n const rs = rowsRef.current;\n const i = rs.findIndex((r) => r.sentenceId === id);\n const r = rs[i];\n if (!r) return null;\n const end = rs[i + 1]?.start ?? lineEnd(r, r.start, r.start + 4);\n const span = Math.max(0, end - r.start);\n const v = videoRef.current;\n const now = v && Date.now() - v.at < 2000 ? v.t + (Date.now() - v.at) / 1000 * (queue.rate || 1) : r.start;\n const fromS = Math.max(0, Math.min(span, now - r.start));\n return { fromS, ms: ((span - fromS) * 1000) / (queue.rate || 1) };\n };\n queue.speakable = (id) => {\n const m = mutedRef.current;\n if (!m || !m.size) return true;\n const r = rowsRef.current.find((x) => x.sentenceId === id);\n return !r || !m.has(r.speaker);\n };\n }, []);\n const keyRef = useRef<string | null>(null);\n const snapRef = useRef<PlayPos | null>(null);\n const pendingRef = useRef<PlayPos | null>(null);\n const [resuming, setResuming] = useState(false);\n const applyRef = useRef<(p: PlayPos) => void>(() => {});\n const park = (p: PlayPos | null) => {\n pendingRef.current = p;\n setResuming(!!p?.playing);\n if (!p) return;\n const i = placePosition(p, rowsRef.current, dur).index;\n setPos(i);\n posRef.current = i;\n };\n const drop = () => { if (pendingRef.current) park(null); };\n useEffect(() => {\n if (keyRef.current !== key) {\n const was = keyRef.current != null ? snapRef.current : null;\n keyRef.current = key;\n q.current?.stop();\n q.current = new ClipQueue();\n wire(q.current);\n q.current.setSequence(lineIdsRef.current);\n setPlaying(false);\n setPos(0);\n setError(null);\n setStarting(null);\n setAim(null);\n park(was && (was.playing || was.t > 0) ? was : null);\n }\n const queue = q.current!;\n queue.setMuted(quietRef.current);\n for (const c of clips) queue.add(c);\n const p = pendingRef.current;\n if (p && (timedRef.current || clips.some((c) => c.sentenceId >= (p.sentenceId ?? 0)))) { park(null); applyRef.current(p); }\n }, [key, clips]); // eslint-disable-line react-hooks/exhaustive-deps\n const lineIds = useMemo(() => (timed ? rows.map((r) => r.sentenceId).filter((id): id is number => id != null) : []), [rows, timed]);\n lineIdsRef.current = lineIds;\n useEffect(() => { q.current?.setSequence(lineIds); }, [lineIds, key]);\n useEffect(() => () => { q.current?.stop(); q.current = null; keyRef.current = null; }, []);\n const hasPos = clipPos != null || restS != null;\n useEffect(() => {\n if (!playing && !hasPos) { setClipPos(null); setRestS(null); return; }\n const tick = () => {\n const rest = q.current?.resting() ?? null;\n setSilent(!!rest?.silent);\n if (rest?.silent && aimRef.current) { aimRef.current = null; setAim(null); }\n setRestS((prev) => (rest == null ? null : prev != null && Math.abs(prev - rest.s) < 0.05 ? prev : rest.s));\n const a = aimRef.current;\n if (rest == null) setRestBase(null);\n else if (a && a.sid === rest.sentenceId) { setRestBase(a.t); aimRef.current = null; setAim(null); }\n const at = q.current?.position() ?? null;\n const w = at && timesRef.current ? timesRef.current[String(at.sentenceId)] ?? null : null;\n if (a && at && at.sentenceId === a.sid && at.t > 0.1) setAim(null);\n setClipPos((prev) => {\n if (!at) return prev == null ? prev : null;\n if (prev && Math.abs(prev.t - at.t) < 0.05 && prev.dur === at.dur && prev.words === w) return prev;\n return { t: at.t, dur: at.dur, words: w };\n });\n };\n tick();\n const h = setInterval(tick, 100);\n return () => clearInterval(h);\n }, [playing, hasPos]);\n const voiced = useMemo(() => new Set(clips.map((c) => c.sentenceId)), [clips]);\n const heard = (i: number) => { const sid = rows[i]?.sentenceId; return sid != null && voiced.has(sid); };\n const step = (from: number, dir: 1 | -1): number | null => {\n for (let i = from; i >= 0 && i < rows.length; i += dir) if (heard(i)) return i;\n return null;\n };\n const idx = Math.max(0, Math.min(pos, Math.max(0, rows.length - 1)));\n const lastEnd = rows.length ? rows[rows.length - 1].start + 4 : 0;\n const dur = lenS || lastEnd || 1;\n const held = useRef(false);\n const posRef = useRef(pos); posRef.current = pos;\n const start = (i: number) => { q.current?.play(rows[i]?.sentenceId ?? null); setPlaying(!!q.current?.playing); };\n const goRow = (i: number) => {\n const at = Math.max(0, Math.min(Math.max(0, rows.length - 1), i));\n setPos(at);\n posRef.current = at;\n setSeekN((n) => n + 1);\n q.current?.seek(rows[at]?.sentenceId ?? null);\n setPlaying(!!q.current?.playing);\n };\n const seekRow = (i: number) => { drop(); setAim(null); q.current?.startWithin(-1, 0); goRow(i); };\n const spanOf = (i: number) => {\n const r = rows[i];\n const from = r?.start ?? 0;\n const next = rows[i + 1]?.start ?? lineEnd(r, from, dur);\n return { from, span: Math.max(0, next - from) };\n };\n const cur = spanOf(idx);\n const speech = Math.max(0, Math.min(cur.span, lineEnd(rows[idx], cur.from, cur.from + 4) - cur.from));\n const tNow = aim ? aim.t\n : !timed ? (clipPos && clipPos.dur > 0 ? cur.from + Math.min(cur.span, (clipPos.t / clipPos.dur) * cur.span) : cur.from)\n : restS != null && silent ? cur.from + Math.min(cur.span, restS)\n : restS != null ? (restBase != null ? Math.min(cur.from, restBase + restS) : cur.from + Math.min(cur.span, speech + restS))\n : clipPos && clipPos.dur > 0 ? cur.from + Math.min(speech, (clipPos.t / clipPos.dur) * speech)\n : cur.from;\n useEffect(() => { snapRef.current = pendingRef.current ?? snapPosition(rows, tNow, playing, dur); });\n const api: TxPlayer = {\n playing: playing || resuming,\n t: tNow,\n idx, dur, muted: quiet, wordSync: false, timed, clipPos: aim ? null : clipPos,\n videoAt: (t: number) => { videoRef.current = { t, at: Date.now() }; },\n engaged: playing || clipPos != null,\n has: clips.length > 0,\n preparing: waiting != null || resuming,\n silent: playing && silent,\n starting,\n error, seekN,\n toggleMute: () => { const m = !quietRef.current; quietRef.current = m; q.current?.setMuted(m); setQuiet(m); },\n toggle: () => {\n if (resuming) { drop(); return; }\n drop();\n if (playing) { q.current?.pause(); setPlaying(false); return; }\n setError(null);\n const at = posRef.current;\n if (!aimRef.current && q.current?.resume(rows[at]?.sentenceId ?? null)) { setPlaying(true); return; }\n start(at);\n },\n pause: () => { drop(); q.current?.pause(); setPlaying(false); },\n stop: () => { drop(); q.current?.pause(); setPlaying(false); setPos(0); setClipPos(null); q.current?.seek(rows[0]?.sentenceId ?? null); },\n seekRow,\n resumeAt: (p: PlayPos) => { park(p); if (clips.some((c) => c.sentenceId >= (p.sentenceId ?? 0))) { park(null); applyRef.current(p); } },\n seekFrac: (f: number) => {\n drop();\n const t = Math.max(0, Math.min(1, f)) * dur;\n let i = 0;\n for (let k = 0; k < rows.length; k++) if (rows[k].start <= t) i = k;\n const r = rows[i];\n const before = timed && r && t < r.start - 0.05;\n if (timed && r && (before || (rows[i + 1] && t >= lineEnd(r, r.start, r.start + 4)))) {\n const k = before ? i : i + 1;\n const n = rows[k];\n q.current?.startWithin(-1, 0);\n const a = { t, sid: n.sentenceId ?? null };\n aimRef.current = a;\n setAim(a);\n goRow(k);\n return;\n }\n const sid = r?.sentenceId ?? null;\n const { from, span } = spanOf(i);\n let share = span > 0 ? Math.max(0, Math.min(1, (t - from) / span)) : 0;\n const wt = sid != null ? timesRef.current?.[String(sid)] : undefined;\n const clipEnd = wt?.length ? wt[wt.length - 1][1] : 0;\n if (r && wt && wt.length === r.words.length && clipEnd > 0) {\n let j = 0;\n for (let k = 0; k < r.words.length; k++) if (r.words[k].start <= t) j = k;\n const w = r.words[j];\n const into = w.end > w.start ? Math.max(0, Math.min(1, (t - w.start) / (w.end - w.start))) : 0;\n share = Math.min(1, (wt[j][0] + into * (wt[j][1] - wt[j][0])) / clipEnd);\n }\n if (sid != null) q.current?.startWithin(sid, share);\n setAim(share > 0.01 ? { t, sid } : null);\n goRow(i);\n },\n seekWord: wordTimes ? (w: Word) => {\n const r = rows[idx];\n if (!r || r.sentenceId == null) return;\n const j = r.words.findIndex((x) => x.seq === w.seq && x.idx === w.idx);\n const t = j >= 0 ? timesRef.current?.[String(r.sentenceId)]?.[j]?.[0] : undefined;\n if (t != null) q.current?.seekWithin(t);\n } : undefined,\n playRow: (i: number) => {\n drop();\n const at = Math.max(0, Math.min(Math.max(0, rows.length - 1), i));\n setAim(null);\n q.current?.startWithin(-1, 0);\n setPos(at);\n posRef.current = at;\n setSeekN((n) => n + 1);\n start(at);\n },\n prev: () => { const i = step(idx - 1, -1); if (i != null) seekRow(i); },\n next: () => { const i = step(idx + 1, 1); if (i != null) seekRow(i); },\n hold: () => { if (playing) { q.current?.pause(); held.current = true; } },\n release: () => { if (held.current) { held.current = false; start(posRef.current); } },\n clearError: () => setError(null),\n setVolume: (v: number) => q.current?.setVolume(v),\n };\n function joinRow(i: number) {\n const sid = rows[i]?.sentenceId;\n if (sid == null) return;\n setPos(i);\n posRef.current = i;\n setAim(null);\n aimRef.current = null;\n q.current?.joinSilently(sid);\n const rest = q.current?.resting() ?? null;\n setRestS(rest?.s ?? null);\n setSilent(!!rest?.silent);\n setPlaying(!!q.current?.playing);\n }\n api.joinAt = timed ? (t: number) => { drop(); joinRow(placePosition({ t, playing: true, sentenceId: null, offset: 0, ended: false }, rows, dur).index); } : undefined;\n applyRef.current = (p: PlayPos) => {\n const at = placePosition(p, rows, dur);\n if (timedRef.current) {\n setPos(at.index);\n posRef.current = at.index;\n if (at.playing) joinRow(at.index);\n return;\n }\n api.seekFrac?.(at.t / dur);\n if (at.playing) start(posRef.current);\n };\n return api;\n}\n\nexport const NO_SEEK = () => {};\nconst TX_PICKER_NOTE = 'The language this recording is read aloud in.';\n\nconst TX_SIDE = { title: 'TRANSCRIPT LANGUAGE', note: 'The transcript and its voice switch to this language.' };\nexport const PUB_SIDE = { title: 'READ IN', note: 'The transcript and its voice switch to this language.' };\n\n\nexport interface VoiceSheetCtx {\n people: CastMember[];\n gvList: AvailableVoice[];\n autoOf: (key: number) => AvailableVoice | null;\n savedFor: (sp: CastMember) => AvailableVoice | null;\n}\n\nexport interface NoCloneNote { busy?: boolean; title: string; sub: string; tip?: string; action?: () => void }\n\nexport interface VoiceSheetHooks {\n cloneOn?: boolean;\n pendingClones?: boolean;\n titleNode?: React.ReactNode;\n badge?: (ctx: VoiceSheetCtx) => number;\n onAddVoice?: (v: AvailableVoice) => void;\n onPickVoice?: (v: AvailableVoice) => boolean | void;\n onSelectSpeaker?: (key: number) => void;\n noCloneFor?: (sp: CastMember, auto: AvailableVoice | null, ctx: VoiceSheetCtx) => NoCloneNote | null;\n castNoClone?: (sp: CastMember, ctx: VoiceSheetCtx) => boolean;\n castShort?: (sp: CastMember, ctx: VoiceSheetCtx) => boolean;\n castBuilding?: (sp: CastMember, ctx: VoiceSheetCtx) => boolean;\n castWarn?: (sp: CastMember, ctx: VoiceSheetCtx) => string | null;\n}\n\nexport function useTxVoice({ recordingId, model, rows, lenS, ended, cred, langs, srcLang, canTranslate, pickedLang, setPickedLang, side, hearOriginal = false, timed = false, stockVoices = false, stickyPicker = false, pickerBusy = null, voiceSheet , forcedVoice = null }: {\n voiceSheet?: VoiceSheetHooks;\n forcedVoice?: string | null;\n hearOriginal?: boolean;\n stockVoices?: boolean;\n stickyPicker?: boolean;\n pickerBusy?: string | null;\n timed?: boolean;\n recordingId: string | null;\n model: Model;\n rows: Row[];\n lenS: number | null;\n ended: boolean;\n cred: MediaCred;\n langs: LanguageLists | null;\n srcLang: string | null;\n canTranslate: boolean;\n pickedLang: string | null | undefined;\n setPickedLang: (l: string | null | undefined) => void;\n side?: { title: string; note: string };\n}) {\n const { onAddVoice, onPickVoice, onSelectSpeaker, noCloneFor, castNoClone, castShort, castBuilding, castWarn, badge, titleNode: voiceTitleNode } = voiceSheet ?? {};\n const hooked = !!voiceSheet;\n const pendingClones = !!voiceSheet?.pendingClones;\n const [recent, pushRecent] = useRecentLangs();\n const [picked, setPicked] = useState<string | null>(null);\n const [picker, setPicker] = useState(false);\n const [sheet, setSheet] = useState(false);\n const [fromVoices, setFromVoices] = useState(false);\n const [want, setWant] = useState(false);\n const lang = pickedLang ?? srcLang;\n const original = pickedLang === null;\n const on = pickedLang != null || picked != null;\n const speakable = (c: string | null | undefined) => !!c && !!langs?.voice.includes(c);\n const vLang = speakable(original ? srcLang : lang) ? (original ? srcLang : lang) : 'en';\n const preview = useVoicePreview(vLang);\n const cloneOn = voiceSheet?.cloneOn ?? true;\n const [catVer, setCatVer] = useState(0);\n const cloneSeen = useRef(cloneOn);\n useEffect(() => { if (cloneSeen.current !== cloneOn) { cloneSeen.current = cloneOn; setCatVer((n) => n + 1); } }, [cloneOn]);\n const catalogue = useVoiceCatalogue(vLang, on || ended || sheet, namedCount(model) * 1000 + catVer, { id: recordingId ?? null, shareCode: cred.shareCode ?? null });\n const gvList = useMemo(() => (catalogue?.voices ?? []).filter((v) => hooked || !v.cloned || v.speaker != null), [catalogue, hooked]);\n const gVoicePick = gvList.length > 1;\n const meta = langMeta(langs, lang);\n const t = strings();\n const trLangs = useMemo(() => pickerLanguages(langs, 'translation'), [langs]);\n\n const [spkSel, setSpkSel] = useState<number | null>(null);\n const [spkMute] = useState<Set<number>>(() => new Set());\n const [castByLang, setCastByLang] = useState<Record<string, Record<number, string>>>({});\n const spkRoster = useMemo(() => speakerRoster(rows, model, t.vcUnknownSpk), [rows, model, t]);\n const spkCastOn = gVoicePick && spkRoster.filter((p) => p.key >= 0).length > 1;\n const spkSelected = spkSel != null && spkRoster.some((p) => p.key === spkSel) ? spkSel : spkRoster[0]?.key ?? null;\n const cast = useMemo(() => {\n const out = autoCast(spkRoster, gvList, cloneOn);\n for (const [k, v] of Object.entries(castByLang[vLang ?? ''] ?? {})) out.set(Number(k), v);\n return out;\n }, [spkRoster, gvList, castByLang, vLang, cloneOn]);\n const castChosen = spkCastOn && Object.keys(castByLang[vLang ?? ''] ?? {}).length > 0;\n const stockCast = useMemo(() => (stockVoices && !castChosen ? autoCast(spkRoster, gvList, false) : null), [stockVoices, castChosen, spkRoster, gvList]);\n const castKeyStr = useMemo(() => (castChosen ? castKey(cast) || null : stockCast ? castKey(stockCast) || null : null), [castChosen, cast, stockCast]);\n const sentCast = castChosen ? cast : stockCast;\n const hasClone = gvList.some((v) => v.cloned && v.consent !== 'pending');\n const canSpeak = !!lang && !!langs?.voice.includes(lang);\n const speakHere = canSpeak && !hearOriginal;\n const sentenceIds = useMemo(\n () => rows.filter((r) => !r.suppressed && !r.unclear).map((r) => r.sentenceId).filter((id): id is number => id != null),\n [rows],\n );\n const arch = useArchiveVoice({ recordingId, lang, ended, cred, pickedVoice: forcedVoice || (castKeyStr ?? picked), sentenceIds: ended && speakHere ? sentenceIds : undefined });\n const gvPicked = gvList.find((v) => v.id === picked) ?? gvList.find((v) => v.id === arch.track?.voice) ?? gvList.find((v) => v.default) ?? gvList[0] ?? null;\n const gvId = gvPicked?.id ?? null;\n\n useEffect(() => {\n if (!arch.rendering) return;\n const id = setInterval(arch.reload, 4000);\n return () => clearInterval(id);\n }, [arch.rendering, arch.reload]);\n\n const clipKey = `${recordingId ?? ''}|${lang ?? ''}|${forcedVoice || (castKeyStr ?? picked ?? arch.track?.voiceKey ?? 'default')}`;\n const vp = useTxVoicePlayer(arch.clips, rows, lenS, clipKey, spkMute, arch.track?.wordTimes, timed, arch.coming);\n useEffect(() => { const id = rows[vp.idx]?.sentenceId; if (id != null) arch.setNear(id); }, [vp.idx]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!want || !vp.has) return;\n setWant(false);\n if (!vp.playing) vp.toggle();\n }, [want, vp.has]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const rendering = arch.rendering;\n const failed = rendering ? null : arch.failed ?? null;\n const noVoice = false;\n const speaks = on && speakHere;\n const relang = on && !original && speakHere\n && !(arch.listed && arch.listed.lang === lang && arch.listed.recordingId === recordingId);\n const player: TxPlayer = {\n ...vp,\n has: vp.has || (speaks && ended),\n toggle: () => {\n if (!vp.has && !vp.playing) { setWant(true); return; }\n vp.toggle();\n },\n pause: () => { setWant(false); vp.pause(); },\n };\n\n const openPicker = () => setPicker(true);\n const closePicker = () => { setPicker(false); setSheet(fromVoices); setFromVoices(false); };\n const selectLang = (c: string | null) => {\n setPickedLang(c);\n pushRecent(c);\n if ((side || stickyPicker) && !fromVoices) return;\n if (c != null) { closePicker(); return; }\n preview.reset();\n setPicker(false);\n setSheet(false);\n setFromVoices(false);\n };\n const openVoices = () => { preview.reset(); setSheet(true); };\n const closeVoices = () => { preview.reset(); setSheet(false); };\n const pickerMine = picker && !fromVoices;\n const voicesMine = sheet || (picker && fromVoices);\n const toggleChip = () => {\n if (pickerMine) { setPicker(false); return; }\n preview.reset(); setSheet(false); setFromVoices(false); setPicker(true);\n };\n const toggleVoices = () => {\n preview.reset();\n if (voicesMine) { setSheet(false); setPicker(false); setFromVoices(false); return; }\n setPicker(false); setFromVoices(false); setSheet(true);\n };\n const pickVoice = (id: string) => {\n preview.reset();\n setSheet(spkCastOn);\n if (lang !== vLang || original) setPickedLang(vLang);\n arch.forget();\n setWant(true);\n if (spkCastOn && spkSelected != null && vLang) {\n const next = new Map(cast);\n next.set(spkSelected, id);\n setCastByLang((m) => ({ ...m, [vLang]: Object.fromEntries(next) }));\n setPicked(null);\n return;\n }\n setPicked(id);\n };\n\n const chipMeta = original ? { ...langMeta(langs, null), flag: <Icon d={D.langAuto} size={21} sw={1.7} style={{ color: 'currentColor', display: 'block' }} /> } : meta;\n const chip = canTranslate ? (side ? (\n <span className=\"barchip\" style={pickerMine ? { background: 'var(--brand-tint)', boxShadow: '0 0 0 1.5px var(--brand)' } : undefined}>\n <LanguageChip flag={chipMeta.flag} code={chipMeta.code} bordered={false} onClick={toggleChip} flagOnly label={chipMeta.label} />\n </span>\n ) : <LanguageChip flag={chipMeta.flag} code={chipMeta.code} bordered={false} onClick={openPicker} flagOnly label={chipMeta.label} />) : null;\n const glyph = D.voiceClone;\n const active = on && (!!arch.track || rendering);\n const glyphFg = failed ? 'var(--conf-low)' : active || (side && voicesMine) ? 'var(--brand)' : 'var(--ink-55)';\n const waitKind = voiceWait({ on, want, relang, playing: vp.playing, preparing: !!vp.preparing, starting: vp.starting });\n const [lineHeld] = useHeld(waitKind === 'line', 400);\n const voiceWaiting = waitKind === 'asked' || (waitKind === 'line' && lineHeld);\n const busy = rendering || voiceWaiting;\n const voiceTitle = waitKind === 'asked'\n ? VOICE_WAIT_TITLE\n : vp.preparing\n ? `Speaking this line in ${gvPicked?.name ?? 'this voice'}…`\n : rendering\n ? `Preparing this recording in ${gvPicked?.name ?? 'this voice'} — it will play as soon as it is ready`\n : failed\n ? `This voice could not be prepared: ${failed}`\n : !canSpeak\n ? `${t.vcNoVoice}${meta.label}`\n : gVoicePick\n ? 'Choose a voice'\n : gvPicked\n ? gvPicked.name\n : t.vcNoVoice + meta.label;\n const pickerEl = (\n <LanguagePicker open={picker} onClose={closePicker} keepOpen={(!!side || stickyPicker) && !fromVoices} value={original ? null : lang} onSelect={selectLang} languages={trLangs} title={side?.title ?? 'SPOKEN LANGUAGE'} note={side?.note ?? TX_PICKER_NOTE} searchPlaceholder={t.search} none=\"Original\" pinned={(original ? srcLang : lang) ? [(original ? srcLang : lang)!] : []} recent={recent} requireVoice={fromVoices} sticky={stickyPicker} busy={pickerBusy} />\n );\n const savedClones = useMemo(() => gvList.filter((v) => v.cloned && !v.auto), [gvList]);\n const savedFor = (sp: CastMember) => (sp.voiceId ? savedClones.find((v) => v.id === `clone:${sp.voiceId}`) ?? null : null);\n const people = useMemo(() => spkRoster.filter((p2) => p2.key >= 0), [spkRoster]);\n const sheetList = useMemo(() => {\n const stock = gvList.filter((v) => !v.cloned);\n if (!spkCastOn) return [...stock, ...(ended && people.length === 1 ? savedClones.filter((v) => v.id === `clone:${people[0].voiceId}`) : [])];\n const own: AvailableVoice[] = [];\n for (const sp of people) {\n if (savedFor(sp)) continue;\n const auto = gvList.find((v) => v.cloned && v.auto && v.speaker === sp.key);\n if (!auto || auto.ready === false || (auto.consent === 'pending' && !pendingClones)) continue;\n own.push({ id: auto.id, name: sp.name, cloned: true, default: false, live: true, auto: true, gender: sp.sex ?? auto.gender ?? null, speaker: sp.key, consent: auto.consent ?? null });\n }\n return [...stock, ...savedClones, ...own];\n }, [gvList, savedClones, spkCastOn, people, pendingClones, ended]); // eslint-disable-line react-hooks/exhaustive-deps\n const selSp = spkCastOn ? people.find((p2) => p2.key === spkSelected) ?? null : null;\n const soleSp = !spkCastOn && gVoicePick && people.length === 1 && !gvList.some((v) => v.cloned && v.auto && v.speaker === people[0].key) ? people[0] : null;\n const noteSp = selSp ?? soleSp;\n const genderOf = (id: string | undefined) => (id ? gvList.find((v) => v.id === id)?.gender ?? null : null);\n const selSex = selSp ? selSp.sex ?? genderOf(cast.get(selSp.key)) : null;\n const shownList = useMemo(() => {\n if (!selSp) return sheetList;\n return sheetList.filter((v) => (v.cloned ? (v.live ? v.speaker === selSp.key : v.id === `clone:${selSp.voiceId}`) : true));\n }, [sheetList, selSp, selSex, people]); // eslint-disable-line react-hooks/exhaustive-deps\n const autoOf = (key: number) => gvList.find((v) => v.cloned && v.auto && v.speaker === key) ?? null;\n const ctx: VoiceSheetCtx = { people, gvList, autoOf, savedFor };\n const toClone = badge?.(ctx) ?? 0;\n const warns = castWarn ? people.map((p2) => castWarn(p2, ctx)).filter((w): w is string => !!w) : [];\n const voiceBtn = (\n <button type=\"button\" className=\"txvoice\" aria-label=\"Voice\" aria-pressed={side ? voicesMine : undefined} aria-busy={busy || undefined} title={busy || failed ? voiceTitle : undefined} style={{ cursor: 'pointer', background: active || busy || (side && voicesMine) ? 'var(--brand-tint)' : 'var(--fill-06)', boxShadow: side && voicesMine ? 'inset 0 0 0 1.5px var(--brand)' : undefined }} onClick={side ? toggleVoices : openVoices}>\n <Icon d={glyph} size={17} sw={1.6} style={{ color: glyphFg }} />\n {busy && <span aria-hidden=\"true\" style={{ position: 'absolute', inset: 0, boxSizing: 'border-box', borderRadius: '50%', border: '2px solid var(--fill-12)', borderTopColor: 'var(--brand)', animation: 'vs-spin .7s linear infinite', pointerEvents: 'none' }} />}\n {warns.length > 0\n ? <span className=\"txvoice__warn\" title={warns.join(' · ')}>!</span>\n : !!toClone && <span className=\"txvoice__n\" title={`${toClone} speaker${toClone === 1 ? '' : 's'} can get a cloned voice`}>{toClone}</span>}\n </button>\n );\n const voiceSheetEl = (\n <Sheet open={sheet} onClose={closeVoices} title={t.vcSheet} titleNode={voiceTitleNode} doneLabel={t.done}>\n <VoiceSheetBody\n t={t}\n cast={spkCastOn && (\n <SpeakerCast\n t={t}\n roster={spkRoster}\n selected={spkSelected}\n onSelect={(k) => { preview.reset(); setSpkSel(k); onSelectSpeaker?.(k); }}\n noClone={(p2) => !!castNoClone?.(p2, ctx)}\n short={(p2) => !!castShort?.(p2, ctx)}\n warn={(p2) => castWarn?.(p2, ctx) ?? null}\n building={(p2) => !savedFor(p2) && (gvList.some((v) => v.cloned && v.speaker === p2.key && v.ready === false) || !!castBuilding?.(p2, ctx))}\n sexOf={(p2) => p2.sex ?? genderOf(cast.get(p2.key))}\n />\n )}\n voices={shownList}\n onAdd={(v) => { preview.reset(); onAddVoice?.(v); }}\n noClone={noteSp && !shownList.some((v) => v.cloned) ? noCloneFor?.(noteSp, autoOf(noteSp.key), ctx) ?? null : null}\n usedBy={spkCastOn && spkSelected != null\n ? (v) => {\n const also = spkRoster.filter((p) => p.key !== spkSelected && cast.get(p.key) === v.id);\n return also.length ? also.map((p) => p.name).join(', ') : null;\n }\n : undefined}\n foldKey={spkSelected}\n foldFor={selSex}\n currentId={spkCastOn && spkSelected != null ? cast.get(spkSelected) ?? null : gvId}\n armedId={preview.armId}\n sampleId={preview.sampleId}\n dlId={preview.dlId}\n onPick={(v) => { if (preview.sampleId === v.id || preview.dlId === v.id) { preview.stop(); return; } if (onPickVoice?.(v) === false) { preview.reset(); return; } preview.arm(v); }}\n onUse={pickVoice}\n />\n </Sheet>\n );\n const sheets = side ? null : <>{pickerEl}{voiceSheetEl}</>;\n const sidePanel = side && (picker || sheet) ? <div className=\"vs-side\">{picker ? pickerEl : voiceSheetEl}</div> : null;\n const playTitle = !speaks\n ? null\n : failed\n ? `This voice could not be prepared: ${failed}`\n : voiceWaiting && (want || vp.playing)\n ? VOICE_WAIT_TITLE\n : null;\n const noVoiceNote = noVoice && (\n <div className=\"novoice\" title={NO_VOICE_TIP}>\n <Icon d={D.headphonesOff} size={17} sw={1.6} style={{ flex: 'none', color: 'var(--ink-45)' }} />\n <span className=\"novoice__text\">{`${t.vcNoVoice}${meta.label} yet — this transcript can be read, not played.`}</span>\n </div>\n );\n return {\n barChip: { flag: chipMeta.flag, code: chipMeta.code, label: chipMeta.label, onClick: side || stickyPicker ? toggleChip : openPicker, active: !!((side || stickyPicker) && pickerMine), can: canTranslate },\n sheetsOpen: picker || sheet,\n on: speaks, player, chip, voiceBtn, voiceWaiting: busy, sheets, sidePanel, voicesMine, toggleVoices, cloningOn: cloneOn, playTitle, noVoice, noVoiceNote, relang, sampling: preview.sampleId != null, error: preview.error, clearError: () => preview.clearError(), openVoices, openPicker, original, reloadVoices: () => setCatVer((n) => n + 1), voicesVer: catVer, people, gvList, autoOf, savedFor, closeVoices, setSheet,\n selectedSpeaker: selSp, armVoice: preview.arm, resetPreview: preview.reset, armedId: preview.armId, resetCast: () => setCastByLang((m) => ({ ...m, [vLang ?? '']: {} })),\n readLang: typeof pickedLang === 'string' && pickedLang !== srcLang ? pickedLang : null,\n readVoiceKey: forcedVoice || (castKeyStr ?? picked ?? arch.track?.voiceKey ?? ''),\n pickedVoiceKey: castKeyStr ?? picked ?? null,\n readVoiceName: gvPicked?.name ?? null,\n canSpeak,\n requestTrack: () => arch.requestRender(castKeyStr ?? picked, castKeyStr ? sentCast : null),\n hasClone,\n clips: arch.clips,\n setNear: arch.setNear,\n closePicker: () => { if (pickerMine) closePicker(); },\n langList: { value: original ? null : lang, onSelect: selectLang, languages: trLangs, searchPlaceholder: t.search, none: 'Original', pinned: (original ? srcLang : lang) ? [(original ? srcLang : lang)!] : [], recent } satisfies LanguageListProps,\n };\n}\n\nexport function TxLines({ model, rows, player, fixed, applied, onFixOpen, onWord, onFix, fixMode, fixingId, marks = true, fixBadges = true, tail, tailFg, running, desk, feedRef, listener, showLabels, find, findOpen, lang, warm, onVisible, wordHl = true }: { model: Model; rows: Row[]; player: TxPlayer; fixed?: Set<string>; applied?: Correction[]; onFixOpen?: (r: Row, hist: boolean) => void; onWord?: (r: Row, w: Word) => void; onFix?: (r: Row) => void; fixMode?: boolean; fixingId?: string | null; marks?: boolean; fixBadges?: boolean; tail: string; tailFg: string; running?: boolean; desk: boolean; feedRef: React.RefObject<HTMLDivElement>; listener?: boolean; showLabels: boolean; find?: string; findOpen?: boolean; lang?: string | null ; warm?: boolean; onVisible?: (ids: number[]) => void; wordHl?: boolean }) {\n const { playing, engaged, t, idx, seekN, wordSync, clipPos } = player;\n useDragScroll(true, feedRef);\n const thumbRef = useRef<HTMLDivElement>(null);\n useFeedBar(feedRef, thumbRef);\n const [hovId, setHovId] = useState<string | null>(null);\n const needle = (find ?? '').trim().toLowerCase();\n const [off, setOff] = useState<-1 | 0 | 1>(0);\n const glideUntil = useRef(0);\n const glide = useRef<number | null>(null);\n const lastIdx = useRef(idx);\n const rowEl = (i: number) => feedRef.current?.querySelector<HTMLElement>(`[data-tx-row=\"${i}\"]`) ?? null;\n const visKey = useRef('');\n useEffect(() => {\n const el = feedRef.current;\n if (!el || !onVisible) return;\n const measure = () => {\n const b = el.getBoundingClientRect();\n const ids: number[] = [];\n for (const c of Array.from(el.querySelectorAll<HTMLElement>('[data-sentence]'))) {\n const r = c.getBoundingClientRect();\n if (r.bottom > b.top && r.top < b.bottom) ids.push(Number(c.dataset.sentence));\n }\n const key = ids.join(',');\n if (key === visKey.current) return;\n visKey.current = key;\n onVisible(ids);\n };\n const t = window.setTimeout(measure, 120);\n let h: number | undefined;\n const onScroll = () => { window.clearTimeout(h); h = window.setTimeout(measure, 120); };\n el.addEventListener('scroll', onScroll, { passive: true });\n return () => { window.clearTimeout(t); window.clearTimeout(h); el.removeEventListener('scroll', onScroll); };\n }, [rows, onVisible, feedRef]);\n const centre = (i: number) => {\n const el = feedRef.current, row = rowEl(i);\n if (!el || !row) return;\n const top = row.getBoundingClientRect().top - el.getBoundingClientRect().top + el.scrollTop;\n const max = el.scrollHeight - el.clientHeight;\n const ins = feedInset(el);\n const visH = Math.max(80, el.clientHeight - ins.top - ins.bottom);\n const lead = row.offsetHeight > visH ? 8 : (visH - row.offsetHeight) / 2;\n el.scrollTop = Math.max(0, Math.min(max, top - ins.top - lead));\n };\n const rowOffscreen = (i: number): -1 | 0 | 1 => {\n const el = feedRef.current, row = rowEl(i);\n if (!el || !el.clientHeight || !el.offsetParent || !row) return 0;\n const r = row.getBoundingClientRect(), b = el.getBoundingClientRect();\n const ins = feedInset(el);\n const top = b.top + ins.top, bot = b.bottom - ins.bottom;\n if (r.height > bot - top) return r.top < top - 4 ? -1 : r.top > bot - 60 ? 1 : 0;\n if (r.bottom < top + 10) return -1;\n if (r.bottom > bot - 4) return 1;\n return 0;\n };\n const smoothRow = (i: number) => {\n glideUntil.current = performance.now() + 420;\n const el = feedRef.current, row = rowEl(i);\n if (!el || !el.clientHeight || !row) return;\n const r = row.getBoundingClientRect(), b = el.getBoundingClientRect();\n const max = el.scrollHeight - el.clientHeight;\n const from = el.scrollTop;\n const ins = feedInset(el);\n const visH = Math.max(80, el.clientHeight - ins.top - ins.bottom);\n const lead = r.height > visH ? 8 : (visH - r.height) / 2;\n const to = Math.max(0, Math.min(max, from + (r.top - b.top) - ins.top - lead));\n if (glide.current) cancelAnimationFrame(glide.current);\n if (Math.abs(to - from) < 2) { el.scrollTop = to; glide.current = null; return; }\n const t0 = performance.now(), ms = 360;\n const step = () => {\n const k = Math.min(1, (performance.now() - t0) / ms);\n el.scrollTop = from + (to - from) * (1 - Math.pow(1 - k, 3));\n glide.current = k < 1 ? requestAnimationFrame(step) : null;\n };\n glide.current = requestAnimationFrame(step);\n };\n useEffect(() => () => { if (glide.current) cancelAnimationFrame(glide.current); }, []);\n const offRef = useRef<-1 | 0 | 1>(0);\n useEffect(() => {\n if (!playing) { lastIdx.current = idx; offRef.current = 0; setOff(0); return; }\n const check = () => {\n const moved = idx !== lastIdx.current;\n lastIdx.current = idx;\n let o: -1 | 0 | 1 = performance.now() < glideUntil.current ? 0 : rowOffscreen(idx);\n if (moved && o && !offRef.current) { centre(idx); o = 0; }\n offRef.current = o;\n setOff(o);\n };\n check();\n const h = setInterval(check, 200);\n return () => clearInterval(h);\n }, [idx, playing]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => { if (seekN) smoothRow(idx); }, [seekN]); // eslint-disable-line react-hooks/exhaustive-deps\n const followJump = () => { smoothRow(idx); offRef.current = 0; setOff(0); };\n const follow = (dir: 'up' | 'down') => (\n <div className={`txfollow txfollow--${dir}`}>\n <button type=\"button\" className=\"txfollow__pill\" title=\"Jump to the line playing now\" onClick={followJump}>\n <Icon d={dir === 'up' ? 'm4.5 15.75 7.5-7.5 7.5 7.5' : 'm19.5 8.25-7.5 7.5-7.5-7.5'} size={15} sw={2} />Now playing\n </button>\n </div>\n );\n return (\n <div ref={feedRef} data-tx-feed=\"1\" className={`txfeed${desk ? ' txfeed--desk' : ''}${findOpen && !running ? ' is-find' : ''}`}>\n <FeedBar thumbRef={thumbRef} />\n {playing && off === -1 && follow('up')}\n {rows.map((r, i) => {\n const on = playing && i === idx;\n const held = engaged && i === idx;\n const fixing = !!fixingId && fixingId === r.id;\n const dim = needle && !r.text.toLowerCase().includes(needle) && !(lang && r.translations[lang]?.toLowerCase().includes(needle)) ? 0.22 : !engaged || i <= idx || fixing ? 1 : 0.38;\n const tapRow = listener ? () => player.playRow(i)\n : fixMode && onFix ? () => { if (playing && !on) player.seekRow(i); onFix(r); }\n : playing && on ? undefined : () => player.playRow(i);\n const fx = listener ? null : rowFixes(r, applied, fixed);\n const fxAny = !!fx && (fx.script > 0 || fx.manual);\n const pen = desk && !!onFixOpen && hovId === r.id && !!fx && !fxAny;\n const who = speakerLabel(model, r.speaker);\n const look = speakerLook(model, r.speaker);\n const ln = look.lane;\n const tr = lang && r.translations[lang] && r.language !== lang ? r.translations[lang] : null;\n const words = lineWords(rows, i, lang);\n const spokenWord = held && !wordSync && clipPos ? readCursor(words.map((w) => ({ t: w.text, sp: ' ' })), clipPos) : null;\n return (\n <div key={r.id} data-tx-row={i} data-sentence={r.sentenceId} className={`txline${warm ? ' txline--warm' : ''}${fixing ? ' txline--fixing' : ''}`} aria-current={fixing || undefined} style={{ opacity: dim }} onClick={tapRow} onMouseEnter={desk && onFixOpen ? () => setHovId(r.id) : undefined} onMouseLeave={desk && onFixOpen ? () => setHovId(null) : undefined}>\n <div className=\"txline__meta\">\n <span className=\"txline__at\">{clock(r.start)}</span>\n {showLabels && r.speaker >= 0 && (\n <>\n <div className={`lanechip bg-lane-${ln}`} style={look.soft ? { background: look.soft, color: look.fg } : undefined}>{speakerInitial(model, r.speaker)}</div>\n <span className={`txline__who lane-${ln}`} style={look.fg ? { color: look.fg } : undefined}>{who}</span>\n {look.hasVoice && <VoiceIdGlyph color={look.fg ?? `var(--lane-${ln})`} />}\n </>\n )}\n {on && <span title=\"Playing\" style={{ flex: 'none', display: 'inline-flex', alignItems: 'center' }}><Icon d={D.headphones} size={desk ? 15 : 14} sw={1.6} stroke={showLabels && r.speaker >= 0 ? look.fg ?? `var(--lane-${ln})` : 'var(--ink-45)'} /></span>}\n {fx && fixBadges && <FixBadges f={fx} desk={desk} onOpen={onFixOpen ? () => onFixOpen(r, true) : undefined} />}\n {pen && <FixPen alone onOpen={() => onFixOpen?.(r, false)} />}\n </div>\n <div className=\"txline__text\">\n {words.map((w, j) => {\n const key = `${w.seq}:${w.idx}`;\n const c = confClass(w.prob);\n const tracks = held && wordHl;\n const at = tracks && (wordSync\n ? t >= w.start && (t < w.end || j === words.length - 1 || t < words[j + 1].start)\n : j === spokenWord);\n const ahead = tracks && !at && (wordSync ? w.start > t : spokenWord != null && j > spokenWord);\n const fx = !tr && !listener && (!!fixed?.has(key) || !!w.script);\n const dash = !tr && !listener && marks && !!c && !fx;\n const half = dash ? (c === 'low' ? 'var(--conf-low-half)' : 'var(--conf-mid-half)') : null;\n const fg = fx ? 'var(--brand)' : ahead ? 'var(--ink-40)' : half ?? 'var(--ink-96)';\n return (\n <span key={key + j}>\n <span\n className=\"txw\"\n title={onWord && !tr ? (fixMode ? 'Correct this word' : on ? (playing && player.seekWord ? 'Play from this word' : 'Play from this line') : 'Play from this line') : on ? '' : 'Play from this line'}\n onClick={onWord && !tr ? (e) => { e.stopPropagation(); if (fixMode) { onWord(r, w); return; } if (playing && on) { player.seekWord?.(w); return; } player.playRow(i); } : undefined}\n style={{ color: fg, opacity: ahead ? 0.45 : 1, fontWeight: 300, cursor: onWord && !tr ? (fixMode || !on || !playing || player.seekWord ? 'pointer' : 'default') : on ? 'default' : 'pointer', textShadow: at ? '0 0 2px currentColor, 0 0 4px currentColor' : 'none', textDecorationLine: dash || fx ? 'underline' : 'none', textDecorationStyle: fx ? 'solid' : 'dotted', textDecorationColor: fx ? 'var(--brand)' : half ?? 'currentColor', textDecorationThickness: dash || fx ? '1.5px' : undefined, textUnderlineOffset: dash || fx ? '3px' : undefined }}\n >{w.text}</span>\n <span style={{ whiteSpace: 'pre-wrap' }}> </span>\n </span>\n );\n })}\n </div>\n </div>\n );\n })}\n {running\n ? <div className=\"txtail txtail--wave\" title=\"Still transcribing\"><span className=\"eq3\" aria-hidden=\"true\"><span /><span /><span /></span></div>\n : <div className=\"txtail\" style={{ color: tailFg }}>{tail}</div>}\n {playing && off === 1 && follow('down')}\n </div>\n );\n}\n\nexport function TxFind({ open, q, onQ, onClose, hits, desk, inline, flash }: { open: boolean; q: string; onQ: (q: string) => void; onClose: () => void; hits: number; desk: boolean; inline?: boolean; flash?: string | null }) {\n return (\n <div className={inline ? 'searchbar searchbar--inline' : `searchbar searchbar--float${desk ? ' searchbar--desk' : ''}${open ? '' : ' is-hidden'}`}>\n <div>\n <Icon d={D.search} size={16} sw={1.7} style={{ color: 'var(--ink-45)', flex: 'none' }} />\n <input value={q} onChange={(e) => onQ(e.target.value)} onKeyDown={(e) => { if (e.key !== 'Escape') return; e.stopPropagation(); if (q) onQ(''); else onClose(); }} placeholder=\"Search this transcript\" />\n {inline && flash && <span className=\"searchbar__flash\">{flash}</span>}\n {q.trim() && <span className=\"count\">{hits} found</span>}\n {q.trim() && <button type=\"button\" className=\"searchbar__x\" onClick={() => onQ('')} aria-label=\"Clear\" title=\"Clear\"><Icon d={D.close} size={15} sw={1.7} /></button>}\n </div>\n </div>\n );\n}\nexport function useFindPull(feedRef: React.RefObject<HTMLDivElement>, rows: Row[], open: boolean, q: string, setOpen: (v: boolean) => void) {\n const openRef = useRef(open); openRef.current = open;\n const qRef = useRef(q); qRef.current = q;\n const [hits, setHits] = useState(0);\n const needle = q.trim().toLowerCase();\n useEffect(() => { setHits(needle ? rows.filter((r) => r.text.toLowerCase().includes(needle)).length : 0); }, [rows, needle]);\n useEffect(() => {\n const el = feedRef.current;\n if (!el) return;\n let last = el.scrollTop, acc = 0, userUntil = 0;\n const touch = () => { userUntil = Date.now() + 1500; };\n const drag = (e: PointerEvent) => { if (e.buttons) touch(); };\n const onScroll = () => {\n const top = el.scrollTop, d = top - last;\n last = top;\n if (Date.now() > userUntil) { acc = 0; return; }\n acc = (d < 0) === (acc < 0) ? acc + d : d;\n if (acc < -14 && !openRef.current) { acc = 0; setOpen(true); }\n else if (acc > 56 && openRef.current && !qRef.current.trim()) { acc = 0; setOpen(false); }\n };\n el.addEventListener('wheel', touch, { passive: true });\n el.addEventListener('touchmove', touch, { passive: true });\n el.addEventListener('pointermove', drag);\n el.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n el.removeEventListener('wheel', touch);\n el.removeEventListener('touchmove', touch);\n el.removeEventListener('pointermove', drag);\n el.removeEventListener('scroll', onScroll);\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n return hits;\n}\n\n","const ECC_M = { formatBits: 0, perBlock: [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28], blocks: [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49] };\n\nfunction rawDataModules(ver: number): number {\n let n = (16 * ver + 128) * ver + 64;\n if (ver >= 2) {\n const a = Math.floor(ver / 7) + 2;\n n -= (25 * a - 10) * a - 55;\n if (ver >= 7) n -= 36;\n }\n return n;\n}\nconst dataCodewords = (ver: number) => Math.floor(rawDataModules(ver) / 8) - ECC_M.perBlock[ver] * ECC_M.blocks[ver];\n\nfunction gfMul(x: number, y: number): number {\n let z = 0;\n for (let i = 7; i >= 0; i--) {\n z = (z << 1) ^ ((z >>> 7) * 0x11d);\n z ^= ((y >>> i) & 1) * x;\n }\n return z;\n}\nfunction rsDivisor(degree: number): number[] {\n const out = new Array<number>(degree).fill(0);\n out[degree - 1] = 1;\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < degree; j++) out[j] = gfMul(out[j], root) ^ (j + 1 < degree ? out[j + 1] : 0);\n root = gfMul(root, 2);\n }\n return out;\n}\nfunction rsRemainder(data: number[], divisor: number[]): number[] {\n const out = new Array<number>(divisor.length).fill(0);\n for (const b of data) {\n const factor = b ^ (out.shift() as number);\n out.push(0);\n divisor.forEach((c, i) => { out[i] ^= gfMul(c, factor); });\n }\n return out;\n}\n\nfunction alignmentPositions(ver: number): number[] {\n if (ver === 1) return [];\n const n = Math.floor(ver / 7) + 2;\n const size = ver * 4 + 17;\n const step = ver === 32 ? 26 : Math.ceil((ver * 4 + 4) / (n * 2 - 2)) * 2;\n const out = [6];\n for (let pos = size - 7; out.length < n; pos -= step) out.splice(1, 0, pos);\n return out;\n}\n\nexport function qrMatrix(text: string): boolean[][] {\n const bytes = Array.from(new TextEncoder().encode(text));\n let ver = 1;\n for (; ver <= 40; ver++) {\n const countBits = ver <= 9 ? 8 : 16;\n if (4 + countBits + bytes.length * 8 <= dataCodewords(ver) * 8) break;\n }\n if (ver > 40) throw new Error('Text too long for a QR code');\n const size = ver * 4 + 17;\n const capacity = dataCodewords(ver) * 8;\n const bits: number[] = [];\n const push = (v: number, n: number) => { for (let i = n - 1; i >= 0; i--) bits.push((v >>> i) & 1); };\n push(4, 4);\n push(bytes.length, ver <= 9 ? 8 : 16);\n for (const b of bytes) push(b, 8);\n push(0, Math.min(4, capacity - bits.length));\n while (bits.length % 8) bits.push(0);\n for (let pad = 0xec; bits.length < capacity; pad ^= 0xec ^ 0x11) push(pad, 8);\n const data: number[] = [];\n for (let i = 0; i < bits.length; i += 8) data.push(bits.slice(i, i + 8).reduce((a, b) => (a << 1) | b, 0));\n const numBlocks = ECC_M.blocks[ver], eccLen = ECC_M.perBlock[ver];\n const rawCodewords = Math.floor(rawDataModules(ver) / 8);\n const numShort = numBlocks - (rawCodewords % numBlocks);\n const shortLen = Math.floor(rawCodewords / numBlocks);\n const blocks: number[][] = [];\n const div = rsDivisor(eccLen);\n for (let i = 0, k = 0; i < numBlocks; i++) {\n const dat = data.slice(k, k + shortLen - eccLen + (i < numShort ? 0 : 1));\n k += dat.length;\n const ecc = rsRemainder(dat, div);\n if (i < numShort) dat.push(0);\n blocks.push(dat.concat(ecc));\n }\n const codewords: number[] = [];\n for (let i = 0; i < blocks[0].length; i++) blocks.forEach((b, j) => { if (i !== shortLen - eccLen || j >= numShort) codewords.push(b[i]); });\n\n const m: boolean[][] = Array.from({ length: size }, () => new Array<boolean>(size).fill(false));\n const fn: boolean[][] = Array.from({ length: size }, () => new Array<boolean>(size).fill(false));\n const set = (x: number, y: number, dark: boolean) => { m[y][x] = dark; fn[y][x] = true; };\n for (let i = 0; i < size; i++) { set(6, i, i % 2 === 0); set(i, 6, i % 2 === 0); }\n const finder = (x: number, y: number) => {\n for (let dy = -4; dy <= 4; dy++) for (let dx = -4; dx <= 4; dx++) {\n const d = Math.max(Math.abs(dx), Math.abs(dy)), xx = x + dx, yy = y + dy;\n if (xx >= 0 && xx < size && yy >= 0 && yy < size) set(xx, yy, d !== 2 && d !== 4);\n }\n };\n finder(3, 3); finder(size - 4, 3); finder(3, size - 4);\n const ap = alignmentPositions(ver);\n for (let i = 0; i < ap.length; i++) for (let j = 0; j < ap.length; j++) {\n if ((i === 0 && j === 0) || (i === 0 && j === ap.length - 1) || (i === ap.length - 1 && j === 0)) continue;\n for (let dy = -2; dy <= 2; dy++) for (let dx = -2; dx <= 2; dx++) set(ap[i] + dx, ap[j] + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);\n }\n const formatBits = (mask: number) => {\n const d = (ECC_M.formatBits << 3) | mask;\n let rem = d;\n for (let i = 0; i < 10; i++) rem = (rem << 1) ^ ((rem >>> 9) * 0x537);\n const b = ((d << 10) | rem) ^ 0x5412;\n const bit = (i: number) => ((b >>> i) & 1) !== 0;\n for (let i = 0; i <= 5; i++) set(8, i, bit(i));\n set(8, 7, bit(6)); set(8, 8, bit(7)); set(7, 8, bit(8));\n for (let i = 9; i < 15; i++) set(14 - i, 8, bit(i));\n for (let i = 0; i < 8; i++) set(size - 1 - i, 8, bit(i));\n for (let i = 8; i < 15; i++) set(8, size - 15 + i, bit(i));\n set(8, size - 8, true);\n };\n formatBits(0);\n if (ver >= 7) {\n let rem = ver;\n for (let i = 0; i < 12; i++) rem = (rem << 1) ^ ((rem >>> 11) * 0x1f25);\n const b = (ver << 12) | rem;\n for (let i = 0; i < 18; i++) {\n const bit = ((b >>> i) & 1) !== 0, a = size - 11 + (i % 3), c = Math.floor(i / 3);\n set(a, c, bit); set(c, a, bit);\n }\n }\n let i = 0;\n for (let right = size - 1; right >= 1; right -= 2) {\n if (right === 6) right = 5;\n for (let vert = 0; vert < size; vert++) for (let j = 0; j < 2; j++) {\n const x = right - j, y = ((right + 1) & 2) === 0 ? size - 1 - vert : vert;\n if (!fn[y][x] && i < codewords.length * 8) { m[y][x] = ((codewords[i >>> 3] >>> (7 - (i & 7))) & 1) !== 0; i++; }\n }\n }\n const maskAt = (k: number, x: number, y: number) => {\n switch (k) {\n case 0: return (x + y) % 2 === 0;\n case 1: return y % 2 === 0;\n case 2: return x % 3 === 0;\n case 3: return (x + y) % 3 === 0;\n case 4: return (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0;\n case 5: return ((x * y) % 2) + ((x * y) % 3) === 0;\n case 6: return (((x * y) % 2) + ((x * y) % 3)) % 2 === 0;\n default: return (((x + y) % 2) + ((x * y) % 3)) % 2 === 0;\n }\n };\n const apply = (k: number) => { for (let y = 0; y < size; y++) for (let x = 0; x < size; x++) if (!fn[y][x] && maskAt(k, x, y)) m[y][x] = !m[y][x]; };\n const penalty = () => {\n let score = 0;\n const count = (h: number[]) => {\n const n = h[1];\n const core = n > 0 && h[2] === n && h[3] === n * 3 && h[4] === n && h[5] === n;\n return (core && h[0] >= n * 4 && h[6] >= n ? 1 : 0) + (core && h[6] >= n * 4 && h[0] >= n ? 1 : 0);\n };\n const add = (h: number[], len: number) => { if (h[0] === 0) len += size; h.pop(); h.unshift(len); };\n const finish = (h: number[], color: boolean, len: number) => { if (color) { add(h, len); len = 0; } add(h, len + size); return count(h); };\n const line = (at: (i: number) => boolean) => {\n let color = false, run = 0;\n const h = [0, 0, 0, 0, 0, 0, 0];\n for (let i = 0; i < size; i++) {\n if (at(i) === color) { run++; if (run === 5) score += 3; else if (run > 5) score++; }\n else { add(h, run); if (!color) score += count(h) * 40; color = at(i); run = 1; }\n }\n score += finish(h, color, run) * 40;\n };\n for (let y = 0; y < size; y++) line((x) => m[y][x]);\n for (let x = 0; x < size; x++) line((y) => m[y][x]);\n for (let y = 0; y < size - 1; y++) for (let x = 0; x < size - 1; x++) {\n const c = m[y][x];\n if (c === m[y][x + 1] && c === m[y + 1][x] && c === m[y + 1][x + 1]) score += 3;\n }\n let dark = 0;\n for (const row of m) for (const c of row) if (c) dark++;\n const total = size * size;\n score += (Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1) * 10;\n return score;\n };\n let best = 0, min = Infinity;\n for (let k = 0; k < 8; k++) {\n apply(k); formatBits(k);\n const p = penalty();\n if (p < min) { min = p; best = k; }\n apply(k);\n }\n apply(best); formatBits(best);\n return m;\n}\n\nexport function qrSvgUrl(text: string): string {\n const m = qrMatrix(text);\n const n = m.length, q = 2;\n let d = '';\n for (let y = 0; y < n; y++) for (let x = 0; x < n; x++) if (m[y][x]) d += `M${x} ${y}h1v1h-1z`;\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${-q} ${-q} ${n + q * 2} ${n + q * 2}\" shape-rendering=\"crispEdges\"><rect x=\"${-q}\" y=\"${-q}\" width=\"${n + q * 2}\" height=\"${n + q * 2}\" fill=\"#fff\"/><path fill=\"#111\" d=\"${d}\"/></svg>`;\n return `data:image/svg+xml,${encodeURIComponent(svg)}`;\n}\n","import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { IconButton, Sheet } from '../ds/Controls';\nimport type { Strings } from '../data/i18n';\nimport { D, Icon, Logo, Mark, PauseGlyph, PlayGlyph, SITE } from '../ds/Icons';\nimport { qrSvgUrl } from '../core/qr';\nimport { shareLink } from './shared';\nimport { clock } from '../core/format';\n\nconst HINT_CODES = ['es', 'fr', 'ro', 'ja', 'pt'];\n\nconst DUCK = 0.5;\n\nconst ICON_FULL = 'M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15';\nconst ICON_EXIT = 'M9 9V4.5M9 9H4.5M9 9 3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5 5.25 5.25';\n\nfunction fullNow(): Element | null {\n const d = document as Document & { webkitFullscreenElement?: Element };\n return d.fullscreenElement ?? d.webkitFullscreenElement ?? null;\n}\n\nlet fullTarget: HTMLElement | null = null;\nexport function setFullTarget(el: HTMLElement | null) {\n fullTarget = el;\n}\n\nfunction canFull(): boolean {\n const d = document as Document & { webkitFullscreenEnabled?: boolean };\n return !!(d.fullscreenEnabled || d.webkitFullscreenEnabled);\n}\n\nfunction noBrowserFull(): boolean {\n if (typeof document === 'undefined' || !window.matchMedia?.('(pointer: coarse)').matches) return false;\n const el = (fullTarget ?? document.documentElement) as HTMLElement & { webkitRequestFullscreen?: unknown };\n return !el.requestFullscreen && !el.webkitRequestFullscreen;\n}\n\nexport function browserFull(on: boolean) {\n if (typeof document === 'undefined' || !window.matchMedia?.('(pointer: coarse)').matches) return;\n realFull(on);\n}\n\nexport function realFull(on: boolean) {\n if (typeof document === 'undefined') return;\n const d = document as Document & { webkitFullscreenElement?: Element; webkitExitFullscreen?: () => Promise<void> };\n const el = (fullTarget ?? document.documentElement) as HTMLElement & { webkitRequestFullscreen?: (o?: FullscreenOptions) => Promise<void> };\n const now = d.fullscreenElement ?? d.webkitFullscreenElement;\n try {\n if (on && !now) void (el.requestFullscreen ?? el.webkitRequestFullscreen)?.call(el, { navigationUI: 'hide' })?.catch(() => {});\n if (!on && now) void (d.exitFullscreen ?? d.webkitExitFullscreen)?.call(d)?.catch(() => {});\n } catch { }\n}\n\nfunction useMedia(q: string): boolean {\n const [on, setOn] = useState(() => typeof window !== 'undefined' && !!window.matchMedia?.(q).matches);\n useEffect(() => {\n const m = window.matchMedia?.(q);\n if (!m) return;\n const f = () => setOn(m.matches);\n f();\n m.addEventListener('change', f);\n return () => m.removeEventListener('change', f);\n }, [q]);\n return on;\n}\n\nexport type PlayerPos = { live: boolean; atEdge: boolean; edgeFrac: number | null; readyFrac?: number | null; pct: number; atLabel: string; labelAt: (frac: number) => string; endLabel: string; onSeek: (frac: number) => void };\nexport type VoicesBtn = { on: boolean; title: string; onClick: () => void; busy?: boolean };\nexport type PlayerTransport = { prevOn: boolean; nextOn: boolean; onPrev: () => void; onNext: () => void; playing: boolean; playable: boolean; playTitle: string; onPlay?: () => void; busy?: boolean };\n\nfunction SeekRow({ pos, interactive, axis = 'x' }: { pos: PlayerPos; interactive: boolean; axis?: 'x' | 'y' }) {\n const [drag, setDrag] = useState<number | null>(null);\n const fracOf = (e: React.PointerEvent<HTMLDivElement>) => {\n const r = e.currentTarget.getBoundingClientRect();\n const f = axis === 'y' ? (e.clientY - r.top) / Math.max(1, r.height) : (e.clientX - r.left) / Math.max(1, r.width);\n return Math.min(1, Math.max(0, f));\n };\n const up = (e: React.PointerEvent<HTMLDivElement>) => { if (drag == null) return; const f = fracOf(e); setDrag(null); pos.onSeek(f); };\n const shown = drag != null ? drag * 100 : pos.pct;\n return (\n <>\n <span className={`gfull__t${interactive ? ' gfull__t--at' : ''}`}>{drag != null ? pos.labelAt(drag) : pos.atLabel}</span>\n <div className={`gfull__seek${interactive ? ' gfull__seek--on' : ''}`} role={interactive ? 'slider' : undefined} aria-label={interactive ? 'Playback position' : undefined} aria-valuemin={interactive ? 0 : undefined} aria-valuemax={interactive ? 100 : undefined} aria-valuenow={interactive ? Math.round(shown) : undefined}\n onPointerDown={interactive ? (e) => { e.stopPropagation(); e.currentTarget.setPointerCapture?.(e.pointerId); setDrag(fracOf(e)); e.preventDefault(); } : undefined}\n onPointerMove={interactive ? (e) => { if (drag != null) setDrag(fracOf(e)); } : undefined}\n onPointerUp={interactive ? up : undefined} onPointerCancel={interactive ? () => setDrag(null) : undefined}>\n <div className={`gfull__track${pos.readyFrac != null ? ' gfull__track--part' : ''}`}>\n {pos.readyFrac != null && <div className=\"gfull__ready\" style={{ width: `${Math.min(100, pos.readyFrac * 100)}%` }} />}\n <div style={{ width: `${shown}%`, background: (drag == null ? pos.atEdge : pos.edgeFrac != null && drag >= pos.edgeFrac) ? '#ec634d' : '#55abe5', transition: drag != null ? 'none' : undefined }} />\n <i style={{ left: `${shown}%`, transition: drag != null ? 'none' : undefined }} />\n </div>\n </div>\n <span className=\"gfull__t gfull__end\" style={{ color: pos.live ? '#ec634d' : 'rgba(234,236,250,.6)' }}>{pos.endLabel}</span>\n </>\n );\n}\n\nexport function PanelSeek({ pos }: { pos: PlayerPos }) {\n const [drag, setDrag] = useState<number | null>(null);\n const fracOf = (e: React.PointerEvent<HTMLDivElement>) => {\n const r = e.currentTarget.getBoundingClientRect();\n return Math.min(1, Math.max(0, (e.clientX - r.left) / Math.max(1, r.width)));\n };\n const up = (e: React.PointerEvent<HTMLDivElement>) => { if (drag == null) return; const f = fracOf(e); setDrag(null); pos.onSeek(f); };\n const shown = drag != null ? drag * 100 : pos.pct;\n const glide = drag != null ? 'none' : undefined;\n return (\n <div className=\"gaseek\">\n <div className=\"gaseek__bar\" role=\"slider\" aria-label=\"Playback position\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={Math.round(shown)}\n onPointerDown={(e) => { e.currentTarget.setPointerCapture?.(e.pointerId); setDrag(fracOf(e)); e.preventDefault(); }}\n onPointerMove={(e) => { if (drag != null) setDrag(fracOf(e)); }}\n onPointerUp={up} onPointerCancel={() => setDrag(null)}>\n <div className=\"gaseek__track\" />\n <div className=\"gaseek__fill\" style={{ width: `${shown}%`, transition: glide }} />\n <i style={{ left: `${shown}%`, transition: glide }} />\n </div>\n <div className=\"gaseek__labels\">\n <span className=\"gaseek__t\">{drag != null ? pos.labelAt(drag) : pos.atLabel}</span>\n <span className=\"gaseek__t gaseek__end\">{pos.endLabel}</span>\n </div>\n </div>\n );\n}\n\nfunction GlassTransport({ t, mini }: { t: PlayerTransport; mini?: boolean }) {\n return (\n <div className=\"gfull__transport\">\n <button type=\"button\" className=\"gfull__step\" aria-label=\"Previous line\" title=\"Previous line\" style={{ opacity: t.prevOn ? 1 : 0.3 }} onClick={t.onPrev}><Icon d={D.chevronLeft} size={mini ? 13 : 16} sw={mini ? 1.8 : 1.9} /></button>\n <button type=\"button\" className=\"gfull__play\" aria-label={t.busy ? 'Preparing audio' : t.playing ? 'Pause' : 'Play'} title={t.playTitle} disabled={!t.playable}\n style={{ background: !t.playable ? 'rgba(5,6,21,.42)' : t.playing ? 'rgba(238,240,248,.92)' : 'var(--brand)', color: !t.playable ? 'rgba(234,236,250,.5)' : t.playing ? '#131326' : 'var(--brand-ink)', cursor: t.playable ? 'pointer' : 'default' }}\n onClick={t.onPlay}>{t.busy ? <span className=\"gfull__spin\" aria-hidden=\"true\" /> : t.playing ? <PauseGlyph size={mini ? 14 : 18} /> : <PlayGlyph size={mini ? 15 : 19} />}</button>\n <button type=\"button\" className=\"gfull__step\" aria-label=\"Next line\" title=\"Next line\" style={{ opacity: t.nextOn ? 1 : 0.3 }} onClick={t.onNext}><Icon d={D.chevronRight} size={mini ? 13 : 16} sw={mini ? 1.8 : 1.9} /></button>\n </div>\n );\n}\n\nfunction GlassBrand({ live, mini, desk, pct, mark }: { live: boolean; mini?: boolean; desk?: boolean; pct?: number | null; mark?: boolean }) {\n return <div className={`gfull__brand${mark ? ' gfull__brand--mark' : ''}`}><a href={SITE} target=\"_blank\" rel=\"noopener\" style={{ display: 'block', lineHeight: 0 }} aria-label=\"VocalStack\" title=\"VocalStack\">{mark ? <Mark dark size={22} /> : <Logo dark link={false} height={mini ? 11 : desk ? 18 : 15} />}</a>{live && <span className=\"gfull__live\"><i />LIVE</span>}{pct != null && <span className=\"gfull__txpct\" title=\"Still being transcribed: it plays as far as it is written\">{`TRANSCRIBING ${pct}%`}</span>}</div>;\n}\n\nfunction VoicesButton({ v, size }: { v: VoicesBtn; size: number }) {\n return <button type=\"button\" className=\"gfull__btn\" aria-label=\"Voices\" aria-busy={v.busy || undefined} title={v.busy ? 'Preparing the voice…' : v.title} disabled={!v.on} style={{ position: 'relative', opacity: v.on || v.busy ? 1 : 0.45, cursor: v.on ? 'pointer' : 'default' }} onClick={v.on ? v.onClick : undefined}><Icon d={D.headphones} size={size} sw={1.6} />{v.busy && <span aria-hidden=\"true\" style={{ position: 'absolute', inset: 0, boxSizing: 'border-box', borderRadius: '50%', border: '2px solid var(--fill-12)', borderTopColor: 'var(--brand)', animation: 'vs-spin .7s linear infinite', pointerEvents: 'none' }} />}</button>;\n}\n\nexport function MiniPlayer({ pos, transport, chip, voices, onShare, onFull, copied }: { pos: PlayerPos; transport: PlayerTransport; chip: React.ReactNode; voices: VoicesBtn; onShare?: () => void; onFull: () => void; copied: React.ReactNode }) {\n return (\n <div className=\"gmini\" data-theme=\"dark\">\n <div className=\"gmini__shade\" aria-hidden=\"true\" />\n <div className=\"gmini__top\"><GlassBrand live={pos.live} mini /></div>\n <div className=\"gmini__foot\">\n <div className=\"gmini__row\"><SeekRow pos={pos} interactive /></div>\n <div className=\"gmini__row gmini__row--ctl\">\n <GlassTransport t={transport} mini />\n <span style={{ flex: 1 }} />\n <div className=\"gfull__chip\">{chip}</div>\n <VoicesButton v={voices} size={14} />\n {onShare && <button type=\"button\" className=\"gfull__btn\" aria-label=\"Share\" title=\"Share\" onClick={(e) => { e.stopPropagation(); onShare(); }}><Icon d={D.share} size={13} sw={1.8} /></button>}\n <button type=\"button\" className=\"gfull__btn\" aria-label=\"Full screen\" title=\"Full screen\" onClick={onFull}><Icon d={ICON_FULL} size={14} sw={1.8} /></button>\n </div>\n </div>\n {copied}\n </div>\n );\n}\n\nconst DIM_WORD: React.CSSProperties = { color: 'rgba(255,255,255,.4)' };\n\nexport function FullVideo({ compact = false, noFull = false, page = true, picture, title, desk, pos, sub, wait, pct, mute, cc, ad, chip, transport, picker, sheet, voices, voicesBtn, sheetOpen, onShare, onSettings, paused, copied, onTouch, onClose }: { compact?: boolean; noFull?: boolean; page?: boolean; onTouch: () => void; onSettings?: () => void; paused?: { title: string; summary: string | null; share?: { url: (t: number | null) => string; at: number } | null } | null; voices: React.ReactNode; voicesBtn: VoicesBtn | null; picture: React.ReactNode; title: string; desk: boolean; pos: PlayerPos; sub: { who: string | null; color: string; words: { t: string; sp: string; dim: boolean }[]; cursor?: number | null } | null; wait?: React.ReactNode; pct?: number | null; mute?: { muted: boolean; onToggle: () => void }; cc?: { on: boolean; onToggle: () => void }; ad?: boolean; chip: React.ReactNode; transport: PlayerTransport; picker: React.ReactNode; sheet: React.ReactNode; sheetOpen: boolean; onShare?: () => void; copied: React.ReactNode; onClose?: () => void }) {\n const [isFull, setIsFull] = useState(() => !!fullNow());\n useEffect(() => {\n const on = () => setIsFull(!!fullNow());\n document.addEventListener('fullscreenchange', on);\n document.addEventListener('webkitfullscreenchange', on);\n return () => { document.removeEventListener('fullscreenchange', on); document.removeEventListener('webkitfullscreenchange', on); };\n }, []);\n const close = useRef(onClose);\n close.current = onClose;\n const play = useRef(transport.playable ? transport.onPlay : undefined);\n play.current = transport.playable ? transport.onPlay : undefined;\n const [calm, setCalm] = useState(false);\n const [touchN, setTouchN] = useState(0);\n const swallow = useRef(false);\n useEffect(() => () => realFull(false), []);\n useEffect(() => {\n if (!page) return;\n const els = [document.documentElement, document.body];\n const was = els.map((el) => el.style.background);\n els.forEach((el) => { el.style.background = '#050507'; });\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"theme-color\"]');\n const tint = meta?.content;\n if (meta) meta.content = '#050507';\n return () => { els.forEach((el, i) => { el.style.background = was[i]; }); if (meta && tint) meta.content = tint; };\n }, []);\n const swipeFull = useMemo(() => page && noBrowserFull(), [page]);\n const [barsUp, setBarsUp] = useState(swipeFull);\n useEffect(() => {\n if (!page) return;\n const els = [document.documentElement, document.body];\n const was = els.map((el) => [el.style.overflow, el.style.overscrollBehavior] as const);\n if (!swipeFull) {\n els.forEach((el) => { el.style.overflow = 'hidden'; el.style.overscrollBehavior = 'none'; });\n return () => els.forEach((el, i) => { el.style.overflow = was[i][0]; el.style.overscrollBehavior = was[i][1]; });\n }\n const strip = document.createElement('div');\n strip.setAttribute('aria-hidden', 'true');\n strip.style.cssText = 'position:absolute;top:0;left:0;width:1px;height:calc(100lvh + 160px);pointer-events:none';\n document.body.appendChild(strip);\n document.documentElement.style.overscrollBehavior = 'none';\n const onScroll = () => { if (window.scrollY > 24) setBarsUp(false); };\n window.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n window.removeEventListener('scroll', onScroll);\n strip.remove();\n document.documentElement.style.overscrollBehavior = was[0][1];\n window.scrollTo(0, 0);\n };\n }, [swipeFull, page]);\n const sheetUp = useRef(sheetOpen);\n sheetUp.current = sheetOpen;\n useEffect(() => {\n const typing = (el: EventTarget | null) => el instanceof HTMLElement && (el.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName));\n const key = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !sheetUp.current && close.current) { e.stopPropagation(); close.current(); }\n if (e.key === ' ' && !sheetUp.current && !typing(e.target)) { e.preventDefault(); e.stopPropagation(); if (!e.repeat) play.current?.(); }\n if ((e.key === 'f' || e.key === 'F') && !e.metaKey && !e.ctrlKey && !e.altKey && !sheetUp.current && !typing(e.target) && canFull()) { e.preventDefault(); if (!e.repeat) realFull(!fullNow()); }\n };\n const keyUp = (e: KeyboardEvent) => { if (e.key === ' ' && !sheetUp.current && !typing(e.target)) e.preventDefault(); };\n window.addEventListener('keydown', key, true);\n window.addEventListener('keyup', keyUp, true);\n return () => { window.removeEventListener('keydown', key, true); window.removeEventListener('keyup', keyUp, true); };\n }, []);\n const sideways = useMedia('(orientation: landscape) and (max-height: 540px)');\n const rootRef = useRef<HTMLDivElement>(null);\n const [boxW, setBoxW] = useState<number | null>(null);\n useLayoutEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n setBoxW(el.getBoundingClientRect().width);\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(([e]) => setBoxW(e.contentRect.width));\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n const small = compact && !isFull;\n const big = !small && desk && !sideways && (boxW == null || boxW >= 880);\n const mini = !big;\n useEffect(() => {\n setCalm(false);\n if (!transport.playing || sheetOpen) return;\n const h = setTimeout(() => setCalm(true), 3000);\n return () => clearTimeout(h);\n }, [transport.playing, sheetOpen, touchN]);\n const calmRef = useRef(calm); calmRef.current = calm;\n const movedAt = useRef(0);\n const onMove = (e: React.PointerEvent) => {\n if (e.pointerType !== 'mouse') return;\n const now = Date.now();\n if (!calmRef.current && now - movedAt.current < 1000) return;\n movedAt.current = now;\n setTouchN((n) => n + 1);\n };\n const land = !big && sideways;\n const subBox = useRef<HTMLDivElement>(null);\n const subKey = sub ? sub.words.map((w) => (w.dim ? 0 : 1)).join('') + sub.words.length + ':' + (sub.cursor ?? '') : '';\n useLayoutEffect(() => {\n const box = subBox.current;\n if (!box) return;\n const reading = !!sub?.words.some((w) => w.dim) || sub?.cursor != null;\n const said = box.querySelectorAll<HTMLElement>(sub?.cursor != null && !sub.words.some((w) => w.dim) ? '[data-at]' : '[data-said]');\n const row = parseFloat(getComputedStyle(box).lineHeight) || 24;\n const extra = Math.round(box.scrollHeight / row) - Math.round(box.clientHeight / row);\n const room = Math.max(0, extra) * row;\n if (room <= 0) { if (box.scrollTop) box.scrollTo({ top: 0 }); return; }\n const rowOf = (el: HTMLElement) => Math.round((el.getBoundingClientRect().top - box.getBoundingClientRect().top + box.scrollTop) / row);\n const page = Math.max(1, Math.round(box.clientHeight / row));\n const at = reading ? (said.length ? Math.floor(rowOf(said[said.length - 1]) / page) * page * row : 0) : room;\n const want = Math.max(0, Math.min(room, at));\n if (Math.abs(want - box.scrollTop) > 1) box.scrollTop = want;\n }, [subKey, land]); // eslint-disable-line react-hooks/exhaustive-deps\n const [shareAt, setShareAt] = useState(true);\n const [shareCopied, setShareCopied] = useState(false);\n const shareT = useRef<number | undefined>(undefined);\n useEffect(() => () => window.clearTimeout(shareT.current), []);\n const shareUrl = paused?.share ? paused.share.url(shareAt && paused.share.at >= 1 ? Math.floor(paused.share.at) : null) : '';\n const shareQr = useMemo(() => (big && shareUrl && !transport.playing ? qrSvgUrl(shareUrl) : ''), [big, shareUrl, transport.playing]);\n const copyShare = () => { void navigator.clipboard?.writeText(shareUrl).then(() => { setShareCopied(true); window.clearTimeout(shareT.current); shareT.current = window.setTimeout(() => setShareCopied(false), 1800); }, () => {}); };\n const shareCard = big && paused?.share && (\n <div className=\"gfull__sharecard\" onPointerDown={(e) => e.stopPropagation()} onClick={(e) => e.stopPropagation()}>\n {shareQr && <div className=\"gfull__shareqr\" role=\"img\" aria-label=\"QR code for this link\" style={{ backgroundImage: `url(\"${shareQr}\")` }} />}\n <div className=\"gfull__sharebody\">\n <div className=\"gfull__shareeyebrow\">SHARE THIS MOMENT</div>\n <label className=\"gfull__shareat\"><input type=\"checkbox\" checked={shareAt} onChange={(e) => setShareAt(e.target.checked)} disabled={paused.share.at < 1} />Start at {clock(Math.floor(paused.share.at))}</label>\n <div className=\"gfull__shareurl\"><span>{shareUrl.replace(/^https?:\\/\\//, '')}</span></div>\n <div className=\"gfull__shareacts\">\n <button type=\"button\" className=\"gfull__sharebtn gfull__sharebtn--main\" onClick={copyShare}><Icon d={shareCopied ? D.check : D.copy} size={14} sw={1.8} />{shareCopied ? 'Copied' : 'Copy link'}</button>\n <button type=\"button\" className=\"gfull__sharebtn\" onClick={() => shareLink(shareUrl, title)}><Icon d={D.share} size={14} sw={1.6} />Share</button>\n </div>\n </div>\n </div>\n );\n const glass = (lbl: string, d: string, sw: number, onClick: () => void, style?: React.CSSProperties, grow = 0) => (\n <button type=\"button\" className=\"gfull__btn\" title={lbl} aria-label={lbl} onClick={onClick}><Icon d={d} size={(big ? 20 : mini ? 15 : 18) + grow} sw={sw} style={style} /></button>\n );\n const acts = (\n <div className=\"gfull__acts\">\n {voicesBtn && <VoicesButton v={voicesBtn} size={big ? 20 : mini ? 15 : 18} />}\n {onShare && glass('Share', D.share, 1.6, onShare)}\n {canFull() && !noFull && glass(isFull ? 'Exit full screen' : 'Full screen', isFull ? ICON_EXIT : ICON_FULL, 1.7, () => realFull(!isFull))}\n {onClose && glass('Close player', D.close, 1.7, onClose)}\n </div>\n );\n const top = (mute || cc || onSettings) && (\n <div className=\"gfull__top\">\n {mute && glass(mute.muted ? 'Unmute' : 'Mute', mute.muted ? D.volumeOff : D.volume, 1.6, mute.onToggle)}\n {cc && glass(cc.on ? 'Hide subtitles' : 'Show subtitles', cc.on ? D.cc : D.ccOff, 1.7, cc.onToggle, undefined, 4)}\n {onSettings && glass('Settings', D.cog, 1.6, onSettings)}\n </div>\n );\n return (\n <div ref={rootRef} className={`gfull${big ? ' gfull--desk' : ''}${mini ? ' gfull--mini' : ''}${small ? ' gfull--small' : ''}${swipeFull ? ' gfull--swipe' : ''}${ad ? ' gfull--ad' : ''}${calm ? ' gfull--calm' : ''}`} data-theme=\"dark\" role=\"dialog\" aria-label={title} onPointerMove={onMove} onPointerDownCapture={(e) => { if (calm) swallow.current = true; setTouchN((n) => n + 1); if (!(e.target as Element).closest?.('[aria-label=\"Exit full screen\"], [aria-label=\"Full screen\"], [aria-label=\"Close player\"]')) onTouch(); }}\n onClickCapture={(e) => { if (swallow.current) { swallow.current = false; e.stopPropagation(); e.preventDefault(); } }}>\n {swipeFull && barsUp && <div className=\"gfull__swipe\" aria-live=\"polite\"><Icon d=\"m4.5 15.75 7.5-7.5 7.5 7.5\" size={14} sw={2} />Swipe up for full screen</div>}\n <div className={`gfull__frame${land ? ' gfull__frame--land' : ''}`}>\n {picture}\n <div className=\"gfull__shade\" aria-hidden=\"true\" />\n {paused && !ad && (\n <div className={`gfull__pausedinfo${!transport.playing ? ' gfull__pausedinfo--on' : ''}`} aria-hidden={transport.playing}>\n <div className=\"gfull__pausedtext\">\n <div className=\"gfull__pausedhead\">{(mini || small) && <span className=\"gfull__pausedmark\" aria-hidden=\"true\"><Mark dark size={20} /></span>}<div className=\"gfull__pausedtitle\">{paused.title}</div></div>\n {paused.summary && <div className=\"gfull__pausedsum\">{paused.summary}</div>}\n </div>\n {shareCard}\n </div>\n )}\n {top}\n {copied}\n {wait ? (\n typeof wait === 'string'\n ? <div className=\"gfull__sub\" aria-live=\"polite\"><div className=\"gfull__wait\"><span className=\"gfull__spin\" aria-hidden=\"true\" />{wait}</div></div>\n : <div className=\"gfull__sub\">{wait}</div>\n ) : sub && (\n <div className=\"gfull__sub\">\n <div ref={subBox}>\n <div className=\"gfull__subback\" aria-hidden=\"true\"><span>{sub.who && <><b>{sub.who}:</b> </>}{sub.words.map((w) => w.t + w.sp).join('')}</span></div>\n <span>{sub.who && <><b style={{ color: sub.color }}>{sub.who}:</b> </>}{sub.words.map((w, j) => <span key={j} data-said={w.dim ? undefined : ''} data-at={sub.cursor != null && j <= sub.cursor ? '' : undefined} style={w.dim ? DIM_WORD : undefined}>{w.t}{w.sp}</span>)}</span>\n </div>\n </div>\n )}\n <div className={`gfull__prog${big ? '' : ' gfull__prog--two'}`}>\n {big ? (\n <>\n <GlassBrand live={pos.live} desk pct={pct} />\n <GlassTransport t={transport} />\n <SeekRow pos={pos} interactive />\n <div className=\"gfull__chip\">{chip}</div>\n {acts}\n </>\n ) : mini ? (\n <div className=\"gfull__row\"><GlassTransport t={transport} mini /><SeekRow pos={pos} interactive /><div className=\"gfull__chip\">{chip}</div>{acts}</div>\n ) : (\n <>\n <div className=\"gfull__row\"><GlassBrand live={pos.live} pct={pct} mark /><SeekRow pos={pos} interactive /></div>\n <div className=\"gfull__row\"><GlassTransport t={transport} /><span style={{ flex: 1 }} /><div className=\"gfull__chip\">{chip}</div>{acts}</div>\n </>\n )}\n </div>\n {picker}\n {sheet}\n {voices}\n </div>\n </div>\n );\n}\n\n\nexport function ListenerHeader({ dark, back: onBack, home, live, title, badge, subline, onOptions, optionsActive }: { dark: boolean; back?: () => void; home?: boolean; live?: boolean; title?: string; badge?: React.ReactNode; subline?: string; onOptions: () => void; optionsActive?: boolean }) {\n return (\n <div className=\"ghead\">\n {onBack && <button type=\"button\" className=\"ghead__back\" aria-label=\"Back\" title=\"Back\" onClick={onBack}><Icon d={D.chevronLeft} size={19} sw={1.7} /></button>}\n {live && <span className=\"mark\"><Mark dark={dark} size={30} /></span>}\n <div style={{ flex: 1, minWidth: 0, display: 'flex' }}>\n {home ? (\n <div className=\"ghead__logo\"><Logo dark={dark} height={22} /></div>\n ) : (\n <div className=\"ghead__title\" onClick={onBack} title={onBack ? 'Back' : undefined} style={{ cursor: onBack ? 'pointer' : 'default' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <span className=\"ghead__name\">{title}</span>\n {badge}\n </div>\n {subline && <div className=\"ghead__sub\">{subline}</div>}\n </div>\n )}\n </div>\n <IconButton size=\"sm\" bordered={false} variant={optionsActive ? 'primary' : undefined} onClick={onOptions} label=\"Options\">\n <svg viewBox=\"0 0 24 24\" width=\"19\" height=\"19\" fill=\"currentColor\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"5.5\" r=\"1.85\" /><circle cx=\"12\" cy=\"12\" r=\"1.85\" /><circle cx=\"12\" cy=\"18.5\" r=\"1.85\" /></svg>\n </IconButton>\n </div>\n );\n}\nconst VIDEO_D = 'm15.75 10.5 4.72-4.72a.75.75 0 0 1 1.28.53v11.38a.75.75 0 0 1-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25h-9A2.25 2.25 0 0 0 2.25 7.5v9a2.25 2.25 0 0 0 2.25 2.25Z';\nexport const modeOptions = (t: Strings, video = false) => [{ value: 'read' as const, label: t.read, icon: <Icon d={D.book} size={17} /> }, { value: 'listen' as const, label: <span style={{ display: 'inline-block', minWidth: 52, textAlign: 'center' }}>{video ? t.watch : t.listen}</span>, icon: <Icon d={video ? VIDEO_D : D.headphones} size={19} sw={1.5} /> }];\n","export const DEFAULT_APP = 'https://app.vocalstack.com';\nconst PATH = '/connect/transcribe';\n\nexport interface Started { transcriptionId: string; recordingId: string; token: string; expiresAt: string | null }\n\nexport type PopupStatus = 'signing-in' | 'consent' | 'looking' | 'confirm' | 'checking' | 'starting';\n\nfunction nonce(): string {\n const b = new Uint8Array(24);\n crypto.getRandomValues(b);\n return btoa(String.fromCharCode(...b)).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nexport function openPopup(appUrl: string | undefined, ask: { url?: string; transcription?: string; ask?: boolean; connect?: boolean }, onStatus?: (s: PopupStatus) => void): Promise<Started | 'connected' | null> {\n const app = new URL(appUrl ?? DEFAULT_APP);\n const n = nonce();\n const u = new URL(PATH, app);\n if (ask.url) u.searchParams.set('url', ask.url);\n if (ask.transcription) u.searchParams.set('transcription', ask.transcription);\n if (ask.ask) u.searchParams.set('ask', '1');\n if (ask.connect) u.searchParams.set('connect', '1');\n u.searchParams.set('origin', window.location.origin);\n u.searchParams.set('nonce', n);\n const w = 480, h = 640;\n const left = Math.max(0, (window.screenX ?? 0) + ((window.outerWidth ?? w) - w) / 2);\n const top = Math.max(0, (window.screenY ?? 0) + ((window.outerHeight ?? h) - h) / 2);\n const pop = window.open(u.toString(), 'vocalstack-connect', `popup=yes,width=${w},height=${h},left=${Math.round(left)},top=${Math.round(top)}`);\n if (!pop) return Promise.reject(new Error('Your browser blocked the VocalStack window. Allow pop-ups for this site and try again.'));\n return new Promise((resolve, reject) => {\n let done = false;\n const finish = (fn: () => void) => { if (done) return; done = true; window.removeEventListener('message', on); clearInterval(watch); fn(); };\n const on = (ev: MessageEvent) => {\n if (ev.origin !== app.origin || ev.source !== pop) return;\n const d = ev.data as { source?: string; type?: string; nonce?: string; [k: string]: any } | null;\n if (!d || d.source !== 'vocalstack' || d.nonce !== n) return;\n if (d.type === 'vocalstack:hello') { pop.postMessage({ source: 'vocalstack', type: 'vocalstack:hello-ack', nonce: n }, app.origin); return; }\n if (d.type === 'vocalstack:status') { onStatus?.(d.status); return; }\n if (d.type === 'vocalstack:started' || d.type === 'vocalstack:token' || d.type === 'vocalstack:found') {\n finish(() => resolve({ transcriptionId: String(d.transcriptionId), recordingId: String(d.recordingId), token: String(d.token), expiresAt: d.expiresAt ?? null }));\n return;\n }\n if (d.type === 'vocalstack:connected') { finish(() => resolve('connected')); return; }\n if (d.type === 'vocalstack:declined') { finish(() => resolve(null)); return; }\n if (d.type === 'vocalstack:error') finish(() => reject(new Error(typeof d.message === 'string' && d.message ? d.message : 'VocalStack could not start this transcription.')));\n };\n window.addEventListener('message', on);\n const watch = setInterval(() => { if (pop.closed) finish(() => resolve(null)); }, 500);\n });\n}\n\nexport async function startFromEmbed(appUrl: string | undefined, url: string, onStatus?: (s: PopupStatus) => void): Promise<Started | null> {\n const r = await openPopup(appUrl, { url }, onStatus);\n return r === 'connected' ? null : r;\n}\n\nconst CONNECTED = 'vsp.connected';\n\nexport function wasConnected(appUrl: string | undefined): boolean {\n try { return localStorage.getItem(CONNECTED) === new URL(appUrl ?? DEFAULT_APP).origin; } catch { return false; }\n}\n\nexport function rememberConnected(appUrl: string | undefined): void {\n try { localStorage.setItem(CONNECTED, new URL(appUrl ?? DEFAULT_APP).origin); } catch { }\n}\n","import { useEffect, useState } from 'react';\nimport { D, Icon, Mark, Spinner } from '../ds/Icons';\nimport { startFromEmbed, type PopupStatus, type Started } from '../data/connect';\n\nexport interface EndCardOptions {\n appUrl?: string;\n title?: string;\n note?: string;\n}\n\nconst STATUS: Record<PopupStatus, string> = {\n 'signing-in': 'Sign in to VocalStack in the window that opened…',\n consent: 'Confirm in the VocalStack window…',\n looking: 'Looking for your transcription of this video…',\n confirm: 'Confirm in the VocalStack window…',\n checking: 'Checking the link…',\n starting: 'Starting the transcription…',\n};\n\nconst LINK = /^(https?:\\/\\/)?([\\w-]+\\.)+[a-z]{2,}(\\/\\S*)?$/i;\n\nexport function EndCard({ options, onStarted, onReplay, onClose }: { options: EndCardOptions; onStarted: (s: Started) => void; onReplay: () => void; onClose: () => void }) {\n const [url, setUrl] = useState('');\n const [busy, setBusy] = useState(false);\n const [err, setErr] = useState<string | null>(null);\n const [status, setStatus] = useState<PopupStatus | null>(null);\n useEffect(() => {\n const key = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n window.addEventListener('keydown', key);\n return () => window.removeEventListener('keydown', key);\n }, [onClose]);\n const clean = url.trim();\n const ok = LINK.test(clean);\n const go = async () => {\n if (!ok || busy) return;\n setBusy(true);\n setErr(null);\n try {\n const s = await startFromEmbed(options.appUrl, /^https?:\\/\\//i.test(clean) ? clean : `https://${clean}`, setStatus);\n if (s) onStarted(s);\n } catch (e) {\n setErr(e instanceof Error ? e.message : 'Something went wrong. Please try again.');\n } finally {\n setBusy(false);\n setStatus(null);\n }\n };\n return (\n <div className=\"vsp-end vsp-end--v2\" role=\"dialog\" aria-label=\"Transcribe another video\" onPointerDown={(e) => e.stopPropagation()} onClick={(e) => { e.stopPropagation(); if (e.target === e.currentTarget) onClose(); }}>\n <button type=\"button\" className=\"gfull__btn vsp-end2__close\" aria-label=\"Close\" title=\"Close\" onClick={onClose}><Icon d={D.close} size={17} sw={1.8} /></button>\n <div className=\"vsp-end2\">\n <span className=\"vsp-end2__mark\"><Mark dark size={26} /></span>\n <div className=\"vsp-end2__title\">{options.title ?? 'Watch another video in your language'}</div>\n <form className=\"vsp-end2__field\" onSubmit={(e) => { e.preventDefault(); void go(); }}>\n <Icon d={D.link} size={16} sw={1.8} style={{ flex: 'none', color: 'rgba(238,240,248,.55)' }} />\n <input className=\"vsp-end2__input\" type=\"url\" inputMode=\"url\" autoComplete=\"off\" spellCheck={false} placeholder=\"Paste a video link\" value={url} onChange={(e) => { setUrl(e.target.value); setErr(null); }} aria-label=\"Video link\" />\n <button type=\"submit\" className=\"vsp-end2__go\" disabled={!ok || busy} aria-label=\"Transcribe\" title=\"Transcribe\">{busy ? <Spinner size={15} color=\"#06101c\" track=\"rgba(6,16,28,.25)\" /> : <Icon d={D.arrowRight} size={17} sw={2} />}</button>\n </form>\n <div className=\"vsp-end2__note\" role={busy ? 'status' : undefined}>{busy ? STATUS[status ?? 'checking'] : (options.note ?? 'YouTube, Vimeo, TikTok and more, with subtitles and spoken translations.')}</div>\n {err && <div className=\"vsp-end__err\" role=\"alert\">{err}</div>}\n <button type=\"button\" className=\"vsp-end2__replay\" onClick={onReplay}><Icon d={D.uturn} size={14} sw={1.8} />Replay</button>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\n\nexport function useDesk(forced?: boolean): boolean {\n const [desk, setDesk] = useState(() => (typeof window === 'undefined' ? true : window.innerWidth >= 880));\n useEffect(() => {\n if (forced != null) return;\n const on = () => setDesk(window.innerWidth >= 880);\n window.addEventListener('resize', on);\n return () => window.removeEventListener('resize', on);\n }, [forced]);\n return forced ?? desk;\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { GrowBox, Sheet, Switch, Toggle } from '../ds/Controls';\nimport { D, Icon } from '../ds/Icons';\nimport { useLanguageList } from '../ds/LanguagePicker';\nimport { useLanguages } from '../data/transcript';\nimport { pickerLanguages, useRecentLangs } from '../data/prefs';\nimport { REMOVE_BG_LABEL } from '../core/background';\nimport { langMeta } from './shared';\n\nexport interface IdlePrefs {\n lang: string | null;\n subtitles: boolean;\n speakerLabels: boolean;\n wordHighlight: boolean;\n translateAudio: boolean;\n voices: 'cloned' | 'synthetic';\n removeBackground: boolean;\n muted: boolean;\n}\n\nconst HINT_CODES = ['es', 'fr', 'ro', 'ja', 'pt'];\n\nexport const IDLE_DEFAULTS: IdlePrefs = { lang: null, subtitles: true, speakerLabels: false, wordHighlight: true, translateAudio: true, voices: 'cloned', removeBackground: false, muted: false };\n\ntype Page = 'main' | 'lang' | 'subs' | 'audio';\n\nexport function useIdleControls(prefs: IdlePrefs, set: (p: Partial<IdlePrefs>) => void) {\n const langs = useLanguages();\n const [recent, pushRecent] = useRecentLangs();\n const [sheet, setSheet] = useState<'settings' | 'lang' | null>(null);\n const [page, setPage] = useState<Page>('main');\n const meta = langMeta(langs, prefs.lang);\n const languages = useMemo(() => pickerLanguages(langs, 'translation'), [langs]);\n const pick = (c: string | null) => { set({ lang: c }); pushRecent(c); };\n const list = useLanguageList({ open: sheet === 'lang' || (sheet === 'settings' && page === 'lang'), onClose: () => (sheet === 'lang' ? setSheet(null) : setPage('main')), value: prefs.lang, onSelect: pick, languages, none: 'As spoken', pinned: prefs.lang ? [prefs.lang] : [], recent, keepOpen: true });\n const close = () => { setSheet(null); setPage('main'); };\n const flag = prefs.lang ? <span style={{ fontSize: 19, lineHeight: 1 }}>{meta.flag}</span> : <Icon d={D.langAuto} size={19} sw={1.7} />;\n const [hint, setHint] = useState(() => { try { return sessionStorage.getItem('vsp.langHint') !== 'false'; } catch { return true; } });\n const dropHint = () => { setHint(false); try { sessionStorage.setItem('vsp.langHint', 'false'); } catch { } };\n const hintLangs = useMemo(() => HINT_CODES.map((c) => languages.find((l) => l.code === c)).filter((l): l is (typeof languages)[number] => !!l), [languages]);\n const tipRef = useRef<HTMLSpanElement>(null);\n const [roomy, setRoomy] = useState(false);\n useEffect(() => {\n const root = tipRef.current?.closest('.gfull') ?? tipRef.current?.closest('.vsp');\n if (!root) return;\n const ro = new ResizeObserver(() => setRoomy(root.clientWidth >= 520 && root.clientHeight >= 300));\n ro.observe(root);\n return () => ro.disconnect();\n }, []);\n const hintOn = roomy && hint && !prefs.lang && sheet == null && hintLangs.length > 0;\n const [hintIdx, setHintIdx] = useState(0);\n useEffect(() => {\n if (!hintOn) return;\n const id = setInterval(() => setHintIdx((i) => i + 1), 1700);\n return () => clearInterval(id);\n }, [hintOn]);\n const hintAt = hintLangs[hintIdx % Math.max(1, hintLangs.length)];\n const openLang = () => { dropHint(); setPage('main'); setSheet('lang'); };\n const bubble = hintOn && hintAt ? (\n <div className=\"vsp-langhint\" onClick={(e) => e.stopPropagation()}>\n <button type=\"button\" className=\"vsp-langhint__pick\" onClick={openLang} aria-label=\"Choose a language\">\n <Icon d={D.language} size={16} sw={1.5} style={{ color: 'var(--brand)', flex: 'none' }} />\n <span key={hintIdx} className=\"vsp-langhint__lang\" style={{ animation: `vs-swap-${hintIdx % 2 ? 'a' : 'b'} .4s cubic-bezier(.2,.8,.2,1) both` }}>\n <span className=\"vsp-langhint__flag\">{hintAt.flag}</span>\n <span className=\"vsp-langhint__name\">{hintAt.native}</span>\n </span>\n <span className=\"vsp-langhint__dots\">{hintLangs.map((o, i) => <span key={o.code} className={i === hintIdx % hintLangs.length ? 'is-on' : undefined} />)}</span>\n <span className=\"vsp-langhint__count\">100+</span>\n </button>\n <button type=\"button\" className=\"vsp-langhint__close\" aria-label=\"Dismiss\" onClick={dropHint}><Icon d={D.close} size={14} sw={1.6} /></button>\n <span className=\"vsp-langhint__arrow\" />\n </div>\n ) : null;\n const chip = (\n <span ref={tipRef} className=\"vsp-btip\" data-hint={bubble ? '' : undefined} data-tip={`Language: ${prefs.lang ? meta.label : 'As spoken'}`} data-open={sheet === 'lang' ? '' : undefined}>\n <button type=\"button\" className=\"gfull__btn\" aria-label={`Language: ${prefs.lang ? meta.label : 'As spoken'}`} onClick={(e) => { e.stopPropagation(); dropHint(); setPage('main'); setSheet((s) => (s === 'lang' ? null : 'lang')); }}>{flag}</button>\n {bubble}\n </span>\n );\n const chev = <Icon d={D.chevronRight} size={17} sw={1.6} style={{ flex: 'none', color: 'var(--ink-45)' }} />;\n const back = (\n <span className=\"vs-sheet__title\" style={{ position: 'relative' }}>\n {' '}\n <button type=\"button\" onClick={() => setPage('main')} aria-label=\"Back\" className=\"vsp-idlesheet__back\"><Icon d={D.chevronLeft} size={18} sw={1.8} />Back</button>\n </span>\n );\n const body = { display: 'flex', flexDirection: 'column' as const, gap: 2, paddingBottom: 14 };\n const row = (title: string, sub: string, ctl: React.ReactNode) => (\n <div className=\"srow\"><div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">{title}</div><div className=\"srow__s\">{sub}</div></div>{ctl}</div>\n );\n const langList = (\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <div style={{ position: 'sticky', top: 0, zIndex: 1, padding: '4px 14px 10px', background: 'var(--vs-surface-raised)' }}>{list.search}</div>\n {list.list}\n </div>\n );\n const settingsBody = page === 'lang' ? langList : page === 'subs' ? (\n <div style={body}>\n {row('Show subtitles', 'Captions over the video', <Toggle checked={prefs.subtitles} onChange={(v) => set({ subtitles: v })} label=\"Show subtitles\" />)}\n {row('Show speaker labels', 'Who is speaking, before each line', <Toggle checked={prefs.speakerLabels} onChange={(v) => set({ speakerLabels: v })} label=\"Show speaker labels\" />)}\n {row('Highlight words', 'Follow each word as it is spoken', <Toggle checked={prefs.wordHighlight} onChange={(v) => set({ wordHighlight: v })} label=\"Highlight words\" />)}\n </div>\n ) : page === 'audio' ? (\n <div style={body}>\n {row('Translate audio', prefs.lang ? 'Hear the translation read aloud instead of the original speech' : 'Pick a language to hear the translation read aloud', <Toggle checked={prefs.translateAudio && !!prefs.lang} onChange={(v) => set({ translateAudio: v })} label=\"Translate audio\" disabled={!prefs.lang} />)}\n {row('Voices', prefs.voices === 'cloned' ? 'Each speaker in their own cloned voice, where they agreed to it' : 'Synthetic voices matched to each speaker', <Switch<'synthetic' | 'cloned'> value={prefs.voices} onChange={(v) => set({ voices: v })} size=\"sm\" options={[{ value: 'synthetic', label: 'Synthetic' }, { value: 'cloned', label: 'Cloned' }]} />)}\n {row(REMOVE_BG_LABEL, \"Takes out everything that isn't speech: music, ambience and noise.\", <Toggle checked={prefs.removeBackground} onChange={(v) => set({ removeBackground: v })} label={REMOVE_BG_LABEL} />)}\n </div>\n ) : (\n <div style={body}>\n <div className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('lang')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Language</div><div className=\"srow__s\">{prefs.lang ? `Translated to ${meta.label}` : 'Original language'}</div></div>\n <span style={{ fontSize: 18, lineHeight: 1 }}>{prefs.lang ? meta.flag : null}</span>{chev}\n </div>\n <div className=\"sdiv\" />\n <div className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('subs')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Subtitles</div><div className=\"srow__s\">{prefs.subtitles ? 'On · speaker labels and word highlighting' : 'Off'}</div></div>{chev}\n </div>\n <div className=\"sdiv\" />\n <div className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('audio')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Audio</div><div className=\"srow__s\">{prefs.lang && prefs.translateAudio ? `Translated, ${prefs.voices === 'cloned' ? 'cloned voices' : 'synthetic voices'}` : prefs.removeBackground ? 'Original speech, background removed' : 'Original sound'}</div></div>{chev}\n </div>\n </div>\n );\n const sheets = (\n <>\n <Sheet open={sheet === 'lang'} onClose={close} title=\"LANGUAGE\" kind=\"picker\" header={list.search} sticky>\n <GrowBox>{list.list}</GrowBox>\n </Sheet>\n <Sheet open={sheet === 'settings'} onClose={close} title={{ main: 'SETTINGS', lang: 'LANGUAGE', subs: 'SUBTITLES', audio: 'AUDIO' }[page]} titleNode={page === 'main' ? undefined : back} kind={page === 'main' ? 'settings' : 'settings vs-sheet--page'} sticky>\n <GrowBox>{settingsBody}</GrowBox>\n </Sheet>\n </>\n );\n return {\n chip,\n sheets,\n sheetOpen: sheet != null,\n openSettings: () => { setPage('main'); setSheet((s) => (s === 'settings' ? null : 'settings')); },\n };\n}\n","export function shareCodeOf(raw: string): string | null {\n const v = raw.trim();\n if (!v) return null;\n try {\n const u = new URL(/^[a-z][a-z0-9+.-]*:\\/\\//i.test(v) ? v : `https://${v}`);\n const m = /^\\/(?:t|v)\\/([a-z0-9]{6,24})(?:\\/.*)?$/i.exec(u.pathname);\n return m ? m[1].toLowerCase() : null;\n } catch {\n return null;\n }\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\n\ntype Tile = { name: string; glyph: ReactNode; tint: string };\n\nconst fill = (d: string, rule: 'evenodd' | 'nonzero' = 'nonzero') => <path d={d} fill=\"currentColor\" fillRule={rule} />;\n\nconst file = (ext: string): ReactNode => (\n <>\n <path d=\"M6.5 2.75h7.25l4.75 4.75v12.25a1.5 1.5 0 0 1-1.5 1.5H6.5a1.5 1.5 0 0 1-1.5-1.5V4.25a1.5 1.5 0 0 1 1.5-1.5Z\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinejoin=\"round\" />\n <path d=\"M13.75 2.75V7.5h4.75\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinejoin=\"round\" />\n <text x=\"11.75\" y=\"17.4\" textAnchor=\"middle\" fontSize={ext.length > 3 ? 4.4 : 5.2} fontWeight=\"800\" fill=\"currentColor\" fontFamily=\"inherit\" letterSpacing=\".2\">{ext}</text>\n </>\n);\n\nconst TILES: Tile[] = [\n { name: 'YouTube', tint: '#ff3b30', glyph: fill('M21.6 7.2a2.7 2.7 0 0 0-1.9-1.9C18 4.8 12 4.8 12 4.8s-6 0-7.7.5a2.7 2.7 0 0 0-1.9 1.9C2 8.9 2 12 2 12s0 3.1.4 4.8a2.7 2.7 0 0 0 1.9 1.9c1.7.5 7.7.5 7.7.5s6 0 7.7-.5a2.7 2.7 0 0 0 1.9-1.9c.4-1.7.4-4.8.4-4.8s0-3.1-.4-4.8ZM10 15.1V8.9l5.3 3.1L10 15.1Z', 'evenodd') },\n { name: 'MP3', tint: '#f78472', glyph: file('MP3') },\n { name: 'Vimeo', tint: '#1ab7ea', glyph: fill('M22 7.4c-.1 2-1.5 4.7-4.2 8.1-2.8 3.6-5.1 5.4-7 5.4-1.2 0-2.2-1.1-3-3.3L6.2 11.6C5.6 9.4 5 8.3 4.3 8.3c-.1 0-.6.3-1.4.9L2 8l2.7-2.4C5.9 4.6 6.8 4 7.4 4c1.4-.1 2.3.9 2.6 2.9.4 2.2.6 3.6.8 4.1.4 1.8.9 2.7 1.4 2.7.4 0 1-.6 1.8-1.9.8-1.2 1.2-2.2 1.3-2.8.1-1.1-.3-1.6-1.3-1.6-.5 0-.9.1-1.4.3.9-3 2.7-4.5 5.3-4.4 1.9.1 2.8 1.3 2.7 3.7Z') },\n { name: 'Video', tint: '#55abe5', glyph: <><rect x=\"3\" y=\"5.5\" width=\"13\" height=\"13\" rx=\"2.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />{fill('M16 10.2 21 7v10l-5-3.2v-3.6Z')}</> },\n { name: 'Twitch', tint: '#a970ff', glyph: fill('M5 2.5 3 6.5v13h4.5V22H10l2.5-2.5h3.8L21 14.8V2.5H5Zm14 11.4-2.9 2.9h-4.3L9.4 19.2v-2.4H6V4.5h13v9.4ZM15.2 7.4h1.9v5.2h-1.9V7.4Zm-5 0h1.9v5.2h-1.9V7.4Z', 'evenodd') },\n { name: 'WAV', tint: '#7ee0b4', glyph: file('WAV') },\n { name: 'SoundCloud', tint: '#ff7a1a', glyph: <>{fill('M11 8.6a5 5 0 0 1 7.8 3.1 3 3 0 0 1-.3 6H11V8.6Z')}<rect x=\"8.6\" y=\"9.4\" width=\"1.3\" height=\"8.3\" rx=\".65\" fill=\"currentColor\" /><rect x=\"6.2\" y=\"10.6\" width=\"1.3\" height=\"7.1\" rx=\".65\" fill=\"currentColor\" /><rect x=\"3.8\" y=\"12.2\" width=\"1.3\" height=\"5.5\" rx=\".65\" fill=\"currentColor\" /><rect x=\"1.4\" y=\"13.8\" width=\"1.3\" height=\"3.9\" rx=\".65\" fill=\"currentColor\" /></> },\n { name: 'MP4', tint: '#5b63d7', glyph: file('MP4') },\n { name: 'TikTok', tint: '#25f4ee', glyph: fill('M16.6 2.5c.3 2.3 1.7 3.8 3.9 4v2.7a6.8 6.8 0 0 1-3.9-1.3v6.5a5.7 5.7 0 1 1-5.7-5.7l.9.1v2.8a2.9 2.9 0 1 0 2 2.8V2.5h2.8Z') },\n { name: 'Audio', tint: '#f7c948', glyph: <g fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\"><path d=\"M3 10.5v3M6.5 7.5v9M10 4.5v15M13.5 8v8M17 6v12M20.5 10v4\" /></g> },\n { name: 'X', tint: '#e8eaf2', glyph: fill('M17.8 3h3.1l-6.7 7.7L22 21h-6.2l-4.8-6.3L5.5 21H2.4l7.2-8.2L2.1 3h6.3l4.4 5.8L17.8 3Zm-1.1 16.2h1.7L7.4 4.7H5.6l11.1 14.5Z') },\n { name: 'MOV', tint: '#55abe5', glyph: file('MOV') },\n { name: 'Facebook', tint: '#3b82f6', glyph: fill('M13.9 21.5v-8h2.7l.4-3.1h-3.1V8.4c0-.9.3-1.5 1.6-1.5H17V4.1c-.3 0-1.3-.1-2.4-.1-2.4 0-4 1.4-4 4.1v2.3H7.9v3.1h2.7v8h3.3Z') },\n { name: 'Podcast', tint: '#c46bff', glyph: <g fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"><rect x=\"9\" y=\"3\" width=\"6\" height=\"10.5\" rx=\"3\" /><path d=\"M5.5 11a6.5 6.5 0 0 0 13 0M12 17.5V21M8.5 21h7\" /></g> },\n { name: 'Instagram', tint: '#f56aa0', glyph: <g fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\"><rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"5\" /><circle cx=\"12\" cy=\"12\" r=\"4\" /><circle cx=\"17.2\" cy=\"6.8\" r=\".9\" fill=\"currentColor\" stroke=\"none\" /></g> },\n { name: 'M4A', tint: '#f78472', glyph: file('M4A') },\n { name: 'Dailymotion', tint: '#4aa3ff', glyph: fill('M14.6 3.5h3.2V20h-3v-1.2a5.4 5.4 0 0 1-3.6 1.4c-3.3 0-5.9-2.7-5.9-6.1S7.9 8 11.2 8c1.3 0 2.5.4 3.4 1.2V3.5Zm-3.1 7.4a3.2 3.2 0 1 0 0 6.4 3.2 3.2 0 0 0 0-6.4Z', 'evenodd') },\n { name: 'Radio', tint: '#7ee0b4', glyph: <g fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"1.8\" fill=\"currentColor\" stroke=\"none\" /><path d=\"M8.5 15.5a5 5 0 0 1 0-7M15.5 8.5a5 5 0 0 1 0 7M5.6 18.4a9 9 0 0 1 0-12.8M18.4 5.6a9 9 0 0 1 0 12.8\" /></g> },\n { name: 'WEBM', tint: '#5b63d7', glyph: file('WEBM') },\n { name: 'Loom', tint: '#8f7bff', glyph: fill('M21 11h-5.2l4.5-2.6-1-1.7-4.5 2.6 2.6-4.5-1.7-1-2.6 4.5V3h-2v5.3L8.5 3.8l-1.7 1 2.6 4.5-4.5-2.6-1 1.7L8.2 11H3v2h5.2l-4.5 2.6 1 1.7 4.5-2.6-2.6 4.5 1.7 1 2.6-4.5V21h2v-5.2l2.6 4.5 1.7-1-2.6-4.5 4.5 2.6 1-1.7-4.5-2.6H21v-2Zm-9 3.4a2.4 2.4 0 1 1 0-4.8 2.4 2.4 0 0 1 0 4.8Z', 'evenodd') },\n { name: 'FLAC', tint: '#f7c948', glyph: file('FLAC') },\n { name: 'Live', tint: '#ff5a5a', glyph: <g fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"><rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"3\" /><circle cx=\"8\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\" /><path d=\"M11.5 10h6M11.5 14h4\" /></g> },\n];\n\nconst ROWS = 14;\nconst COPIES = 4;\n\nfunction row(i: number): Tile[] {\n const n = TILES.length;\n const out: Tile[] = [];\n for (let k = 0; k < 11; k++) out.push(TILES[(k + i * 7) % n]);\n return out;\n}\n\nfunction Cell({ t }: { t: Tile }) {\n return (\n <span className=\"vsp-prov__tile\" style={{ ['--tint' as string]: t.tint }}>\n <svg viewBox=\"0 0 24 24\" width=\"100%\" height=\"100%\" aria-hidden=\"true\">{t.glyph}</svg>\n <span className=\"vsp-prov__name\">{t.name}</span>\n </span>\n );\n}\n\nexport function ProviderGrid() {\n const ref = useRef<HTMLDivElement>(null);\n const [seen, setSeen] = useState(true);\n const [shown, setShown] = useState(() => typeof document === 'undefined' || !document.hidden);\n useEffect(() => {\n const vis = () => setShown(!document.hidden);\n document.addEventListener('visibilitychange', vis);\n const el = ref.current;\n let io: IntersectionObserver | null = null;\n if (el && typeof IntersectionObserver !== 'undefined') {\n io = new IntersectionObserver(([e]) => setSeen(e.isIntersecting));\n io.observe(el);\n }\n return () => { document.removeEventListener('visibilitychange', vis); io?.disconnect(); };\n }, []);\n return (\n <div ref={ref} className={`vsp-prov${seen && shown ? '' : ' vsp-prov--still'}`} aria-hidden=\"true\">\n <div className=\"vsp-prov__plane\">\n {Array.from({ length: ROWS }, (_, i) => {\n const cells = row(i);\n return (\n <div key={i} className={`vsp-prov__row${i % 2 ? ' vsp-prov__row--rev' : ''}`} style={{ animationDuration: `${80 + i * 11}s`, animationDelay: `-${i * 17}s` }}>\n {Array.from({ length: COPIES }, (_, c) => cells.map((t, k) => <Cell key={`${c}-${k}`} t={t} />))}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback, useLayoutEffect, useRef, useState, type ReactNode } from 'react';\nimport { D, Icon, Spinner } from '../ds/Icons';\nimport { ytIdOf } from '../core/youtube';\nimport { siteOf } from '../core/sites';\nimport { openPopup, rememberConnected, wasConnected, type PopupStatus, type Started } from '../data/connect';\nimport { FullVideo, type PlayerPos, type PlayerTransport } from './full';\nimport { useDesk } from './useDesk';\nimport { useIdleControls, type IdlePrefs } from './IdleSettings';\nimport { shareLink } from './shared';\nimport { shareCodeOf } from '../core/share';\nimport { ProviderGrid } from './Providers';\n\nexport interface IdleState { prefs: IdlePrefs; set: (p: Partial<IdlePrefs>) => void; shareUrl?: string }\n\nconst STATUS: Record<PopupStatus, string> = {\n 'signing-in': 'Sign in to VocalStack in the window that opened…',\n consent: 'Confirm in the VocalStack window…',\n looking: 'Looking for your transcription of this video…',\n confirm: 'Confirm in the VocalStack window…',\n checking: 'Checking the link…',\n starting: 'Starting the transcription…',\n};\n\nconst LINK = /^(https?:\\/\\/)?([\\w-]+\\.)+[a-z]{2,}(\\/\\S*)?$/i;\n\nexport function hostOf(src: string): string {\n try { return new URL(src).hostname.replace(/^www\\./, ''); } catch { return src; }\n}\n\nexport interface Connect {\n busy: boolean;\n status: PopupStatus | null;\n err: string | null;\n connected: boolean;\n connect: () => void;\n start: (url: string, ask: boolean) => void;\n}\n\nexport function useConnect(appUrl: string | undefined, onReady: (s: Started) => void): Connect {\n const [busy, setBusy] = useState(false);\n const [status, setStatus] = useState<PopupStatus | null>(null);\n const [err, setErr] = useState<string | null>(null);\n const [connected, setConnected] = useState(() => wasConnected(appUrl));\n const run = useCallback((ask: Parameters<typeof openPopup>[1]) => {\n if (busy) return;\n setBusy(true);\n setErr(null);\n let p: ReturnType<typeof openPopup>;\n try { p = openPopup(appUrl, ask, setStatus); } catch (e) { p = Promise.reject(e); }\n p.then((s) => {\n if (!s) return;\n rememberConnected(appUrl);\n setConnected(true);\n if (s !== 'connected') onReady(s);\n })\n .catch((e) => setErr(e instanceof Error ? e.message : 'Something went wrong. Please try again.'))\n .finally(() => { setBusy(false); setStatus(null); });\n }, [appUrl, busy, onReady]);\n const connect = useCallback(() => run({ connect: true }), [run]);\n const start = useCallback((url: string, ask: boolean) => run({ url, ask }), [run]);\n return { busy, status, err, connected, connect, start };\n}\n\nfunction isMedia(src: string): boolean {\n return /\\.(mp4|webm|mov|m4v|ogv|mkv)(\\?|#|$)/i.test(src);\n}\n\nfunction Backdrop({ poster, src }: { poster: string | null; src: string | null }) {\n const yt = src && siteOf(src)?.id === 'youtube' ? ytIdOf(src) : null;\n const img = poster ?? (yt ? `https://i.ytimg.com/vi/${yt}/hqdefault.jpg` : null);\n if (img) return <div className=\"vsp-idle__pic\" style={{ backgroundImage: `url(${img})` }} />;\n if (src && isMedia(src)) return <video className=\"vsp-idle__pic vsp-idle__frame\" src={`${src}#t=1`} muted playsInline preload=\"metadata\" aria-hidden=\"true\" />;\n return <><div className=\"vsp-idle__pic vsp-idle__pic--brand\" /><ProviderGrid /></>;\n}\n\nconst NOW: PlayerPos = { live: false, atEdge: false, edgeFrac: null, pct: 0, atLabel: '0:00', labelAt: () => '0:00', endLabel: '0:00', onSeek: () => {} };\n\nfunction IdlePlayer({ idle, poster, src, title, page, onAct, children }: { idle: IdleState; poster: string | null; src: string | null; title: string; page: boolean; onAct: () => void; children: ReactNode }) {\n const ctl = useIdleControls(idle.prefs, idle.set);\n const desk = useDesk();\n const box = useRef<HTMLDivElement>(null);\n const [small, setSmall] = useState(false);\n useLayoutEffect(() => {\n const el = box.current?.parentElement;\n if (!el) return;\n const measure = () => setSmall(el.getBoundingClientRect().width < 560);\n measure();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n const transport: PlayerTransport = { prevOn: false, nextOn: false, onPrev: () => {}, onNext: () => {}, playing: false, playable: true, playTitle: 'Connect to play', onPlay: onAct };\n return (\n <div ref={box} className={`vsp-idleroot${small ? ' vsp-idleroot--small' : ''}`}>\n <FullVideo page={page} picture={<Backdrop poster={poster} src={src} />} title={title} desk={desk} pos={NOW} sub={null} mute={{ muted: idle.prefs.muted, onToggle: () => idle.set({ muted: !idle.prefs.muted }) }} cc={{ on: idle.prefs.subtitles, onToggle: () => idle.set({ subtitles: !idle.prefs.subtitles }) }} chip={ctl.chip} transport={transport} picker={ctl.sheets} sheet={null} voices={null} voicesBtn={null} sheetOpen={ctl.sheetOpen} onSettings={ctl.openSettings} onShare={() => shareLink(idle.shareUrl ?? window.location.href, title)} copied={null} onTouch={() => {}} />\n {!ctl.sheetOpen && <div className=\"vsp-idle\" data-theme=\"dark\"><div className=\"vsp-idle__box\">{children}</div></div>}\n </div>\n );\n}\n\nfunction ConnectButton({ connect, onClick, label }: { connect: Connect; onClick: () => void; label: string }) {\n return (\n <>\n <button type=\"button\" className=\"vsp-idle__connect\" onClick={onClick} disabled={connect.busy}>\n {connect.busy ? <Spinner size={18} color=\"#050507\" track=\"rgba(5,5,7,.2)\" /> : <Icon d={D.link} size={18} sw={1.8} />}\n <span>{connect.busy ? 'Waiting for VocalStack…' : label}</span>\n </button>\n {connect.busy && <div className=\"vsp-idle__note\" role=\"status\">{STATUS[connect.status ?? 'checking']}</div>}\n {connect.err && <div className=\"vsp-end__err\" role=\"alert\">{connect.err}</div>}\n </>\n );\n}\n\nexport function SourceGate({ idle, src, ask, connect, page, poster = null, onClear }: { idle: IdleState; src: string; ask: boolean; connect: Connect; page: boolean; poster?: string | null; onClear?: () => void }) {\n const go = () => connect.start(src, ask);\n return (\n <IdlePlayer idle={idle} poster={poster} src={src} title={hostOf(src)} page={page} onAct={go}>\n <ConnectButton connect={connect} onClick={go} label={connect.connected ? 'Play with VocalStack' : 'Connect to VocalStack'} />\n {!connect.busy && <div className=\"vsp-idle__note\">{connect.connected ? `Plays ${hostOf(src)} with subtitles and spoken translations.` : `Connect to play ${hostOf(src)} with subtitles and spoken translations.`}</div>}\n {onClear && !connect.busy && <button type=\"button\" className=\"vsp-idle__other\" onClick={onClear}>Choose another video</button>}\n </IdlePlayer>\n );\n}\n\nexport function StartCard({ idle, connect, page, poster = null, onPick, onShare }: { idle: IdleState; connect: Connect; page: boolean; poster?: string | null; onPick: (url: string) => void; onShare?: (code: string) => Promise<boolean> }) {\n const [url, setUrl] = useState('');\n const [opening, setOpening] = useState(false);\n const [shareErr, setShareErr] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const lastAuto = useRef<string | null>(null);\n const clean = url.trim();\n const isLink = (v: string) => LINK.test(v) || !!shareCodeOf(v);\n const ok = isLink(clean);\n const busy = connect.busy || opening;\n const launch = async (raw: string) => {\n const full = /^https?:\\/\\//i.test(raw) ? raw : `https://${raw}`;\n setShareErr(null);\n const code = shareCodeOf(full);\n if (code && onShare) {\n setOpening(true);\n const found = await onShare(code).catch(() => false);\n setOpening(false);\n if (found) return;\n if (!connect.connected) { setShareErr('That share link does not open. It may have been revoked.'); return; }\n }\n onPick(full);\n connect.start(full, false);\n };\n const submit = () => { if (ok && !busy) void launch(clean); };\n const go = () => { if (ok) submit(); else if (!connect.connected) connect.connect(); else inputRef.current?.focus(); };\n const auto = (v: string) => {\n const c = v.trim();\n if (!isLink(c) || busy || c === lastAuto.current) return;\n lastAuto.current = c;\n void launch(c);\n };\n const note = connect.busy ? <div className=\"vsp-idle__note\" role=\"status\">{STATUS[connect.status ?? 'checking']}</div>\n : opening ? <div className=\"vsp-idle__note\" role=\"status\">Opening the shared transcript…</div>\n : <div className=\"vsp-idle__note\">{connect.connected ? 'Paste a VocalStack share link, or a YouTube, Vimeo, mp3 or any video link to play it here with subtitles and spoken translations.' : 'Paste a VocalStack share link to watch it here, or connect to transcribe any video link.'}</div>;\n return (\n <IdlePlayer idle={idle} poster={poster} src={null} title=\"VocalStack\" page={page} onAct={go}>\n <form className=\"vsp-idle__form\" onSubmit={(e) => { e.preventDefault(); submit(); }}>\n <span className=\"vsp-idle__field\">\n <Icon d={D.link} size={16} sw={1.8} />\n <input ref={inputRef} className=\"vsp-idle__input\" type=\"url\" inputMode=\"url\" enterKeyHint=\"go\" autoComplete=\"off\" spellCheck={false} placeholder={connect.connected ? 'Paste a video link' : 'Paste a share link'} value={url} onChange={(e) => setUrl(e.target.value)} onPaste={(e) => { const v = e.clipboardData.getData('text'); if (v) { setUrl(v.trim()); auto(v); e.preventDefault(); } }} aria-label=\"Video link\" autoFocus={connect.connected} />\n {busy && <Spinner size={15} color=\"#eef0f8\" track=\"rgba(255,255,255,.2)\" />}\n </span>\n </form>\n {note}\n {!connect.connected && !busy && <ConnectButton connect={connect} onClick={connect.connect} label=\"Connect to VocalStack\" />}\n {(shareErr || connect.err) && <div className=\"vsp-end__err\" role=\"alert\">{shareErr ?? connect.err}</div>}\n </IdlePlayer>\n );\n}\n\nexport function ErrorGate({ idle, message, onRetry, page }: { idle: IdleState; message: string; onRetry: () => void; page: boolean }) {\n return (\n <IdlePlayer idle={idle} poster={null} src={null} title=\"VocalStack\" page={page} onAct={onRetry}>\n <div className=\"vsp-idle__err\" role=\"alert\"><Icon d={D.warn} size={16} sw={1.8} />{message}</div>\n <button type=\"button\" className=\"vsp-idle__connect\" onClick={onRetry}><Icon d={D.uturn} size={18} sw={1.8} /><span>Try again</span></button>\n </IdlePlayer>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { VocalStack } from '@vocalstack/js-sdk';\nimport { DEFAULT_API, type TokenSource } from './context';\n\nexport function useLookup(src: string | null, token: TokenSource | null, baseUrl: string | null): { id: string } | null | undefined {\n const [found, setFound] = useState<{ id: string } | null | undefined>(src ? (token ? undefined : null) : null);\n useEffect(() => {\n if (!src) { setFound(null); return; }\n if (!token) { setFound(null); return; }\n let alive = true;\n setFound(undefined);\n const client = new VocalStack({ baseUrl: (baseUrl ?? DEFAULT_API).replace(/\\/$/, ''), token: async () => { const v = typeof token === 'function' ? await token() : token; return v || undefined; } });\n const look = (client.transcriptions as unknown as { lookup?: (u: string) => Promise<{ id: string } | null> }).lookup;\n if (!look) { setFound(null); return; }\n look.call(client.transcriptions, src).then((t) => { if (alive) setFound(t ? { id: t.id } : null); }).catch(() => { if (alive) setFound(null); });\n return () => { alive = false; };\n }, [src, token, baseUrl]);\n return found;\n}\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, type ReactNode, type Ref } from 'react';\nimport { Card, GrowBox, LanguageChip, Sheet, Switch, Toggle } from '../ds/Controls';\nimport { D, Icon, Logo, PlayGlyph, Spinner } from '../ds/Icons';\nimport { mediaKind } from '../core/voiceplayer';\nimport { useLanguageList } from '../ds/LanguagePicker';\nimport { audioDownloadUrl, audioSealed, backgroundAudioUrl, deliveryAudioUrl } from '../core/audio';\nimport { FileFollow } from './FileFollow';\nimport { EmbedFollow } from './EmbedFollow';\nimport { FacebookFollow } from './FacebookFollow';\nimport { WistiaFollow } from './WistiaFollow';\nimport { VidyardFollow } from './VidyardFollow';\nimport { hasEmbed, loomId, sourceVideoUrl, vidyardId, wistiaId } from '../core/embeds';\nimport { siteOf } from '../core/sites';\nimport { loomSetup } from '../core/loomStream';\nimport { displayName, useYtTitle } from '../data/title';\nimport { bedNote, REMOVE_BG_LABEL, removeBgFromQuery, trackPlan, useBackgroundBed, useSeparatedTrack, withRemoveBg } from '../core/background';\nimport { useVoiceFollow } from '../core/voiceFollow';\nimport { useMediaKeys } from '../core/mediaKeys';\nimport { clock, durationLabel } from '../core/format';\nimport { describe, useLanguages, useTranscript, type ErrorLike } from '../data/transcript';\nimport { strings } from '../data/i18n';\nimport { rows as toRows, showLabels, speakerLabel, speakerLook } from '../core/transcript';\nimport { downloadVoiceTrack, exportTranscript, jobLengthS, progressOf, rowStatusOf, saveUrl, saveWhenReady, segsLabel, TX_FORMATS, type TxProgress } from '../data/tx';\nimport { ytIdOf } from '../core/youtube';\nimport { subtitleShown } from '../core/readalong';\nimport { PlayerApiProvider, useApi, useMediaToken, useSource, withMedia, type Listen, type PlayerApi, type PlayerSource as LoadedSource, type TokenSource } from '../data/context';\nimport { SideFrame, SidePanels, useSideTabs } from './SideColumn';\nimport { ExportPanel, LiveVideo, ReplayScrub, SummaryPanel, shareLink, summaryOf, TabBar, Toast, useSummaryIn, useViewportTranslation, type TabSpec } from './shared';\nimport { MuteButton, NO_SEEK, PAUSE_D, PLAY_D, PUB_SIDE, TxFind, TxLines, YtFollow, lineEnd, lineWords, pictureT, spokenWordOf, useDuck, useFindPull, useFlash, useTxPlayer, useTxVoice, useYtLead } from './core';\nimport { FullVideo, ListenerHeader, MiniPlayer, browserFull, modeOptions, setFullTarget, type PlayerPos, type PlayerTransport } from './full';\nimport { PlayerWait, playerWaitOf, useHeld } from './wait';\nimport { EndCard, type EndCardOptions } from './EndCard';\nimport type { Started } from '../data/connect';\nimport { useDesk } from './useDesk';\nimport { ErrorGate, SourceGate, StartCard, useConnect, type IdleState } from './SourceGate';\nimport { IDLE_DEFAULTS, type IdlePrefs } from './IdleSettings';\nimport { useLookup } from '../data/lookup';\n\nexport interface PlayerSettings {\n lang?: string | null;\n subtitles?: boolean;\n speakerLabels?: boolean;\n wordHighlight?: boolean;\n translateAudio?: boolean;\n voices?: 'cloned' | 'synthetic';\n removeBackground?: boolean;\n}\n\nexport interface PlayerControls {\n language?: boolean;\n subtitles?: boolean;\n audio?: boolean;\n export?: boolean;\n share?: boolean;\n fullscreen?: boolean;\n settings?: boolean;\n}\n\nexport interface PlaybackState {\n t: number;\n dur: number;\n playing: boolean;\n idx: number;\n seekN: number;\n lang: string | null;\n muted: boolean;\n}\n\nexport interface PlayerHandle {\n seek: (t: number) => void;\n play: () => void;\n pause: () => void;\n toggle: () => void;\n toggleMute: () => void;\n}\n\nconst PLAYBACK_MS = 100;\n\nexport interface VocalStackPlayerProps {\n id?: string;\n src?: string;\n token?: TokenSource | null;\n baseUrl?: string | null;\n mode?: 'video' | 'transcript';\n layout?: 'embed' | 'page';\n dark?: boolean;\n desk?: boolean;\n settings?: PlayerSettings;\n initial?: PlayerSettings;\n onSettingsChange?: (s: Required<PlayerSettings>) => void;\n controls?: PlayerControls;\n autoplay?: boolean;\n startAt?: number | null;\n syncUrl?: boolean;\n endCard?: EndCardOptions | false;\n appUrl?: string;\n poster?: string | null;\n voice?: string | null;\n settingsExtra?: ReactNode;\n shareUrl?: (t: number | null) => string;\n onShare?: () => void;\n onSource?: (s: LoadedSource) => void;\n onProgress?: (pct: number | null) => void;\n onError?: (e: ErrorLike) => void;\n onPlayback?: (s: PlaybackState) => void;\n compact?: boolean;\n className?: string;\n}\n\ninterface Init { lang: string | null; labels: 'on' | 'off' | null; words: 'on' | 'off' | null; cc: boolean; translateAudio: boolean; clonedVoices: boolean; removeBackground: boolean; startAt: number | null }\n\nconst onOffOf = (v: boolean | undefined) => (v == null ? null : v ? 'on' : 'off');\n\nfunction initialOf(p: VocalStackPlayerProps): Init {\n const q = p.syncUrl && typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : null;\n const i = { ...(p.initial ?? {}), ...(p.settings ?? {}) };\n const onOff = (v: string | null | undefined) => (v === 'on' || v === 'off' ? v : null);\n const t = Number(q?.get('t'));\n return {\n lang: q?.get('lang') || i.lang || null,\n labels: onOff(q?.get('labels')) ?? onOffOf(i.speakerLabels),\n words: onOff(q?.get('words')) ?? onOffOf(i.wordHighlight),\n cc: q?.get('cc') ? q.get('cc') !== 'off' : i.subtitles ?? true,\n translateAudio: q?.get('audio') ? q.get('audio') !== 'original' : i.translateAudio ?? true,\n clonedVoices: q?.get('voices') ? q.get('voices') !== 'stock' : (i.voices ?? 'cloned') === 'cloned',\n removeBackground: q && q.get('bg') ? removeBgFromQuery(q) : i.removeBackground ?? false,\n startAt: Number.isFinite(t) && t > 0 ? t : p.startAt ?? null,\n };\n}\n\nexport const VocalStackPlayer = forwardRef(function VocalStackPlayer(props: VocalStackPlayerProps, ref: Ref<PlayerHandle>) {\n const handle = useRef<PlayerHandle | null>(null);\n useImperativeHandle(ref, () => ({\n seek: (t) => handle.current?.seek(t),\n play: () => handle.current?.play(),\n toggleMute: () => handle.current?.toggleMute(),\n pause: () => handle.current?.pause(),\n toggle: () => handle.current?.toggle(),\n }), []);\n const [cur, setCur] = useState<{ id: string; token: TokenSource | null | undefined; listen?: Listen | null }>({ id: props.id ?? '', token: props.token });\n useEffect(() => { setCur({ id: props.id ?? '', token: props.token }); }, [props.id, props.token, props.src]);\n const found = useLookup(props.src ?? null, props.token ?? null, props.baseUrl ?? null);\n useEffect(() => { if (found?.id) setCur({ id: found.id, token: props.token }); }, [found?.id]); // eslint-disable-line react-hooks/exhaustive-deps\n const [typed, setTyped] = useState<string | null>(null);\n const [idlePrefs, setIdlePrefs] = useState<IdlePrefs>(() => ({ ...IDLE_DEFAULTS, ...Object.fromEntries(Object.entries({ ...(props.initial ?? {}), ...(props.settings ?? {}) }).filter(([, v]) => v !== undefined)) } as IdlePrefs));\n const [touched, setTouched] = useState<Partial<IdlePrefs>>({});\n const idle: IdleState = { prefs: idlePrefs, set: (p) => { setIdlePrefs((x) => ({ ...x, ...p })); setTouched((x) => ({ ...x, ...p })); }, shareUrl: props.shareUrl?.(null) };\n const { muted: idleMuted, ...idleChosen } = touched;\n useEffect(() => { setTyped(null); }, [props.id, props.src]);\n const gateSrc = props.src ?? typed;\n const gate = !cur.id && !!gateSrc && (typed != null || found !== undefined);\n const empty = !cur.id && !props.src && !typed;\n const base = useApi({ id: cur.id, token: cur.token, baseUrl: props.baseUrl, listen: cur.listen });\n const { source, gone, error, reload } = useSource(base, cur.id);\n const media = useMediaToken(base, source?.recording.id ?? null);\n const api = useMemo(() => withMedia(base, media), [base, media]);\n useEffect(() => { if (source) props.onSource?.(source); }, [source]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => { if (error) props.onError?.(error); }, [error]); // eslint-disable-line react-hooks/exhaustive-deps\n const desk = useDesk(props.desk);\n const embed = (props.layout ?? 'embed') === 'embed';\n const appUrl = props.appUrl ?? (props.endCard ? props.endCard.appUrl : undefined);\n const onReady = useCallback((st: Started) => setCur({ id: st.transcriptionId, token: null, listen: { transcriptionId: st.transcriptionId, recordingId: st.recordingId, token: st.token } }), []);\n const connect = useConnect(appUrl, onReady);\n const root = useRef<HTMLDivElement>(null);\n useEffect(() => {\n setFullTarget(embed ? root.current : null);\n return () => setFullTarget(null);\n }, [embed]);\n return (\n <PlayerApiProvider value={api}>\n <div ref={root} className={`vsp${embed ? ' vsp--embed' : ''}${props.className ? ` ${props.className}` : ''}`} data-theme={(props.mode ?? 'video') === 'video' || props.dark ? 'dark' : 'light'} data-mode={(props.mode ?? 'video') === 'video' ? 'video' : 'transcript'}>\n {empty ? <StartCard idle={idle} connect={connect} page={!embed} poster={props.poster ?? null} onPick={setTyped} onShare={async (code) => { try { await base.client.shareLinks.open(code); setCur({ id: code, token: null }); return true; } catch { return false; } }} /> : gate ? <SourceGate idle={idle} src={gateSrc!} ask={!typed} connect={connect} page={!embed} poster={props.poster ?? null} onClear={typed ? () => setTyped(null) : undefined} /> : !cur.id ? <div className=\"vsp-gate\" data-theme=\"dark\"><span className=\"gfull__spin gfull__holdspin\" aria-label=\"Loading\" /></div> : error && !source ? <ErrorGate idle={idle} message={error.message} onRetry={reload} page={!embed} /> : <PlayerBody key={cur.id} {...props} initial={{ ...(props.initial ?? {}), ...idleChosen }} startMuted={idleMuted === true} handle={handle} id={cur.id} api={api} shared={source} gone={gone} loadError={error} reread={reload} desk={desk} dark={(props.mode ?? 'video') === 'video' || !!props.dark} onStarted={(st) => setCur({ id: st.transcriptionId, token: null, listen: { transcriptionId: st.transcriptionId, recordingId: st.recordingId, token: st.token } })} />}\n </div>\n </PlayerApiProvider>\n );\n});\n\n\ntype PubTab = 'summary' | 'export';\n\nfunction PlayerBody(props: VocalStackPlayerProps & { startMuted?: boolean; handle: { current: PlayerHandle | null }; api: PlayerApi; shared: LoadedSource | null; gone: boolean; loadError: ErrorLike | null; reread: () => void; desk: boolean; dark: boolean; onStarted: (s: Started) => void }) {\n const { api, shared, gone, desk, dark } = props;\n const code = props.id ?? \"\";\n const init = useMemo(() => initialOf(props), []); // eslint-disable-line react-hooks/exhaustive-deps\n const wantVideo = (props.mode ?? 'video') === 'video';\n const locked = wantVideo;\n const [error, setError] = useState<ErrorLike | null>(props.loadError);\n useEffect(() => { if (props.loadError) setError(props.loadError); }, [props.loadError]);\n const [tab, setTab] = useState<PubTab | 'none'>('none');\n const [find, setFind] = useState(false);\n const [findQ, setFindQ] = useState('');\n const [flash, doFlash] = useFlash();\n const [live, setLive] = useState<TxProgress | null>(null);\n const [mode, setMode] = useState<'read' | 'listen'>(locked ? 'listen' : 'read');\n const [settings, setSettings] = useState(false);\n const subLangRef = useRef<string | null>(null);\n const trSeen = useRef(new Map<string, string>());\n const [page, setPageRaw] = useState<'main' | 'subs' | 'lang' | 'audio' | 'export'>('main');\n const setPage = (next: 'main' | 'subs' | 'lang' | 'audio' | 'export') => {\n const el = document.querySelector<HTMLElement>('.vs-sheet--settings');\n const scrim = el?.parentElement;\n if (el && scrim && page === 'main' && next !== 'main') scrim.style.setProperty('--vs-sheet-top', `${Math.round(el.getBoundingClientRect().top - scrim.getBoundingClientRect().top)}px`);\n setPageRaw(next);\n };\n useEffect(() => { if (!settings) setPage('main'); }, [settings]);\n const [full, setFull] = useState(locked);\n const rec = shared?.recording ?? null;\n const recordingId = rec?.id ?? null;\n const [txLang, setTxLang] = useState<string | null | undefined>(init.lang);\n const askLang = typeof txLang === 'string' ? txLang : null;\n const [labelsPref, setLabelsPref] = useState<'on' | 'off' | null>(init.labels);\n const [wordsPref, setWordsPref] = useState<'on' | 'off' | null>(init.words);\n const [ccOn, setCcOn] = useState(init.cc);\n const [speakOn, setSpeakOn] = useState(init.translateAudio);\n const [cloneOn, setCloneOn] = useState(init.clonedVoices);\n const [removeBg, setRemoveBg] = useState(init.removeBackground);\n const fixed = props.settings;\n useEffect(() => { if (fixed?.lang !== undefined) setTxLang(fixed.lang); }, [fixed?.lang]);\n useEffect(() => { if (fixed?.speakerLabels !== undefined) setLabelsPref(fixed.speakerLabels ? 'on' : 'off'); }, [fixed?.speakerLabels]);\n useEffect(() => { if (fixed?.wordHighlight !== undefined) setWordsPref(fixed.wordHighlight ? 'on' : 'off'); }, [fixed?.wordHighlight]);\n useEffect(() => { if (fixed?.subtitles !== undefined) setCcOn(fixed.subtitles); }, [fixed?.subtitles]);\n useEffect(() => { if (fixed?.translateAudio !== undefined) setSpeakOn(fixed.translateAudio); }, [fixed?.translateAudio]);\n useEffect(() => { if (fixed?.voices !== undefined) setCloneOn(fixed.voices === 'cloned'); }, [fixed?.voices]);\n useEffect(() => { if (fixed?.removeBackground !== undefined) setRemoveBg(fixed.removeBackground); }, [fixed?.removeBackground]);\n const ctl = { language: true, subtitles: true, audio: true, export: true, share: true, fullscreen: true, settings: true, ...(props.controls ?? {}) };\n const hearOriginal = locked && !speakOn;\n useEffect(() => {\n if (!props.syncUrl) return;\n const u = new URL(window.location.href);\n if (askLang) u.searchParams.set('lang', askLang); else u.searchParams.delete('lang');\n if (labelsPref) u.searchParams.set('labels', labelsPref); else u.searchParams.delete('labels');\n if (wordsPref) u.searchParams.set('words', wordsPref); else u.searchParams.delete('words');\n if (ccOn) u.searchParams.delete('cc'); else u.searchParams.set('cc', 'off');\n if (speakOn) u.searchParams.delete('audio'); else u.searchParams.set('audio', 'original');\n if (cloneOn) u.searchParams.delete('voices'); else u.searchParams.set('voices', 'stock');\n withRemoveBg(u, removeBg);\n if (u.href !== window.location.href) window.history.replaceState(window.history.state, '', u);\n }, [askLang, labelsPref, wordsPref, ccOn, speakOn, cloneOn, removeBg]);\n useEffect(() => { if (shared && !shared.allowTranslate && askLang) setTxLang(null); }, [shared, askLang]);\n const { model, error: subError, clearError, setLanguage, mergeTranslations, translating, translateFailed, shownLang } = useTranscript(recordingId, {\n lang: null,\n onFrame: (f) => { if (f.type === 'job.progress') setLive({ state: f.state, processedS: f.processedS ?? 0, totalS: f.totalS ?? null, segmentsDone: f.segmentsDone ?? 0, segmentsTotal: f.segmentsTotal ?? null, pct: f.pct ?? 0, error: f.error ?? null }); },\n });\n const rows = useMemo(() => toRows(model).filter((r) => !r.suppressed), [model]);\n const known = progressOf(shared?.job ?? null);\n const settled = ['done', 'failed', 'stopped'].includes(rowStatusOf(known?.state ?? shared?.job?.state));\n const progress = settled ? known : (live ?? known);\n const liveMoving = !!live && !['done', 'failed', 'stopped'].includes(rowStatusOf(live.state));\n const reread = useRef(0);\n useEffect(() => {\n if (!settled || !liveMoving || Date.now() - reread.current < 10_000) return;\n reread.current = Date.now();\n props.reread();\n }, [settled, liveMoving, live?.state, live?.processedS, code]);\n const status = rowStatusOf(progress?.state ?? shared?.job?.state ?? (api.listen ? (rec?.state === 'finalized' ? 'done' : rec?.state ? 'transcribing' : undefined) : undefined));\n const running = !!recordingId && (status === 'transcribing' || status === 'queued');\n const holding = locked && !gone && (!shared || ((running || status === 'cropping') && rows.length === 0));\n const pct = running ? (progress?.pct ?? 0) : 100;\n const lenS = jobLengthS(shared?.job, progress) ?? rec?.mediaDurationS ?? null;\n const langCode = model.segments.values().next().value?.language ?? rec?.spokenLanguage ?? null;\n const by = shared?.sharedBy ? `Shared by ${shared.sharedBy}` : '';\n const srcName = shared?.job?.source?.name?.trim() || null;\n const pageTitle = shared ? (shared.name?.trim() || srcName) : null;\n const hasAudio = !!shared?.job?.hasAudio;\n const src = shared?.job?.source;\n const sourceAudio = !hasAudio && !!src && (src.kind !== 'url' || src.bytes != null) && (status === 'transcribing' || status === 'queued' || status === 'done');\n const deliveryUrl = recordingId && shared?.allowDownload && hasAudio ? deliveryAudioUrl(api.origin, recordingId, api.cred) : null;\n const sourceStored = !!src && (src.kind !== 'url' || src.bytes != null);\n const sealed = useSealed(deliveryUrl && sourceStored ? deliveryUrl : null);\n const audioUrl = deliveryUrl && (!sourceStored || sealed === 'yes') ? deliveryUrl\n : deliveryUrl && sealed === 'unknown' ? null\n : recordingId && shared?.allowDownload && (sourceAudio || (hasAudio && sourceStored)) ? audioDownloadUrl(api.origin, recordingId, 'source', api.cred) : null;\n const lastRow = rows[rows.length - 1];\n const doneTo = lastRow ? lastRow.words[lastRow.words.length - 1]?.end ?? lastRow.start : 0;\n const edgeS = locked && running ? Math.max(doneTo, progress?.processedS ?? 0) : null;\n const audioPlayer = useTxPlayer(audioUrl, (hasAudio || sourceAudio) && !!shared?.allowDownload, rows, lenS, sourceAudio ? shared?.job?.crop?.startS ?? 0 : 0, edgeS);\n const srcVideoUrl = sourceVideoUrl(shared?.job?.source as Parameters<typeof sourceVideoUrl>[0]);\n const ytId = srcVideoUrl && siteOf(srcVideoUrl)?.id === 'youtube' ? ytIdOf(srcVideoUrl) : null;\n const ytLed = !!ytId && !audioUrl;\n const ytTitle = useYtTitle(ytId);\n const yt = useYtLead(rows, lenS, shared?.job?.crop?.startS ?? 0, edgeS);\n const videoLed = !!ytId;\n const srcPlayer = videoLed ? yt.player : audioPlayer;\n const langs = useLanguages();\n const langBusyRef = useRef<string | null>(null);\n const voice = useTxVoice({ forcedVoice: props.voice ?? null, recordingId, model, rows, lenS, ended: !!recordingId && !running, cred: api.cred, langs, srcLang: langCode, canTranslate: !!shared?.allowTranslate, pickedLang: txLang, setPickedLang: setTxLang, side: desk && !full ? PUB_SIDE : undefined, hearOriginal, timed: !!ytId, stockVoices: locked && !cloneOn, stickyPicker: locked, pickerBusy: langBusyRef.current });\n const langSent = useRef<string | null>(null);\n useEffect(() => { if (!recordingId || langSent.current === askLang) return; langSent.current = askLang; setLanguage(askLang); }, [askLang, recordingId]); // eslint-disable-line react-hooks/exhaustive-deps\n const player = videoLed ? yt.player : voice.on ? voice.player : srcPlayer;\n useEffect(() => { if (videoLed) { voice.player.pause(); return; } (voice.on ? srcPlayer : voice.player).pause(); }, [voice.on, videoLed]); // eslint-disable-line react-hooks/exhaustive-deps\n const followLines = useMemo(() => rows.filter((r) => r.sentenceId != null).map((r, i, a) => ({ sid: r.sentenceId as number, start: r.start, end: a[i + 1]?.start ?? lineEnd(r, r.start, r.start + 4) })), [rows]);\n const follow = useVoiceFollow({ on: videoLed && voice.on, lines: followLines, clips: voice.clips, t: player.t, playing: player.playing, muted: player.muted });\n const langBusy = !!askLang && (translating || voice.relang || (voice.on && follow.missing != null));\n langBusyRef.current = langBusy ? askLang : null;\n useEffect(() => { if (videoLed && voice.on && follow.sid != null) voice.setNear(follow.sid); }, [follow.sid, videoLed, voice.on]); // eslint-disable-line react-hooks/exhaustive-deps\n useDuck([srcPlayer, voice.player], voice.sampling);\n const feedRef = useRef<HTMLDivElement>(null);\n useEffect(() => { if (running && !player.playing && feedRef.current) feedRef.current.scrollTop = feedRef.current.scrollHeight; }, [running, rows.length]); // eslint-disable-line react-hooks/exhaustive-deps\n const findHits = useFindPull(feedRef, rows, find, findQ, setFind);\n const findField = <TxFind open={find} q={findQ} onQ={setFindQ} onClose={() => setFind(false)} hits={findHits} desk={desk} inline={desk} />;\n const name = displayName({ name: shared?.name, sourceName: shared?.job?.source?.name, ytTitle, url: shared?.job?.source?.kind === 'url' ? shared.job.source.url : props.src ?? null, id: code });\n const canDownload = !!shared?.allowDownload;\n const canExport = !!shared?.allowExport;\n const dlLang = voice.readLang;\n const dlLangName = dlLang ? (langs?.languages.find((l) => l.code === dlLang)?.name ?? dlLang.toUpperCase()) : null;\n const download = async () => {\n if (!recordingId) return;\n try {\n if (dlLang && voice.canSpeak) {\n doFlash(`Preparing ${name} in ${dlLangName}${voice.readVoiceName ? `, read by ${voice.readVoiceName}` : ''} — the download starts when it is ready.`);\n await downloadVoiceTrack(api, { recordingId, lang: dlLang, voiceKey: voice.readVoiceKey, cred: api.cred, request: voice.requestTrack });\n doFlash(`Downloading ${name} in ${dlLangName}.`);\n return;\n }\n if (hasAudio) {\n doFlash(`Preparing ${name} as MP3 — the download starts when it is ready.`);\n await saveWhenReady(audioDownloadUrl(api.origin, recordingId, 'delivery', api.cred));\n doFlash(`Downloading ${name}.`);\n return;\n }\n saveUrl(audioDownloadUrl(api.origin, recordingId, 'source', api.cred));\n doFlash(`Downloading ${name} — the full audio, since the transcript is still being written.`);\n } catch (e) {\n setError(describe(e));\n throw e;\n }\n };\n const doExport = (key: typeof TX_FORMATS[number]['key']) => {\n if (!recordingId) return;\n const fmt = TX_FORMATS.find((f) => f.key === key)!.name;\n const inLang = dlLangName ? ` in ${dlLangName}` : '';\n return exportTranscript(api, recordingId, key, { lang: dlLang }).then(() => doFlash(running ? `${fmt} exported${inLang} for the first ${rows.length} segments — the rest is still transcribing.` : `${fmt} exported${inLang}.`)).catch((e) => { setError(describe(e)); throw e; });\n };\n const tail = running ? 'MORE TO COME…' : 'END OF TRANSCRIPT';\n const tailFg = running ? 'var(--brand)' : 'var(--ink-28)';\n const segs = segsLabel(progress, rows.length);\n const playable = player.has && (!voice.relang || !!ytId);\n const playerRef = useRef(player); playerRef.current = player;\n const placeKey = `${askLang ?? ''}|${voice.on ? 'voice' : 'source'}`;\n const placeRef = useRef({ key: placeKey, idx: 0, t: 0, playing: false, until: 0 });\n useEffect(() => {\n const at = placeRef.current;\n if (at.key !== placeKey) { at.key = placeKey; at.until = Date.now() + 15000; }\n if (videoLed) return;\n if (!at.until) { at.idx = player.idx; at.t = player.t; at.playing = player.playing; return; }\n if (Date.now() > at.until) { at.until = 0; return; }\n if (!player.has || voice.relang) return;\n at.until = 0;\n if (Math.abs(player.t - at.t) > 0.5) { if (player.seekFrac && player.dur > 0) player.seekFrac(at.t / player.dur); else player.seekRow(at.idx); }\n if (at.playing && !player.playing && mode === 'listen') { autoplayDone.current = true; player.toggle(); }\n });\n const autoplayed = useRef(false);\n const autoplayDone = useRef(false);\n if (locked) mediaKind.video = true;\n const [soundTip, setSoundTip] = useState(false);\n const [adOn, setAdOn] = useState(false);\n useEffect(() => {\n if (!locked || autoplayed.current || !playable || !full || holding || props.autoplay === false) return;\n autoplayed.current = true;\n const tryPlay = (n: number) => { if (playerRef.current.playing || autoplayDone.current) return; playerRef.current.toggle(); if (n > 0) setTimeout(() => tryPlay(n - 1), 1500); };\n const muted = () => { if (!playerRef.current.muted) playerRef.current.toggleMute(); setSoundTip(true); tryPlay(3); };\n const p = playerRef.current;\n if (!p.autoplay || props.startMuted) { muted(); return; }\n void p.autoplay().then((sound) => { if (sound === false) setSoundTip(true); else if (sound == null && !autoplayDone.current) muted(); });\n }, [locked, playable, full, holding]);\n const unmutedNow = useRef(false);\n const soundOn = () => { if (!soundTip) return; setSoundTip(false); unmutedNow.current = true; setTimeout(() => { unmutedNow.current = false; }, 500); if (playerRef.current.muted) playerRef.current.toggleMute(); };\n const toggleSound = () => { if (unmutedNow.current) { unmutedNow.current = false; return; } setSoundTip(false); playerRef.current.toggleMute(); };\n const tapPicture = () => { if (unmutedNow.current) { unmutedNow.current = false; return; } autoplayDone.current = true; playerRef.current.toggle(); };\n const mute = (size: number) => <MuteButton player={player} size={size} />;\n const sumOn = !!recordingId && !running;\n const [warm, setWarm] = useState(false);\n useEffect(() => {\n if (!translating) { setWarm(false); return; }\n const t = setTimeout(() => setWarm(true), 180);\n return () => clearTimeout(t);\n }, [translating]);\n const feedLang = warm ? shownLang : askLang;\n const onVisible = useViewportTranslation(recordingId, askLang, rows, mergeTranslations);\n const sharedSummary = useSummaryIn(summaryOf(rec), recordingId, voice.readLang);\n const anyExport = canDownload || canExport;\n const ytAt = (shared?.job?.crop?.startS ?? 0) + pictureT(player, rows);\n const listening = mode === 'listen';\n const watching = listening && (!!ytId || locked);\n const pickMode = (m: 'read' | 'listen') => { srcPlayer.pause(); voice.player.pause(); setMode(m); if (m === 'read' && full) { browserFull(false); setFull(false); } };\n useEffect(() => { if (listening) return; if (srcPlayer.playing) srcPlayer.pause(); if (voice.player.playing) voice.player.pause(); }, [listening, srcPlayer.playing, voice.player.playing]); // eslint-disable-line react-hooks/exhaustive-deps\n const meta = voice.barChip;\n const t = strings(meta.label);\n const modeSwitch = <Switch<'read' | 'listen'> value={mode} onChange={pickMode} bordered={false} options={modeOptions(t, !!ytId)} />;\n const tabs: TabSpec<PubTab>[] = [...(sumOn ? [{ key: 'summary' as const, label: 'Summary' }] : []), ...(anyExport ? [{ key: 'export' as const, label: 'Export' }] : [])];\n const pubPanel = (k: PubTab) => (\n <>\n {k === 'summary' && sumOn && <SummaryPanel s={sharedSummary} />}\n {k === 'export' && <ExportPanel audio={canDownload ? { name, meta: (dlLang && voice.canSpeak) || hasAudio ? `MP3${lenS ? ` · ${clock(lenS)}` : ''}` : 'ORIGINAL AUDIO', onClick: download } : null} formats={canExport} onExport={doExport} />}\n </>\n );\n const scrub = (deskStep: boolean) => (\n <ReplayScrub index={player.idx} total={Math.max(1, rows.length)} frac={player.dur > 0 ? Math.min(1, player.t / player.dur) : 0} glideMs={player.wordSync ? 0 : 220} atLabel={clock(player.t)} durLabel={clock(player.dur)} stepLabel={deskStep ? `${player.idx + 1} / ${rows.length}` : ''} onSeek={voice.relang ? NO_SEEK : player.seekRow} onSeekFrac={voice.relang ? undefined : player.seekFrac} onScrubStart={player.hold} onScrubEnd={player.release} />\n );\n const pos: PlayerPos = {\n live: false, atEdge: false, edgeFrac: null, readyFrac: edgeS != null && player.dur > 0 ? Math.min(1, edgeS / player.dur) : null,\n pct: player.dur > 0 ? Math.min(100, Math.round((player.t / player.dur) * 1000) / 10) : 0,\n atLabel: clock(player.t), labelAt: (f) => clock(f * player.dur), endLabel: clock(player.dur),\n onSeek: (f) => { if (!voice.relang) player.seekFrac?.(f); },\n };\n const [slowLine, lineSince] = useHeld(voice.on && !!player.preparing && player.playing, 1500);\n const voiceFailed = voice.on && player.error?.code === 'voice_not_started';\n const speakAvail = voice.canSpeak && !voice.error && !voiceFailed;\n const waitLangName = askLang ? (langs?.languages.find((l) => l.code === askLang)?.name ?? meta.label) : '';\n const waitState = full ? playerWaitOf({ lang: askLang, langName: waitLangName, translating: translating && !!askLang, translateFailed, voiceFailed, relang: voice.relang, starting: voice.on ? player.starting : null, slowLine, lineSince }) : null;\n const softWait = !!ytId && !!waitState && (waitState.kind === 'translating' || (waitState.kind === 'voice' && voice.relang));\n const softNote = !softWait || !waitState ? null : waitState.kind === 'translating' ? `Translating into ${waitLangName || 'the new language'}…` : `Preparing the ${waitLangName || 'translated'} voice…`;\n const voiceHolds = !softWait && (waitState?.kind === 'voice' || waitState?.kind === 'starting');\n const langPage = useLanguageList({ ...voice.langList, keepOpen: true, open: page === 'lang', onClose: () => setPage('main') });\n const plan = trackPlan(removeBg, voice.on);\n const bedUrl = locked && plan.bed && canDownload && !!recordingId && (!running || !!audioUrl) ? backgroundAudioUrl(api.origin, recordingId, api.cred) : null;\n const bed = useBackgroundBed(bedUrl, { t: pictureT(player, rows), playing: player.playing && !voiceHolds && !(player.timed && !!player.preparing), muted: player.muted });\n const speechUrl = locked && plan.speech && canDownload && !!recordingId && (!running || !!audioUrl) ? backgroundAudioUrl(api.origin, recordingId, api.cred, 'speech') : null;\n const speechTrack = useSeparatedTrack(speechUrl, { t: pictureT(player, rows), playing: !voice.on && player.playing, muted: player.muted });\n const speechOver = !voice.on && speechTrack.on;\n useEffect(() => { yt.setVideoSound(!(videoLed && (voice.on || speechOver))); audioPlayer.silence?.(!videoLed && speechOver); }, [videoLed, voice.on, speechOver, audioUrl]); // eslint-disable-line react-hooks/exhaustive-deps\n const bgState = !canDownload ? 'unavailable' : voice.on ? bed : speechTrack.state;\n const speaking = speakOn && speakAvail && !!askLang;\n const audioSummary = !speaking ? (removeBg && bgState !== 'unavailable' ? 'Original speech, background removed' : 'Original sound') : [`Translated${voice.hasClone ? (cloneOn ? ', cloned voices' : ', synthetic voices') : ''}`, !removeBg && canDownload && bed !== 'unavailable' ? 'with background sound' : null].filter(Boolean).join(' ');\n const waitRetry = () => { if (waitState?.kind === 'translateFailed') { setLanguage(askLang); return; } autoplayDone.current = true; player.toggle(); };\n const waitOriginal = () => { const at = player.idx; player.pause(); setTxLang(null); autoplayDone.current = true; srcPlayer.playRow(at); };\n const transport: PlayerTransport = { prevOn: player.idx > 0, nextOn: player.idx < rows.length - 1, onPrev: player.prev, onNext: player.next, playing: player.playing, playable, playTitle: voice.playTitle ?? (player.playing ? 'Pause' : 'Play'), onPlay: () => { autoplayDone.current = true; player.toggle(); }, busy: (voice.relang && !ytId) || voiceHolds };\n useMediaKeys(playable && listening ? { playing: player.playing, toggle: () => { autoplayDone.current = true; player.toggle(); }, next: player.next, prev: player.prev } : null, pageTitle);\n const glassChip: React.CSSProperties = { background: 'transparent', color: '#eef0f8', width: 74, justifyContent: 'center', boxSizing: 'border-box' };\n const chipFor = (style: React.CSSProperties, size?: 'sm') => !meta.can || !ctl.language ? null : locked\n ? <button type=\"button\" className=\"gfull__btn\" title={langBusy ? `${meta.label ?? meta.code}: still being prepared` : meta.label ?? meta.code} aria-label={`Language: ${meta.label ?? meta.code}`} aria-busy={langBusy || undefined} onClick={() => { setSettings(false); meta.onClick(); }} style={{ position: 'relative' }}><span style={{ fontSize: size === 'sm' ? 17 : 21, lineHeight: 1 }}>{meta.flag}</span>{langBusy && <span style={{ position: 'absolute', right: 2, bottom: 2, display: 'flex', borderRadius: 999, background: 'rgba(5,6,21,.7)', padding: 1 }}><Spinner size={11} color=\"#eef0f8\" track=\"rgba(255,255,255,.25)\" /></span>}</button>\n : <LanguageChip flag={meta.flag} code={meta.code} label={meta.label} bordered={false} size={size} onClick={meta.onClick} style={style} />;\n const voicesBtn = { on: false, title: 'Voices', onClick: () => {}, busy: voice.voiceWaiting || voiceHolds };\n const [posterGone, setPosterGone] = useState(false);\n useEffect(() => { if (player.t > 0.3) setPosterGone(true); }, [player.t]);\n const fileVideo = !ytId && locked && recordingId && shared?.allowDownload && !running && shared?.job?.hasVideo !== false && shared?.job?.source?.kind !== 'url' ? <FileFollow key={recordingId} src={audioDownloadUrl(api.origin, recordingId, 'video', api.cred)} t={pictureT(player, rows)} playing={player.playing && !voiceHolds} seekN={player.seekN} onToggle={player.has ? tapPicture : undefined} /> : null;\n const embedSrc = !ytId && locked && srcVideoUrl && hasEmbed(srcVideoUrl) ? srcVideoUrl : null;\n const loomVid = embedSrc ? loomId(embedSrc) : null;\n const loomFollow = useMemo(() => (loomVid ? loomSetup(loomVid) : undefined), [loomVid]);\n const fbSrc = embedSrc && siteOf(embedSrc)?.id === 'facebook' ? embedSrc : null;\n const wistia = embedSrc && siteOf(embedSrc)?.id === 'wistia' ? wistiaId(embedSrc) : null;\n const vidyard = embedSrc && siteOf(embedSrc)?.id === 'vidyard' ? vidyardId(embedSrc) : null;\n const embedPic = vidyard ? <VidyardFollow key={vidyard} uuid={vidyard} t={pictureT(player, rows) + (shared?.job?.crop?.startS ?? 0)} playing={player.playing && !voiceHolds} seekN={player.seekN} onToggle={player.has ? tapPicture : undefined} />\n : wistia ? <WistiaFollow key={wistia} id={wistia} t={pictureT(player, rows) + (shared?.job?.crop?.startS ?? 0)} playing={player.playing && !voiceHolds} seekN={player.seekN} onToggle={player.has ? tapPicture : undefined} />\n : fbSrc ? <FacebookFollow key={fbSrc} url={fbSrc} t={pictureT(player, rows) + (shared?.job?.crop?.startS ?? 0)} playing={player.playing && !voiceHolds} seekN={player.seekN} onToggle={player.has ? tapPicture : undefined} />\n : loomFollow ? <FileFollow key={loomVid} setup={loomFollow} seekOver={1} t={pictureT(player, rows) + (shared?.job?.crop?.startS ?? 0)} playing={player.playing && !voiceHolds} seekN={player.seekN} onToggle={player.has ? tapPicture : undefined} />\n : embedSrc ? <EmbedFollow url={embedSrc} t={pictureT(player, rows) + (shared?.job?.crop?.startS ?? 0)} playing={player.playing && !voiceHolds} seekN={player.seekN} title={name} onToggle={player.has ? tapPicture : undefined} /> : null;\n const baseTap = player.has ? <div className=\"txyt vsp-follow\"><div aria-hidden=\"true\" className=\"txyt__tap\" onClick={tapPicture} style={{ cursor: 'pointer' }} /><div className={`txyt__paused${!player.playing ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div></div> : null;\n const thumbUrl = (shared?.job?.source as { thumbnailUrl?: string | null } | undefined)?.thumbnailUrl ?? null;\n const thumbPic = thumbUrl && /^https:\\/\\//.test(thumbUrl) ? <div className=\"vsp-thumbpic\" aria-hidden=\"true\" style={{ backgroundImage: `url(${JSON.stringify(thumbUrl)})` }} /> : null;\n const picture = !ytId ? (locked ? <><div className=\"vsp-idle__pic vsp-idle__pic--brand\" />{thumbPic}{baseTap}{embedPic}{fileVideo}</> : null) : <>{<YtFollow ytId={ytId} title={name} t={ytAt} playing={player.playing && !voiceHolds} waiting={voice.on && !!player.timed && !!player.preparing} seekN={player.seekN} onTime={(y) => player.videoAt?.(y - (shared?.job?.crop?.startS ?? 0))} onToggle={player.has ? tapPicture : undefined} onAd={setAdOn} lead={videoLed ? yt.lead : undefined} />}<div className=\"vsp-poster\" aria-hidden=\"true\" style={{ opacity: posterGone ? 0 : 1 }}><div className=\"vsp-poster__img\" style={{ backgroundImage: `url(https://i.ytimg.com/vi/${ytId}/hqdefault.jpg)` }} /><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div></>;\n const video = watching && ytId && !full ? (\n <LiveVideo ytId={ytId} title={name} radius={14} large style={desk ? undefined : { margin: '8px 20px 2px' }} picture={picture}>\n <MiniPlayer pos={pos} transport={transport} chip={chipFor({ ...glassChip, width: 64, height: 28, minHeight: 28, padding: '0 8px' }, 'sm')} voices={voicesBtn} onFull={() => { browserFull(true); setFull(true); }} copied={null} />\n </LiveVideo>\n ) : null;\n const subRow = player.wordSync ? (subtitleShown(rows, player.idx, player.t) ? rows[player.idx] : undefined) : rows[player.idx];\n for (const r of rows) for (const [l, tx] of Object.entries(r.translations)) if (tx) trSeen.current.set(`${r.sentenceId ?? r.start}|${l}`, tx);\n const seenIn = (r: NonNullable<typeof subRow>, l: string) => r.translations[l] || trSeen.current.get(`${r.sentenceId ?? r.start}|${l}`) || null;\n const hasLang = (r: typeof subRow, l: string | null) => !r || !l || r.language === l || !!seenIn(r, l);\n const subLang = hasLang(subRow, askLang) ? askLang : hasLang(subRow, subLangRef.current) ? subLangRef.current : askLang;\n if (subRow && hasLang(subRow, subLang)) subLangRef.current = subLang;\n const subText = subRow && subLang && subRow.language !== subLang ? seenIn(subRow, subLang) : null;\n const subRows = subRow && subText && subLang && !subRow.translations[subLang] ? Object.assign([...rows], { [player.idx]: { ...subRow, translations: { ...subRow.translations, [subLang]: subText } } }) : rows;\n const subLine = subRow ? lineWords(subRows, player.idx, subLang) : [];\n const wordsOn = wordsPref ? wordsPref === 'on' : !locked || voice.on || !feedLang || feedLang === langCode;\n const subAt = wordsOn ? spokenWordOf(player, player.idx, subLine) : null;\n const subWords = subLine.map((w, j) => ({ t: w.text, sp: j < subLine.length - 1 ? ' ' : '', dim: subAt != null && j > subAt }));\n const labelsOn = labelsPref ? labelsPref === 'on' : locked ? false : showLabels(model, rows, rec?.settings);\n const settingsOut = { lang: askLang, subtitles: ccOn, speakerLabels: labelsOn, wordHighlight: wordsOn, translateAudio: speakOn, voices: cloneOn ? 'cloned' as const : 'synthetic' as const, removeBackground: removeBg };\n const settingsKey = JSON.stringify(settingsOut);\n const onSettings = useRef(props.onSettingsChange);\n onSettings.current = props.onSettingsChange;\n useEffect(() => { onSettings.current?.(settingsOut); }, [settingsKey]); // eslint-disable-line react-hooks/exhaustive-deps\n const subLook = subRow && subRow.speaker >= 0 && labelsOn ? speakerLook(model, subRow.speaker) : null;\n const [linkCopied, setLinkCopied] = useState(false);\n const [expBusy, setExpBusy] = useState<'srt' | 'pdf' | null>(null);\n const [expDone, setExpDone] = useState<'srt' | 'pdf' | null>(null);\n const expT = useRef<number | undefined>(undefined);\n useEffect(() => () => window.clearTimeout(expT.current), []);\n const copiedT = useRef<number | undefined>(undefined);\n useEffect(() => () => window.clearTimeout(copiedT.current), []);\n const shareAtUrl = (t: number | null) => { if (props.shareUrl) return props.shareUrl(t); const u = new URL(window.location.href); if (t != null && t > 0) u.searchParams.set('t', String(t)); else u.searchParams.delete('t'); return u.href; };\n const startAt = useRef<number | null>(init.startAt);\n const startSeek = (t0: number) => {\n if (player.seekFrac && player.dur > 0) { player.seekFrac(Math.min(1, t0 / player.dur)); return; }\n let i = 0;\n for (let k = 0; k < rows.length; k++) if (rows[k].start <= t0) i = k;\n player.seekRow(i);\n };\n const startEarly = useRef(false);\n useEffect(() => {\n const t0 = startAt.current;\n if (t0 == null || startEarly.current || !player.has || rows.length === 0) return;\n startEarly.current = true;\n startSeek(t0);\n }, [player.has, rows.length]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n const t0 = startAt.current;\n if (t0 == null || !player.playing) return;\n startAt.current = null;\n if (Math.abs(player.t - t0) > 2) startSeek(t0);\n }, [player.playing]); // eslint-disable-line react-hooks/exhaustive-deps\n const seekTo = (t0: number) => { autoplayDone.current = true; startAt.current = null; startSeek(Math.max(0, t0)); };\n props.handle.current = {\n seek: (t0) => seekTo(t0),\n play: () => { autoplayDone.current = true; if (listening && !playerRef.current.playing) playerRef.current.toggle(); },\n pause: () => { autoplayDone.current = true; playerRef.current.pause(); },\n toggle: () => { autoplayDone.current = true; if (listening || playerRef.current.playing) playerRef.current.toggle(); },\n toggleMute: () => { setSoundTip(false); playerRef.current.toggleMute(); },\n };\n useEffect(() => () => { props.handle.current = null; }, []); // eslint-disable-line react-hooks/exhaustive-deps\n const onPlayback = useRef(props.onPlayback);\n onPlayback.current = props.onPlayback;\n const playbackLang = useRef(askLang);\n playbackLang.current = askLang;\n useEffect(() => {\n let last = '';\n const tick = () => {\n const cb = onPlayback.current;\n if (!cb) return;\n const p = playerRef.current;\n const s: PlaybackState = { t: p.t, dur: p.dur, playing: p.playing, idx: p.idx, seekN: p.seekN, lang: playbackLang.current, muted: p.muted };\n const key = `${s.t.toFixed(2)}|${s.dur}|${s.playing}|${s.idx}|${s.seekN}|${s.lang}|${s.muted}`;\n if (key === last) return;\n last = key;\n cb(s);\n };\n tick();\n const id = window.setInterval(tick, PLAYBACK_MS);\n return () => window.clearInterval(id);\n }, []);\n const shareHere = () => props.onShare ? props.onShare() : shareLink(shareAtUrl(null), name, () => { window.clearTimeout(copiedT.current); setLinkCopied(true); copiedT.current = window.setTimeout(() => setLinkCopied(false), 2200); });\n const exportRow = (key: 'srt' | 'pdf', title: string, sub: string) => {\n const f = TX_FORMATS.find((x) => x.key === key)!;\n const busy = expBusy === key, done = expDone === key;\n return (\n <div className=\"srow srow--tap\" role=\"button\" aria-busy={busy || undefined} style={expBusy && !busy ? { opacity: 0.45, pointerEvents: 'none' } : undefined} onClick={() => {\n if (expBusy) return;\n setExpBusy(key);\n Promise.resolve().then(() => doExport(key)).then(() => { setExpDone(key); window.clearTimeout(expT.current); expT.current = window.setTimeout(() => setExpDone(null), 1600); }).catch(() => {}).finally(() => setExpBusy(null));\n }}>\n {busy ? <Spinner size={17} color=\"var(--brand)\" track=\"var(--fill-12)\" /> : <Icon d={f.icon} size={17} sw={1.5} style={{ flex: 'none', color: 'var(--ink-70)' }} />}\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">{title}</div><div className=\"srow__s\">{sub}</div></div>\n <Icon d={done ? D.check : D.downloaded} size={17} sw={1.6} style={{ flex: 'none', color: done ? 'var(--brand)' : 'var(--ink-62)' }} />\n </div>\n );\n };\n const eyebrow: React.CSSProperties = { padding: '10px 14px 4px', fontSize: 11, fontWeight: 600, letterSpacing: '.12em', color: 'var(--ink-35)' };\n const subsBack = (\n <span className=\"vs-sheet__title\" style={{ position: 'relative' }}>\n {'\\u00a0'}\n <button type=\"button\" onClick={() => setPage('main')} aria-label=\"Back\" style={{ position: 'absolute', left: -6, top: '50%', transform: 'translateY(-50%)', display: 'inline-flex', alignItems: 'center', gap: 2, padding: '4px 6px 4px 0', border: 0, background: 'none', color: 'var(--ink-96)', fontFamily: 'var(--vs-font-sans)', fontSize: 15, fontWeight: 600, letterSpacing: 0, lineHeight: 1, whiteSpace: 'nowrap', cursor: 'pointer' }}>\n <Icon d={D.chevronLeft} size={18} sw={1.8} />Back\n </button>\n </span>\n );\n const chev = <Icon d={D.chevronRight} size={17} sw={1.6} style={{ flex: 'none', color: 'var(--ink-45)' }} />;\n const sheetTitle = { main: 'SETTINGS', lang: 'LANGUAGE', subs: 'SUBTITLES', audio: 'AUDIO', export: 'EXPORT' }[page];\n const pageBody: React.CSSProperties = { display: 'flex', flexDirection: 'column', gap: 2, paddingBottom: 14 };\n const settingsSheet = locked ? (\n <Sheet open={settings} onClose={() => setSettings(false)} title={sheetTitle} titleNode={page === 'main' ? undefined : subsBack} doneLabel={t.done} kind={page === 'main' ? 'settings' : 'settings vs-sheet--page'} sticky>\n <GrowBox>\n {page === 'lang' ? (\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <div style={{ position: 'sticky', top: 0, zIndex: 1, padding: '4px 14px 10px', background: 'var(--vs-surface-raised)' }}>{langPage.search}</div>\n {langPage.list}\n </div>\n ) : page === 'subs' ? (\n <div style={pageBody}>\n <div className=\"srow\">\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Show subtitles</div><div className=\"srow__s\">Captions over the video</div></div>\n <Toggle checked={ccOn} onChange={setCcOn} label=\"Show subtitles\" />\n </div>\n <div className=\"srow\">\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Show speaker labels</div><div className=\"srow__s\">Who is speaking, before each line</div></div>\n <Toggle checked={labelsOn} onChange={(v) => setLabelsPref(v ? 'on' : 'off')} label=\"Show speaker labels\" />\n </div>\n <div className=\"srow\">\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Highlight words</div><div className=\"srow__s\">Follow each word as it is spoken</div></div>\n <Toggle checked={wordsOn} onChange={(v) => setWordsPref(v ? 'on' : 'off')} label=\"Highlight words\" />\n </div>\n </div>\n ) : page === 'audio' ? (\n <div style={pageBody}>\n <div className=\"srow\">\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Translate audio</div><div className=\"srow__s\">{!askLang ? 'Pick a language to hear the translation read aloud' : speakAvail ? 'Hear the translation read aloud instead of the original speech' : voice.canSpeak ? 'Not available right now' : 'Not available in this language'}</div></div>\n <Toggle checked={speaking} onChange={setSpeakOn} label=\"Translate audio\" disabled={!speakAvail || !askLang} />\n </div>\n {speaking && voice.hasClone && (\n <div className=\"srow\">\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Voices</div><div className=\"srow__s\">{cloneOn ? 'Each speaker in their own cloned voice' : 'Synthetic voices matched to each speaker'}</div></div>\n <Switch<'stock' | 'clone'> value={cloneOn ? 'clone' : 'stock'} onChange={(v) => setCloneOn(v === 'clone')} size=\"sm\" options={[{ value: 'stock', label: 'Synthetic' }, { value: 'clone', label: 'Cloned' }]} />\n </div>\n )}\n <div className=\"srow\">\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">{REMOVE_BG_LABEL}</div><div className=\"srow__s\">{bedNote(removeBg, bgState, 'video', voice.on ? 0 : speechTrack.untilS)}</div></div>\n <Toggle checked={removeBg && canDownload} onChange={setRemoveBg} label={REMOVE_BG_LABEL} disabled={!canDownload || (bgState === 'unavailable' && !removeBg)} />\n </div>\n </div>\n ) : page === 'export' ? (\n <div style={pageBody}>\n {exportRow('srt', 'Subtitles', 'SRT / VTT caption cues, ready for a video editor or a player')}\n {exportRow('pdf', 'PDF', 'Formatted transcript in paragraphs, with timestamps and speaker labels')}\n </div>\n ) : (\n <div style={pageBody}>\n {[\n meta.can && ctl.language && (\n <div key=\"lang\" className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('lang')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Language</div><div className=\"srow__s\">{askLang ? `Translated to ${meta.label ?? askLang.toUpperCase()}` : 'Original language'}</div></div>\n <span style={{ fontSize: 18, lineHeight: 1 }}>{meta.flag}</span>\n {chev}\n </div>\n ),\n ctl.subtitles && (\n <div key=\"subs\" className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('subs')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Subtitles</div><div className=\"srow__s\">{ccOn ? 'On · speaker labels and word highlighting' : 'Off'}</div></div>\n {chev}\n </div>\n ),\n ctl.audio && (\n <div key=\"audio\" className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('audio')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Audio</div><div className=\"srow__s\">{audioSummary}</div></div>\n {chev}\n </div>\n ),\n ctl.export && canExport && !!recordingId && (\n <div key=\"export\" className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('export')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Export{dlLangName ? ` in ${dlLangName}` : ''}</div><div className=\"srow__s\">Subtitles (SRT / VTT) or a PDF of the transcript</div></div>\n {chev}\n </div>\n ),\n ].filter(Boolean).flatMap((el, i) => (i ? [<div key={`d${i}`} className=\"sdiv\" />, el] : [el]))}\n </div>\n )}\n </GrowBox>\n </Sheet>\n ) : (\n <Sheet open={settings} onClose={() => setSettings(false)} title={t.settings} doneLabel={t.done} drawer={desk}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {meta.can && (\n <>\n <div className=\"srow srow--tap\" onClick={() => { setSettings(false); meta.onClick(); }}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">{t.langLabel}</div><div className=\"srow__s\">{t.langCount}</div></div>\n <span style={{ fontSize: 18, lineHeight: 1 }}>{meta.flag}</span>{voice.original ? null : <span style={{ fontSize: 14, fontWeight: 600, color: 'var(--ink-96)' }}>{meta.label}</span>}<Icon d={D.chevronRight} size={15} style={{ color: 'var(--ink-45)' }} />\n </div>\n <div className=\"sdiv\" />\n </>\n )}\n {props.settingsExtra}\n </div>\n </Sheet>\n );\n\n const fullEl = full && watching && (!!ytId || locked) && (\n <FullVideo page={(props.layout ?? 'embed') === 'page'} picture={picture} title={name} desk={desk} pos={pos} mute={{ muted: player.muted, onToggle: toggleSound }} cc={ctl.subtitles ? { on: ccOn, onToggle: () => setCcOn((v) => !v) } : undefined} noFull={!ctl.fullscreen} ad={adOn} wait={waitState && !softWait ? <PlayerWait state={waitState} line={voiceHolds ? subWords.map((w) => w.t + w.sp).join('') : null} onRetry={waitRetry} onOriginal={waitOriginal} /> : player.edgeWait ? `Transcribing ${Math.round(pct)}% — it plays on as more is written` : null} pct={running ? Math.round(pct) : null}\n sub={ccOn && subRow ? { who: subLook ? speakerLabel(model, subRow.speaker) : null, color: subLook ? subLook.fg ?? `var(--lane-${subLook.lane})` : '#fff', words: subWords, cursor: spokenWordOf(player, player.idx, subLine) } : null}\n chip={chipFor(desk ? glassChip : { ...glassChip, width: 64, padding: '0 6px' }, desk ? undefined : 'sm')} transport={transport}\n picker={voice.sheets} sheet={locked ? settingsSheet : null} voices={null} voicesBtn={locked ? null : voicesBtn} sheetOpen={voice.sheetsOpen || settings} onShare={locked && ctl.share ? shareHere : undefined} onSettings={locked && ctl.settings ? () => { voice.closePicker(); setSettings((v) => !v); } : undefined} compact={!!props.compact} paused={{ title: name, summary: sharedSummary.state === 'ready' ? sharedSummary.summary ?? null : null, share: ctl.share && (props.shareUrl || !props.onShare) ? { url: shareAtUrl, at: player.t } : null }}\n copied={linkCopied ? <div className=\"gfull__toast\" aria-live=\"polite\"><Icon d={D.check} size={13} sw={2} />Link copied</div> : soundTip ? <div className=\"gfull__toast gfull__soundtip\" aria-live=\"polite\"><Icon d={D.volumeOff} size={14} sw={1.8} />Tap for sound</div> : softNote ? <div className=\"gfull__toast\" role=\"status\" aria-live=\"polite\"><Spinner size={13} color=\"#eef0f8\" track=\"rgba(255,255,255,.25)\" />{softNote}</div> : voice.on && (videoLed ? follow.missing != null : player.silent) ? <div className=\"gfull__toast\" role=\"status\" aria-live=\"polite\"><Spinner size={13} color=\"#eef0f8\" track=\"rgba(255,255,255,.25)\" />{`${waitLangName || 'Translated'} voice is still being prepared · playing with subtitles`}</div> : null} onTouch={() => { browserFull(true); soundOn(); }} onClose={locked ? undefined : () => { browserFull(false); setFull(false); }} />\n );\n useEffect(() => { if (!locked && full && !watching) { browserFull(false); setFull(false); } }, [locked, full, watching]);\n const progressBox = running && (\n <div className={`pubprog${desk ? ' pubprog--desk' : ''}${find ? ' pubprog--find' : ''}`}>\n <div className=\"pubprog__row\"><span className=\"l\">{`TRANSCRIBING ${pct}%`}</span>{!desk && <div style={{ flex: 1 }} />}{desk && <div className=\"pubprog__bar\" style={{ flex: 1 }}><div style={{ width: `${pct}%` }} /></div>}<span className=\"s\">{segs}</span></div>\n {!desk && <div className=\"pubprog__bar\" style={{ marginTop: 8 }}><div style={{ width: `${pct}%` }} /></div>}\n </div>\n );\n const gonePanel = gone && <div className=\"hint\" style={{ padding: '30px 20px', textAlign: 'center', fontSize: 13 }}>This link is no longer shared. Ask the person who sent it for a new one.</div>;\n const lines = <TxLines model={model} rows={rows} player={listening ? player : { ...player, playRow: player.seekRow }} tail={tail} tailFg={tailFg} running={running} desk={desk} feedRef={feedRef} listener showLabels={labelsOn} find={findQ} findOpen={!desk && find} lang={feedLang} warm={warm} onVisible={onVisible} wordHl={wordsOn} />;\n const toast = <Toast error={error ?? subError ?? (voiceFailed && full ? null : player.error) ?? voice.error} onClose={() => { setError(null); clearError(); player.clearError(); voice.clearError(); }} />;\n const subline = [lenS ? clock(lenS) : null, langCode ? langCode.toUpperCase() : null, by || 'Read-only copy'].filter(Boolean).join(' · ');\n const pubTransport = (deskScrub: boolean) => (\n <div className=\"ctrans\">\n {voice.noVoice ? voice.noVoiceNote : (\n <>\n <div className=\"ctrans__row\">\n <span className=\"ctrans__sp\" aria-hidden=\"true\" />\n <div className=\"ctrans__mid\">\n <button type=\"button\" className=\"ctrans__step\" aria-label=\"Previous segment\" title=\"Previous segment\" style={{ opacity: player.idx <= 0 ? 0.3 : 1 }} onClick={player.prev}><Icon d={D.chevronLeft} size={16} sw={1.8} /></button>\n <button type=\"button\" className=\"ctrans__play\" aria-label={voice.relang ? 'Preparing audio' : player.playing ? 'Pause' : 'Play'} title={voice.relang ? 'Preparing audio…' : voice.playTitle ?? (player.playing ? 'Pause' : 'Play')} disabled={!playable} onClick={player.toggle}>\n {voice.relang\n ? <span className=\"ctrans__spin\" />\n : <svg viewBox=\"0 0 24 24\" width={16} height={16} fill=\"currentColor\" aria-hidden=\"true\" style={player.playing ? undefined : { marginLeft: 2 }}>{player.playing ? PAUSE_D : PLAY_D}</svg>}\n </button>\n <button type=\"button\" className=\"ctrans__step\" aria-label=\"Next segment\" title=\"Next segment\" style={{ opacity: player.idx >= rows.length - 1 ? 0.3 : 1 }} onClick={player.next}><Icon d={D.chevronRight} size={16} sw={1.8} /></button>\n </div>\n <span className=\"ctrans__mute\">{mute(36)}</span>\n </div>\n <div className=\"ctrans__scrub\">{scrub(deskScrub)}</div>\n </>\n )}\n </div>\n );\n const dp = useSideTabs<PubTab>('ga', { tabs, cur: tab, pref: tabs[0]?.key, onPick: setTab });\n const holdPct = Math.max(0, Math.min(100, Math.round(pct)));\n const hold = holding && (\n <div className=\"gfull gfull--hold\" data-theme=\"dark\" role=\"status\" aria-live=\"polite\">\n {ytId && <div className=\"gfull__holdbg\" style={{ backgroundImage: `url(https://i.ytimg.com/vi/${ytId}/hqdefault.jpg)` }} />}\n <div className=\"gfull__hold\">\n {!shared ? <span className=\"gfull__spin gfull__holdspin\" aria-label=\"Loading\" /> : (\n <>\n {name && <div className=\"gfull__holdt\">{name}</div>}\n <div className=\"gfull__holdpct\">{status === 'transcribing' ? `${holdPct}%` : <span className=\"gfull__spin gfull__holdspin\" />}</div>\n <div className=\"gfull__holdbar\"><div style={{ width: `${status === 'transcribing' ? holdPct : 0}%` }} /></div>\n <div className=\"gfull__holds\">{status === 'transcribing' ? 'Transcribing' : status === 'cropping' ? 'Preparing the video' : 'Waiting to start'}{status === 'transcribing' && progress?.segmentsDone ? ` · ${segs.toLowerCase()}` : ''}</div>\n <div className=\"gfull__holdn\">The video starts as soon as the first lines are transcribed.</div>\n </>\n )}\n </div>\n </div>\n );\n const tabPct = locked && shared && (running || status === 'cropping') ? Math.max(0, Math.min(100, Math.round(pct))) : null;\n const onProgress = useRef(props.onProgress);\n onProgress.current = props.onProgress;\n useEffect(() => { onProgress.current?.(tabPct); }, [tabPct]);\n const [endDismissed, setEndDismissed] = useState(false);\n const atEnd = !!fullEl && !holding && (videoLed ? !!player.ended : !player.playing && player.dur > 0 && player.t >= player.dur - 0.5);\n useEffect(() => { if (!atEnd) setEndDismissed(false); }, [atEnd]);\n const endCard = props.endCard !== false && atEnd && !endDismissed && (\n <EndCard options={{ appUrl: props.appUrl, ...(props.endCard || {}) }} onStarted={props.onStarted} onClose={() => setEndDismissed(true)} onReplay={() => { setEndDismissed(true); autoplayDone.current = true; if (player.seekFrac) player.seekFrac(0); else player.seekRow(0); if (!player.playing) player.toggle(); }} />\n );\n const endPill = props.endCard !== false && atEnd && endDismissed && (\n <button type=\"button\" className=\"vsp-endpill\" onClick={(e) => { e.stopPropagation(); setEndDismissed(false); }}><Icon d={D.link} size={15} sw={1.8} />Transcribe a video</button>\n );\n if (locked) return <>{gone ? <div className=\"gfull\" data-theme=\"dark\">{gonePanel}</div> : hold || fullEl || <div className=\"gfull\" data-theme=\"dark\" />}{endCard}{endPill}{toast}</>;\n if (desk) {\n const deskAudio = listening && !watching && !gone && <div className=\"pubdeskctl\">{pubTransport(true)}</div>;\n const sideOn = !gone && (tabs.length > 0 || watching || !!voice.sidePanel || !!deskAudio);\n return (\n <>\n <div className=\"dhead dhead--listener dhead--cols\">\n <div className=\"gcolhead\">\n <div className=\"gcolhead__main\">\n <div className=\"gcolhead__col\">\n <div style={{ flex: 'none' }}><Logo dark={dark} height={20.38} /></div>\n {!gone && (\n <div className=\"dhead__session\">\n <span className=\"t\">{shared ? name : ''}</span>\n <span className=\"s\">{shared ? subline : ''}</span>\n </div>\n )}\n </div>\n </div>\n {sideOn && <div className=\"gcolhead__side\" />}\n </div>\n </div>\n <div className=\"listenerlive listenerlive--cols listenerlive--pub\">\n <div className=\"listenerlive__main\">\n {gonePanel}\n {!gone && findField}\n {progressBox}\n {flash && <div className=\"pubflash\">{flash}</div>}\n {!gone && <div className=\"listenerlive__inner\" style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column', marginTop: 6 }}>{lines}</div>}\n {!gone && (\n <div className=\"listenerlive__inner gdeskbar\" data-transport=\"1\">\n {meta.can && <span className=\"barchip\" style={meta.active ? { background: 'var(--brand-tint)', boxShadow: '0 0 0 1.5px var(--brand)', borderRadius: 12 } : undefined}><LanguageChip flag={meta.flag} code={meta.code} label={meta.label} bordered={false} onClick={meta.onClick} /></span>}\n {modeSwitch}\n </div>\n )}\n </div>\n {sideOn && (\n <SideFrame id=\"ga\" className=\"listenerside\" gap={20} plain>\n {!voice.sidePanel && deskAudio}\n {!voice.sidePanel && video}\n {!voice.sidePanel && tabs.length > 0 && (\n <div data-panel-grid=\"\" className=\"listenerside__panels\">\n <SidePanels col={dp} order={['summary', 'export']} onPick={setTab} grip={{ summary: 40, export: 28 }} render={(k) => <Card panel>{pubPanel(k)}</Card>} />\n </div>\n )}\n {voice.sidePanel}\n </SideFrame>\n )}\n </div>\n {!fullEl && voice.sheets}{!(locked && fullEl) && settingsSheet}{fullEl}{toast}\n </>\n );\n }\n const widgetOn = tabs.length > 0 && !find;\n const widget = widgetOn && (\n <div className=\"txwidget\">\n <Card panel>\n <TabBar tabs={tabs} current={tab} onPick={setTab} gap={tab !== 'none'} />\n {tab !== 'none' && pubPanel(tab)}\n </Card>\n </div>\n );\n return (\n <>\n <ListenerHeader dark={dark} title={shared ? name : ''} subline={shared ? subline : ''} onOptions={() => setSettings(true)} optionsActive={settings} />\n {gonePanel}\n {progressBox}\n {!gone && widget}\n {!gone && video}\n {!gone && (\n <div style={{ position: 'relative', flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>\n {findField}\n {lines}\n {flash && <div className=\"txflash\">{flash}</div>}\n </div>\n )}\n {!gone && (\n <div className=\"gbottom\" data-transport=\"1\">\n {listening && !watching && <div className=\"pubctl\">{pubTransport(false)}</div>}\n <div className=\"gbottom__bar\">\n {meta.can && <div style={{ flex: 'none' }}>{chipFor({ width: 87 }, undefined)}</div>}\n <div style={{ flex: 1, minWidth: 0 }}>{modeSwitch}</div>\n </div>\n </div>\n )}\n {!fullEl && voice.sheets}{!(locked && fullEl) && settingsSheet}{fullEl}{toast}\n </>\n );\n}\n\nfunction useSealed(url: string | null): 'yes' | 'no' | 'unknown' {\n const [st, setSt] = useState<{ url: string; ok: boolean } | null>(null);\n useEffect(() => {\n if (!url || (st?.url === url && st.ok)) return;\n let live = true;\n let h: ReturnType<typeof setTimeout> | undefined;\n const check = () => { void audioSealed(url).then((y) => { if (!live) return; setSt({ url, ok: y }); if (!y) h = setTimeout(check, 3000); }); };\n check();\n return () => { live = false; if (h) clearTimeout(h); };\n }, [url, st?.url === url && st?.ok]); // eslint-disable-line react-hooks/exhaustive-deps\n return !url || st?.url !== url ? 'unknown' : st.ok ? 'yes' : 'no';\n}\n","import type { CSSProperties } from 'react';\nimport type { Site } from '../core/sites';\n\nexport function SiteIcon({ site, size = 16, tinted = false, style, className }: { site: Site; size?: number; tinted?: boolean; style?: CSSProperties; className?: string }) {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" className={className} style={{ flex: 'none', display: 'block', color: tinted ? site.color : undefined, ...style }}>\n <path d={site.glyph} fill=\"currentColor\" fillRule=\"evenodd\" />\n </svg>\n );\n}\n"],"names":["SITE","LOGO_DARK","LOGO_LIGHT","MARK_DARK","MARK_LIGHT","I","size","sw","children","style","rest","jsx","D","Icon","d","p","StopGlyph","PlayGlyph","Spinner","color","track","PauseGlyph","jsxs","Logo","dark","height","link","img","Mark","Card","panel","inset","className","Toggle","checked","onChange","label","disabled","Switch","value","options","bordered","fill","ref","useRef","thumb","setThumb","useState","idx","o","useLayoutEffect","el","opt","useEffect","ro","IconButton","onClick","variant","active","title","LanguageChip","flag","code","block","flagOnly","named","CopyButton","onCopied","copied","setCopied","copy","e","useVisualViewportInset","open","vv","focusTimer","apply","r","top","bottom","a","GrowBox","ms","anim","_a","GrowAnim","outer","inner","h","setH","box","settle","room","sheet","max","measure","scrim","full","Sheet","onClose","titleNode","note","doneLabel","drawer","header","kind","sticky","scrimRef","onKey","createContext","Eyebrow","reporter","setErrorReporter","fn","reportError","deliveryFormat","credParams","cred","q","explainAudioError","url","res","body","message","audioSealed","deliveryAudioUrl","apiOrigin","recordingId","backgroundAudioUrl","audioDownloadUrl","voiceTrackDownloadUrl","lang","voiceKey","voiceTrackUrlAs","format","mediaErrorText","report","what","reportMediaError","STARTING_DEFAULT_MS","startingRetryMs","status","retryAfter","ra","b","ClipPrefetch","__publicField","src","signal","u","srcs","keepSet","s","n","ready","recent","order","over","i","busy","ctl","done","cur","mediaKind","newMediaElement","v","VoiceNotStarted","_ClipQueue","ids","id","afterId","clip","c","line","held","w","exp","prev","rested","gap","span","floor","part","beforeFirst","patience","first","sentenceId","at","going","t","m","sec","base","frac","lens","_","total","x","y","target","k","len","from","withFrom","out","secs","enough","again","afterMs","since","tries","known","piece","tagged","next","dropped","ClipQueue","rowForVoice","rows","voiceId","archiveClips","row","sentenceIds","cp","tk","vk","rev","parts","_b","readCursor","tokens","pos","tokenAt","dur","acc","want","RECENT","subs","read","key","fallback","raw","write","useStored","setV","on","forgetRecentLang","list","useRecentLangs","set","safe","pickerLanguages","langs","allowed","l","useSidePins","pins","setPins","COL_W","useColW","useLanguageList","onSelect","languages","searchPlaceholder","none","pinned","requireVoice","keepOpen","setQ","showAll","setShowAll","refused","setRefused","filtered","useMemo","needle","pa","pb","recents","cut","shown","more","inRecent","extra","off","search","Fragment","LanguagePicker","FileFollow","setup","playing","seekN","onToggle","seekOver","setReady","gone","setGone","tRef","SITES","BY_ID","siteById","hostOfUrl","siteOf","host","loomId","vimeoIds","dailymotionId","twitchTarget","hms","embedUrl","site","play","tg","_c","name","_d","_e","_f","_g","path","_h","_i","_j","FOLLOWS","hasEmbed","urlFromEmbed","sourceVideoUrl","wistiaId","vidyardId","SIGNALS","embedSignal","EmbedFollow","failed","setFailed","heard","sig","onMsg","sdk","loadSdk","resolve","seq","FacebookFollow","player","live","fb","onReady","f","script","loadScript","WistiaFollow","video","playRef","loadApi","started","wait","VidyardFollow","uuid","api","loomStreamUrl","j","signedLoader","master","query","xhr","loomSetup","fail","destroy","mod","Hls","hls","cache","useYtTitle","ytId","setTitle","HASH","ID","displayName","clean","BED_DRIFT_S","followBed","REMOVE_BG_LABEL","REMOVE_BG_NOTE","clockOf","bedNote","state","untilS","trackPlan","removeBg","voiceOn","removeBgFromQuery","withRemoveBg","bedRetryS","SEAM_S","partsOf","partAt","lo","hi","mid","slotsFor","load","other","probe","release","useSeparatedTrack","setState","setParts","setOn","els","stop","timer","check","old","pauseParts","plan","slot","useBackgroundBed","FOLLOW_DRIFT_S","FOLLOW_AHEAD","lineAt","lines","followTarget","clips","elapsed","mayRunOn","playingSid","upcomingSrcs","useVoiceFollow","bySid","stopCurrent","missing","sid","keep","MEDIA_KEYS","onMediaKey","bindMediaKeys","get","useMediaKeys","clock","mm","ss","empty","mediaToWall","media","end","last","toWords","fromSnapshot","snap","sp","foldTr","undoesAutoFix","words","tail","changed","marked","applyFrame","seg","kept","norm","fixes","g","sentences","segs","sentenceConfidence","mergeSegTranslations","sum","CONF_MID","CONF_LOW","confClass","LANES","lane","speaker","speakerNumbers","see","was","speakerNumber","GENERIC_NAME","given","speakerName","speakerLabel","speakerInitial","speakerColor","voiceColor","speakerLook","showLabels","own","said","mode","seen","THEIRS","OURS","GENERIC","OFFLINE","BROWSER","describe","any","details","rid","VocalStackError","DEFAULT_API","Ctx","usePlayerApi","useContext","PlayerApiProvider","props","OwnApi","useApi","UUID","isTranscriptionId","listen","listenerToken","owner","origin","tokRef","hasToken","bearer","ownerTok","setOwnerTok","client","VocalStack","shareCode","withMedia","loadSource","recording","tx","job","useSource","source","setSource","error","setError","setN","alive","useMediaToken","tok","setTok","left","apiFetch","init","headers","qs","langCache","useLanguages","setL","useAsync","deps","data","setData","sleep","PENDING_REFETCH_MS","PENDING_REFETCHES","useTranscript","opts","apiRef","model","setModel","modelRef","subRef","langRef","connected","setConnected","notFound","setNotFound","bump","useCallback","optsRef","attempt","announced","announceState","sub","asked","ev","pe","pd","st","translating","setTranslating","translateFailed","setTranslateFailed","langTurn","shownLang","setShownLang","setLanguage","turn","fetchOnce","mergeTranslations","made","touched","text","clearError","I18N","strings","answerError","rowStatusOf","progressOf","segsLabel","fallbackDone","jobLengthS","progress","TX_FORMATS","saveUrl","saveWhenReady","exportTranscript","blob","cd","star","plain","href","downloadVoiceTrack","mine","until","ytIdOf","liveEmbedUrl","SUB_LEAD_S","SUB_LINGER_S","lineSpeechEnd","subtitleShown","spreadWords","to","weight","start","feedInset","cs","cap","useFeedBar","thumbRef","paintRef","glassBar","geom","bar","covered","vis","hide","dragging","clearGlass","atBottom","show","barRO","watched","paint","reveal","gutter","onScroll","down","move","FeedBar","Toast","closeRef","hover","setHover","copiedT","credit","VoiceIdGlyph","Transport","chip","scrub","mute","voice","ReplayScrub","index","atLabel","durLabel","stepLabel","onSeek","onSeekFrac","onScrubStart","onScrubEnd","glideMs","drag","setHeld","pct","glide","emit","up","rowFixes","corrections","slots","seqs","rewritten","FixBadges","desk","onOpen","one","FixPen","alone","setOver","useViewportTranslation","merge","visible","setVisible","tick","setTick","byId","onVisible","voiceDetail","groupOf","voiceGroups","counts","head","headOn","speakerRoster","unknownLabel","unknown","look","castKey","map","parseCast","spk","autoCast","roster","voices","clones","pool","used","free","pick","SpeakerCast","selected","noClone","building","short","warn","sexOf","sel","alert","dot","few","VoiceSheetBody","cast","currentId","armedId","sampleId","dlId","onPick","onAdd","onUse","usedBy","foldKey","foldFor","problem","fold","setFold","gendered","useOn","headCount","rule","detail","dling","shares","Equaliser","width","ORIGINAL_FLAG","langMeta","useVoiceCatalogue","version","rec","recId","recToken","recShare","namedCount","useArchiveVoice","ended","pickedVoice","listed","reload","got","renderVoiceId","asking","setAsking","renderError","setRenderError","renderKey","requestRender","fromKey","use","castObj","k2","forget","prefix","rendering","sentenceKey","near","setNear","kicked","castMap","missingNow","lastCount","coming","TAB_ICON","TabBar","tabs","current","side","anyOn","tip","setTip","tipRef","tipW","setTipW","showTip","tab","strip","hideTip","tipEl","createPortal","labelled","flex","icon","DL_D","MUSIC_D","ExportPanel","audio","formats","onExport","setDone","setBusy","flash","exportAs","save","dl","shareLink","useSummaryIn","setGot","summaryOf","SummaryPanel","action","COPY_D","LiveVideo","timeLabel","radius","large","picture","useDragScroll","enabled","external","startY","startTop","dy","useSideTabs","stored","setStored","keys","tabbed","pinnable","forced","tabKeys","after","pin","unpin","avail","SidePanels","col","render","grip","wrapClass","usePanelGrip","hot","tabsEl","begin","ground","bg","pg","frame","canPin","tr","zone","rs","commit","myCol","onMove","surf","onDown","onUp","onCancel","onLeave","SideFrame","hidden","setW","grid","useMasonry","onGrip","MIN","CONTENT","x0","w0","nw","GAP","raf","layout","mark","watch","mo","isNotCaptured","SAMPLE_RETRY_MS","SAMPLE_GIVE_UP_MS","useVoicePreview","armId","setArmId","setSampleId","setDlId","run","reset","arm","ask","token","EPS","indexAt","snapPosition","placePosition","atEnd","voiceWait","VOICE_WAIT_TITLE","playerWaitOf","useHeld","setSince","PlayerWait","onRetry","onOriginal","now","setNow","lineWords","ws","spokenWordOf","pictureT","lineEnd","YtFollow","wantPlay","onAd","endT","onGone","onKnown","lead","onTime","waiting","adRef","ad","setAd","cmd","func","args","contentDur","liveVideo","adByDur","adByStall","toggleRef","leadRef","adCb","resumeAfterAd","adCheck","playingRef","timeCb","ytT","ytState","ytPaused","setYtPaused","noCaptions","capT","noCaptionsSoon","onLoad","win","endRef","probed","goneRef","knownRef","goneSaid","outside","seek","ps","all","_k","_l","_m","_n","_o","_p","still","PAUSE_D","PLAY_D","MuteButton","useFlash","msg","setMsg","DUCK","DUCK_MS","UNDUCK_MS","useDuck","players","ducked","fade","t0","step","useYtLead","lenS","offsetS","edgeS","cmdRef","readyRef","pending","muted","setMuted","mutedRef","soundOff","setT","offset","edgeRef","edgeWait","setEdgeWait","edgeWaitRef","setWait","send","stateRef","ytMuted","lastEnd","setSeekN","s0","playRetry","nudgePlay","chosen","soundUp","pause","toggle","seekRow","applyMute","setMute","setVideoSound","ok","useTxPlayer","available","setPlaying","silenced","carry","setAttempt","err","why","windowed","durRef","windowedRef","playFailed","seekFrac","resumeAt","seekWord","playRow","lastNudge","hold","vt","useTxVoicePlayer","wordTimes","timed","comingRef","setPos","quiet","setQuiet","quietRef","setWaiting","starting","setStarting","aim","setAim","aimRef","clipPos","setClipPos","restS","setRestS","restBase","setRestBase","silent","setSilent","rowsRef","timedRef","lineIdsRef","videoRef","timesRef","wire","queue","aimed","fromS","keyRef","snapRef","pendingRef","resuming","setResuming","applyRef","park","posRef","drop","lineIds","hasPos","voiced","dir","goRow","spanOf","speech","tNow","before","share","wt","clipEnd","into","joinRow","NO_SEEK","TX_PICKER_NOTE","PUB_SIDE","useTxVoice","srcLang","canTranslate","pickedLang","setPickedLang","hearOriginal","stockVoices","stickyPicker","pickerBusy","voiceSheet","forcedVoice","onAddVoice","onPickVoice","onSelectSpeaker","noCloneFor","castNoClone","castShort","castBuilding","castWarn","badge","voiceTitleNode","hooked","pendingClones","pushRecent","picked","setPicked","picker","setPicker","setSheet","fromVoices","setFromVoices","setWant","original","vLang","preview","cloneOn","catVer","setCatVer","cloneSeen","catalogue","gvList","gVoicePick","meta","trLangs","spkSel","setSpkSel","spkMute","castByLang","setCastByLang","spkRoster","spkCastOn","spkSelected","castChosen","stockCast","castKeyStr","sentCast","hasClone","canSpeak","speakHere","arch","gvPicked","gvId","clipKey","vp","noVoice","speaks","relang","openPicker","closePicker","selectLang","openVoices","closeVoices","pickerMine","voicesMine","toggleChip","toggleVoices","pickVoice","chipMeta","glyph","glyphFg","waitKind","lineHeld","voiceWaiting","voiceTitle","pickerEl","savedClones","savedFor","people","p2","sheetList","stock","auto","selSp","soleSp","noteSp","genderOf","selSex","shownList","autoOf","ctx","toClone","warns","voiceBtn","voiceSheetEl","also","sheets","sidePanel","playTitle","noVoiceNote","TxLines","fixed","applied","onFixOpen","onWord","onFix","fixMode","fixingId","marks","fixBadges","tailFg","running","feedRef","listener","find","findOpen","warm","wordHl","engaged","wordSync","hovId","setHovId","setOff","glideUntil","lastIdx","rowEl","visKey","centre","ins","visH","rowOffscreen","bot","smoothRow","offRef","moved","followJump","follow","fixing","dim","tapRow","fx","fxAny","pen","who","ln","spokenWord","tracks","ahead","dash","half","fg","TxFind","onQ","hits","inline","useFindPull","setOpen","openRef","qRef","setHits","userUntil","touch","ECC_M","rawDataModules","ver","dataCodewords","gfMul","z","rsDivisor","degree","root","rsRemainder","divisor","factor","alignmentPositions","qrMatrix","bytes","capacity","bits","push","pad","numBlocks","eccLen","rawCodewords","numShort","shortLen","blocks","div","dat","ecc","codewords","finder","dx","xx","yy","ap","formatBits","mask","rem","bit","right","vert","maskAt","penalty","score","count","core","add","finish","best","min","qrSvgUrl","svg","ICON_FULL","ICON_EXIT","fullNow","fullTarget","setFullTarget","canFull","noBrowserFull","browserFull","realFull","useMedia","SeekRow","interactive","axis","setDrag","fracOf","PanelSeek","GlassTransport","mini","GlassBrand","VoicesButton","MiniPlayer","transport","onShare","onFull","DIM_WORD","FullVideo","compact","noFull","page","cc","voicesBtn","sheetOpen","onSettings","paused","onTouch","isFull","setIsFull","close","calm","setCalm","touchN","setTouchN","swallow","tint","swipeFull","barsUp","setBarsUp","sheetUp","typing","keyUp","sideways","rootRef","boxW","setBoxW","small","big","calmRef","movedAt","land","subBox","subKey","reading","rowOf","shareAt","setShareAt","shareCopied","setShareCopied","shareT","shareUrl","shareQr","copyShare","shareCard","glass","lbl","grow","acts","ListenerHeader","onBack","home","subline","onOptions","optionsActive","VIDEO_D","modeOptions","DEFAULT_APP","PATH","nonce","openPopup","appUrl","onStatus","app","pop","reject","startFromEmbed","CONNECTED","wasConnected","rememberConnected","STATUS","LINK","EndCard","onStarted","onReplay","setUrl","setErr","setStatus","go","useDesk","setDesk","HINT_CODES","IDLE_DEFAULTS","useIdleControls","prefs","setPage","hint","setHint","dropHint","hintLangs","roomy","setRoomy","hintOn","hintIdx","setHintIdx","hintAt","bubble","chev","back","langList","settingsBody","shareCodeOf","file","ext","TILES","ROWS","COPIES","Cell","ProviderGrid","setSeen","setShown","io","cells","hostOf","useConnect","connect","isMedia","Backdrop","poster","yt","NOW","IdlePlayer","idle","onAct","setSmall","ConnectButton","SourceGate","onClear","StartCard","opening","setOpening","shareErr","setShareErr","inputRef","lastAuto","isLink","launch","found","submit","ErrorGate","useLookup","baseUrl","setFound","PLAYBACK_MS","onOffOf","initialOf","onOff","VocalStackPlayer","forwardRef","handle","useImperativeHandle","setCur","typed","setTyped","idlePrefs","setIdlePrefs","setTouched","idleMuted","idleChosen","gateSrc","gate","embed","PlayerBody","shared","locked","setTab","setFind","findQ","setFindQ","doFlash","setLive","setMode","settings","setSettings","subLangRef","trSeen","setPageRaw","setFull","txLang","setTxLang","askLang","labelsPref","setLabelsPref","wordsPref","setWordsPref","ccOn","setCcOn","speakOn","setSpeakOn","setCloneOn","setRemoveBg","subError","toRows","settled","liveMoving","reread","holding","langCode","by","srcName","pageTitle","hasAudio","sourceAudio","deliveryUrl","sourceStored","sealed","useSealed","audioUrl","lastRow","doneTo","audioPlayer","srcVideoUrl","ytTitle","videoLed","srcPlayer","langBusyRef","langSent","followLines","langBusy","findHits","findField","_r","_q","_t","_s","canDownload","canExport","dlLang","dlLangName","_u","download","doExport","fmt","inLang","playable","playerRef","placeKey","placeRef","autoplayDone","autoplayed","soundTip","setSoundTip","adOn","setAdOn","tryPlay","sound","unmutedNow","soundOn","toggleSound","tapPicture","sumOn","setWarm","feedLang","sharedSummary","anyExport","ytAt","_w","_v","listening","watching","pickMode","modeSwitch","pubPanel","deskStep","slowLine","lineSince","voiceFailed","_x","speakAvail","waitLangName","_y","waitState","softWait","softNote","voiceHolds","langPage","bedUrl","bed","speechUrl","speechTrack","speechOver","bgState","speaking","audioSummary","waitRetry","waitOriginal","glassChip","chipFor","posterGone","setPosterGone","fileVideo","_z","_B","_A","embedSrc","loomVid","loomFollow","fbSrc","_C","wistia","_D","vidyard","_E","embedPic","_G","_F","_I","_H","_K","_J","_M","_L","_O","_N","baseTap","thumbUrl","_Q","_P","thumbPic","subRow","seenIn","hasLang","subLang","subText","subRows","subLine","wordsOn","subAt","subWords","labelsOn","settingsOut","settingsKey","subLook","linkCopied","setLinkCopied","expBusy","setExpBusy","expDone","setExpDone","expT","shareAtUrl","startAt","startSeek","startEarly","seekTo","onPlayback","playbackLang","cb","shareHere","exportRow","subsBack","sheetTitle","pageBody","settingsSheet","fullEl","progressBox","gonePanel","toast","pubTransport","deskScrub","dp","_R","holdPct","tabPct","onProgress","endDismissed","setEndDismissed","endCard","endPill","deskAudio","sideOn","widget","setSt","SiteIcon","tinted"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/ds/Icons.tsx","../src/ds/Controls.tsx","../src/core/audio.ts","../src/core/voiceRetry.ts","../src/core/clipPrefetch.ts","../src/core/clipQueue.ts","../src/core/voiceplayer.ts","../src/data/prefs.ts","../src/ds/LanguagePicker.tsx","../src/ui/FileFollow.tsx","../src/core/sites.ts","../src/core/embeds.ts","../src/ui/EmbedFollow.tsx","../src/ui/FacebookFollow.tsx","../src/ui/WistiaFollow.tsx","../src/ui/VidyardFollow.tsx","../src/core/loomStream.ts","../src/data/title.ts","../src/core/background.ts","../src/core/voiceFollow.ts","../src/core/mediaKeys.ts","../src/core/format.ts","../src/core/transcript.ts","../src/data/errors.ts","../src/data/context.tsx","../src/data/transcript.ts","../src/data/i18n.ts","../src/data/tx.ts","../src/core/youtube.ts","../src/core/readalong.ts","../src/ui/shared.tsx","../src/ui/SideColumn.tsx","../src/core/noAudio.ts","../src/data/voicePreview.ts","../src/core/playPosition.ts","../src/core/voiceWait.ts","../src/ui/wait.tsx","../src/ui/core.tsx","../src/core/qr.ts","../src/ui/full.tsx","../src/data/connect.ts","../src/ui/EndCard.tsx","../src/ui/useDesk.ts","../src/ui/IdleSettings.tsx","../src/core/share.ts","../src/ui/Providers.tsx","../src/ui/SourceGate.tsx","../src/data/lookup.ts","../src/ui/VocalStackPlayer.tsx","../src/ui/SiteIcon.tsx"],"sourcesContent":["/** Heroicons v2 outline paths (24px, stroke 1.5) used by the app, as\n * they appear in the design. `currentColor` throughout. */\nimport type { SVGProps } from 'react';\nexport const SITE = 'https://vocalstack.com';\nconst LOGO_DARK = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDUxLjY5MDciIGhlaWdodD0iMTU1LjMwNjQxIiB2aWV3Qm94PSIwIDAgMTA1MS42OTA2IDE1NS4zMDY0MSI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMC44ODczNDc3MSwwLDAsMC44OTExODY4MiwtNDIuNzE2NjMsLTEyMy44NTM4OCkiPjxwYXRoIHN0eWxlPSJmaWxsOiM1NWFiZTU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjAuMzcyOTYyIiBkPSJtIDE2NS43NDM2OSwzMTIuMzQ1MTQgYyAtMy42NTkwNCwtMC45NTg2MSAtNi44OTEzMSwtMy4zNTM0OCAtOS4yMTQ5NCwtNi44Mjc1OSAtMS45MTIyNiwtMi44NTkwOCAtMi4zOTcwNSwtNC41Njk3MSAtMi4zOTcwNSwtOC40NTgzNiAwLC0zLjk5MjU0IDAuMDgyNCwtNC4yNzU3IDQuMjMwMTIsLTE0LjU0NTUzIDQuMDA5MjMsLTkuOTI2ODEgMTEuNzQ1OTcsLTI5LjYwODA0IDE0LjE3MjU0LC0zNi4wNTMwMiAxLjA1NTUsLTIuODAzNDQgNC42MzU3OSwtMTIuMDkwMiA3Ljk1NjE5LC0yMC42MzcyNSAzLjMyMDQsLTguNTQ3MDYgOS40NzI2NSwtMjQuNDkxMiAxMy42NzE2OCwtMzUuNDMxNDMgOS40MTE2MywtMjQuNTIxMjUgMTIuMTUxMjQsLTMxLjM5NjE0IDE0LjE5MjIyLC0zNS42MTQ1NSAxLjMzMjI5LC0yLjc1MzY0IDEuODc4NjcsLTMuNTkyNTggMy4zNDU0NiwtNS4xMzY3MiAxLjk2ODIyLC0yLjA3MjAzIDQuMDk4NCwtMy41NjI1MyA2LjQ2Njg3LC00LjUyNDkzIDEuMjcxMzgsLTAuNTE2NiAyLjI1NzYzLC0wLjY5MzAyIDQuODI2NzksLTAuODYzNCA1LjIxODMsLTAuMzQ2MDcgMjQuNTc0NjIsLTAuNTU0NTggMjQuOTg1MDgsLTAuMjY5MTQgMC40Mzc5NywwLjMwNDU2IDEuMTMxMzEsLTEuNTAwMjEgLTE1LjE1NDEyLDM5LjQ0Njc4IC0yMC42ODg0Miw1Mi4wMTc1NyAtMjguOTYxODUsNzIuOTgyNjUgLTM2Ljc1MTgxLDkzLjEzMDA0IC04LjQwMzU2LDIxLjczNDM0IC05LjM5NDk1LDI0LjIwNzY0IC0xMC43NjMxNiwyNi44NTE2NSAtMi4zNTQ1LDQuNTUgLTYuMzgyNCw3Ljc4MzMxIC0xMS4yNzY2MSw5LjA1MjA3IC0yLjA3MjU5LDAuNTM3MjkgLTYuMDAwMTUsMC40ODEwOSAtOC4yODkyNiwtMC4xMTg2MiB6Ii8+PHBhdGggc3R5bGU9ImZpbGw6IzU1YWJlNTtmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MC4zNzI5NjIiIGQ9Im0gMTIyLjQ5MjIsMzEyLjU4OTE2IGMgLTQuMDc5NTYsLTAuNzMyNTggLTguNjUxMjMsLTMuOTM0MSAtMTEuMjMyNTgsLTcuODY2MTYgLTAuNzMwMDQsLTEuMTEyMDMgLTEuODU0NTksLTMuNDgzMjYgLTIuODQzMDksLTUuOTk0OTYgLTAuODk5NDMsLTIuMjg1NCAtNC43NjI4NywtMTIuMTU1MyAtOC41ODU0MDksLTIxLjkzMzEzIC0zLjgyMjU0LC05Ljc3NzgzIC04LjQ3OTA3MiwtMjEuNjM4MDMgLTEwLjM0Nzg1MiwtMjYuMzU2MDEgLTEuODY4NzgsLTQuNzE3OTcgLTcuNDA0OTY4LC0xOC44MTU5NSAtMTIuMzAyNjQ2LC0zMS4zMjg4NCAtNC44OTc2ODEsLTEyLjUxMjg4IC0xMC44NjE5MjMsLTI3LjcyOTc1IC0xMy4yNTM4NzYsLTMzLjgxNTI1IC0yLjM5MTk1MywtNi4wODU1IC01LjY2NTIxNiwtMTQuNDc3MTUgLTcuMjczOTE4LC0xOC42NDgxMSAtMS42MDg2OTgsLTQuMTcwOTcgLTQuMjM1OTUsLTEwLjg0ODI2IC01LjgzODMzNCwtMTQuODM4NDMgLTIuMDcyNzc5LC01LjE2MTUzIC0yLjgzNjUwOSwtNy4zMzE3NyAtMi42NDY4NjksLTcuNTIxNCAwLjM0NzkwMywtMC4zNDc5MSAyMC44Mjg4ODcsLTAuMzU5MTcgMjQuNzMyODc0LC0wLjAxMzYgNC42NDkyNTYsMC40MTE1NCA3LjAxMjg0OCwxLjUyODExIDEwLjUxNzU0Niw0Ljk2ODUyIDEuNDUwODE5LDEuNDI0MjEgMi4zOTgsMi42MDIxMyAyLjkwNDM3NSwzLjYxMTkgMS43OTg2OTMsMy41ODY3OCA4LjQxODEwMywyMC4wMjg2OSAxOC42NjYyNzksNDYuMzY1MDYgMy42OTgzOSw5LjUwNDMyIDExLjE2MDY3LDI4LjQxMzUxIDE2LjU4Mjg1LDQyLjAyMDQyIDE0LjYzNDMzLDM2LjcyNDY3IDE4Ljc0NzUzLDQ3LjEzNzY1IDE5LjUzOTc1LDQ5LjQ2Njg3IDIuMjI5ODEsNi41NTU4OSAxLjA1NTMzLDEyLjcwMjE0IC0zLjMwNDI2LDE3LjI5MTc2IC0zLjEwMzU5LDMuMjY3MzYgLTYuMjIwNDMsNC42MDg0NSAtMTEuMDIxNzgsNC43NDI0IC0xLjY0MzMxLDAuMDQ1OCAtMy41NzUxOCwtMC4wMjIxIC00LjI5MzA2LC0wLjE1MTAzIHoiLz48cmVjdCBzdHlsZT0iZmlsbDojZWM2MzRkIiB3aWR0aD0iMTEuMjY5NTQiIGhlaWdodD0iNDIuMDk3NjIyIiB4PSIxNjQuODgwMTQiIHk9IjE3Ni4yNTkwOSIgcnk9IjUuNjEwNDk2Ii8+PHJlY3Qgc3R5bGU9ImZpbGw6I2VjNjM0ZCIgd2lkdGg9IjExLjYyMTU2IiBoZWlnaHQ9Ijg3LjAzODYwNSIgeD0iMTQyLjE1ODY4IiB5PSIxNTMuNzg4NiIgcnk9IjUuNjEwNDk2Ii8+PHJlY3Qgc3R5bGU9ImZpbGw6I2VjNjM0ZCIgd2lkdGg9IjExLjI2OTU0IiBoZWlnaHQ9IjQyLjA5NzYyMiIgeD0iMTE5Ljc4OTI0IiB5PSIxNzYuMjU5MDkiIHJ5PSI1LjYxMDQ5NiIvPjwvZz48cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmIiBkPSJtIDIyMi4yNTEzMiw2OC40Nzk4OTcgcSAtMTIuNzk5OTgsMCAtMjEuNzU5OTcsOC45NTk5ODYgLTguOTU5OTgsOC45NTk5ODYgLTguOTU5OTgsMjEuNzU5OTY1IDAsMTIuNTg2NjQyIDguOTU5OTgsMjEuNTQ2NjMyIDQuMjY2NjYsNC40Nzk5OSA5LjgxMzMyLDYuODI2NjYgNS43NTk5OSwyLjEzMzMzIDExLjk0NjY1LDIuMTMzMzMgNi4xODY2NiwwIDExLjczMzMxLC0yLjEzMzMzIDUuNTQ2NjYsLTIuMzQ2NjcgMTAuMDI2NjUsLTYuODI2NjYgOC45NTk5OSwtOC45NTk5OSA4Ljk1OTk5LC0yMS41NDY2MzIgMCwtMTIuNzk5OTc5IC04Ljk1OTk5LC0yMS43NTk5NjUgLTkuMzg2NjUsLTguOTU5OTg2IC0yMS43NTk5NiwtOC45NTk5ODYgeiBtIDAsLTI1LjU5OTk1OSBxIDExLjczMzMxLDAgMjEuOTczMyw0LjQ3OTk5MyAxMC4yMzk5OCw0LjI2NjY2IDE3LjkxOTk3LDExLjk0NjY0OCA3LjY3OTk5LDcuNjc5OTg3IDExLjk0NjY1LDE3LjkxOTk3MSA0LjQ3OTk5LDEwLjIzOTk4NCA0LjQ3OTk5LDIxLjk3MzI5OCAwLDExLjUxOTk4MiAtNC40Nzk5OSwyMS43NTk5NjIgLTQuMjY2NjYsMTAuMjM5OTkgLTExLjk0NjY1LDE3LjkxOTk3IC03LjY3OTk5LDcuNjc5OTkgLTE3LjkxOTk3LDEyLjE1OTk5IC0xMC4yMzk5OSw0LjI2NjY2IC0yMS45NzMzLDQuMjY2NjYgLTExLjczMzMyLDAgLTIxLjk3MzMsLTQuMjY2NjYgLTEwLjIzOTk4LC00LjQ4IC0xNy45MTk5NywtMTIuMTU5OTkgLTcuNjc5OTksLTcuNjc5OTggLTEyLjE1OTk4LC0xNy45MTk5NyAtNC4yNjY2NiwtMTAuMjM5OTggLTQuMjY2NjYsLTIxLjc1OTk2MiAwLC0xMS43MzMzMTQgNC4yNjY2NiwtMjEuOTczMjk4IDQuNDc5OTksLTEwLjIzOTk4NCAxMi4xNTk5OCwtMTcuOTE5OTcxIDcuNjc5OTksLTcuNjc5OTg4IDE3LjkxOTk3LC0xMS45NDY2NDggMTAuMjM5OTgsLTQuNDc5OTkzIDIxLjk3MzMsLTQuNDc5OTkzIHogTSAzODMuMzE3OSwxMzguODc5NzggcSAtNy42Nzk5OSw3LjY3OTk5IC0xNy45MTk5NywxMi4xNTk5OSAtMTAuMjM5OTksNC4yNjY2NiAtMjEuOTczMyw0LjI2NjY2IC0xMS43MzMzMiwwIC0yMS45NzMzLC00LjI2NjY2IC0xMC4yMzk5OCwtNC40OCAtMTcuOTE5OTcsLTEyLjE1OTk5IC03LjY3OTk5LC03LjY3OTk4IC0xMi4xNTk5OCwtMTcuOTE5OTcgLTQuMjY2NjYsLTEwLjIzOTk4IC00LjI2NjY2LC0yMS43NTk5NjIgMCwtMTEuNzMzMzE0IDQuMjY2NjYsLTIxLjk3MzI5OCA0LjQ3OTk5LC0xMC4yMzk5ODQgMTIuMTU5OTgsLTE3LjkxOTk3MSA3LjY3OTk5LC03LjY3OTk4OCAxNy45MTk5NywtMTEuOTQ2NjQ4IDEwLjIzOTk4LC00LjQ3OTk5MyAyMS45NzMzLC00LjQ3OTk5MyAxMS43MzMzMSwwIDIxLjk3MzMsNC40Nzk5OTMgMTAuMjM5OTgsNC4yNjY2NiAxNy45MTk5NywxMS45NDY2NDggbCAtMTguMTMzMzEsMTguMTMzMzA0IHEgLTguOTU5OTgsLTguOTU5OTg2IC0yMS43NTk5NiwtOC45NTk5ODYgLTEyLjM3MzMyLDAgLTIxLjc1OTk3LDguOTU5OTg2IC04Ljk1OTk4LDguOTU5OTg2IC04Ljk1OTk4LDIxLjc1OTk2NSAwLDEyLjU4NjY0MiA4Ljk1OTk4LDIxLjU0NjYzMiA0LjQ4LDQuNDc5OTkgMTAuMDI2NjUsNi44MjY2NiA1LjU0NjY2LDIuMTMzMzMgMTEuNzMzMzIsMi4xMzMzMyAxMy4wMTMzMSwwIDIxLjc1OTk2LC04Ljk1OTk5IHogTSA0OTguMDkxMTQsNDUuNjUzMjY3IFYgMTUyLjUzMzEgSCA0NzIuNDkxMTggViA5OS4xOTk4NDggcSAwLC0xMi43OTk5NzkgLTguOTU5OTgsLTIxLjc1OTk2NSAtOC45NTk5OSwtOC45NTk5ODYgLTIxLjc1OTk3LC04Ljk1OTk4NiAtNi4xODY2NiwwIC0xMS45NDY2NSwyLjM0NjY2MyAtNS41NDY2NSwyLjM0NjY2MyAtOS44MTMzMSw2LjYxMzMyMyAtOC45NTk5OSw4Ljk1OTk4NiAtOC45NTk5OSwyMS43NTk5NjUgMCwxMi41ODY2NDIgOC45NTk5OSwyMS41NDY2MzIgNC4yNjY2Niw0LjQ3OTk5IDkuODEzMzEsNi44MjY2NiA1Ljc1OTk5LDIuMTMzMzMgMTEuOTQ2NjUsMi4xMzMzMyA2LjM5OTk5LDAgMTEuNTE5OTgsLTIuMTMzMzMgbCA5LjE3MzMyLDIyLjgyNjYzIHEgLTkuODEzMzIsNC45MDY2NiAtMjIuODI2NjMsNC45MDY2NiAtMTEuNzMzMzEsMCAtMjEuNzU5OTYsLTQuMjY2NjYgLTkuODEzMzIsLTQuNDggLTE3LjA2NjY0LC0xMi4xNTk5OSAtNy4yNTMzMiwtNy42Nzk5OCAtMTEuMzA2NjUsLTE3LjkxOTk3IC00LjA1MzMzLC0xMC4yMzk5OCAtNC4wNTMzMywtMjEuNzU5OTYyIDAsLTExLjczMzMxNCA0LjA1MzMzLC0yMS45NzMyOTggNC4wNTMzMywtMTAuMjM5OTg0IDExLjMwNjY1LC0xNy45MTk5NzEgNy4yNTMzMiwtNy42Nzk5ODggMTcuMDY2NjQsLTExLjk0NjY0OCAxMC4wMjY2NSwtNC40Nzk5OTMgMjEuNzU5OTYsLTQuNDc5OTkzIDEwLjQ1MzMyLDAgMTguNTU5OTcsMy4xOTk5OTUgOC4xMDY2NiwzLjE5OTk5NSAxNC4yOTMzMSw4LjEwNjY1NCB2IC04LjUzMzMyIHogTSA1MzguNjI0NDYsMTUyLjUzMzEgSCA1MTMuMDI0NSBWIDMuMjAwMDAxNSBoIDI1LjU5OTk2IFYgMTUyLjUzMzEgWiBtIDEyMC4xMDY1OSwtNDIuNjY2NiBxIDAsMTAuNDUzMzEgLTMuNDEzMzMsMTguOTg2NjMgLTMuNDEzMzIsOC4zMTk5OSAtOS44MTMzMSwxNC4yOTMzMSAtNi4xODY2Niw1Ljc2IC0xNS4xNDY2NSw4Ljk1OTk5IC04Ljk1OTk4LDMuMiAtMjAuMDUzMywzLjIgLTE3LjcwNjY0LDAgLTMxLjU3MzI4LC01LjU0NjY2IC0xMy44NjY2NCwtNS43NTk5OSAtMjIuODI2NjMsLTEzLjAxMzMyIGwgMTcuNzA2NjQsLTE3LjcwNjYzIHEgNy4wMzk5OSw2LjM5OTk5IDE1Ljc4NjY0LDkuODEzMzEgNS4zMzMzMiwyLjEzMzMzIDEwLjAyNjY1LDIuNzczMzMgNC42OTMzMywwLjY0IDcuNjc5OTksMC42NCA1LjU0NjY2LDAgMTAuMDI2NjUsLTEuMjggNC42OTMzMiwtMS40OTMzMyA4LjEwNjY1LC0zLjgzOTk5IDcuMjUzMzIsLTUuMzMzMzIgNy4yNTMzMiwtMTQuMDc5OTggMCwtNS4zMzMzMiAtMy44Mzk5OSwtOS41OTk5OCAtMi45ODY2NiwtMy40MTMzMyAtNy42Nzk5OSwtNS41NDY2NiAtMy44Mzk5OSwtMi4xMzMzMyAtOC4xMDY2NSwtMy40MTMzMjggLTQuMjY2NjYsLTEuMjc5OTk4IC03LjY3OTk5LC0yLjM0NjY2MyAtMS4wNjY2NiwtMC40MjY2NjYgLTEuOTIsLTAuNDI2NjY2IC0wLjg1MzMzLC0wLjIxMzMzMyAtMS40OTMzMywtMC42Mzk5OTkgLTAuNDI2NjYsMCAtMS4yNzk5OSwtMC40MjY2NjYgLTQuNDgsLTEuMjc5OTk3IC0xMy4wMTMzMiwtNC40Nzk5OTIgLTguMzE5OTgsLTMuMTk5OTk1IC0xNi42Mzk5NywtOC43NDY2NTMgLTE5LjQxMzMsLTEzLjAxMzMxMyAtMTkuNDEzMywtMzEuOTk5OTQ5IDAsLTEyLjU4NjY0NyA0LjI2NjY2LC0yMS4xMTk5NjYgNC40Nzk5OSwtOC43NDY2NTMgMTEuNTE5OTgsLTE0LjA3OTk3OCA3LjAzOTk5LC01LjU0NjY1NzUgMTUuNTczMzEsLTcuODkzMzIwNCBRIDU5MS41MzExNiw2LjYzNzU3MzNlLTYgNTk5Ljg1MTE1LDYuNjM3NTczM2UtNiBxIDE1LjM1OTk3LDAgMjUuODEzMjksMy42MjY2NjA4NjI0MjY3IDEwLjQ1MzMyLDMuNjI2NjYwOSAxNi42Mzk5Nyw3LjI1MzMyMTUgMy4yLDEuOTE5OTk3IDUuMzMzMzMsMy44Mzk5OTQgMi4zNDY2NiwxLjcwNjY2NCA0LjA1MzMyLDMuMTk5OTk1IGwgLTE4LjEzMzMsMTguMzQ2NjM3IHEgLTUuNzU5OTksLTUuNzU5OTkgLTExLjczMzMyLC04Ljc0NjY1MiAtOC45NTk5OCwtNC4yNjY2NiAtMTguNzczMywtNC4yNjY2NiAtNC4yNjY2NiwwIC04LjUzMzMyLDEuMDY2NjY1IC00LjI2NjY2LDEuMDY2NjY1IC03LjQ2NjY1LDIuNzczMzI5IC05LjM4NjY1LDUuNzU5OTkgLTkuMzg2NjUsMTUuMTQ2NjQyIDAsNS43NTk5OTEgMy44Mzk5OSw5LjgxMzMxOCAyLjc3MzMzLDMuMTk5OTk1IDcuNjc5OTksNS43NTk5OTEgNC4wNTMzMiwyLjEzMzMzIDguNTMzMzIsMy40MTMzMjggNC40Nzk5OSwxLjI3OTk5NyA4LjMxOTk4LDIuMzQ2NjYyIGwgMi41NiwwLjYzOTk5OSBxIDEuMDY2NjYsMC40MjY2NjYgNC4wNTMzMywxLjI3OTk5OCAyLjk4NjY2LDAuODUzMzMyIDcuMDM5OTgsMi41NTk5OTYgNC4wNTMzMywxLjcwNjY2NCA4Ljc0NjY2LDQuMDUzMzI3IDQuOTA2NjYsMi4zNDY2NjMgOS41OTk5OCw1LjU0NjY1OCAyMC42OTMzLDEzLjY1MzMxMSAyMC42OTMzLDMyLjIxMzI4NCB6IG0gNjkuMTE5NzcsNDIuNjY2NiBoIC0yMy40NjY2MyBxIC03LjI1MzMyLDAgLTEzLjY1MzMxLC0yLjc3MzMzIC02LjM5OTk5LC0yLjc3MzMzIC0xMS4wOTMzMiwtNy40NjY2NiAtNC42OTMzMiwtNC45MDY2NiAtNy40NjY2NSwtMTEuMzA2NjUgLTIuNzczMzMsLTYuMzk5OTkgLTIuNzczMzMsLTEzLjY1MzMxIFYgMjQuMzE5OTY4IGwgMjUuNTk5OTYsLTYuMzk5OTkgViA1OC42NjY1OCBoIDE0LjkzMzMxIGwgNi4zOTk5OSwyNS41OTk5NTkgaCAtMjEuMzMzMyB2IDMzLjA2NjYxMSBxIDAsNC4wNTMzMyAyLjc3MzMzLDYuODI2NjYgMi43NzMzMywyLjc3MzMzIDYuNjEzMzIsMi43NzMzMyBoIDE3LjA2NjY0IHogbSAxMTEuMzYsLTEwNi44Nzk4MzMgViAxNTIuNTMzMSBIIDgxMy42MTA4NiBWIDk5LjE5OTg0OCBxIDAsLTEyLjc5OTk3OSAtOC45NTk5OSwtMjEuNzU5OTY1IC04Ljk1OTk4LC04Ljk1OTk4NiAtMjEuNzU5OTYsLTguOTU5OTg2IC02LjE4NjY2LDAgLTExLjk0NjY1LDIuMzQ2NjYzIC01LjU0NjY2LDIuMzQ2NjYzIC05LjgxMzMyLDYuNjEzMzIzIC04Ljk1OTk4LDguOTU5OTg2IC04Ljk1OTk4LDIxLjc1OTk2NSAwLDEyLjU4NjY0MiA4Ljk1OTk4LDIxLjU0NjYzMiA0LjI2NjY2LDQuNDc5OTkgOS44MTMzMiw2LjgyNjY2IDUuNzU5OTksMi4xMzMzMyAxMS45NDY2NSwyLjEzMzMzIDYuMzk5OTksMCAxMS41MTk5OCwtMi4xMzMzMyBsIDkuMTczMzIsMjIuODI2NjMgcSAtOS44MTMzMiw0LjkwNjY2IC0yMi44MjY2Myw0LjkwNjY2IC0xMS43MzMzMiwwIC0yMS43NTk5NywtNC4yNjY2NiAtOS44MTMzMiwtNC40OCAtMTcuMDY2NjQsLTEyLjE1OTk5IC03LjI1MzMyLC03LjY3OTk4IC0xMS4zMDY2NSwtMTcuOTE5OTcgLTQuMDUzMzIsLTEwLjIzOTk4IC00LjA1MzMyLC0yMS43NTk5NjIgMCwtMTEuNzMzMzE0IDQuMDUzMzIsLTIxLjk3MzI5OCA0LjA1MzMzLC0xMC4yMzk5ODQgMTEuMzA2NjUsLTE3LjkxOTk3MSA3LjI1MzMyLC03LjY3OTk4OCAxNy4wNjY2NCwtMTEuOTQ2NjQ4IDEwLjAyNjY1LC00LjQ3OTk5MyAyMS43NTk5NywtNC40Nzk5OTMgMTAuNDUzMzEsMCAxOC41NTk5NywzLjE5OTk5NSA4LjEwNjY1LDMuMTk5OTk1IDE0LjI5MzMxLDguMTA2NjU0IHYgLTguNTMzMzIgeiBtIDEwNy45NDY1Miw5My4yMjY1MTMgcSAtNy42Nzk5OCw3LjY3OTk5IC0xNy45MTk5NywxMi4xNTk5OSAtMTAuMjM5OTgsNC4yNjY2NiAtMjEuOTczMjksNC4yNjY2NiAtMTEuNzMzMzIsMCAtMjEuOTczMywtNC4yNjY2NiAtMTAuMjM5OTksLTQuNDggLTE3LjkxOTk3LC0xMi4xNTk5OSAtNy42Nzk5OSwtNy42Nzk5OCAtMTIuMTU5OTgsLTE3LjkxOTk3IC00LjI2NjY2LC0xMC4yMzk5OCAtNC4yNjY2NiwtMjEuNzU5OTYyIDAsLTExLjczMzMxNCA0LjI2NjY2LC0yMS45NzMyOTggNC40Nzk5OSwtMTAuMjM5OTg0IDEyLjE1OTk4LC0xNy45MTk5NzEgNy42Nzk5OCwtNy42Nzk5ODggMTcuOTE5OTcsLTExLjk0NjY0OCAxMC4yMzk5OCwtNC40Nzk5OTMgMjEuOTczMywtNC40Nzk5OTMgMTEuNzMzMzEsMCAyMS45NzMyOSw0LjQ3OTk5MyAxMC4yMzk5OSw0LjI2NjY2IDE3LjkxOTk3LDExLjk0NjY0OCBsIC0xOC4xMzMzLDE4LjEzMzMwNCBxIC04Ljk1OTk5LC04Ljk1OTk4NiAtMjEuNzU5OTYsLTguOTU5OTg2IC0xMi4zNzMzMiwwIC0yMS43NTk5Nyw4Ljk1OTk4NiAtOC45NTk5OSw4Ljk1OTk4NiAtOC45NTk5OSwyMS43NTk5NjUgMCwxMi41ODY2NDIgOC45NTk5OSwyMS41NDY2MzIgNC40Nzk5OSw0LjQ3OTk5IDEwLjAyNjY1LDYuODI2NjYgNS41NDY2NiwyLjEzMzMzIDExLjczMzMyLDIuMTMzMzMgMTMuMDEzMzEsMCAyMS43NTk5NiwtOC45NTk5OSB6IE0gMTA1MS42OTA3LDQ1Ljg2NjYgOTk4LjM1NzQsOTkuMTk5ODQ4IDEwNTEuNjkwNywxNTIuNTMzMSBoIC0zNi4wNTMzIEwgOTgwLjIyNDEsMTE3LjExOTgyIFYgMTUyLjUzMzEgSCA5NTQuNjI0MTQgViAzLjIwMDAwMTUgSCA5ODAuMjI0MSBWIDgxLjA2NjU0NCBMIDEwMTUuNDI0LDQ1Ljg2NjYgaCAzNi4yNjY3IHoiLz48L3N2Zz4=';\nconst LOGO_LIGHT = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDUxLjY5MDciIGhlaWdodD0iMTU1LjMwNjQxIiB2aWV3Qm94PSIwIDAgMTA1MS42OTA2IDE1NS4zMDY0MSI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMC44ODczNDc3MSwwLDAsMC44OTExODY4MiwtNDIuNzE2NjMsLTEyMy44NTM4OCkiPjxwYXRoIHN0eWxlPSJmaWxsOiMyNDVCOEY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjAuMzcyOTYyIiBkPSJtIDE2NS43NDM2OSwzMTIuMzQ1MTQgYyAtMy42NTkwNCwtMC45NTg2MSAtNi44OTEzMSwtMy4zNTM0OCAtOS4yMTQ5NCwtNi44Mjc1OSAtMS45MTIyNiwtMi44NTkwOCAtMi4zOTcwNSwtNC41Njk3MSAtMi4zOTcwNSwtOC40NTgzNiAwLC0zLjk5MjU0IDAuMDgyNCwtNC4yNzU3IDQuMjMwMTIsLTE0LjU0NTUzIDQuMDA5MjMsLTkuOTI2ODEgMTEuNzQ1OTcsLTI5LjYwODA0IDE0LjE3MjU0LC0zNi4wNTMwMiAxLjA1NTUsLTIuODAzNDQgNC42MzU3OSwtMTIuMDkwMiA3Ljk1NjE5LC0yMC42MzcyNSAzLjMyMDQsLTguNTQ3MDYgOS40NzI2NSwtMjQuNDkxMiAxMy42NzE2OCwtMzUuNDMxNDMgOS40MTE2MywtMjQuNTIxMjUgMTIuMTUxMjQsLTMxLjM5NjE0IDE0LjE5MjIyLC0zNS42MTQ1NSAxLjMzMjI5LC0yLjc1MzY0IDEuODc4NjcsLTMuNTkyNTggMy4zNDU0NiwtNS4xMzY3MiAxLjk2ODIyLC0yLjA3MjAzIDQuMDk4NCwtMy41NjI1MyA2LjQ2Njg3LC00LjUyNDkzIDEuMjcxMzgsLTAuNTE2NiAyLjI1NzYzLC0wLjY5MzAyIDQuODI2NzksLTAuODYzNCA1LjIxODMsLTAuMzQ2MDcgMjQuNTc0NjIsLTAuNTU0NTggMjQuOTg1MDgsLTAuMjY5MTQgMC40Mzc5NywwLjMwNDU2IDEuMTMxMzEsLTEuNTAwMjEgLTE1LjE1NDEyLDM5LjQ0Njc4IC0yMC42ODg0Miw1Mi4wMTc1NyAtMjguOTYxODUsNzIuOTgyNjUgLTM2Ljc1MTgxLDkzLjEzMDA0IC04LjQwMzU2LDIxLjczNDM0IC05LjM5NDk1LDI0LjIwNzY0IC0xMC43NjMxNiwyNi44NTE2NSAtMi4zNTQ1LDQuNTUgLTYuMzgyNCw3Ljc4MzMxIC0xMS4yNzY2MSw5LjA1MjA3IC0yLjA3MjU5LDAuNTM3MjkgLTYuMDAwMTUsMC40ODEwOSAtOC4yODkyNiwtMC4xMTg2MiB6Ii8+PHBhdGggc3R5bGU9ImZpbGw6IzI0NUI4RjtmaWxsLW9wYWNpdHk6MTtzdHJva2Utd2lkdGg6MC4zNzI5NjIiIGQ9Im0gMTIyLjQ5MjIsMzEyLjU4OTE2IGMgLTQuMDc5NTYsLTAuNzMyNTggLTguNjUxMjMsLTMuOTM0MSAtMTEuMjMyNTgsLTcuODY2MTYgLTAuNzMwMDQsLTEuMTEyMDMgLTEuODU0NTksLTMuNDgzMjYgLTIuODQzMDksLTUuOTk0OTYgLTAuODk5NDMsLTIuMjg1NCAtNC43NjI4NywtMTIuMTU1MyAtOC41ODU0MDksLTIxLjkzMzEzIC0zLjgyMjU0LC05Ljc3NzgzIC04LjQ3OTA3MiwtMjEuNjM4MDMgLTEwLjM0Nzg1MiwtMjYuMzU2MDEgLTEuODY4NzgsLTQuNzE3OTcgLTcuNDA0OTY4LC0xOC44MTU5NSAtMTIuMzAyNjQ2LC0zMS4zMjg4NCAtNC44OTc2ODEsLTEyLjUxMjg4IC0xMC44NjE5MjMsLTI3LjcyOTc1IC0xMy4yNTM4NzYsLTMzLjgxNTI1IC0yLjM5MTk1MywtNi4wODU1IC01LjY2NTIxNiwtMTQuNDc3MTUgLTcuMjczOTE4LC0xOC42NDgxMSAtMS42MDg2OTgsLTQuMTcwOTcgLTQuMjM1OTUsLTEwLjg0ODI2IC01LjgzODMzNCwtMTQuODM4NDMgLTIuMDcyNzc5LC01LjE2MTUzIC0yLjgzNjUwOSwtNy4zMzE3NyAtMi42NDY4NjksLTcuNTIxNCAwLjM0NzkwMywtMC4zNDc5MSAyMC44Mjg4ODcsLTAuMzU5MTcgMjQuNzMyODc0LC0wLjAxMzYgNC42NDkyNTYsMC40MTE1NCA3LjAxMjg0OCwxLjUyODExIDEwLjUxNzU0Niw0Ljk2ODUyIDEuNDUwODE5LDEuNDI0MjEgMi4zOTgsMi42MDIxMyAyLjkwNDM3NSwzLjYxMTkgMS43OTg2OTMsMy41ODY3OCA4LjQxODEwMywyMC4wMjg2OSAxOC42NjYyNzksNDYuMzY1MDYgMy42OTgzOSw5LjUwNDMyIDExLjE2MDY3LDI4LjQxMzUxIDE2LjU4Mjg1LDQyLjAyMDQyIDE0LjYzNDMzLDM2LjcyNDY3IDE4Ljc0NzUzLDQ3LjEzNzY1IDE5LjUzOTc1LDQ5LjQ2Njg3IDIuMjI5ODEsNi41NTU4OSAxLjA1NTMzLDEyLjcwMjE0IC0zLjMwNDI2LDE3LjI5MTc2IC0zLjEwMzU5LDMuMjY3MzYgLTYuMjIwNDMsNC42MDg0NSAtMTEuMDIxNzgsNC43NDI0IC0xLjY0MzMxLDAuMDQ1OCAtMy41NzUxOCwtMC4wMjIxIC00LjI5MzA2LC0wLjE1MTAzIHoiLz48cmVjdCBzdHlsZT0iZmlsbDojZWM2MzRkIiB3aWR0aD0iMTEuMjY5NTQiIGhlaWdodD0iNDIuMDk3NjIyIiB4PSIxNjQuODgwMTQiIHk9IjE3Ni4yNTkwOSIgcnk9IjUuNjEwNDk2Ii8+PHJlY3Qgc3R5bGU9ImZpbGw6I2VjNjM0ZCIgd2lkdGg9IjExLjYyMTU2IiBoZWlnaHQ9Ijg3LjAzODYwNSIgeD0iMTQyLjE1ODY4IiB5PSIxNTMuNzg4NiIgcnk9IjUuNjEwNDk2Ii8+PHJlY3Qgc3R5bGU9ImZpbGw6I2VjNjM0ZCIgd2lkdGg9IjExLjI2OTU0IiBoZWlnaHQ9IjQyLjA5NzYyMiIgeD0iMTE5Ljc4OTI0IiB5PSIxNzYuMjU5MDkiIHJ5PSI1LjYxMDQ5NiIvPjwvZz48cGF0aCBzdHlsZT0iZmlsbDojZWM2MzRkIiBkPSJtIDIyMi4yNTEzMiw2OC40Nzk4OTcgcSAtMTIuNzk5OTgsMCAtMjEuNzU5OTcsOC45NTk5ODYgLTguOTU5OTgsOC45NTk5ODYgLTguOTU5OTgsMjEuNzU5OTY1IDAsMTIuNTg2NjQyIDguOTU5OTgsMjEuNTQ2NjMyIDQuMjY2NjYsNC40Nzk5OSA5LjgxMzMyLDYuODI2NjYgNS43NTk5OSwyLjEzMzMzIDExLjk0NjY1LDIuMTMzMzMgNi4xODY2NiwwIDExLjczMzMxLC0yLjEzMzMzIDUuNTQ2NjYsLTIuMzQ2NjcgMTAuMDI2NjUsLTYuODI2NjYgOC45NTk5OSwtOC45NTk5OSA4Ljk1OTk5LC0yMS41NDY2MzIgMCwtMTIuNzk5OTc5IC04Ljk1OTk5LC0yMS43NTk5NjUgLTkuMzg2NjUsLTguOTU5OTg2IC0yMS43NTk5NiwtOC45NTk5ODYgeiBtIDAsLTI1LjU5OTk1OSBxIDExLjczMzMxLDAgMjEuOTczMyw0LjQ3OTk5MyAxMC4yMzk5OCw0LjI2NjY2IDE3LjkxOTk3LDExLjk0NjY0OCA3LjY3OTk5LDcuNjc5OTg3IDExLjk0NjY1LDE3LjkxOTk3MSA0LjQ3OTk5LDEwLjIzOTk4NCA0LjQ3OTk5LDIxLjk3MzI5OCAwLDExLjUxOTk4MiAtNC40Nzk5OSwyMS43NTk5NjIgLTQuMjY2NjYsMTAuMjM5OTkgLTExLjk0NjY1LDE3LjkxOTk3IC03LjY3OTk5LDcuNjc5OTkgLTE3LjkxOTk3LDEyLjE1OTk5IC0xMC4yMzk5OSw0LjI2NjY2IC0yMS45NzMzLDQuMjY2NjYgLTExLjczMzMyLDAgLTIxLjk3MzMsLTQuMjY2NjYgLTEwLjIzOTk4LC00LjQ4IC0xNy45MTk5NywtMTIuMTU5OTkgLTcuNjc5OTksLTcuNjc5OTggLTEyLjE1OTk4LC0xNy45MTk5NyAtNC4yNjY2NiwtMTAuMjM5OTggLTQuMjY2NjYsLTIxLjc1OTk2MiAwLC0xMS43MzMzMTQgNC4yNjY2NiwtMjEuOTczMjk4IDQuNDc5OTksLTEwLjIzOTk4NCAxMi4xNTk5OCwtMTcuOTE5OTcxIDcuNjc5OTksLTcuNjc5OTg4IDE3LjkxOTk3LC0xMS45NDY2NDggMTAuMjM5OTgsLTQuNDc5OTkzIDIxLjk3MzMsLTQuNDc5OTkzIHogTSAzODMuMzE3OSwxMzguODc5NzggcSAtNy42Nzk5OSw3LjY3OTk5IC0xNy45MTk5NywxMi4xNTk5OSAtMTAuMjM5OTksNC4yNjY2NiAtMjEuOTczMyw0LjI2NjY2IC0xMS43MzMzMiwwIC0yMS45NzMzLC00LjI2NjY2IC0xMC4yMzk5OCwtNC40OCAtMTcuOTE5OTcsLTEyLjE1OTk5IC03LjY3OTk5LC03LjY3OTk4IC0xMi4xNTk5OCwtMTcuOTE5OTcgLTQuMjY2NjYsLTEwLjIzOTk4IC00LjI2NjY2LC0yMS43NTk5NjIgMCwtMTEuNzMzMzE0IDQuMjY2NjYsLTIxLjk3MzI5OCA0LjQ3OTk5LC0xMC4yMzk5ODQgMTIuMTU5OTgsLTE3LjkxOTk3MSA3LjY3OTk5LC03LjY3OTk4OCAxNy45MTk5NywtMTEuOTQ2NjQ4IDEwLjIzOTk4LC00LjQ3OTk5MyAyMS45NzMzLC00LjQ3OTk5MyAxMS43MzMzMSwwIDIxLjk3MzMsNC40Nzk5OTMgMTAuMjM5OTgsNC4yNjY2NiAxNy45MTk5NywxMS45NDY2NDggbCAtMTguMTMzMzEsMTguMTMzMzA0IHEgLTguOTU5OTgsLTguOTU5OTg2IC0yMS43NTk5NiwtOC45NTk5ODYgLTEyLjM3MzMyLDAgLTIxLjc1OTk3LDguOTU5OTg2IC04Ljk1OTk4LDguOTU5OTg2IC04Ljk1OTk4LDIxLjc1OTk2NSAwLDEyLjU4NjY0MiA4Ljk1OTk4LDIxLjU0NjYzMiA0LjQ4LDQuNDc5OTkgMTAuMDI2NjUsNi44MjY2NiA1LjU0NjY2LDIuMTMzMzMgMTEuNzMzMzIsMi4xMzMzMyAxMy4wMTMzMSwwIDIxLjc1OTk2LC04Ljk1OTk5IHogTSA0OTguMDkxMTQsNDUuNjUzMjY3IFYgMTUyLjUzMzEgSCA0NzIuNDkxMTggViA5OS4xOTk4NDggcSAwLC0xMi43OTk5NzkgLTguOTU5OTgsLTIxLjc1OTk2NSAtOC45NTk5OSwtOC45NTk5ODYgLTIxLjc1OTk3LC04Ljk1OTk4NiAtNi4xODY2NiwwIC0xMS45NDY2NSwyLjM0NjY2MyAtNS41NDY2NSwyLjM0NjY2MyAtOS44MTMzMSw2LjYxMzMyMyAtOC45NTk5OSw4Ljk1OTk4NiAtOC45NTk5OSwyMS43NTk5NjUgMCwxMi41ODY2NDIgOC45NTk5OSwyMS41NDY2MzIgNC4yNjY2Niw0LjQ3OTk5IDkuODEzMzEsNi44MjY2NiA1Ljc1OTk5LDIuMTMzMzMgMTEuOTQ2NjUsMi4xMzMzMyA2LjM5OTk5LDAgMTEuNTE5OTgsLTIuMTMzMzMgbCA5LjE3MzMyLDIyLjgyNjYzIHEgLTkuODEzMzIsNC45MDY2NiAtMjIuODI2NjMsNC45MDY2NiAtMTEuNzMzMzEsMCAtMjEuNzU5OTYsLTQuMjY2NjYgLTkuODEzMzIsLTQuNDggLTE3LjA2NjY0LC0xMi4xNTk5OSAtNy4yNTMzMiwtNy42Nzk5OCAtMTEuMzA2NjUsLTE3LjkxOTk3IC00LjA1MzMzLC0xMC4yMzk5OCAtNC4wNTMzMywtMjEuNzU5OTYyIDAsLTExLjczMzMxNCA0LjA1MzMzLC0yMS45NzMyOTggNC4wNTMzMywtMTAuMjM5OTg0IDExLjMwNjY1LC0xNy45MTk5NzEgNy4yNTMzMiwtNy42Nzk5ODggMTcuMDY2NjQsLTExLjk0NjY0OCAxMC4wMjY2NSwtNC40Nzk5OTMgMjEuNzU5OTYsLTQuNDc5OTkzIDEwLjQ1MzMyLDAgMTguNTU5OTcsMy4xOTk5OTUgOC4xMDY2NiwzLjE5OTk5NSAxNC4yOTMzMSw4LjEwNjY1NCB2IC04LjUzMzMyIHogTSA1MzguNjI0NDYsMTUyLjUzMzEgSCA1MTMuMDI0NSBWIDMuMjAwMDAxNSBoIDI1LjU5OTk2IFYgMTUyLjUzMzEgWiBtIDEyMC4xMDY1OSwtNDIuNjY2NiBxIDAsMTAuNDUzMzEgLTMuNDEzMzMsMTguOTg2NjMgLTMuNDEzMzIsOC4zMTk5OSAtOS44MTMzMSwxNC4yOTMzMSAtNi4xODY2Niw1Ljc2IC0xNS4xNDY2NSw4Ljk1OTk5IC04Ljk1OTk4LDMuMiAtMjAuMDUzMywzLjIgLTE3LjcwNjY0LDAgLTMxLjU3MzI4LC01LjU0NjY2IC0xMy44NjY2NCwtNS43NTk5OSAtMjIuODI2NjMsLTEzLjAxMzMyIGwgMTcuNzA2NjQsLTE3LjcwNjYzIHEgNy4wMzk5OSw2LjM5OTk5IDE1Ljc4NjY0LDkuODEzMzEgNS4zMzMzMiwyLjEzMzMzIDEwLjAyNjY1LDIuNzczMzMgNC42OTMzMywwLjY0IDcuNjc5OTksMC42NCA1LjU0NjY2LDAgMTAuMDI2NjUsLTEuMjggNC42OTMzMiwtMS40OTMzMyA4LjEwNjY1LC0zLjgzOTk5IDcuMjUzMzIsLTUuMzMzMzIgNy4yNTMzMiwtMTQuMDc5OTggMCwtNS4zMzMzMiAtMy44Mzk5OSwtOS41OTk5OCAtMi45ODY2NiwtMy40MTMzMyAtNy42Nzk5OSwtNS41NDY2NiAtMy44Mzk5OSwtMi4xMzMzMyAtOC4xMDY2NSwtMy40MTMzMjggLTQuMjY2NjYsLTEuMjc5OTk4IC03LjY3OTk5LC0yLjM0NjY2MyAtMS4wNjY2NiwtMC40MjY2NjYgLTEuOTIsLTAuNDI2NjY2IC0wLjg1MzMzLC0wLjIxMzMzMyAtMS40OTMzMywtMC42Mzk5OTkgLTAuNDI2NjYsMCAtMS4yNzk5OSwtMC40MjY2NjYgLTQuNDgsLTEuMjc5OTk3IC0xMy4wMTMzMiwtNC40Nzk5OTIgLTguMzE5OTgsLTMuMTk5OTk1IC0xNi42Mzk5NywtOC43NDY2NTMgLTE5LjQxMzMsLTEzLjAxMzMxMyAtMTkuNDEzMywtMzEuOTk5OTQ5IDAsLTEyLjU4NjY0NyA0LjI2NjY2LC0yMS4xMTk5NjYgNC40Nzk5OSwtOC43NDY2NTMgMTEuNTE5OTgsLTE0LjA3OTk3OCA3LjAzOTk5LC01LjU0NjY1NzUgMTUuNTczMzEsLTcuODkzMzIwNCBRIDU5MS41MzExNiw2LjYzNzU3MzNlLTYgNTk5Ljg1MTE1LDYuNjM3NTczM2UtNiBxIDE1LjM1OTk3LDAgMjUuODEzMjksMy42MjY2NjA4NjI0MjY3IDEwLjQ1MzMyLDMuNjI2NjYwOSAxNi42Mzk5Nyw3LjI1MzMyMTUgMy4yLDEuOTE5OTk3IDUuMzMzMzMsMy44Mzk5OTQgMi4zNDY2NiwxLjcwNjY2NCA0LjA1MzMyLDMuMTk5OTk1IGwgLTE4LjEzMzMsMTguMzQ2NjM3IHEgLTUuNzU5OTksLTUuNzU5OTkgLTExLjczMzMyLC04Ljc0NjY1MiAtOC45NTk5OCwtNC4yNjY2NiAtMTguNzczMywtNC4yNjY2NiAtNC4yNjY2NiwwIC04LjUzMzMyLDEuMDY2NjY1IC00LjI2NjY2LDEuMDY2NjY1IC03LjQ2NjY1LDIuNzczMzI5IC05LjM4NjY1LDUuNzU5OTkgLTkuMzg2NjUsMTUuMTQ2NjQyIDAsNS43NTk5OTEgMy44Mzk5OSw5LjgxMzMxOCAyLjc3MzMzLDMuMTk5OTk1IDcuNjc5OTksNS43NTk5OTEgNC4wNTMzMiwyLjEzMzMzIDguNTMzMzIsMy40MTMzMjggNC40Nzk5OSwxLjI3OTk5NyA4LjMxOTk4LDIuMzQ2NjYyIGwgMi41NiwwLjYzOTk5OSBxIDEuMDY2NjYsMC40MjY2NjYgNC4wNTMzMywxLjI3OTk5OCAyLjk4NjY2LDAuODUzMzMyIDcuMDM5OTgsMi41NTk5OTYgNC4wNTMzMywxLjcwNjY2NCA4Ljc0NjY2LDQuMDUzMzI3IDQuOTA2NjYsMi4zNDY2NjMgOS41OTk5OCw1LjU0NjY1OCAyMC42OTMzLDEzLjY1MzMxMSAyMC42OTMzLDMyLjIxMzI4NCB6IG0gNjkuMTE5NzcsNDIuNjY2NiBoIC0yMy40NjY2MyBxIC03LjI1MzMyLDAgLTEzLjY1MzMxLC0yLjc3MzMzIC02LjM5OTk5LC0yLjc3MzMzIC0xMS4wOTMzMiwtNy40NjY2NiAtNC42OTMzMiwtNC45MDY2NiAtNy40NjY2NSwtMTEuMzA2NjUgLTIuNzczMzMsLTYuMzk5OTkgLTIuNzczMzMsLTEzLjY1MzMxIFYgMjQuMzE5OTY4IGwgMjUuNTk5OTYsLTYuMzk5OTkgViA1OC42NjY1OCBoIDE0LjkzMzMxIGwgNi4zOTk5OSwyNS41OTk5NTkgaCAtMjEuMzMzMyB2IDMzLjA2NjYxMSBxIDAsNC4wNTMzMyAyLjc3MzMzLDYuODI2NjYgMi43NzMzMywyLjc3MzMzIDYuNjEzMzIsMi43NzMzMyBoIDE3LjA2NjY0IHogbSAxMTEuMzYsLTEwNi44Nzk4MzMgViAxNTIuNTMzMSBIIDgxMy42MTA4NiBWIDk5LjE5OTg0OCBxIDAsLTEyLjc5OTk3OSAtOC45NTk5OSwtMjEuNzU5OTY1IC04Ljk1OTk4LC04Ljk1OTk4NiAtMjEuNzU5OTYsLTguOTU5OTg2IC02LjE4NjY2LDAgLTExLjk0NjY1LDIuMzQ2NjYzIC01LjU0NjY2LDIuMzQ2NjYzIC05LjgxMzMyLDYuNjEzMzIzIC04Ljk1OTk4LDguOTU5OTg2IC04Ljk1OTk4LDIxLjc1OTk2NSAwLDEyLjU4NjY0MiA4Ljk1OTk4LDIxLjU0NjYzMiA0LjI2NjY2LDQuNDc5OTkgOS44MTMzMiw2LjgyNjY2IDUuNzU5OTksMi4xMzMzMyAxMS45NDY2NSwyLjEzMzMzIDYuMzk5OTksMCAxMS41MTk5OCwtMi4xMzMzMyBsIDkuMTczMzIsMjIuODI2NjMgcSAtOS44MTMzMiw0LjkwNjY2IC0yMi44MjY2Myw0LjkwNjY2IC0xMS43MzMzMiwwIC0yMS43NTk5NywtNC4yNjY2NiAtOS44MTMzMiwtNC40OCAtMTcuMDY2NjQsLTEyLjE1OTk5IC03LjI1MzMyLC03LjY3OTk4IC0xMS4zMDY2NSwtMTcuOTE5OTcgLTQuMDUzMzIsLTEwLjIzOTk4IC00LjA1MzMyLC0yMS43NTk5NjIgMCwtMTEuNzMzMzE0IDQuMDUzMzIsLTIxLjk3MzI5OCA0LjA1MzMzLC0xMC4yMzk5ODQgMTEuMzA2NjUsLTE3LjkxOTk3MSA3LjI1MzMyLC03LjY3OTk4OCAxNy4wNjY2NCwtMTEuOTQ2NjQ4IDEwLjAyNjY1LC00LjQ3OTk5MyAyMS43NTk5NywtNC40Nzk5OTMgMTAuNDUzMzEsMCAxOC41NTk5NywzLjE5OTk5NSA4LjEwNjY1LDMuMTk5OTk1IDE0LjI5MzMxLDguMTA2NjU0IHYgLTguNTMzMzIgeiBtIDEwNy45NDY1Miw5My4yMjY1MTMgcSAtNy42Nzk5OCw3LjY3OTk5IC0xNy45MTk5NywxMi4xNTk5OSAtMTAuMjM5OTgsNC4yNjY2NiAtMjEuOTczMjksNC4yNjY2NiAtMTEuNzMzMzIsMCAtMjEuOTczMywtNC4yNjY2NiAtMTAuMjM5OTksLTQuNDggLTE3LjkxOTk3LC0xMi4xNTk5OSAtNy42Nzk5OSwtNy42Nzk5OCAtMTIuMTU5OTgsLTE3LjkxOTk3IC00LjI2NjY2LC0xMC4yMzk5OCAtNC4yNjY2NiwtMjEuNzU5OTYyIDAsLTExLjczMzMxNCA0LjI2NjY2LC0yMS45NzMyOTggNC40Nzk5OSwtMTAuMjM5OTg0IDEyLjE1OTk4LC0xNy45MTk5NzEgNy42Nzk5OCwtNy42Nzk5ODggMTcuOTE5OTcsLTExLjk0NjY0OCAxMC4yMzk5OCwtNC40Nzk5OTMgMjEuOTczMywtNC40Nzk5OTMgMTEuNzMzMzEsMCAyMS45NzMyOSw0LjQ3OTk5MyAxMC4yMzk5OSw0LjI2NjY2IDE3LjkxOTk3LDExLjk0NjY0OCBsIC0xOC4xMzMzLDE4LjEzMzMwNCBxIC04Ljk1OTk5LC04Ljk1OTk4NiAtMjEuNzU5OTYsLTguOTU5OTg2IC0xMi4zNzMzMiwwIC0yMS43NTk5Nyw4Ljk1OTk4NiAtOC45NTk5OSw4Ljk1OTk4NiAtOC45NTk5OSwyMS43NTk5NjUgMCwxMi41ODY2NDIgOC45NTk5OSwyMS41NDY2MzIgNC40Nzk5OSw0LjQ3OTk5IDEwLjAyNjY1LDYuODI2NjYgNS41NDY2NiwyLjEzMzMzIDExLjczMzMyLDIuMTMzMzMgMTMuMDEzMzEsMCAyMS43NTk5NiwtOC45NTk5OSB6IE0gMTA1MS42OTA3LDQ1Ljg2NjYgOTk4LjM1NzQsOTkuMTk5ODQ4IDEwNTEuNjkwNywxNTIuNTMzMSBoIC0zNi4wNTMzIEwgOTgwLjIyNDEsMTE3LjExOTgyIFYgMTUyLjUzMzEgSCA5NTQuNjI0MTQgViAzLjIwMDAwMTUgSCA5ODAuMjI0MSBWIDgxLjA2NjU0NCBMIDEwMTUuNDI0LDQ1Ljg2NjYgaCAzNi4yNjY3IHoiLz48L3N2Zz4=';\nconst MARK_DARK = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0Ni45NTU0ODJtbSIgaGVpZ2h0PSIzOS44NDUzMW1tIiB2aWV3Qm94PSIwIDAgNDYuOTU1NDgyIDM5Ljg0NTMxIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODAuOTYyNSwtMTI4LjU4NzUpIj48ZyB0cmFuc2Zvcm09Im1hdHJpeCgwLjIzNDc3NzQxLDAsMCwwLjIzNTc5MzE4LDY5LjY2MDM5Miw5NC42Njg4MzgpIj48cGF0aCBzdHlsZT0iZmlsbDojNTVhYmU1O2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDowLjM3Mjk2MiIgZD0ibSAxNjUuNzQzNjksMzEyLjM0NTE0IGMgLTMuNjU5MDQsLTAuOTU4NjEgLTYuODkxMzEsLTMuMzUzNDggLTkuMjE0OTQsLTYuODI3NTkgLTEuOTEyMjYsLTIuODU5MDggLTIuMzk3MDUsLTQuNTY5NzEgLTIuMzk3MDUsLTguNDU4MzYgMCwtMy45OTI1NCAwLjA4MjQsLTQuMjc1NyA0LjIzMDEyLC0xNC41NDU1MyA0LjAwOTIzLC05LjkyNjgxIDExLjc0NTk3LC0yOS42MDgwNCAxNC4xNzI1NCwtMzYuMDUzMDIgMS4wNTU1LC0yLjgwMzQ0IDQuNjM1NzksLTEyLjA5MDIgNy45NTYxOSwtMjAuNjM3MjUgMy4zMjA0LC04LjU0NzA2IDkuNDcyNjUsLTI0LjQ5MTIgMTMuNjcxNjgsLTM1LjQzMTQzIDkuNDExNjMsLTI0LjUyMTI1IDEyLjE1MTI0LC0zMS4zOTYxNCAxNC4xOTIyMiwtMzUuNjE0NTUgMS4zMzIyOSwtMi43NTM2NCAxLjg3ODY3LC0zLjU5MjU4IDMuMzQ1NDYsLTUuMTM2NzIgMS45NjgyMiwtMi4wNzIwMyA0LjA5ODQsLTMuNTYyNTMgNi40NjY4NywtNC41MjQ5MyAxLjI3MTM4LC0wLjUxNjYgMi4yNTc2MywtMC42OTMwMiA0LjgyNjc5LC0wLjg2MzQgNS4yMTgzLC0wLjM0NjA3IDI0LjU3NDYyLC0wLjU1NDU4IDI0Ljk4NTA4LC0wLjI2OTE0IDAuNDM3OTcsMC4zMDQ1NiAxLjEzMTMxLC0xLjUwMDIxIC0xNS4xNTQxMiwzOS40NDY3OCAtMjAuNjg4NDIsNTIuMDE3NTcgLTI4Ljk2MTg1LDcyLjk4MjY1IC0zNi43NTE4MSw5My4xMzAwNCAtOC40MDM1NiwyMS43MzQzNCAtOS4zOTQ5NSwyNC4yMDc2NCAtMTAuNzYzMTYsMjYuODUxNjUgLTIuMzU0NSw0LjU1IC02LjM4MjQsNy43ODMzMSAtMTEuMjc2NjEsOS4wNTIwNyAtMi4wNzI1OSwwLjUzNzI5IC02LjAwMDE1LDAuNDgxMDkgLTguMjg5MjYsLTAuMTE4NjIgeiIvPjxwYXRoIHN0eWxlPSJmaWxsOiM1NWFiZTU7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjAuMzcyOTYyIiBkPSJtIDEyMi40OTIyLDMxMi41ODkxNiBjIC00LjA3OTU2LC0wLjczMjU4IC04LjY1MTIzLC0zLjkzNDEgLTExLjIzMjU4LC03Ljg2NjE2IC0wLjczMDA0LC0xLjExMjAzIC0xLjg1NDU5LC0zLjQ4MzI2IC0yLjg0MzA5LC01Ljk5NDk2IC0wLjg5OTQzLC0yLjI4NTQgLTQuNzYyODcsLTEyLjE1NTMgLTguNTg1NDA5LC0yMS45MzMxMyAtMy44MjI1NCwtOS43Nzc4MyAtOC40NzkwNzIsLTIxLjYzODAzIC0xMC4zNDc4NTIsLTI2LjM1NjAxIC0xLjg2ODc4LC00LjcxNzk3IC03LjQwNDk2OCwtMTguODE1OTUgLTEyLjMwMjY0NiwtMzEuMzI4ODQgLTQuODk3NjgxLC0xMi41MTI4OCAtMTAuODYxOTIzLC0yNy43Mjk3NSAtMTMuMjUzODc2LC0zMy44MTUyNSAtMi4zOTE5NTMsLTYuMDg1NSAtNS42NjUyMTYsLTE0LjQ3NzE1IC03LjI3MzkxOCwtMTguNjQ4MTEgLTEuNjA4Njk4LC00LjE3MDk3IC00LjIzNTk1LC0xMC44NDgyNiAtNS44MzgzMzQsLTE0LjgzODQzIC0yLjA3Mjc3OSwtNS4xNjE1MyAtMi44MzY1MDksLTcuMzMxNzcgLTIuNjQ2ODY5LC03LjUyMTQgMC4zNDc5MDMsLTAuMzQ3OTEgMjAuODI4ODg3LC0wLjM1OTE3IDI0LjczMjg3NCwtMC4wMTM2IDQuNjQ5MjU2LDAuNDExNTQgNy4wMTI4NDgsMS41MjgxMSAxMC41MTc1NDYsNC45Njg1MiAxLjQ1MDgxOSwxLjQyNDIxIDIuMzk4LDIuNjAyMTMgMi45MDQzNzUsMy42MTE5IDEuNzk4NjkzLDMuNTg2NzggOC40MTgxMDMsMjAuMDI4NjkgMTguNjY2Mjc5LDQ2LjM2NTA2IDMuNjk4MzksOS41MDQzMiAxMS4xNjA2NywyOC40MTM1MSAxNi41ODI4NSw0Mi4wMjA0MiAxNC42MzQzMywzNi43MjQ2NyAxOC43NDc1Myw0Ny4xMzc2NSAxOS41Mzk3NSw0OS40NjY4NyAyLjIyOTgxLDYuNTU1ODkgMS4wNTUzMywxMi43MDIxNCAtMy4zMDQyNiwxNy4yOTE3NiAtMy4xMDM1OSwzLjI2NzM2IC02LjIyMDQzLDQuNjA4NDUgLTExLjAyMTc4LDQuNzQyNCAtMS42NDMzMSwwLjA0NTggLTMuNTc1MTgsLTAuMDIyMSAtNC4yOTMwNiwtMC4xNTEwMyB6Ii8+PHJlY3Qgc3R5bGU9ImZpbGw6I2Y3ODQ3MiIgd2lkdGg9IjExLjI2OTU0IiBoZWlnaHQ9IjQyLjA5NzYyMiIgeD0iMTY0Ljg4MDE0IiB5PSIxNzYuMjU5MDkiIHJ5PSI1LjYxMDQ5NiIvPjxyZWN0IHN0eWxlPSJmaWxsOiNmNzg0NzIiIHdpZHRoPSIxMS42MjE1NiIgaGVpZ2h0PSI4Ny4wMzg2MDUiIHg9IjE0Mi4xNTg2OCIgeT0iMTUzLjc4ODYiIHJ5PSI1LjYxMDQ5NiIvPjxyZWN0IHN0eWxlPSJmaWxsOiNmNzg0NzIiIHdpZHRoPSIxMS4yNjk1NCIgaGVpZ2h0PSI0Mi4wOTc2MjIiIHg9IjExOS43ODkyNCIgeT0iMTc2LjI1OTA5IiByeT0iNS42MTA0OTYiLz48L2c+PC9nPjwvc3ZnPg==';\nconst MARK_LIGHT = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0Ni45NTU0ODJtbSIgaGVpZ2h0PSIzOS44NDUzMW1tIiB2aWV3Qm94PSIwIDAgNDYuOTU1NDgyIDM5Ljg0NTMxIj48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtODAuOTYyNSwtMTI4LjU4NzUpIj48ZyB0cmFuc2Zvcm09Im1hdHJpeCgwLjIzNDc3NzQxLDAsMCwwLjIzNTc5MzE4LDY5LjY2MDM5Miw5NC42Njg4MzgpIj48cGF0aCBzdHlsZT0iZmlsbDojMjQ1YjhmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZS13aWR0aDowLjM3Mjk2MiIgZD0ibSAxNjUuNzQzNjksMzEyLjM0NTE0IGMgLTMuNjU5MDQsLTAuOTU4NjEgLTYuODkxMzEsLTMuMzUzNDggLTkuMjE0OTQsLTYuODI3NTkgLTEuOTEyMjYsLTIuODU5MDggLTIuMzk3MDUsLTQuNTY5NzEgLTIuMzk3MDUsLTguNDU4MzYgMCwtMy45OTI1NCAwLjA4MjQsLTQuMjc1NyA0LjIzMDEyLC0xNC41NDU1MyA0LjAwOTIzLC05LjkyNjgxIDExLjc0NTk3LC0yOS42MDgwNCAxNC4xNzI1NCwtMzYuMDUzMDIgMS4wNTU1LC0yLjgwMzQ0IDQuNjM1NzksLTEyLjA5MDIgNy45NTYxOSwtMjAuNjM3MjUgMy4zMjA0LC04LjU0NzA2IDkuNDcyNjUsLTI0LjQ5MTIgMTMuNjcxNjgsLTM1LjQzMTQzIDkuNDExNjMsLTI0LjUyMTI1IDEyLjE1MTI0LC0zMS4zOTYxNCAxNC4xOTIyMiwtMzUuNjE0NTUgMS4zMzIyOSwtMi43NTM2NCAxLjg3ODY3LC0zLjU5MjU4IDMuMzQ1NDYsLTUuMTM2NzIgMS45NjgyMiwtMi4wNzIwMyA0LjA5ODQsLTMuNTYyNTMgNi40NjY4NywtNC41MjQ5MyAxLjI3MTM4LC0wLjUxNjYgMi4yNTc2MywtMC42OTMwMiA0LjgyNjc5LC0wLjg2MzQgNS4yMTgzLC0wLjM0NjA3IDI0LjU3NDYyLC0wLjU1NDU4IDI0Ljk4NTA4LC0wLjI2OTE0IDAuNDM3OTcsMC4zMDQ1NiAxLjEzMTMxLC0xLjUwMDIxIC0xNS4xNTQxMiwzOS40NDY3OCAtMjAuNjg4NDIsNTIuMDE3NTcgLTI4Ljk2MTg1LDcyLjk4MjY1IC0zNi43NTE4MSw5My4xMzAwNCAtOC40MDM1NiwyMS43MzQzNCAtOS4zOTQ5NSwyNC4yMDc2NCAtMTAuNzYzMTYsMjYuODUxNjUgLTIuMzU0NSw0LjU1IC02LjM4MjQsNy43ODMzMSAtMTEuMjc2NjEsOS4wNTIwNyAtMi4wNzI1OSwwLjUzNzI5IC02LjAwMDE1LDAuNDgxMDkgLTguMjg5MjYsLTAuMTE4NjIgeiIvPjxwYXRoIHN0eWxlPSJmaWxsOiMyNDViOGY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlLXdpZHRoOjAuMzcyOTYyIiBkPSJtIDEyMi40OTIyLDMxMi41ODkxNiBjIC00LjA3OTU2LC0wLjczMjU4IC04LjY1MTIzLC0zLjkzNDEgLTExLjIzMjU4LC03Ljg2NjE2IC0wLjczMDA0LC0xLjExMjAzIC0xLjg1NDU5LC0zLjQ4MzI2IC0yLjg0MzA5LC01Ljk5NDk2IC0wLjg5OTQzLC0yLjI4NTQgLTQuNzYyODcsLTEyLjE1NTMgLTguNTg1NDA5LC0yMS45MzMxMyAtMy44MjI1NCwtOS43Nzc4MyAtOC40NzkwNzIsLTIxLjYzODAzIC0xMC4zNDc4NTIsLTI2LjM1NjAxIC0xLjg2ODc4LC00LjcxNzk3IC03LjQwNDk2OCwtMTguODE1OTUgLTEyLjMwMjY0NiwtMzEuMzI4ODQgLTQuODk3NjgxLC0xMi41MTI4OCAtMTAuODYxOTIzLC0yNy43Mjk3NSAtMTMuMjUzODc2LC0zMy44MTUyNSAtMi4zOTE5NTMsLTYuMDg1NSAtNS42NjUyMTYsLTE0LjQ3NzE1IC03LjI3MzkxOCwtMTguNjQ4MTEgLTEuNjA4Njk4LC00LjE3MDk3IC00LjIzNTk1LC0xMC44NDgyNiAtNS44MzgzMzQsLTE0LjgzODQzIC0yLjA3Mjc3OSwtNS4xNjE1MyAtMi44MzY1MDksLTcuMzMxNzcgLTIuNjQ2ODY5LC03LjUyMTQgMC4zNDc5MDMsLTAuMzQ3OTEgMjAuODI4ODg3LC0wLjM1OTE3IDI0LjczMjg3NCwtMC4wMTM2IDQuNjQ5MjU2LDAuNDExNTQgNy4wMTI4NDgsMS41MjgxMSAxMC41MTc1NDYsNC45Njg1MiAxLjQ1MDgxOSwxLjQyNDIxIDIuMzk4LDIuNjAyMTMgMi45MDQzNzUsMy42MTE5IDEuNzk4NjkzLDMuNTg2NzggOC40MTgxMDMsMjAuMDI4NjkgMTguNjY2Mjc5LDQ2LjM2NTA2IDMuNjk4MzksOS41MDQzMiAxMS4xNjA2NywyOC40MTM1MSAxNi41ODI4NSw0Mi4wMjA0MiAxNC42MzQzMywzNi43MjQ2NyAxOC43NDc1Myw0Ny4xMzc2NSAxOS41Mzk3NSw0OS40NjY4NyAyLjIyOTgxLDYuNTU1ODkgMS4wNTUzMywxMi43MDIxNCAtMy4zMDQyNiwxNy4yOTE3NiAtMy4xMDM1OSwzLjI2NzM2IC02LjIyMDQzLDQuNjA4NDUgLTExLjAyMTc4LDQuNzQyNCAtMS42NDMzMSwwLjA0NTggLTMuNTc1MTgsLTAuMDIyMSAtNC4yOTMwNiwtMC4xNTEwMyB6Ii8+PHJlY3Qgc3R5bGU9ImZpbGw6I2VjNjM0ZCIgd2lkdGg9IjExLjI2OTU0IiBoZWlnaHQ9IjQyLjA5NzYyMiIgeD0iMTY0Ljg4MDE0IiB5PSIxNzYuMjU5MDkiIHJ5PSI1LjYxMDQ5NiIvPjxyZWN0IHN0eWxlPSJmaWxsOiNlYzYzNGQiIHdpZHRoPSIxMS42MjE1NiIgaGVpZ2h0PSI4Ny4wMzg2MDUiIHg9IjE0Mi4xNTg2OCIgeT0iMTUzLjc4ODYiIHJ5PSI1LjYxMDQ5NiIvPjxyZWN0IHN0eWxlPSJmaWxsOiNlYzYzNGQiIHdpZHRoPSIxMS4yNjk1NCIgaGVpZ2h0PSI0Mi4wOTc2MjIiIHg9IjExOS43ODkyNCIgeT0iMTc2LjI1OTA5IiByeT0iNS42MTA0OTYiLz48L2c+PC9nPjwvc3ZnPg==';\n\ntype P = SVGProps<SVGSVGElement> & { size?: number; stroke?: string; sw?: number };\n\nfunction I({ size = 16, sw = 1.5, children, style, ...rest }: P & { children: React.ReactNode }) {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"none\" stroke=\"currentColor\" strokeWidth={sw} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" style={{ flex: 'none', ...style }} {...rest}>\n {children}\n </svg>\n );\n}\n\nexport const D = {\n plus: 'M12 4.5v15m7.5-7.5h-15',\n check: 'M4.5 12.75l6 6 9-13.5',\n downloaded: 'M12 21a9 9 0 100-18 9 9 0 000 18zM12 6.75v10.5m0 0l3.75-3.75M12 17.25l-3.75-3.75',\n chevronRight: 'm8.25 4.5 7.5 7.5-7.5 7.5',\n chevronLeft: 'M15.75 19.5 8.25 12l7.5-7.5',\n chevronDown: 'm19.5 8.25-7.5 7.5-7.5-7.5',\n external: 'M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-7.5 6L21 3m0 0h-5.25M21 3v5.25',\n arrowLeft: 'M10.5 19.5 3 12m0 0 7.5-7.5M3 12h18',\n arrowRight: 'M4 12h15m0 0-5-5m5 5-5 5',\n volumeOffSpk: 'M17.25 9.75 19.5 12m0 0 2.25 2.25M19.5 12l2.25-2.25M19.5 12l-2.25 2.25M4.5 8.25H6l5.25-4.5v16.5L6 15.75H4.5a1.5 1.5 0 0 1-1.5-1.5v-4.5a1.5 1.5 0 0 1 1.5-1.5Z',\n notice: 'M12 9v3.75m9-1.5a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z',\n close: 'M6 18 18 6M6 6l12 12',\n search: 'M21 21l-4.35-4.35M17 11a6 6 0 1 1-12 0 6 6 0 0 1 12 0Z',\n info: 'M22 12a10 10 0 1 1-20 0 10 10 0 0 1 20 0M12 16v-4M12 8h.01',\n pencil: 'm16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Z',\n infoNote: 'm11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z',\n copy: 'M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75',\n extLink: 'M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25',\n pin: 'M9 3.75h6M10.5 3.75v5.25L7.5 12.75v1.5h9v-1.5l-3-3.75V3.75M12 14.25V20.25',\n pencilEdit: 'm16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125',\n squarePen: 'M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7M18.5 2.5a2.12 2.12 0 0 1 3 3L12 15l-4 1 1-4Z',\n voiceClone: 'M13.75 6.75a3.4 3.4 0 1 1-6.8 0 3.4 3.4 0 0 1 6.8 0ZM3.6 19.7a6.8 6.8 0 0 1 13.5 0 16.3 16.3 0 0 1-6.75 1.47c-2.43 0-4.73-.53-6.8-1.48ZM17.8 4.6a4.5 4.5 0 0 1 0 5.6M20.5 2.6a7.2 7.2 0 0 1 0 9.6',\n headphonesOff: 'M4.5 15.75v-3a7.5 7.5 0 0 1 12.35-5.72M19.5 12.6v3.15M4.5 15.75A2.25 2.25 0 0 0 6.75 18h.75v-4.5h-.75a2.25 2.25 0 0 0-2.25 2.25Zm15 0A2.25 2.25 0 0 1 17.25 18h-.75v-4.5h.75a2.25 2.25 0 0 1 2.25 2.25ZM3.75 20.25 20.25 3.75',\n broadcast: 'M12 9.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm0 0v10.5M8.818 5.818a4.5 4.5 0 0 0 0 6.364m6.364-6.364a4.5 4.5 0 0 1 0 6.364M6.166 3.166a8.25 8.25 0 0 0 0 11.668m11.668-11.668a8.25 8.25 0 0 1 0 11.668M8.25 20.25h7.5',\n globeAlt: 'M12 21a9.004 9.004 0 0 0 8.716-6.747M12 21a9.004 9.004 0 0 1-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 0 1 7.843 4.582M12 3a8.997 8.997 0 0 0-7.843 4.582m15.686 0A11.953 11.953 0 0 1 12 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0 1 21 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0 1 12 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 0 1 3 12c0-1.605.42-3.113 1.157-4.418',\n uturn: 'M9 15 3 9m0 0 6-6M3 9h12a6 6 0 0 1 0 12h-3',\n tabGauge: 'm12 14 4-4M3.34 19a10 10 0 1 1 17.32 0',\n tabScript: 'M15 12h-5m5-4h-5m9 9V5a2 2 0 0 0-2-2H4M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3',\n tabFix: 'm16.133 5.614 1.434-1.435a1.594 1.594 0 1 1 2.254 2.254L7.607 18.647a3.825 3.825 0 0 1-1.612.961l-2.282.68.68-2.282a3.825 3.825 0 0 1 .961-1.612L16.134 5.614Z',\n pencilFix: 'm16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 0 1 1.13-1.897L16.863 4.487Z',\n tabEnding: 'M3 3v1.5M3 21v-6m0 0 2.77-.693a9 9 0 0 1 6.208.682l.108.054a9 9 0 0 0 6.086.71l3.114-.732a48.524 48.524 0 0 1-.005-10.499l-3.11.732a9 9 0 0 1-6.085-.711l-.108-.054a9 9 0 0 0-6.208-.682L3 4.5M3 15V4.5',\n tabSummary: 'M15 4H7m11 12 3 3-3 3M3 4v13a2 2 0 0 0 2 2h16M7 14h7M7 9h12',\n tabExport: 'M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3',\n tabSettings: 'M10.5 6h9.75M10.5 6a1.5 1.5 0 1 1-3 0m3 0a1.5 1.5 0 1 0-3 0M3.75 6H7.5m3 12h9.75m-9.75 0a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m-3.75 0H7.5m9-6h3.75m-3.75 0a1.5 1.5 0 0 1-3 0m3 0a1.5 1.5 0 0 0-3 0m-9.75 0h9.75',\n tabSources: 'M17 19a1 1 0 0 1-1-1v-2a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2v2a1 1 0 0 1-1 1zM17 21v-2M19 14V6.5a1 1 0 0 0-7 0v11a1 1 0 0 1-7 0V10M21 21v-2M3 5V3M4 10a2 2 0 0 1-2-2V6a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2a2 2 0 0 1-2 2zM7 5V3',\n textLines: 'M3.75 6.75h9m-9 4.5h16.5m-16.5 4.5h16.5m-16.5 4.5h10.5M15.75 6.75h4.5',\n mic: 'M12 18.75a6 6 0 0 0 6-6v-1.5m-6 7.5a6 6 0 0 1-6-6v-1.5m6 7.5v3.75m-3.75 0h7.5M12 15.75a3 3 0 0 1-3-3V4.5a3 3 0 1 1 6 0v8.25a3 3 0 0 1-3 3Z',\n signal: 'M9.348 14.652a3.75 3.75 0 0 1 0-5.304m5.304 0a3.75 3.75 0 0 1 0 5.304m-7.425 2.121a6.75 6.75 0 0 1 0-9.546m9.546 0a6.75 6.75 0 0 1 0 9.546M5.106 18.894c-3.808-3.807-3.808-9.98 0-13.788m13.788 0c3.808 3.807 3.808 9.98 0 13.788M12.375 12a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z',\n checkCircle: 'M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z',\n warnCircle: 'M12 9v3.75m0 3.75h.008M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z',\n infoCircle: 'M11.25 11.25h1.5v5.25M12 7.5h.008M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z',\n discard: 'M9 13.5 12 9m0 0 3 4.5M3 12a9 9 0 1 0 18 0 9 9 0 0 0-18 0Z',\n micOff: ['M12 18.75a6 6 0 0 0 6-6v-1.5m-6 7.5a6 6 0 0 1-6-6v-1.5m6 7.5v3.75m-3.75 0h7.5M12 15.75a3 3 0 0 1-3-3V4.5a3 3 0 1 1 6 0v8.25a3 3 0 0 1-3 3Z', 'M3.75 3.75l16.5 16.5'],\n venus: 'M16.5 8.75a4.5 4.5 0 1 1-9 0 4.5 4.5 0 0 1 9 0ZM12 13.25v7.25m-3-3.5h6',\n mars: 'M14.75 14.25a4.5 4.5 0 1 1-9 0 4.5 4.5 0 0 1 9 0ZM14.2 10.8 19.5 5.5m0 0h-4.25M19.5 5.5v4.25',\n language: 'm10.5 21 5.25-11.25L21 21m-9-3h7.5M3 5.621a48.474 48.474 0 0 1 6-.371m0 0c1.12 0 2.233.038 3.334.114M9 5.25V3m3.334 2.364C11.176 10.658 7.69 15.08 3 17.502m9.334-12.138c.896.061 1.785.147 2.666.257m-4.589 8.495a18.023 18.023 0 0 1-3.827-5.802',\n langAuto: 'M10.5 21 15.75 9 21 21m-8.437-3h6.375M3 5.621a48.5 48.5 0 0 1 4.5-.368m0 0V3.75m0 1.503A50 50 0 0 1 10.5 5.62M7.5 5.253C6.9 9.02 5.06 12.35 2.4 14.85m3.6-3.6c.66 1.07 1.53 2.02 2.55 2.79m-4.35 3.6c1.67-.9 3.15-2.13 4.35-3.6',\n share: 'M7.217 10.907a2.25 2.25 0 1 0 0 2.186m0-2.186c.18.324.283.696.283 1.093s-.103.77-.283 1.093m0-2.186 9.566-5.314m-9.566 7.5 9.566 5.314m0 0a2.25 2.25 0 1 0 3.935 2.186 2.25 2.25 0 0 0-3.935-2.186Zm0-12.814a2.25 2.25 0 1 0 3.933-2.185 2.25 2.25 0 0 0-3.933 2.185Z',\n users: 'M15 19.128a9.38 9.38 0 0 0 2.625.372 9.337 9.337 0 0 0 4.121-.952 4.125 4.125 0 0 0-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 0 1 8.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0 1 11.964-3.07M12 6.375a3.375 3.375 0 1 1-6.75 0 3.375 3.375 0 0 1 6.75 0Zm8.25 2.25a2.625 2.625 0 1 1-5.25 0 2.625 2.625 0 0 1 5.25 0Z',\n globe: 'M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18Zm0 0c2.5-2.4 3.75-5.4 3.75-9S14.5 5.4 12 3m0 18c-2.5-2.4-3.75-5.4-3.75-9S9.5 5.4 12 3M3.6 9h16.8M3.6 15h16.8',\n clock: 'M12 6.75V12l3 2.25M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z',\n bolt: 'm3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z',\n sparkles: 'M9.813 15.904 9 18.75l-.813-2.846a4.5 4.5 0 0 0-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 0 0 3.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 0 0 3.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 0 0-3.09 3.09ZM18.259 8.715 18 9.75l-.259-1.035a3.375 3.375 0 0 0-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 0 0 2.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 0 0 2.456 2.456L21.75 6l-1.035.259a3.375 3.375 0 0 0-2.456 2.456Z',\n viewfinder: 'M7.5 3.75H6A2.25 2.25 0 0 0 3.75 6v1.5M16.5 3.75H18A2.25 2.25 0 0 1 20.25 6v1.5m0 9V18A2.25 2.25 0 0 1 18 20.25h-1.5m-9 0H6A2.25 2.25 0 0 1 3.75 18v-1.5M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z',\n speaker: 'M19.114 5.636a9 9 0 0 1 0 12.728M16.463 8.288a5.25 5.25 0 0 1 0 7.424M6.75 8.25l4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.7-.5-1.9-1.36a9.06 9.06 0 0 1 0-4.06c.2-.87 1.02-1.36 1.9-1.36h2.25Z',\n warnTri: ['m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3', 'M12 9v4', 'M12 17h.01'],\n checkThick: 'M20 6 9 17l-5-5',\n warn: 'M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z',\n link: 'M13.19 8.688a4.5 4.5 0 0 1 1.242 7.244l-4.5 4.5a4.5 4.5 0 0 1-6.364-6.364l1.757-1.757m13.35-.622 1.757-1.757a4.5 4.5 0 0 0-6.364-6.364l-4.5 4.5a4.5 4.5 0 0 0 1.242 7.244',\n archive: 'M20.25 7.5v10.5a2.25 2.25 0 0 1-2.25 2.25H6a2.25 2.25 0 0 1-2.25-2.25V7.5M9.75 12h4.5M3 4.5h18v3H3z',\n restore: 'M16.023 9.348h4.992V4.356m-.001 9.752A8.25 8.25 0 1 1 5.633 6.75',\n archiveDown: 'm20.25 7.5-.625 10.632a2.25 2.25 0 0 1-2.247 2.118H6.622a2.25 2.25 0 0 1-2.247-2.118L3.75 7.5m8.25 3v6.75m0 0-3-3m3 3 3-3M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125Z',\n lockRow: 'M16.5 10.5V6.75a4.5 4.5 0 1 0-9 0v3.75M6.75 21h10.5a2.25 2.25 0 0 0 2.25-2.25v-6a2.25 2.25 0 0 0-2.25-2.25H6.75A2.25 2.25 0 0 0 4.5 12.75v6A2.25 2.25 0 0 0 6.75 21Z',\n userRow: 'M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.5 20.25a7.5 7.5 0 0 1 15 0',\n usersRow: 'M18 18.72a9.09 9.09 0 0 0 3.74-.48 3 3 0 0 0-4.68-2.72M18 18.72a6 6 0 0 0-.94-3.2 6 6 0 0 0-10.12 0A6 6 0 0 0 6 18.72m12 0A12.32 12.32 0 0 1 12 21c-2.17 0-4.21-.58-5.96-1.58M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z',\n upload: 'M12 16.5V9.75m0 0 3 3m-3-3-3 3M6.75 19.5a4.5 4.5 0 0 1-1.41-8.78 5.25 5.25 0 0 1 10.23-2.14 3 3 0 0 1 3.75 3.75 4.5 4.5 0 0 1-1.32 7.17',\n music: 'M9 19.5a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm10.5-2.25a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0ZM9 19.5V7.5l10.5-2.25v12',\n trash: 'm14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0',\n qr: 'M3.75 4.875c0-.621.504-1.125 1.125-1.125h4.5c.621 0 1.125.504 1.125 1.125v4.5c0 .621-.504 1.125-1.125 1.125h-4.5A1.125 1.125 0 0 1 3.75 9.375v-4.5ZM3.75 14.625c0-.621.504-1.125 1.125-1.125h4.5c.621 0 1.125.504 1.125 1.125v4.5c0 .621-.504 1.125-1.125 1.125h-4.5a1.125 1.125 0 0 1-1.125-1.125v-4.5ZM13.5 4.875c0-.621.504-1.125 1.125-1.125h4.5c.621 0 1.125.504 1.125 1.125v4.5c0 .621-.504 1.125-1.125 1.125h-4.5A1.125 1.125 0 0 1 13.5 9.375v-4.5Z M6.75 6.75h.75v.75h-.75v-.75ZM6.75 16.5h.75v.75h-.75v-.75ZM16.5 6.75h.75v.75h-.75v-.75ZM13.5 13.5h.75v.75h-.75v-.75ZM13.5 19.5h.75v.75h-.75v-.75ZM19.5 13.5h.75v.75h-.75v-.75ZM19.5 19.5h.75v.75h-.75v-.75ZM16.5 16.5h.75v.75h-.75v-.75Z',\n lockOpen: 'M13.5 10.5V6.75a4.5 4.5 0 1 1 9 0v3.75M3.75 21.75h10.5a2.25 2.25 0 0 0 2.25-2.25v-6.75a2.25 2.25 0 0 0-2.25-2.25H3.75a2.25 2.25 0 0 0-2.25 2.25v6.75a2.25 2.25 0 0 0 2.25 2.25Z',\n calendar: 'M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5',\n lock: 'M16.5 10.5V6.75a4.5 4.5 0 1 0-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 0 0 2.25-2.25v-6.75a2.25 2.25 0 0 0-2.25-2.25H6.75a2.25 2.25 0 0 0-2.25 2.25v6.75a2.25 2.25 0 0 0 2.25 2.25Z',\n user: 'M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z',\n userGroup: 'M18 18.72a9.094 9.094 0 0 0 3.741-.479 3 3 0 0 0-4.682-2.72m.94 3.198.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0 1 12 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 0 1 6 18.719m12 0a5.971 5.971 0 0 0-.941-3.197m0 0A5.995 5.995 0 0 0 12 12.75a5.995 5.995 0 0 0-5.058 2.772m0 0a3 3 0 0 0-4.681 2.72 8.986 8.986 0 0 0 3.74.478m.94-3.197a5.971 5.971 0 0 0-.94 3.197M15 6.75a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm6 3a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Zm-13.5 0a2.25 2.25 0 1 1-4.5 0 2.25 2.25 0 0 1 4.5 0Z',\n home: 'm2.25 12 8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25',\n cog: 'M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.241-.438.613-.43.992a7.723 7.723 0 0 1 0 .255c-.008.378.137.75.43.991l1.004.827c.424.35.534.955.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.47 6.47 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.281c-.09.543-.56.94-1.11.94h-2.594c-.55 0-1.019-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.991a6.932 6.932 0 0 1 0-.255c.007-.38-.138-.751-.43-.992l-1.004-.827a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.28Z M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z',\n docs: 'M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z',\n speakerOne: 'M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z',\n cc: 'M4.5 4.5h15a2.5 2.5 0 0 1 2.5 2.5v10a2.5 2.5 0 0 1-2.5 2.5h-15A2.5 2.5 0 0 1 2 17V7a2.5 2.5 0 0 1 2.5-2.5ZM10.85 10.05a2.75 2.75 0 1 0 0 3.9M17.85 10.05a2.75 2.75 0 1 0 0 3.9',\n ccOff: 'M4.5 4.5h15a2.5 2.5 0 0 1 2.5 2.5v10a2.5 2.5 0 0 1-2.5 2.5h-15A2.5 2.5 0 0 1 2 17V7a2.5 2.5 0 0 1 2.5-2.5ZM10.85 10.05a2.75 2.75 0 1 0 0 3.9M17.85 10.05a2.75 2.75 0 1 0 0 3.9 M3 3l18 18',\n volume: 'M19.114 5.636a9 9 0 0 1 0 12.728M16.463 8.288a5.25 5.25 0 0 1 0 7.424M6.75 8.25l4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.7-.5-1.9-1.36a9.06 9.06 0 0 1 0-4.06c.2-.87 1.02-1.36 1.9-1.36h2.25Z',\n volumeOff: 'M17.25 9.75 19.5 12m0 0 2.25 2.25M19.5 12l2.25-2.25M19.5 12l-2.25 2.25M6.75 8.25l4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.7-.5-1.9-1.36a9.06 9.06 0 0 1 0-4.06c.2-.87 1.02-1.36 1.9-1.36h2.25Z',\n volumeSq: 'M19.114 5.636a9 9 0 0 1 0 12.728M16.463 8.288a5.25 5.25 0 0 1 0 7.424M4.5 8.25H6l5.25-4.5v16.5L6 15.75H4.5a1.5 1.5 0 0 1-1.5-1.5v-4.5a1.5 1.5 0 0 1 1.5-1.5Z',\n volumeOffSq: 'M17.25 9.75 22.5 15m0-5.25L17.25 15M4.5 8.25H6l5.25-4.5v16.5L6 15.75H4.5a1.5 1.5 0 0 1-1.5-1.5v-4.5a1.5 1.5 0 0 1 1.5-1.5Z',\n book: 'M12 6.042A8.967 8.967 0 0 0 6 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 0 1 6 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 0 1 6-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0 0 18 18a8.967 8.967 0 0 0-6 2.292m0-14.25v14.25',\n headphones: ['M3.75 16.5v-4.5a8.25 8.25 0 0 1 16.5 0v4.5', 'M3.75 14.25h1.5a1.5 1.5 0 0 1 1.5 1.5v3a1.5 1.5 0 0 1-1.5 1.5h-1.5a1.5 1.5 0 0 1-1.5-1.5v-3a1.5 1.5 0 0 1 1.5-1.5Z', 'M18.75 14.25h1.5a1.5 1.5 0 0 1 1.5 1.5v3a1.5 1.5 0 0 1-1.5 1.5h-1.5a1.5 1.5 0 0 1-1.5-1.5v-3a1.5 1.5 0 0 1 1.5-1.5Z'],\n video: 'm15.75 10.5 4.72-4.72a.75.75 0 0 1 1.28.53v11.38a.75.75 0 0 1-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25h-9A2.25 2.25 0 0 0 2.25 7.5v9a2.25 2.25 0 0 0 2.25 2.25Z',\n squares: 'M3.75 6A2.25 2.25 0 0 1 6 3.75h2.25A2.25 2.25 0 0 1 10.5 6v2.25a2.25 2.25 0 0 1-2.25 2.25H6a2.25 2.25 0 0 1-2.25-2.25V6ZM3.75 15.75A2.25 2.25 0 0 1 6 13.5h2.25a2.25 2.25 0 0 1 2.25 2.25V18a2.25 2.25 0 0 1-2.25 2.25H6A2.25 2.25 0 0 1 3.75 18v-2.25ZM13.5 6a2.25 2.25 0 0 1 2.25-2.25H18A2.25 2.25 0 0 1 20.25 6v2.25A2.25 2.25 0 0 1 18 10.5h-2.25a2.25 2.25 0 0 1-2.25-2.25V6ZM13.5 15.75a2.25 2.25 0 0 1 2.25-2.25H18a2.25 2.25 0 0 1 2.25 2.25V18A2.25 2.25 0 0 1 18 20.25h-2.25A2.25 2.25 0 0 1 13.5 18v-2.25Z',\n code: 'M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5',\n card: 'M2.25 8.25h19.5M2.25 9h19.5m-16.5 5.25h6m-6 2.25h3m-3.75 3h15a2.25 2.25 0 0 0 2.25-2.25V6.75A2.25 2.25 0 0 0 19.5 4.5h-15a2.25 2.25 0 0 0-2.25 2.25v10.5A2.25 2.25 0 0 0 4.5 19.5Z',\n};\n\nexport function Icon({ d, ...rest }: Omit<P, 'd'> & { d: string | string[] }) {\n return (\n <I {...rest}>\n {(Array.isArray(d) ? d : [d]).map((p) => <path key={p} d={p} />)}\n </I>\n );\n}\n\nexport function AppsGlyph({ size = 20 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"currentColor\" aria-hidden=\"true\" style={{ color: 'var(--ink-96)' }}>\n {[5.5, 12, 18.5].map((cy) => [5.5, 12, 18.5].map((cx) => <circle key={`${cx}-${cy}`} cx={cx} cy={cy} r={2.1} />))}\n </svg>\n );\n}\n\nexport function MenuGlyph({ size = 19, r = 1.85 }: { size?: number; r?: number }) {\n const spread = r > 1.85 ? 7 : 6.5;\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"12\" cy={12 - spread} r={r} />\n <circle cx=\"12\" cy=\"12\" r={r} />\n <circle cx=\"12\" cy={12 + spread} r={r} />\n </svg>\n );\n}\n\nexport function StopGlyph({ size = 15 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"currentColor\" aria-hidden=\"true\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2.5\" />\n </svg>\n );\n}\n\nexport function PlayGlyph({ size = 13 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"currentColor\" style={{ marginLeft: 2 }} aria-hidden=\"true\">\n <path d=\"M7.5 5.6a1 1 0 0 1 1.52-.85l9.1 5.55a1 1 0 0 1 0 1.7l-9.1 5.55a1 1 0 0 1-1.52-.85V5.6Z\" />\n </svg>\n );\n}\n\nexport function Spinner({ size = 15, color = 'currentColor', track = 'rgba(127,127,127,.35)', sw }: { size?: number; color?: string; track?: string; sw?: number }) {\n return (\n <span\n aria-hidden=\"true\"\n style={{\n flex: 'none',\n display: 'block',\n boxSizing: 'border-box',\n width: size,\n height: size,\n borderRadius: '50%',\n border: `${sw ?? Math.max(1.5, Math.round(size / 9))}px solid ${track}`,\n borderTopColor: color,\n animation: 'vs-spin .75s linear infinite',\n }}\n />\n );\n}\n\nexport function PauseGlyph({ size = 12 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"currentColor\" aria-hidden=\"true\">\n <rect x=\"6.5\" y=\"5\" width=\"3.75\" height=\"14\" rx=\"1.2\" />\n <rect x=\"13.75\" y=\"5\" width=\"3.75\" height=\"14\" rx=\"1.2\" />\n </svg>\n );\n}\n\nexport function EqBars({ bars = 4, height = 13, color = 'var(--brand)' }: { bars?: number; height?: number; color?: string }) {\n return (\n <span style={{ display: 'inline-flex', alignItems: 'flex-end', gap: 2, height }} aria-hidden=\"true\">\n {Array.from({ length: bars }, (_, i) => (\n <span key={i} style={{ width: 2.5, height, borderRadius: 1, background: color, animation: 'vs-eq .8s ease-in-out infinite', animationDelay: `${i * 0.11}s`, transformOrigin: 'bottom' }} />\n ))}\n </span>\n );\n}\n\nexport function Logo({ dark, height = 20, link = true }: { dark: boolean; height?: number; link?: boolean }) {\n const img = <img src={dark ? LOGO_DARK : LOGO_LIGHT} alt=\"VocalStack\" decoding=\"sync\" style={{ height, width: 'auto', display: 'block' }} />;\n return link ? <a href={SITE} style={{ display: 'block' }}>{img}</a> : img;\n}\n\nexport function Mark({ dark, size = 30 }: { dark: boolean; size?: number }) {\n return <img src={dark ? MARK_DARK : MARK_LIGHT} alt=\"VocalStack\" style={{ width: size, height: Math.round((size * 26) / 30 * 100) / 100, display: 'block' }} />;\n}\n","import { createContext, useContext, useEffect, useId, useLayoutEffect, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { D, Icon } from './Icons';\n\nexport function Card({ children, panel, inset, className = '', style }: { children: ReactNode; panel?: boolean; inset?: boolean; className?: string; style?: React.CSSProperties }) {\n return (\n <div className={`vs-card${panel ? ' panel' : ''}${inset ? ' vs-card--inset' : ''} ${className}`} style={style}>\n {children}\n </div>\n );\n}\n\nexport function Toggle({ checked, onChange, label, disabled }: { checked: boolean; onChange: (v: boolean) => void; label: string; disabled?: boolean }) {\n return (\n <button type=\"button\" role=\"switch\" aria-checked={checked} aria-label={label} className=\"vs-toggle\" disabled={disabled} onClick={() => onChange(!checked)}>\n <span className=\"vs-toggle__knob\" />\n </button>\n );\n}\n\nexport function TextField({ label, value, onChange, onKeyDown, type = 'text', placeholder, hint, error, mono, inputMode, autoComplete, ariaLabel }: { label?: string; value: string; onChange: (v: string) => void; onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void; type?: string; placeholder?: string; hint?: ReactNode; error?: string; mono?: boolean; inputMode?: React.HTMLAttributes<HTMLInputElement>['inputMode']; autoComplete?: string; ariaLabel?: string }) {\n const id = useId();\n return (\n <div className={`vs-field${error ? ' vs-field--invalid' : ''}`}>\n {label && <label htmlFor={id}>{label}</label>}\n <input id={id} className={`vs-input${mono ? ' vs-input--mono' : ''}`} type={type} value={value} placeholder={placeholder} inputMode={inputMode} autoComplete={autoComplete} aria-label={label ? undefined : ariaLabel} aria-invalid={error ? true : undefined}\n onChange={(e) => onChange(e.target.value)} onKeyDown={onKeyDown} />\n {error ? <span className=\"vs-field__error\" role=\"alert\">{error}</span> : hint ? <span className=\"vs-field__hint\">{hint}</span> : null}\n </div>\n );\n}\n\nexport interface SwitchOption<T extends string> {\n value: T;\n label: ReactNode;\n icon?: ReactNode;\n}\n\nexport function Checkbox({ checked, indeterminate, disabled, label, title, size, onChange }: { checked?: boolean; indeterminate?: boolean; disabled?: boolean; label?: string; title?: string; size?: 'sm'; onChange?: (v: boolean) => void }) {\n const on = !!checked, mixed = !!indeterminate;\n return (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={mixed ? 'mixed' : on}\n aria-disabled={disabled || undefined}\n aria-label={label ? undefined : title}\n title={title}\n className={`vs-check${size === 'sm' ? ' vs-check--sm' : ''}${disabled ? ' vs-check--disabled' : ''}`}\n onClick={disabled ? undefined : () => onChange?.(!on)}\n >\n <span className={`vs-check__box${mixed ? ' vs-check__box--mixed' : on ? ' vs-check__box--on' : ''}`}>\n {mixed ? <span className=\"vs-check__dash\" /> : on ? (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={3} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"m4.5 12.75 6 6 9-13.5\" /></svg>\n ) : null}\n </span>\n {label ? <span className=\"vs-check__label\">{label}</span> : null}\n </button>\n );\n}\n\nexport function Tooltip({ open, onDismiss, content, side = 'bottom', align = 'center', width, children }: { open: boolean; onDismiss: () => void; content: ReactNode; side?: 'top' | 'bottom'; align?: 'start' | 'center' | 'end'; width?: number; children: ReactNode }) {\n useEffect(() => {\n if (!open) return;\n const t = setTimeout(() => window.addEventListener('click', onDismiss, { once: true }), 0);\n return () => { clearTimeout(t); window.removeEventListener('click', onDismiss); };\n }, [open, onDismiss]);\n return (\n <span className=\"vs-tip\">\n {children}\n {open && (\n <span className={`vs-tip__bubble vs-tip__bubble--${side} vs-tip__bubble--${align}`} style={width ? { width } : undefined} onClick={(e) => e.stopPropagation()}>\n <span className=\"vs-tip__row\">\n <span className=\"vs-tip__copy\">{content}</span>\n <button type=\"button\" className=\"vs-tip__close\" aria-label=\"Dismiss\" onClick={onDismiss}><Icon d={D.close} size={12} sw={1.8} /></button>\n </span>\n <span className=\"vs-tip__arrow\" />\n </span>\n )}\n </span>\n );\n}\n\nexport function Switch<T extends string>({ value, onChange, options, size, bordered = true, fill }: { value: T; onChange: (v: T) => void; options: SwitchOption<T>[]; size?: 'sm'; bordered?: boolean; fill?: boolean }) {\n const ref = useRef<HTMLDivElement>(null);\n const [thumb, setThumb] = useState<{ left: number; width: number } | null>(null);\n const idx = Math.max(0, options.findIndex((o) => o.value === value));\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n const opt = el.querySelectorAll<HTMLElement>('.vs-switch__opt')[idx];\n if (opt) setThumb({ left: opt.offsetLeft, width: opt.offsetWidth });\n }, [idx, options.length]);\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(() => {\n const opt = el.querySelectorAll<HTMLElement>('.vs-switch__opt')[idx];\n if (opt) setThumb({ left: opt.offsetLeft, width: opt.offsetWidth });\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [idx]);\n return (\n <div ref={ref} role=\"tablist\" className={`vs-switch${size === 'sm' ? ' vs-switch--sm' : ''}${bordered ? '' : ' vs-switch--borderless'}${fill ? ' vs-switch--fill' : ''}`}>\n {thumb && <span className=\"vs-switch__thumb\" style={{ left: thumb.left, width: thumb.width }} aria-hidden=\"true\" />}\n {options.map((o) => (\n <button key={o.value} type=\"button\" role=\"tab\" aria-selected={o.value === value} className=\"vs-switch__opt\" onClick={() => onChange(o.value)}>\n {o.icon}\n {o.label}\n </button>\n ))}\n </div>\n );\n}\n\nexport function IconButton({ children, onClick, label, size, variant, bordered = true, active, title }: { children: ReactNode; onClick?: () => void; label: string; size?: 'sm'; variant?: 'default' | 'primary'; bordered?: boolean; active?: boolean; title?: string }) {\n return (\n <button type=\"button\" className={`vs-icon-btn${size === 'sm' ? ' vs-icon-btn--sm' : ''}${variant === 'primary' ? ' vs-icon-btn--primary' : ''}${active ? ' vs-icon-btn--primary' : ''}${bordered ? '' : ' vs-icon-btn--borderless'}`} onClick={onClick} aria-label={label} title={title ?? label}>\n {children}\n </button>\n );\n}\n\nexport function LanguageChip({ flag, code, label, onClick, variant, block, bordered = true, size, style, flagOnly }: { flag: ReactNode; code: string; label?: string; onClick?: () => void; variant?: 'primary'; block?: boolean; bordered?: boolean; size?: 'sm'; style?: React.CSSProperties; flagOnly?: boolean }) {\n if (flagOnly) {\n return (\n <button type=\"button\" className=\"mutebtn vs-flagbtn\" onClick={onClick} aria-label={label ? (code ? `${label} (${code})` : label) : code || 'Language'} title={label ?? code} style={style}>\n <span style={{ fontSize: 20, lineHeight: 1, display: 'flex' }}>{flag}</span>\n </button>\n );\n }\n const named = block && !!code;\n return (\n <button type=\"button\" className={`vs-lang-chip${variant ? ` vs-lang-chip--${variant}` : ''}${block ? ' vs-lang-chip--block' : ''}${block && !named ? ' vs-lang-chip--bare' : ''}${bordered ? '' : ' vs-lang-chip--borderless'}${size === 'sm' ? ' vs-lang-chip--sm' : ''}`} onClick={onClick} aria-label={label ? (code ? `${label} (${code})` : label) : code} style={style}>\n {flag ? <span className=\"vs-lang-chip__flag\">{flag}</span> : null}\n {named ? <span className=\"vs-lang-chip__name\">{label ?? code}</span> : block ? null : <span className=\"vs-lang-chip__code\">{code}</span>}\n <Icon d={D.chevronDown} size={13} className=\"vs-lang-chip__chevron\" style={{ color: variant === 'primary' ? 'currentColor' : 'var(--vs-text-muted)' }} />\n </button>\n );\n}\n\nexport function CopyButton({ value, label = 'Copy', onCopied }: { value: string; label?: string; onCopied?: () => void }) {\n const [copied, setCopied] = useState(false);\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopied?.();\n setTimeout(() => setCopied(false), 1400);\n } catch {\n }\n };\n return (\n <button\n type=\"button\"\n className=\"vs-copyable__btn\"\n data-copied={copied}\n aria-label={copied ? 'Copied' : label}\n title={copied ? 'Copied' : label}\n onClick={(e) => { e.stopPropagation(); void copy(); }}\n >\n <span className=\"vs-sr\" aria-live=\"polite\">{copied ? `Copied${label.replace(/^Copy\\b/, '')}` : ''}</span>\n {copied ? (\n <Icon d={D.check} size={13} sw={2.2} />\n ) : (\n <svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75\" />\n </svg>\n )}\n </button>\n );\n}\n\nexport function Copyable({ value, label = 'Copy' }: { value: string; label?: string }) {\n const copy = () => { void navigator.clipboard?.writeText(value).catch(() => {}); };\n return (\n <span className=\"vs-copyable\" onClick={copy} title={label}>\n <span className=\"vs-copyable__value\">{value}</span>\n <CopyButton value={value} label={label} />\n </span>\n );\n}\n\nfunction useVisualViewportInset(ref: React.RefObject<HTMLDivElement | null>, open: boolean) {\n useLayoutEffect(() => {\n const el = ref.current;\n const vv = window.visualViewport;\n if (!open || !el || !vv) return;\n let focusTimer = 0;\n const apply = () => {\n if (getComputedStyle(el).position === 'static') return;\n const r = el.getBoundingClientRect();\n const top = Math.max(0, Math.round(vv.offsetTop - r.top));\n const bottom = Math.max(0, Math.round(r.bottom - (vv.offsetTop + vv.height)));\n el.style.paddingTop = top ? `${top}px` : '';\n el.style.paddingBottom = bottom ? `${bottom}px` : '';\n el.classList.toggle('kb', bottom > 0);\n const a = document.activeElement;\n if (bottom > 0 && a instanceof HTMLElement && el.contains(a)) {\n window.clearTimeout(focusTimer);\n focusTimer = window.setTimeout(() => a.scrollIntoView({ block: 'nearest' }), 0);\n }\n };\n apply();\n vv.addEventListener('resize', apply);\n vv.addEventListener('scroll', apply);\n return () => {\n window.clearTimeout(focusTimer);\n vv.removeEventListener('resize', apply);\n vv.removeEventListener('scroll', apply);\n };\n }, [ref, open]);\n}\n\nexport function GrowBox({ children, ms = 220 }: { children: ReactNode; ms?: number }) {\n const [anim] = useState(() => typeof window !== 'undefined' && !!window.matchMedia?.('(hover: hover) and (pointer: fine)').matches);\n if (!anim) return <div>{children}</div>;\n return <GrowAnim ms={ms}>{children}</GrowAnim>;\n}\n\nfunction GrowAnim({ children, ms }: { children: ReactNode; ms: number }) {\n const outer = useRef<HTMLDivElement>(null);\n const inner = useRef<HTMLDivElement>(null);\n const [h, setH] = useState<number | null>(null);\n useLayoutEffect(() => {\n const el = inner.current;\n const box = outer.current;\n if (!el || !box) return;\n let settle: ReturnType<typeof setTimeout> | undefined;\n const room = () => {\n const sheet = box.closest<HTMLElement>('.vs-sheet');\n const max = sheet ? parseFloat(getComputedStyle(sheet).maxHeight) : NaN;\n if (!sheet || !Number.isFinite(max)) return Infinity;\n return Math.max(0, max - (sheet.offsetHeight - box.offsetHeight));\n };\n const measure = () => {\n const scrim = box.closest<HTMLElement>('.vs-sheet-scrim');\n if (scrim && scrim.clientHeight <= 460) { clearTimeout(settle); setH(null); return; }\n const full = el.offsetHeight;\n clearTimeout(settle);\n setH(Math.min(full, room()));\n if (full > room()) settle = setTimeout(() => setH(full), ms);\n };\n measure();\n if (typeof ResizeObserver === 'undefined') return () => clearTimeout(settle);\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => { ro.disconnect(); clearTimeout(settle); };\n }, [ms]);\n return (\n <div ref={outer} style={{ height: h ?? undefined, overflow: 'clip', transition: h == null ? undefined : `height ${ms}ms cubic-bezier(.32,.72,0,1)` }}>\n <div ref={inner}>{children}</div>\n </div>\n );\n}\n\nexport function Sheet({ open, onClose, title, titleNode, note, doneLabel = 'Done', children, drawer = false, header, kind, sticky = false }: { open: boolean; onClose: () => void; title: string; titleNode?: ReactNode; note?: string; doneLabel?: string; children: ReactNode; drawer?: boolean; header?: ReactNode; kind?: string; sticky?: boolean }) {\n const scrimRef = useRef<HTMLDivElement>(null);\n useVisualViewportInset(scrimRef, open);\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [open, onClose]);\n if (!open) return null;\n return (\n <div ref={scrimRef} className={`vs-sheet-scrim${drawer ? ' drawer' : ''}${sticky ? ' vs-sheet-scrim--sticky' : ''}`} onClick={sticky ? undefined : onClose}>\n <div className={`vs-sheet${kind ? ` vs-sheet--${kind}` : ''}`} role=\"dialog\" aria-modal=\"true\" aria-label={title} onClick={(e) => e.stopPropagation()}>\n <div className=\"vs-sheet__grip\" />\n <div className=\"vs-sheet__head\">\n {titleNode ?? <span className=\"vs-sheet__title\">{title}</span>}\n <button type=\"button\" className=\"vs-sheet__done\" onClick={onClose}>\n {doneLabel}\n </button>\n </div>\n {note && <div className=\"vs-sheet__note\">{note}</div>}\n {header && <div className=\"vs-sheet__header\">{header}</div>}\n <div className=\"vs-sheet__body\">{children}</div>\n </div>\n </div>\n );\n}\n\nexport interface ModalAction {\n label: string;\n variant?: 'primary' | 'danger' | 'ghost';\n onClick: () => void;\n}\n\nexport function Modal({ open, onClose, title, body, actions = [], children, dismissible = true, zIndex, width, page }: { open: boolean; onClose: () => void; title?: string; body?: ReactNode; actions?: ModalAction[]; children?: ReactNode; dismissible?: boolean; zIndex?: number; width?: number; page?: boolean }) {\n useEffect(() => {\n if (!open || !dismissible) return;\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [open, dismissible, onClose]);\n if (!open) return null;\n const scrim = (\n <div className=\"vs-modal-scrim\" style={{ ...(zIndex != null ? { zIndex } : {}), ...(page ? { position: 'fixed' } : {}) }} onClick={dismissible ? onClose : undefined}>\n <div className=\"vs-modal\" role=\"dialog\" aria-modal=\"true\" aria-label={title} style={width ? { maxWidth: width } : undefined} onClick={(e) => e.stopPropagation()}>\n {title && <div className=\"vs-modal__title\">{title}</div>}\n {body && <div className=\"vs-modal__body\">{body}</div>}\n {children && <div className=\"vs-modal__content\">{children}</div>}\n {actions.length > 0 && (\n <div className=\"vs-modal__actions\">\n {actions.map((a, i) => (\n <button key={i} type=\"button\" className={`vs-modal__action vs-modal__action--${a.variant ?? 'ghost'}`} onClick={a.onClick}>\n {a.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n return page ? createPortal(<div className=\"vsp vsp-portal\" data-theme={portalTheme()}>{scrim}</div>, document.body) : scrim;\n}\n\nexport function LiveBadge({ state, label, size, tone }: { state: 'live' | 'paused' | 'ended' | 'starting' | 'idle'; label?: string; size?: 'sm'; tone?: 'muted' }) {\n const copy = label ?? { live: 'LIVE', paused: 'PAUSED', ended: 'ENDED', starting: 'STARTING', idle: 'IDLE' }[state];\n const cls = ['vs-live-badge', `vs-live-badge--${state === 'starting' || state === 'idle' ? 'ended' : state}`, tone === 'muted' ? 'vs-live-badge--muted' : '', size === 'sm' ? 'vs-live-badge--sm' : ''].filter(Boolean).join(' ');\n return (\n <span className={cls}>\n <span className=\"vs-live-badge__slot\">\n {state === 'paused' ? (\n <span className=\"vs-live-badge__bars\">\n <span />\n <span />\n </span>\n ) : state === 'starting' ? (\n <span style={{ width: 9, height: 9, borderRadius: '50%', border: '1.5px solid var(--ink-22)', borderTopColor: 'var(--ink-70)', animation: 'vs-spin .8s linear infinite' }} />\n ) : state === 'idle' ? (\n <svg viewBox=\"0 0 24 24\" width={10} height={10} fill=\"none\" stroke=\"var(--ink-50)\" strokeWidth={1.8} strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M12 6v6h4.5m4.5 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\" /></svg>\n ) : (\n <span className=\"vs-live-badge__dot\" />\n )}\n </span>\n <span className=\"vs-live-badge__label\">{copy}</span>\n </span>\n );\n}\n\nlet recordingSince: number | null = null;\nconst REC_PULSE_MS = 60_000;\nfunction useRecPulse(recording: boolean): boolean {\n if (!recording) recordingSince = null;\n else if (recordingSince == null) recordingSince = Date.now();\n const left = recording && recordingSince != null ? REC_PULSE_MS - (Date.now() - recordingSince) : 0;\n const [, setTick] = useState(0);\n useEffect(() => {\n if (left <= 0) return;\n const id = window.setTimeout(() => setTick((n) => n + 1), left + 50);\n return () => window.clearTimeout(id);\n }, [recording, left > 0]); // eslint-disable-line react-hooks/exhaustive-deps\n return left > 0;\n}\nexport function RecordButton({ state, onClick, size, disabled, label }: { state: 'idle' | 'connecting' | 'recording' | 'paused' | 'captured' | 'warming' | 'ended'; onClick?: () => void; size?: 'sm' | 'md'; disabled?: boolean; label?: string }) {\n const pulsing = useRecPulse(state === 'recording');\n if (state === 'ended') {\n return (\n <div className={`vs-rec vs-rec--ended${size === 'sm' ? ' vs-rec--sm' : size === 'md' ? ' vs-rec--md' : ''}`}>\n <button type=\"button\" className=\"vs-rec__back\" onClick={onClick} aria-label={label ?? 'Back'}>\n <Icon d={D.arrowLeft} size={20} />\n </button>\n </div>\n );\n }\n return (\n <div className={`vs-rec vs-rec--${state}${state === 'recording' && !pulsing ? ' vs-rec--still' : ''}${size === 'sm' ? ' vs-rec--sm' : ''}`}>\n <span className=\"vs-rec__ring\" aria-hidden=\"true\" />\n <button type=\"button\" className=\"vs-rec__btn\" onClick={onClick} disabled={disabled} aria-pressed={state === 'recording'} aria-label={label ?? (state === 'recording' ? 'Pause recording' : state === 'paused' ? 'Resume recording' : 'Start recording')}>\n <span className=\"vs-rec__fill\" aria-hidden=\"true\" />\n <Icon d={state === 'captured' || state === 'warming' ? D.check : D.mic} size={24} sw={state === 'captured' || state === 'warming' ? 2.4 : undefined} className=\"vs-rec__mic\" />\n </button>\n </div>\n );\n}\n\nexport const MenuBadge = createContext(0);\nexport function MenuBadgeDot() {\n const n = useContext(MenuBadge);\n if (n <= 0) return null;\n return <span className=\"menubadge\" aria-label={`${n} unread notification${n === 1 ? '' : 's'}`}>{n > 99 ? '99+' : n}</span>;\n}\n\nexport function ScreenHeader({ onBack, backLabel = 'Back', leading, center, centerAlign, onCenter, centerLabel, title, avatar, badge, subtitle, actions, onMenu, menuActive, showMenu = true, headerRef, frost }: { onBack?: () => void; backLabel?: string; leading?: ReactNode; center?: ReactNode; centerAlign?: 'start' | 'center'; onCenter?: () => void; centerLabel?: string; title?: string; avatar?: ReactNode; badge?: ReactNode; subtitle?: ReactNode; actions?: ReactNode; onMenu?: () => void; menuActive?: boolean; showMenu?: boolean; headerRef?: React.Ref<HTMLDivElement>; frost?: boolean }) {\n const tappable = typeof onBack === 'function';\n return (\n <div className={`vs-hdr${frost ? ' vs-hdr--frost' : ''}`} ref={headerRef}>\n {tappable ? (\n <button type=\"button\" className=\"vs-hdr__caret\" onClick={(e) => { e.currentTarget.blur(); onBack?.(); }} aria-label={backLabel} title={backLabel}>\n <Icon d={D.chevronLeft} size={19} sw={1.7} />\n </button>\n ) : (\n leading ?? null\n )}\n {center ? (\n <div\n className={`vs-hdr__center${centerAlign === 'start' ? ' vs-hdr__center--start' : ''}${onCenter || tappable ? ' vs-hdr__center--tap' : ''}`}\n onClick={onCenter ?? (tappable ? onBack : undefined)}\n title={onCenter ? centerLabel : tappable ? backLabel : undefined}\n >\n {center}\n </div>\n ) : (\n <div className={`vs-hdr__title${tappable ? ' vs-hdr__title--tap' : ''}${avatar ? ' vs-hdr__title--av' : ''}`} onClick={tappable ? onBack : undefined} title={tappable ? backLabel : undefined}>\n <div className={`vs-hdr__name${avatar ? ' vs-hdr__name--av' : ''}`}>\n {avatar}\n <span className=\"vs-hdr__text\">{title}</span>\n {badge}\n </div>\n {subtitle && <div className=\"vs-hdr__sub\">{subtitle}</div>}\n </div>\n )}\n <div className=\"vs-hdr__actions\">\n {actions}\n {showMenu && (\n <button type=\"button\" className={`vs-icon-btn vs-icon-btn--sm vs-icon-btn--borderless has-badge${menuActive ? ' vs-icon-btn--primary' : ''}`} onClick={onMenu} aria-label=\"Options\" title=\"Options\">\n <svg viewBox=\"0 0 24 24\" width=\"19\" height=\"19\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"5.5\" r=\"1.85\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.85\" />\n <circle cx=\"12\" cy=\"18.5\" r=\"1.85\" />\n </svg>\n <MenuBadgeDot />\n </button>\n )}\n </div>\n </div>\n );\n}\n\nexport function Eyebrow({ children, style, className }: { children: ReactNode; style?: React.CSSProperties; className?: string }) {\n return <div className={className ? `eyebrow ${className}` : 'eyebrow'} style={style}>{children}</div>;\n}\n\nexport function portalTheme(): 'dark' | 'light' {\n if (typeof document === 'undefined') return 'dark';\n const el = document.querySelector<HTMLElement>('.vsp:not(.vsp-portal)');\n return el?.dataset.theme === 'light' ? 'light' : 'dark';\n}\n","let reporter: ((e: Error) => void) | null = null;\n\nexport function setErrorReporter(fn: ((e: Error) => void) | null): void {\n reporter = fn;\n}\n\nexport function reportError(e: Error): void {\n reporter?.(e);\n}\n\nexport function liveAudioSupported(): boolean {\n return typeof (window as any).AudioDecoder === 'function' && typeof AudioContext === 'function';\n}\n\nclass OggDemux {\n private buf = new Uint8Array(0);\n private pending: Uint8Array[] = [];\n private partial: Uint8Array | null = null;\n\n push(chunk: Uint8Array): Uint8Array[] {\n const joined = new Uint8Array(this.buf.length + chunk.length);\n joined.set(this.buf);\n joined.set(chunk, this.buf.length);\n this.buf = joined;\n const out: Uint8Array[] = [];\n for (;;) {\n const page = this.readPage();\n if (!page) break;\n out.push(...page);\n }\n return out;\n }\n\n private readPage(): Uint8Array[] | null {\n const b = this.buf;\n if (b.length < 27) return null;\n let start = 0;\n while (start + 27 <= b.length && !(b[start] === 0x4f && b[start + 1] === 0x67 && b[start + 2] === 0x67 && b[start + 3] === 0x53)) start++;\n if (start + 27 > b.length) {\n this.buf = b.subarray(start);\n return null;\n }\n const segCount = b[start + 26];\n const headerLen = 27 + segCount;\n if (start + headerLen > b.length) return null;\n const lacing = b.subarray(start + 27, start + headerLen);\n let bodyLen = 0;\n for (const l of lacing) bodyLen += l;\n if (start + headerLen + bodyLen > b.length) return null;\n const body = b.subarray(start + headerLen, start + headerLen + bodyLen);\n this.buf = b.subarray(start + headerLen + bodyLen);\n const packets: Uint8Array[] = [];\n let off = 0;\n let cur: Uint8Array[] = this.partial ? [this.partial] : [];\n this.partial = null;\n for (const l of lacing) {\n cur.push(body.subarray(off, off + l));\n off += l;\n if (l < 255) {\n packets.push(concat(cur));\n cur = [];\n }\n }\n if (cur.length) this.partial = concat(cur);\n return packets;\n }\n}\n\nfunction concat(parts: Uint8Array[]): Uint8Array {\n const n = parts.reduce((a, p) => a + p.length, 0);\n const out = new Uint8Array(n);\n let o = 0;\n for (const p of parts) {\n out.set(p, o);\n o += p.length;\n }\n return out;\n}\n\nexport class LivePlayer {\n private ctx: AudioContext | null = null;\n private decoder: any = null;\n private demux = new OggDemux();\n private nextTime = 0;\n private gain: GainNode | null = null;\n private headerSeen = false;\n private ts = 0;\n volume = 1;\n\n async start() {\n if (!liveAudioSupported()) throw new Error('Live audio needs WebCodecs (AudioDecoder)');\n this.ctx = new AudioContext({ sampleRate: 48000 });\n this.gain = this.ctx.createGain();\n this.gain.gain.value = this.volume;\n this.gain.connect(this.ctx.destination);\n await this.ctx.resume();\n const AD = (window as any).AudioDecoder;\n this.decoder = new AD({\n output: (data: any) => this.play(data),\n error: (e: unknown) => console.warn('opus decode', e),\n });\n this.decoder.configure({ codec: 'opus', sampleRate: 48000, numberOfChannels: 1 });\n this.nextTime = this.ctx.currentTime + 0.15;\n }\n\n setVolume(v: number) {\n this.volume = v;\n if (this.gain) this.gain.gain.value = v;\n }\n\n feed(bytes: ArrayBuffer) {\n if (!this.decoder) return;\n for (const pkt of this.demux.push(new Uint8Array(bytes))) {\n if (pkt.length >= 8 && pkt[0] === 0x4f && pkt[1] === 0x70 && pkt[2] === 0x75 && pkt[3] === 0x73) {\n this.headerSeen = true;\n continue;\n }\n if (pkt.length === 0) continue;\n const EAC = (window as any).EncodedAudioChunk;\n try {\n this.decoder.decode(new EAC({ type: 'key', timestamp: this.ts, data: pkt }));\n this.ts += 60_000;\n } catch (e) {\n console.warn('decode', e);\n }\n }\n }\n\n private play(data: any) {\n if (!this.ctx || !this.gain) return;\n const frames = data.numberOfFrames as number;\n const buf = this.ctx.createBuffer(1, frames, data.sampleRate ?? 48000);\n const f32 = new Float32Array(frames);\n data.copyTo(f32, { planeIndex: 0, format: 'f32-planar' });\n buf.getChannelData(0).set(f32);\n data.close();\n const src = this.ctx.createBufferSource();\n src.buffer = buf;\n src.connect(this.gain);\n const now = this.ctx.currentTime;\n if (this.nextTime < now) this.nextTime = now + 0.05;\n src.start(this.nextTime);\n this.nextTime += buf.duration;\n }\n\n async stop() {\n try {\n this.decoder?.close();\n } catch {\n }\n this.decoder = null;\n await this.ctx?.close().catch(() => {});\n this.ctx = null;\n }\n}\n\nexport function deliveryFormat(): 'ogg' | 'caf' {\n try {\n return document.createElement('audio').canPlayType('audio/x-caf; codecs=opus') === 'probably' ? 'caf' : 'ogg';\n } catch {\n return 'ogg';\n }\n}\n\nexport interface MediaCred {\n accessToken?: string | null; listenerToken?: string | null; shareCode?: string | null;\n media?: string | null;\n}\n\nexport function credParams(cred: MediaCred = {}): string {\n const q = new URLSearchParams();\n if (cred.media) q.set('media', cred.media);\n else if (cred.accessToken) q.set('access_token', cred.accessToken);\n if (cred.listenerToken) q.set('listenerToken', cred.listenerToken);\n if (cred.shareCode) q.set('shareCode', cred.shareCode);\n return q.toString();\n}\n\nexport function audioClipUrl(apiOrigin: string, recordingId: string, startS: number, endS: number, cred: MediaCred = {}, clean = false): string {\n const cp = credParams(cred);\n return `${apiOrigin}/v1/recordings/${recordingId}/audio/clip?startS=${startS.toFixed(2)}&endS=${endS.toFixed(2)}${clean ? '&clean=true' : ''}${cp ? `&${cp}` : ''}`;\n}\n\nexport async function explainAudioError(url: string): Promise<{ message: string; permanent: boolean } | null> {\n try {\n const res = await fetch(url, { redirect: 'manual', headers: { accept: 'application/json' } });\n if (res.type === 'opaqueredirect' || res.ok || (res.status >= 300 && res.status < 400)) return null;\n let body: any = null;\n try { body = await res.json(); } catch { }\n const message: unknown = body?.message;\n if (typeof message !== 'string' || !message) return null;\n return { message: message[0].toUpperCase() + message.slice(1) + (message.endsWith('.') ? '' : '.'), permanent: res.status === 404 || res.status === 403 };\n } catch {\n return null;\n }\n}\n\nexport async function audioSealed(url: string): Promise<boolean> {\n try {\n const res = await fetch(url, { redirect: 'manual', headers: { accept: 'application/json' } });\n return res.type === 'opaqueredirect' || (res.status >= 300 && res.status < 400);\n } catch {\n return false;\n }\n}\n\nexport function deliveryAudioUrl(apiOrigin: string, recordingId: string, cred: MediaCred = {}): string {\n const q = new URLSearchParams({ kind: 'delivery', format: deliveryFormat() });\n if (cred.media) q.set('media', cred.media);\n else if (cred.accessToken) q.set('access_token', cred.accessToken);\n if (cred.listenerToken) q.set('listenerToken', cred.listenerToken);\n if (cred.shareCode) q.set('shareCode', cred.shareCode);\n return `${apiOrigin}/v1/recordings/${recordingId}/audio?${q}`;\n}\n\nexport function backgroundAudioUrl(apiOrigin: string, recordingId: string, cred: MediaCred = {}, kind: 'background' | 'speech' = 'background'): string {\n const q = new URLSearchParams({ kind, format: deliveryFormat() });\n if (cred.media) q.set('media', cred.media);\n else if (cred.accessToken) q.set('access_token', cred.accessToken);\n if (cred.listenerToken) q.set('listenerToken', cred.listenerToken);\n if (cred.shareCode) q.set('shareCode', cred.shareCode);\n return `${apiOrigin}/v1/recordings/${recordingId}/audio?${q}`;\n}\n\nexport function audioDownloadUrl(apiOrigin: string, recordingId: string, kind: 'source' | 'delivery' | 'video', cred: MediaCred = {}): string {\n const q = new URLSearchParams({ kind });\n if (kind === 'delivery') q.set('format', 'mp3');\n if (cred.media) q.set('media', cred.media);\n else if (cred.accessToken) q.set('access_token', cred.accessToken);\n if (cred.listenerToken) q.set('listenerToken', cred.listenerToken);\n if (cred.shareCode) q.set('shareCode', cred.shareCode);\n return `${apiOrigin}/v1/recordings/${recordingId}/audio?${q}`;\n}\n\nexport function voiceTrackUrl(apiOrigin: string, recordingId: string, lang: string, voiceKey: string, cred: MediaCred = {}): string {\n return voiceTrackUrlAs(apiOrigin, recordingId, lang, voiceKey, deliveryFormat(), cred);\n}\n\nexport function voiceTrackDownloadUrl(apiOrigin: string, recordingId: string, lang: string, voiceKey: string, cred: MediaCred = {}): string {\n return voiceTrackUrlAs(apiOrigin, recordingId, lang, voiceKey, 'mp3', cred);\n}\n\nfunction voiceTrackUrlAs(apiOrigin: string, recordingId: string, lang: string, voiceKey: string, format: 'ogg' | 'caf' | 'mp3', cred: MediaCred): string {\n const q = new URLSearchParams({ kind: 'voice', lang, format });\n if (voiceKey) q.set('voice', voiceKey);\n if (cred.media) q.set('media', cred.media);\n else if (cred.accessToken) q.set('access_token', cred.accessToken);\n if (cred.listenerToken) q.set('listenerToken', cred.listenerToken);\n if (cred.shareCode) q.set('shareCode', cred.shareCode);\n return `${apiOrigin}/v1/recordings/${recordingId}/audio?${q}`;\n}\n\nexport function mediaErrorText(e: MediaError | null, report = true): string {\n const code = e?.code ?? 0;\n const what = code === 2 ? 'the download failed' : code === 3 ? 'this browser could not decode it' : code === 4 ? 'the file is not available, or this browser cannot play it' : code === 1 ? 'the load was stopped' : 'something went wrong';\n if (report) reportMediaError(e);\n return `The audio could not be played: ${what}.`;\n}\n\nexport function reportMediaError(e: MediaError | null): void {\n const code = e?.code ?? 0;\n if (code !== 1) reportError(new Error(`media error ${code}${e?.message ? `: ${e.message}` : ''}`));\n}\n","export const STARTING_DEFAULT_MS = 3_000;\n\nexport function startingRetryMs(status: number, retryAfter: string | null, body: unknown): number | null {\n if (status !== 503) return null;\n const ra = retryAfter == null || retryAfter.trim() === '' ? NaN : Number(retryAfter);\n if (Number.isFinite(ra)) return Math.min(15_000, Math.max(1_000, ra * 1000));\n const b = body as { retryable?: unknown; code?: unknown } | null;\n if (b && (b.retryable === true || b.code === 'engine_unavailable')) return STARTING_DEFAULT_MS;\n return null;\n}\n","export type Fetcher = (src: string, signal: AbortSignal) => Promise<{ ok: boolean; status: number; blob: () => Promise<Blob> }>;\n\ntype Entry = { state: 'loading'; ctl: AbortController } | { state: 'ready'; url: string } | { state: 'failed'; at: number };\n\nexport interface PrefetchOptions {\n fetcher?: Fetcher;\n concurrency?: number;\n keep?: number;\n retryMs?: number;\n now?: () => number;\n toUrl?: (b: Blob) => string;\n revoke?: (url: string) => void;\n}\n\nexport class ClipPrefetch {\n private entries = new Map<string, Entry>();\n private wanted: string[] = [];\n private used: string[] = [];\n private readonly fetcher: Fetcher | null;\n private readonly concurrency: number;\n private readonly keep: number;\n private readonly retryMs: number;\n private readonly now: () => number;\n private readonly toUrl: (b: Blob) => string;\n private readonly revoke: (url: string) => void;\n onReady: (src: string) => void = () => {};\n\n constructor(o: PrefetchOptions = {}) {\n this.fetcher = o.fetcher ?? (typeof fetch === 'function' ? (src, signal) => fetch(src, { signal }) : null);\n this.concurrency = Math.max(1, o.concurrency ?? 2);\n this.keep = Math.max(2, o.keep ?? 24);\n this.retryMs = o.retryMs ?? 4000;\n this.now = o.now ?? (() => Date.now());\n this.toUrl = o.toUrl ?? ((b) => URL.createObjectURL(b));\n this.revoke = o.revoke ?? ((u) => { try { URL.revokeObjectURL(u); } catch { } });\n }\n\n want(srcs: string[]) {\n this.wanted = [...new Set(srcs)];\n const keepSet = new Set(this.wanted);\n for (const [src, e] of this.entries) {\n if (e.state === 'loading' && !keepSet.has(src)) {\n e.ctl.abort();\n this.entries.delete(src);\n }\n }\n this.evict(keepSet);\n this.pump();\n }\n\n urlFor(src: string): string {\n const e = this.entries.get(src);\n if (e?.state !== 'ready') return src;\n this.used = [src, ...this.used.filter((s) => s !== src)];\n return e.url;\n }\n\n ready(src: string): boolean { return this.entries.get(src)?.state === 'ready'; }\n\n loading(): number {\n let n = 0;\n for (const e of this.entries.values()) if (e.state === 'loading') n++;\n return n;\n }\n\n forget(src: string) {\n const e = this.entries.get(src);\n if (!e) return;\n if (e.state === 'loading') e.ctl.abort();\n if (e.state === 'ready') this.revoke(e.url);\n this.entries.delete(src);\n }\n\n clear() {\n for (const src of [...this.entries.keys()]) this.forget(src);\n this.wanted = [];\n this.used = [];\n }\n\n private evict(keepSet: Set<string>) {\n const ready = [...this.entries].filter(([, e]) => e.state === 'ready').map(([s]) => s);\n if (ready.length <= this.keep) return;\n const recent = new Set(this.used.slice(0, 2));\n const spare = ready.filter((s) => !keepSet.has(s) && !recent.has(s));\n const order = spare.sort((a, b) => this.usedRank(b) - this.usedRank(a));\n let over = ready.length - this.keep;\n for (const s of order) {\n if (over <= 0) break;\n this.forget(s);\n over--;\n }\n }\n\n private usedRank(src: string): number {\n const i = this.used.indexOf(src);\n return i < 0 ? Number.MAX_SAFE_INTEGER : i;\n }\n\n private pump() {\n if (!this.fetcher) return;\n let busy = this.loading();\n for (const src of this.wanted) {\n if (busy >= this.concurrency) return;\n const e = this.entries.get(src);\n if (e?.state === 'loading' || e?.state === 'ready') continue;\n if (e?.state === 'failed' && this.now() - e.at < this.retryMs) continue;\n busy++;\n this.load(src);\n }\n }\n\n private load(src: string) {\n const ctl = new AbortController();\n this.entries.set(src, { state: 'loading', ctl });\n const done = (e: Entry | null) => {\n const cur = this.entries.get(src);\n if (cur?.state !== 'loading' || cur.ctl !== ctl) {\n if (e?.state === 'ready') this.revoke(e.url);\n return;\n }\n if (e) this.entries.set(src, e); else this.entries.delete(src);\n if (e?.state === 'ready') this.onReady(src);\n this.evict(new Set(this.wanted));\n this.pump();\n };\n this.fetcher!(src, ctl.signal)\n .then(async (r) => {\n if (!r.ok) { done({ state: 'failed', at: this.now() }); return; }\n const b = await r.blob();\n done(b.size > 0 ? { state: 'ready', url: this.toUrl(b) } : { state: 'failed', at: this.now() });\n })\n .catch(() => done(ctl.signal.aborted ? null : { state: 'failed', at: this.now() }));\n }\n}\n","import { startingRetryMs } from './voiceRetry';\nimport { ClipPrefetch } from './clipPrefetch';\n\nexport const mediaKind = { video: false };\n\nexport function newMediaElement(url?: string): HTMLMediaElement {\n if (!mediaKind.video) return new Audio(url);\n const v = document.createElement('video');\n v.playsInline = true;\n if (url) v.src = url;\n return v;\n}\n\nexport interface VoiceClip {\n sentenceId: number;\n lang: string;\n src: string;\n durationS: number;\n generation?: number;\n part: number;\n parts: number;\n voice?: string | null;\n cloned?: boolean;\n}\n\nexport class VoiceNotStarted extends Error {\n constructor() { super('The voice did not start in time.'); this.name = 'VoiceNotStarted'; }\n}\n\nexport class ClipQueue {\n private el: HTMLMediaElement | null = null;\n private clips = new Map<number, { total: number; got: Map<number, VoiceClip> }>();\n private order: number[] = [];\n current: number | null = null;\n private currentPart = 0;\n private partBase = 0;\n private within: { id: number; frac: number } | null = null;\n playing = false;\n muted = false;\n rate = 1;\n volume = 1;\n finite = false;\n onSentence: (id: number | null) => void = () => {};\n onWaiting: (id: number | null) => void = () => {};\n onStarting: (since: number | null) => void = () => {};\n speakable: (sentenceId: number) => boolean = () => true;\n coming: (sentenceId: number) => boolean = () => false;\n gapBefore: (prev: number | null, next: number) => number = () => 0;\n flow = false;\n silentSpan: (sentenceId: number) => { fromS: number; ms: number } | null = () => null;\n private lastDone: number | null = null;\n private rested = false;\n private rest: { prev: number; totalMs: number; doneMs: number; since: number | null; timer: ReturnType<typeof setTimeout> | null; silent?: boolean; fromS?: number } | null = null;\n private sequence: number[] = [];\n private seqAt = new Map<number, number>();\n setSequence(ids: number[]) {\n if (ids.length === this.sequence.length && ids.every((id, i) => this.sequence[i] === id)) return;\n this.sequence = ids;\n this.seqAt = new Map(ids.map((id, i) => [id, i]));\n this.order.sort((a, b) => this.rank(a) - this.rank(b));\n }\n\n private rank(id: number): number {\n if (!this.sequence.length) return id;\n const i = this.seqAt.get(id);\n return i == null ? Number.MAX_SAFE_INTEGER : i;\n }\n\n private expected(afterId: number): number | null {\n if (!this.sequence.length) return null;\n const i = this.seqAt.get(afterId);\n if (i == null) return afterId < 0 ? this.sequence[0] ?? null : null;\n return this.sequence[i + 1] ?? null;\n }\n static WAIT_MS = 15_000;\n static START_WAIT_MS = 4_000;\n static COMING_MS = 120_000;\n static SKEW_LINES = 3;\n private spoken = new Set<number>();\n private lastRead: number | null = null;\n private started = false;\n private awaiting: { id: number; part: number } | null = null;\n private waitTimer: ReturnType<typeof setTimeout> | null = null;\n onError: (e: unknown) => void = () => {};\n private floor = 0;\n private loading: number | null = null;\n readAhead = 0;\n readAheadS = 0;\n readonly prefetch = new ClipPrefetch();\n private warmed = new Set<string>();\n private static readonly RETRIES = 4;\n private static readonly RETRY_MS = 1200;\n private static readonly STARTING_MS = 300_000;\n private startingSince = new Map<number, number>();\n private retries = new Map<number, number>();\n private retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n add(clip: VoiceClip) {\n if (!this.speakable(clip.sentenceId)) return;\n const c: VoiceClip = { ...clip, part: Math.max(0, clip.part || 0), parts: Math.max(1, clip.parts || 1) };\n let line = this.clips.get(c.sentenceId);\n if (!line) {\n line = { total: Math.max(1, c.parts), got: new Map() };\n this.clips.set(c.sentenceId, line);\n this.order = [...this.clips.keys()].sort((a, b) => this.rank(a) - this.rank(b));\n }\n line.total = Math.max(line.total, c.parts, c.part + 1);\n const held = line.got.get(c.part);\n if (held) {\n const newer = c.generation != null && (held.generation == null || c.generation > held.generation);\n if (!newer || held.src === c.src) return;\n line.got.set(c.part, c);\n if (this.current === c.sentenceId && this.currentPart === c.part && held.generation != null) this.swap(c);\n return;\n }\n line.got.set(c.part, c);\n if (this.current != null) this.warm(this.current);\n else if (this.awaiting) this.warm(this.awaiting.id, true);\n if (!this.playing || this.current != null || this.rest?.silent) return;\n const w = this.awaiting;\n if (w) {\n if (c.sentenceId === w.id && c.part === w.part) {\n this.stopWaiting();\n this.startPart(w.id, w.part);\n }\n return;\n }\n if (this.rank(c.sentenceId) < this.rank(this.floor)) return;\n this.follow();\n }\n\n private piecesOf(id: number): number[] {\n const line = this.clips.get(id);\n return line ? [...line.got.keys()].sort((a, b) => a - b) : [];\n }\n\n private due(): { start: number } | { wait: number } | { silent: number } | null {\n let exp = this.lastRead != null ? this.expected(this.lastRead) : this.floorOrBefore();\n while (exp != null && (this.spoken.has(exp) || !this.speakable(exp))) exp = this.expected(exp);\n const held = this.earliestHeld();\n if (exp != null && (held == null || this.rank(exp) < this.rank(held))) {\n if (this.piecesOf(exp).length) return { start: exp };\n if (this.flow) return { silent: exp };\n if (this.coming(exp)) return { wait: exp };\n if (this.started && held != null) return { wait: exp };\n if (held != null && this.rank(held) - this.rank(exp) <= ClipQueue.SKEW_LINES) return { wait: exp };\n }\n return held != null ? { start: held } : null;\n }\n\n private follow() {\n const d = this.due();\n const prev = this.lastDone;\n this.lastDone = null;\n if (d && 'start' in d) {\n const rested = this.rested;\n this.rested = false;\n const gap = this.playing && !rested ? this.gapBefore(prev, d.start) / (this.rate || 1) : 0;\n if (gap > 0.05) { this.restAfter(prev ?? d.start, gap * 1000); return; }\n this.start(d.start);\n return;\n }\n if (d && 'silent' in d) { this.silentLine(d.silent); return; }\n if (d && 'wait' in d) { this.waitFor(d.wait, 0); return; }\n if (this.finite) this.playing = false;\n this.current = null;\n this.onSentence(null);\n }\n\n private restAfter(prev: number, ms: number) {\n this.clearRest();\n this.current = null;\n this.rest = { prev, totalMs: ms, doneMs: 0, since: null, timer: null };\n this.runRest();\n this.onSentence(prev);\n }\n\n joinSilently(id: number) {\n this.stopWaiting();\n this.el?.pause();\n this.playing = true;\n this.floor = id;\n this.lastRead = null;\n this.lastDone = null;\n this.silentLine(id);\n }\n\n private silentLine(id: number) {\n const span = this.silentSpan(id);\n this.clearRest();\n this.finishLine(id);\n this.started = true;\n this.lastRead = this.lastRead == null ? id : Math.max(this.lastRead, id);\n this.rest = { prev: id, totalMs: Math.max(0, span?.ms ?? 0), doneMs: 0, since: null, timer: null, silent: true, fromS: span?.fromS ?? 0 };\n this.runRest();\n this.onSentence(id);\n }\n\n private runRest() {\n const r = this.rest;\n if (!r || r.timer) return;\n r.since = Date.now();\n r.timer = setTimeout(() => {\n if (this.rest !== r) return;\n this.rest = null;\n if (!this.playing) return;\n this.rested = true;\n this.follow();\n }, Math.max(0, r.totalMs - r.doneMs));\n }\n\n private holdRest() {\n const r = this.rest;\n if (!r || !r.timer) return;\n clearTimeout(r.timer);\n r.timer = null;\n if (r.since != null) r.doneMs += Date.now() - r.since;\n r.since = null;\n }\n\n private clearRest() {\n if (this.rest?.timer) clearTimeout(this.rest.timer);\n this.rest = null;\n }\n\n resting(): { sentenceId: number; s: number; silent: boolean } | null {\n const r = this.rest;\n if (!r) return null;\n const ms = r.doneMs + (r.since != null ? Date.now() - r.since : 0);\n const s = (Math.min(ms, r.totalMs) / 1000) * (this.rate || 1);\n return { sentenceId: r.prev, s: r.silent ? (r.fromS ?? 0) + s : s, silent: !!r.silent };\n }\n\n private finishLine(id: number) {\n this.lastDone = id;\n this.spoken.add(id);\n this.current = null;\n this.currentPart = 0;\n this.partBase = 0;\n }\n\n private earliestHeld(): number | null {\n const floor = this.rank(this.floor);\n for (const id of this.order) if (this.rank(id) >= floor && !this.spoken.has(id) && this.speakable(id) && this.piecesOf(id).length) return id;\n return null;\n }\n\n private floorOrBefore(): number | null {\n if (!this.sequence.length) return null;\n const i = this.seqAt.get(this.floor);\n if (i != null) return this.floor;\n return this.sequence.find((id) => this.rank(id) >= this.rank(this.floor)) ?? null;\n }\n\n private waitFor(id: number, part: number) {\n const beforeFirst = !this.started;\n this.warm(id, true);\n this.current = null;\n this.awaiting = { id, part };\n this.onSentence(id);\n this.onWaiting(id);\n if (this.waitTimer) clearTimeout(this.waitTimer);\n const patience = this.coming(id) ? ClipQueue.COMING_MS : beforeFirst ? ClipQueue.START_WAIT_MS : ClipQueue.WAIT_MS;\n this.waitTimer = setTimeout(() => {\n this.waitTimer = null;\n const w = this.awaiting;\n if (!w || w.id !== id || w.part !== part || !this.playing) return;\n this.awaiting = null;\n this.onWaiting(null);\n if (beforeFirst) {\n const first = this.earliestHeld();\n if (first != null) { this.floor = first; this.start(first); return; }\n this.follow();\n return;\n }\n this.finishLine(id);\n this.follow();\n }, patience);\n }\n\n private stopWaiting() {\n this.awaiting = null;\n if (this.waitTimer) { clearTimeout(this.waitTimer); this.waitTimer = null; }\n }\n\n has(sentenceId: number) { return this.clips.has(sentenceId); }\n get size() { return this.clips.size; }\n latest(): VoiceClip | null { return this.order.length ? this.clipAt(this.order[this.order.length - 1]) : null; }\n clipAt(sentenceId: number): VoiceClip | null {\n const line = this.clips.get(sentenceId);\n if (!line) return null;\n const first = [...line.got.keys()].sort((a, b) => a - b)[0];\n return first == null ? null : line.got.get(first) ?? null;\n }\n\n private from(sentenceId: number | null): number | null {\n if (sentenceId == null) return null;\n for (const id of this.order) if (id >= sentenceId && this.speakable(id)) return id;\n return null;\n }\n\n private edge(): number { return this.order.length ? this.order[this.order.length - 1] + 1 : 0; }\n\n play(sentenceId: number | null) {\n this.clearRest();\n this.lastDone = null;\n this.playing = true;\n this.floor = Math.min(sentenceId ?? this.edge(), this.edge());\n this.stopWaiting();\n for (const id of [...this.spoken]) if (this.rank(id) >= this.rank(this.floor)) this.spoken.delete(id);\n this.lastRead = null;\n this.follow();\n }\n\n pause() {\n this.holdRest();\n this.playing = false;\n this.onWaiting(null);\n this.onStarting(null);\n this.el?.pause();\n }\n\n resume(sentenceId: number | null): boolean {\n if (this.rest && this.rest.prev === sentenceId) {\n this.playing = true;\n this.runRest();\n this.onSentence(this.rest.prev);\n return true;\n }\n const el = this.el;\n if (!el || this.current == null || this.current !== sentenceId || !el.currentSrc || el.ended || el.error || this.startingSince.has(this.current)) return false;\n this.playing = true;\n this.stopWaiting();\n void el.play().catch((e) => {\n if ((e as { name?: string } | null)?.name === 'AbortError') return;\n this.failed(this.current ?? sentenceId!, e);\n });\n this.onSentence(this.current);\n return true;\n }\n\n private swap(c: VoiceClip) {\n const el = this.el;\n if (!el) return;\n const at = Math.max(0, el.currentTime - 0.3);\n const going = this.playing && !el.paused && !el.ended;\n this.loading = c.sentenceId;\n el.src = this.srcOf(c);\n el.addEventListener('loadedmetadata', () => {\n try { el.currentTime = Number.isFinite(el.duration) && el.duration > 0 ? Math.min(at, Math.max(0, el.duration - 0.1)) : at; } catch { }\n }, { once: true });\n if (!going) return;\n this.onWaiting(c.sentenceId);\n void el.play().catch((e) => {\n if ((e as { name?: string } | null)?.name === 'AbortError') return;\n this.failed(c.sentenceId, e);\n });\n }\n\n readingAt(): number | null { return this.current ?? this.awaiting?.id ?? (this.playing ? this.floor : null); }\n\n arm(sentenceId: number | null) {\n this.clearRest();\n this.lastDone = null;\n this.playing = true;\n this.current = null;\n this.floor = sentenceId ?? 0;\n this.stopWaiting();\n this.spoken.clear();\n this.lastRead = null;\n this.started = false;\n this.onSentence(null);\n this.warm(this.floor, true);\n }\n\n seekWithin(t: number) {\n const el = this.el;\n if (!el || this.current == null) return;\n const at = t - this.partBase;\n if (at < 0 || (Number.isFinite(el.duration) && el.duration > 0 && at >= el.duration)) return;\n try { el.currentTime = at; } catch { }\n }\n\n seek(sentenceId: number | null) {\n if (!this.playing) { this.clearRest(); this.lastDone = null; this.floor = Math.min(sentenceId ?? this.edge(), this.edge()); this.current = null; this.warm(this.floor, true); return; }\n this.play(sentenceId);\n }\n\n setMuted(m: boolean) { this.muted = m; if (this.el) this.el.muted = m; }\n setVolume(v: number) { this.volume = v; if (this.el) this.el.volume = v; }\n setRate(r: number) { this.rate = r; if (this.el) this.el.playbackRate = r; }\n\n private start(id: number) {\n const first = this.piecesOf(id)[0];\n this.partBase = 0;\n if (this.within && this.within.id !== id) this.within = null;\n this.startPart(id, first ?? 0);\n }\n\n private startPartAt(id: number, part: number, sec: number) {\n this.within = null;\n const base = this.partBase;\n this.startPart(id, part);\n this.partBase = base;\n const el = this.el;\n if (el && this.current === id && sec > 0.05) {\n el.addEventListener('loadedmetadata', () => {\n try { el.currentTime = Number.isFinite(el.duration) && el.duration > 0 ? Math.min(sec, Math.max(0, el.duration - 0.1)) : sec; } catch { }\n }, { once: true });\n }\n }\n\n startWithin(sentenceId: number, frac: number) {\n this.within = frac > 0.01 ? { id: sentenceId, frac: Math.min(0.98, frac) } : null;\n }\n\n private startPart(id: number, part: number) {\n const line = this.clips.get(id);\n const c = line?.got.get(part);\n if (!this.speakable(id)) {\n this.finishLine(id);\n this.follow();\n return;\n }\n if (!c) { this.waitFor(id, part); return; }\n const w = this.within && this.within.id === id && part === this.piecesOf(id)[0] ? this.within : null;\n let at = 0;\n if (w) {\n this.within = null;\n if (line!.total > 1) {\n const lens = Array.from({ length: line!.total }, (_, i) => line!.got.get(i)?.durationS ?? 0);\n const total = lens.reduce((x, y) => x + y, 0);\n if (total > 0 && lens.every((d) => d > 0)) {\n const target = w.frac * total;\n let k = 0, base = 0;\n while (k < lens.length - 1 && base + lens[k] <= target) base += lens[k++];\n at = -(target - base);\n if (k !== part) { this.partBase = base; this.startPartAt(id, k, target - base); return; }\n }\n } else at = w.frac;\n }\n this.stopWaiting();\n this.clearRest();\n this.started = true;\n this.lastRead = this.lastRead == null ? id : Math.max(this.lastRead, id);\n if (part === 0) this.partBase = 0;\n this.currentPart = part;\n this.current = id;\n this.loading = id;\n if (this.retryTimer) { clearTimeout(this.retryTimer); this.retryTimer = null; }\n const el = this.element();\n el.src = this.srcOf(c);\n this.warm(id);\n if (at !== 0) {\n el.addEventListener('loadedmetadata', () => {\n const len = Number.isFinite(el.duration) && el.duration > 0 ? el.duration : 0;\n const sec = at > 0 ? at * len : -at;\n try { if (sec > 0.05) el.currentTime = len ? Math.min(sec, Math.max(0, len - 0.1)) : sec; } catch { }\n }, { once: true });\n }\n el.muted = this.muted;\n el.volume = this.volume;\n el.playbackRate = this.rate;\n this.onSentence(id);\n this.onWaiting(id);\n void el.play().catch((e) => {\n if ((e as { name?: string } | null)?.name === 'AbortError') return;\n this.failed(id, e);\n });\n }\n\n upcoming(from: number, withFrom = false): VoiceClip[] {\n const out: VoiceClip[] = [];\n let secs = 0;\n const enough = () => out.length >= Math.max(this.readAhead, 1) && secs >= this.readAheadS;\n const cur = this.clips.get(from);\n if (cur) {\n for (const part of this.piecesOf(from)) {\n if (!withFrom && (this.current !== from || part <= this.currentPart)) continue;\n const c = cur.got.get(part);\n if (c) { out.push(c); secs += c.durationS || 0; }\n }\n }\n const at = this.rank(from);\n for (const id of this.order) {\n if (enough()) break;\n if (this.rank(id) <= at || !this.speakable(id)) continue;\n const line = this.clips.get(id);\n if (!line) continue;\n for (const part of [...line.got.keys()].sort((x, y) => x - y)) {\n const c = line.got.get(part)!;\n out.push(c);\n secs += c.durationS || 0;\n }\n }\n return out;\n }\n\n private warm(from: number, withFrom = false) {\n if (this.readAhead <= 0) return;\n this.prefetch.want(this.upcoming(from, withFrom).map((c) => c.src));\n }\n\n private srcOf(c: VoiceClip): string { return this.prefetch.urlFor(c.src); }\n\n private failed(id: number, e: unknown) {\n if (this.loading !== id) return;\n this.loading = null;\n const c = this.clips.get(id)?.got.get(this.currentPart);\n if (c) this.prefetch.forget(c.src);\n if (c && this.playing && this.current === id && (this.retries.get(id) ?? 0) < ClipQueue.RETRIES) {\n void this.classify(id, c.src);\n return;\n }\n this.onError(e);\n this.drop(id);\n }\n\n private async classify(id: number, src: string) {\n let again = false;\n let ready = false;\n let afterMs: number | null = null;\n try {\n const r = await fetch(src, { method: 'GET' });\n ready = r.ok;\n again = r.status === 202 || r.status === 503 || r.status === 429;\n const body = r.status === 503 ? await r.json().catch(() => null) : null;\n afterMs = startingRetryMs(r.status, r.headers.get('Retry-After'), body);\n } catch {\n again = true;\n }\n if (this.current !== id || !this.playing) return;\n if (ready) { this.retries.set(id, (this.retries.get(id) ?? 0) + 1); this.start(id); return; }\n if (!again) { this.drop(id); return; }\n if (afterMs != null) {\n const since = this.startingSince.get(id) ?? Date.now();\n this.startingSince.set(id, since);\n if (Date.now() - since < ClipQueue.STARTING_MS) {\n this.onStarting(since);\n this.retryTimer = setTimeout(() => { if (this.playing && this.current === id) this.start(id); }, afterMs);\n return;\n }\n this.startingSince.delete(id);\n this.playing = false;\n this.onStarting(null);\n this.onWaiting(null);\n this.onError(new VoiceNotStarted());\n this.onSentence(id);\n return;\n }\n const tries = (this.retries.get(id) ?? 0) + 1;\n this.retries.set(id, tries);\n this.retryTimer = setTimeout(() => { if (this.playing && this.current === id) this.start(id); }, ClipQueue.RETRY_MS * tries);\n }\n\n private drop(id: number) {\n this.onWaiting(null);\n this.onStarting(null);\n this.retries.delete(id);\n this.startingSince.delete(id);\n this.clips.delete(id);\n this.order = [...this.clips.keys()].sort((a, b) => this.rank(a) - this.rank(b));\n if (this.current !== id) return;\n this.finishLine(id);\n if (!this.playing) { this.onSentence(null); return; }\n this.follow();\n }\n\n position(): { sentenceId: number; t: number; dur: number } | null {\n const el = this.el;\n if (!el || this.current == null || el.ended) return null;\n const known = Number.isFinite(el.duration) && el.duration > 0 ? el.duration : 0;\n const line = this.clips.get(this.current);\n const piece = known || line?.got.get(this.currentPart)?.durationS || 0;\n let total = 0;\n if (line) for (const [i, c] of line.got) total += (i === this.currentPart ? piece : c.durationS) || 0;\n return { sentenceId: this.current, t: this.partBase + el.currentTime, dur: total || piece };\n }\n\n private element(): HTMLMediaElement {\n if (this.el) return this.el;\n const el = newMediaElement();\n el.preload = 'auto';\n const tagged = el as HTMLMediaElement & { dataset?: DOMStringMap };\n if (tagged.dataset) tagged.dataset.vsVoice = '1';\n (el as HTMLMediaElement & { playsInline?: boolean }).playsInline = true;\n el.onplaying = () => {\n this.onWaiting(null);\n this.onStarting(null);\n if (this.current != null) this.startingSince.delete(this.current);\n if (this.current == null) return;\n this.retries.delete(this.current);\n this.warm(this.current);\n };\n el.onended = () => {\n this.loading = null;\n if (!this.playing) return;\n const id = this.current;\n const line = id == null ? null : this.clips.get(id);\n if (id != null && line) {\n this.partBase += Number.isFinite(el.duration) && el.duration > 0\n ? el.duration\n : line.got.get(this.currentPart)?.durationS ?? 0;\n const next = this.currentPart + 1;\n if (next < line.total) { this.startPart(id, next); return; }\n this.finishLine(id);\n }\n this.follow();\n };\n el.onerror = () => { if (this.loading != null && el.error) this.failed(this.loading, el.error); };\n this.el = el;\n return el;\n }\n\n resync() {\n let dropped = false;\n for (const id of [...this.clips.keys()]) {\n if (this.speakable(id)) continue;\n this.clips.delete(id);\n dropped = true;\n }\n if (!dropped) return;\n this.order = [...this.clips.keys()].sort((a, b) => this.rank(a) - this.rank(b));\n if (this.awaiting && !this.speakable(this.awaiting.id)) {\n const w = this.awaiting.id;\n this.stopWaiting();\n this.finishLine(w);\n this.onWaiting(null);\n if (this.playing) this.follow();\n }\n const cur = this.current;\n if (cur == null || this.clips.has(cur)) return;\n this.el?.pause();\n this.finishLine(cur);\n if (this.playing) { this.follow(); return; }\n this.onSentence(null);\n }\n\n clear() {\n this.clearRest();\n this.el?.pause();\n this.loading = null;\n this.clips.clear();\n this.order = [];\n this.current = null;\n this.currentPart = 0;\n this.partBase = 0;\n this.stopWaiting();\n this.prefetch.clear();\n this.onWaiting(null);\n this.onSentence(null);\n }\n\n stop() {\n this.clearRest();\n this.lastDone = null;\n const el = this.el;\n this.onWaiting(null);\n this.onStarting(null);\n this.playing = false;\n this.current = null;\n this.currentPart = 0;\n this.partBase = 0;\n this.loading = null;\n this.floor = 0;\n this.lastRead = null;\n this.started = false;\n this.stopWaiting();\n this.spoken.clear();\n if (this.retryTimer) { clearTimeout(this.retryTimer); this.retryTimer = null; }\n this.retries.clear();\n this.prefetch.clear();\n if (el) { el.pause(); el.removeAttribute('src'); el.load(); }\n this.el = null;\n }\n}\n","import { credParams, deliveryFormat, type MediaCred } from './audio';\nimport type { VoiceClip } from './clipQueue';\n\nexport { ClipQueue, VoiceNotStarted, mediaKind, newMediaElement, type VoiceClip } from './clipQueue';\n\nexport function clipOf(f: any, apiOrigin: string, listenerToken?: string | null): VoiceClip | null {\n if (!f || f.type !== 'transcript.voice' || typeof f.sentenceId !== 'number') return null;\n let src: string | null = null;\n if (typeof f.url === 'string' && f.url) {\n const extra = [deliveryFormat() === 'caf' ? 'format=caf' : '', listenerToken ? `listenerToken=${encodeURIComponent(listenerToken)}` : ''].filter(Boolean).join('&');\n src = `${apiOrigin}${f.url}${extra ? `${f.url.includes('?') ? '&' : '?'}${extra}` : ''}`;\n } else if (typeof f.audio === 'string' && f.audio) {\n src = `data:audio/ogg;base64,${f.audio}`;\n }\n if (!src) return null;\n const part = Number(f.part ?? 0);\n return {\n sentenceId: f.sentenceId,\n lang: String(f.lang ?? ''),\n src,\n durationS: Number(f.durationS ?? 0),\n voice: f.voice ?? null,\n cloned: !!f.cloned,\n generation: typeof f.generation === 'number' ? f.generation : undefined,\n part: Number.isFinite(part) ? part : 0,\n parts: Math.max(1, Number(f.parts ?? 1) || 1),\n };\n}\n\nexport interface VoiceTrackRow {\n lang: string;\n voiceKey: string;\n state: string;\n durationS?: number | null;\n error?: string | null;\n clips: number[];\n voice?: string | null;\n wordTimes?: Record<string, [number, number][]>;\n clipRev?: Record<string, string>;\n clipDur?: Record<string, number>;\n clipParts?: Record<string, number>;\n}\n\nexport function rowForVoice(rows: VoiceTrackRow[], voiceId: string | null): VoiceTrackRow | null {\n if (voiceId == null) return rows.find((r) => !r.voiceKey) ?? null;\n return rows.find((r) => r.voiceKey === voiceId) ?? rows.find((r) => !r.voiceKey && r.voice === voiceId) ?? null;\n}\n\nexport function archiveClips(row: VoiceTrackRow | null | undefined, recordingId: string, apiOrigin: string, cred: MediaCred = {}, sentenceIds?: number[]): VoiceClip[] {\n if (!row) return [];\n const ids = sentenceIds?.length ? sentenceIds : row.clips;\n if (!ids?.length) return [];\n const cp = credParams(cred);\n const tk = cp ? `&${cp}` : '';\n const vk = row.voiceKey ? `&voice=${encodeURIComponent(row.voiceKey)}` : '';\n return ids.flatMap((sentenceId) => {\n const rev = row.clipRev?.[String(sentenceId)];\n const parts = Math.max(1, row.clipParts?.[String(sentenceId)] ?? 1);\n return Array.from({ length: parts }, (_, part) => ({\n sentenceId,\n lang: row.lang,\n src: `${apiOrigin}/v1/recordings/${recordingId}/voice/${sentenceId}?lang=${encodeURIComponent(row.lang)}${vk}&format=${deliveryFormat()}${part > 0 ? `&part=${part}` : ''}${rev ? `&v=${encodeURIComponent(rev)}` : ''}${tk}`,\n durationS: parts === 1 ? row.clipDur?.[String(sentenceId)] ?? 0 : 0,\n voice: row.voice ?? null,\n cloned: false,\n part,\n parts,\n }));\n });\n}\n\nexport interface ReadToken { t: string; sp: string }\n\nconst CJK = /[぀-ヿ㐀-䶿一-鿿豈-﫿가-힯]/;\n\nexport function readTokens(text: string): ReadToken[] {\n const out: ReadToken[] = [];\n let buf = '';\n let lead = '';\n const push = (t: string) => { out.push({ t: lead + t, sp: '' }); lead = ''; };\n const flush = (sp: string) => {\n if (buf && out.length && !/[\\p{L}\\p{N}]/u.test(buf)) { out[out.length - 1].sp += buf + sp; buf = ''; return; }\n if (buf) { push(buf); buf = ''; out[out.length - 1].sp = sp; }\n else if (sp) { if (out.length) out[out.length - 1].sp += sp; else lead += sp; }\n };\n for (const ch of text) {\n if (/\\s/.test(ch)) { flush(ch); continue; }\n if (CJK.test(ch)) { flush(''); push(ch); continue; }\n buf += ch;\n }\n flush('');\n return out;\n}\n\nexport interface ReadPos { t: number; dur: number; words?: [number, number][] | null }\n\nexport function readCursor(tokens: ReadToken[], pos: ReadPos): number | null {\n const w = pos.words;\n if (w && w.length === tokens.length && tokens.length > 0) {\n let at = 0;\n for (let i = 0; i < w.length; i++) if (pos.t >= w[i][0]) at = i; else break;\n return at;\n }\n if (!(pos.dur > 0)) return null;\n return tokenAt(tokens, pos.t, pos.dur);\n}\n\nexport function tokenAt(tokens: ReadToken[], pos: number, dur: number): number {\n if (tokens.length <= 1 || !(dur > 0)) return 0;\n const w = tokens.map((k) => k.t.length + 1.6);\n const total = w.reduce((a, b) => a + b, 0);\n let acc = 0;\n const want = Math.max(0, Math.min(1, pos / dur)) * total;\n for (let i = 0; i < w.length; i++) {\n acc += w[i];\n if (want < acc) return i;\n }\n return tokens.length - 1;\n}\n","import { useEffect, useState } from 'react';\nimport type { LanguageLists } from '@vocalstack/js-sdk';\n\nconst RECENT = 'vs.recentLangs';\nconst subs = new Set<() => void>();\n\nfunction read<T>(key: string, fallback: T): T {\n try {\n const raw = localStorage.getItem(key);\n return raw === null ? fallback : (JSON.parse(raw) as T);\n } catch {\n return fallback;\n }\n}\n\nfunction write(key: string, value: unknown) {\n try {\n if (value == null) localStorage.removeItem(key);\n else localStorage.setItem(key, JSON.stringify(value));\n } catch { }\n for (const s of subs) s();\n}\n\nexport function useStored<T>(key: string, fallback: T): [T, (v: T) => void] {\n const [v, setV] = useState<T>(() => read(key, fallback));\n useEffect(() => {\n const on = () => setV(read(key, fallback));\n subs.add(on);\n window.addEventListener('storage', on);\n return () => { subs.delete(on); window.removeEventListener('storage', on); };\n }, [key]); // eslint-disable-line react-hooks/exhaustive-deps\n return [v, (x: T) => { setV(x); write(key, x); }];\n}\n\nexport function forgetRecentLang(code: string) {\n const list = read<string[]>(RECENT, []);\n write(RECENT, Array.isArray(list) ? list.filter((c) => c !== code) : []);\n}\n\nexport function useRecentLangs(): [string[], (code: string | null) => void] {\n const [list, set] = useStored<string[]>(RECENT, []);\n const safe = Array.isArray(list) ? list : [];\n return [safe, (code: string | null) => { if (code) set([code, ...safe.filter((c) => c !== code)].slice(0, 3)); }];\n}\n\nexport function pickerLanguages(langs: LanguageLists | null, kind: 'transcription' | 'translation' | 'voice') {\n if (!langs) return [];\n const allowed = new Set(langs[kind]);\n return langs.languages.filter((l) => allowed.has(l.code)).map((l) => ({ code: l.code, label: l.name, native: l.native, flag: l.flag ?? '🌐', voice: !!l.voice }));\n}\n\nexport function useSidePins(id: string): [string[], (v: string[]) => void] {\n const [pins, setPins] = useStored<string[] | null>(`vs.pins.${id}`, null);\n return [Array.isArray(pins) ? pins : [], setPins];\n}\n\nexport const COL_W = 352;\nexport function useColW(id: string): [number, (v: number | null) => void] {\n const [w, set] = useStored<number | null>(id === 'ga' ? 'vs.colW.ga' : 'vs.colW', null);\n return [typeof w === 'number' && w > 0 ? w : id === 'ga' ? 560 : COL_W, set];\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { Sheet } from './Controls';\nimport { D, Icon, Spinner } from './Icons';\nimport { forgetRecentLang } from '../data/prefs';\n\nexport interface PickerLanguage {\n code: string;\n label: string;\n native: string;\n flag: string;\n voice?: boolean;\n live?: boolean;\n}\n\nexport interface LanguageListProps { value: string | null; onSelect: (code: string | null) => void; languages: PickerLanguage[]; searchPlaceholder?: string; none?: string; pinned?: string[]; recent?: string[]; requireVoice?: boolean; keepOpen?: boolean; busy?: string | null }\n\nexport function useLanguageList({ open, onClose, value, onSelect, languages, searchPlaceholder = 'Search languages', none, pinned = [], recent = [], requireVoice, keepOpen, busy }: LanguageListProps & { open: boolean; onClose: () => void }) {\n const [q, setQ] = useState('');\n const [showAll, setShowAll] = useState(false);\n const [refused, setRefused] = useState<string | null>(null);\n useEffect(() => { if (open) { setQ(''); setShowAll(false); setRefused(null); } }, [open]);\n const filtered = useMemo(() => {\n const needle = q.trim().toLowerCase();\n const list = needle\n ? languages.filter((l) => l.label.toLowerCase().includes(needle) || l.native.toLowerCase().includes(needle) || l.code.toLowerCase().includes(needle))\n : languages;\n const ordered = [...list].sort((a, b) => {\n const pa = pinned.indexOf(a.code), pb = pinned.indexOf(b.code);\n if (pa !== -1 || pb !== -1) return (pa === -1 ? 999 : pa) - (pb === -1 ? 999 : pb);\n return a.label.localeCompare(b.label);\n });\n return ordered;\n }, [languages, q, pinned]);\n const recents = useMemo(\n () => (q ? [] : recent.map((c) => filtered.find((l) => l.code === c)).filter((l): l is PickerLanguage => !!l).sort((a, b) => a.label.localeCompare(b.label))),\n [recent, filtered, q],\n );\n const rest = useMemo(() => (recents.length ? filtered.filter((l) => !recents.some((r) => r.code === l.code)) : filtered), [filtered, recents]);\n const cut = showAll || q ? rest.length : 12;\n const shown = rest;\n const more = rest.length - Math.min(cut, rest.length);\n const row = (l: PickerLanguage, inRecent = false, extra = false) => {\n const off = !!requireVoice && !l.voice;\n return (\n <button\n key={l.code}\n type=\"button\"\n className={`vs-picker__row${off ? ' vs-picker__row--off' : ''}${extra ? ' vs-picker__row--extra' : ''}`}\n aria-selected={value === l.code}\n onClick={() => { if (off) { setRefused(l.code); return; } onSelect(l.code); if (!keepOpen) onClose(); }}\n >\n <span className=\"vs-picker__flag\">{l.flag}</span>\n <span style={{ flex: 1, minWidth: 0 }}>\n <div className=\"vs-picker__label\">{l.label}</div>\n <div className=\"vs-picker__native\">{l.native}</div>\n </span>\n <span className=\"vs-picker__slot\">\n {inRecent && (\n <span className=\"vs-picker__forget\" role=\"button\" tabIndex={0} title={`Remove ${l.label} from recent`} aria-label={`Remove ${l.label} from recent`} onClick={(e) => { e.stopPropagation(); forgetRecentLang(l.code); }} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); e.stopPropagation(); forgetRecentLang(l.code); } }}>\n <Icon d={D.close} size={16} />\n </span>\n )}\n </span>\n <span className={`vs-picker__slot${off ? ' vs-picker__slot--wide' : ''}`} title={l.voice ? 'Voice available' : off ? 'No voice speaks this language yet' : undefined}>\n {off\n ? refused === l.code && <span className=\"vs-picker__off\">UNAVAILABLE</span>\n : l.voice && <Icon d={D.headphones} size={16} />}\n </span>\n <span className=\"vs-picker__check\">{value === l.code && (busy === l.code ? <Spinner size={15} color=\"var(--vs-link-hover)\" track=\"var(--vs-border)\" /> : <Icon d={D.check} size={16} sw={2.2} />)}</span>\n </button>\n );\n };\n const search = (\n <div className=\"vs-picker__search\">\n <Icon d={D.search} size={16} sw={1.7} style={{ color: 'var(--vs-text-muted)' }} />\n <input value={q} onChange={(e) => setQ(e.target.value)} placeholder={searchPlaceholder} aria-label={searchPlaceholder} />\n </div>\n );\n const list = (\n <div className=\"vs-picker__list\">\n {none && !q && (\n <button type=\"button\" className=\"vs-picker__row\" data-vs-original=\"\" aria-selected={value === null} onClick={() => { onSelect(null); if (!keepOpen) onClose(); }}>\n <span className=\"vs-picker__flag\"><Icon d={D.mic} size={19} sw={1.6} style={{ color: 'var(--vs-text-muted)' }} /></span>\n <span style={{ flex: 1, minWidth: 0 }}>\n <div className=\"vs-picker__label\">{none}</div>\n <div className=\"vs-picker__native\">As spoken · no translation</div>\n </span>\n <span className=\"vs-picker__slot\" />\n <span className=\"vs-picker__slot\" />\n <span className=\"vs-picker__check\">{value === null && <Icon d={D.check} size={16} sw={2.2} />}</span>\n </button>\n )}\n {recents.length > 0 && (\n <>\n <div className=\"vs-picker__head\">RECENT</div>\n {recents.map((l) => row(l, true))}\n <div className=\"vs-picker__rule\" />\n </>\n )}\n {shown.map((l, i) => row(l, false, i >= cut))}\n {more > 0 && (\n <button type=\"button\" className=\"vs-picker__more vs-picker__more--btn\" style={{ background: 'none', border: 0, cursor: 'pointer', width: '100%', textAlign: 'left' }} onClick={() => setShowAll(true)}>\n + {more} MORE LANGUAGES\n </button>\n )}\n {filtered.length === 0 && <div className=\"vs-picker__more\">No match for “{q}”</div>}\n </div>\n );\n return { search, list };\n}\n\nexport function LanguagePicker({ open, onClose, title, note, sticky, ...rest }: LanguageListProps & { open: boolean; onClose: () => void; title: string; note?: string; sticky?: boolean }) {\n const { search, list } = useLanguageList({ ...rest, open, onClose });\n return (\n <Sheet open={open} onClose={onClose} title={title} note={note} drawer={false} sticky={sticky} kind=\"picker\" header={search}>\n {list}\n </Sheet>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { PlayGlyph } from '../ds/Icons';\n\nexport type FollowSetup = (v: HTMLVideoElement, fail: () => void) => (() => void) | void;\n\nexport function FileFollow({ src, setup, t, playing, seekN, onToggle, seekOver = 0.4 }: { src?: string; setup?: FollowSetup; t: number; playing: boolean; seekN: number; onToggle?: () => void; seekOver?: number }) {\n const ref = useRef<HTMLVideoElement>(null);\n const [ready, setReady] = useState(false);\n const [gone, setGone] = useState(false);\n const tRef = useRef(t); tRef.current = t;\n useEffect(() => { setReady(false); setGone(false); }, [src, setup]);\n useEffect(() => {\n const v = ref.current;\n if (!v || !setup) return;\n return setup(v, () => setGone(true)) ?? undefined;\n }, [setup]);\n useEffect(() => {\n const v = ref.current;\n if (!v || !ready) return;\n if (playing) v.play().catch(() => {}); else v.pause();\n }, [playing, ready]);\n useEffect(() => {\n const v = ref.current;\n if (!v || !ready) return;\n const want = Math.max(0, tRef.current);\n if (Math.abs(v.currentTime - want) > (playing ? seekOver : 0.08)) v.currentTime = want;\n }, [t, seekN, ready, playing]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n const v = ref.current;\n if (!v || !ready || !playing) return;\n const h = setInterval(() => {\n if (v.seeking) return;\n const d = v.currentTime - tRef.current;\n if (Math.abs(d) > seekOver) v.currentTime = Math.max(0, tRef.current);\n else v.playbackRate = Math.abs(d) < 0.03 ? 1 : Math.min(1.1, Math.max(0.9, 1 - 0.5 * d));\n }, 250);\n return () => { clearInterval(h); v.playbackRate = 1; };\n }, [ready, playing, seekOver]);\n if (gone) return null;\n return (\n <div className=\"txyt vsp-follow\" style={ready ? { background: '#000' } : undefined}>\n <video\n ref={ref}\n className=\"vsp-file\"\n style={{ opacity: ready ? 1 : 0 }}\n src={src}\n muted\n playsInline\n preload=\"auto\"\n disablePictureInPicture\n onLoadedData={() => setReady(true)}\n onError={() => { if (src) setGone(true); }}\n aria-hidden=\"true\"\n />\n {ready && <div aria-hidden=\"true\" className=\"txyt__tap\" onClick={onToggle} style={{ cursor: onToggle ? 'pointer' : 'default' }} />}\n {ready && <div className={`txyt__paused${!playing ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div>}\n </div>\n );\n}\n","export type SiteId = 'youtube' | 'loom' | 'vimeo' | 'twitch' | 'facebook' | 'instagram' | 'dailymotion' | 'tiktok' | 'x' | 'soundcloud' | 'kick' | 'mixcloud' | 'bandcamp' | 'streamable' | 'ted' | 'linkedin' | 'archive' | 'odysee' | 'niconico' | 'vk' | 'bitchute' | 'wistia' | 'vidyard' | 'kaltura' | 'jwplayer' | 'pinterest' | 'bluesky' | 'gdrive' | 'spreaker' | 'iheart' | 'audioboom' | 'cnn';\n\nexport interface Site {\n id: SiteId;\n name: string;\n color: string;\n hosts: RegExp;\n glyph: string;\n audioOnly?: boolean;\n}\n\nexport const SITES: Site[] = [\n { id: 'youtube', name: 'YouTube', color: '#ff3b30', hosts: /(^|\\.)(youtube\\.com|youtu\\.be|youtube-nocookie\\.com)$/, glyph: 'M21.6 7.2a2.7 2.7 0 0 0-1.9-1.9C18 4.8 12 4.8 12 4.8s-6 0-7.7.5a2.7 2.7 0 0 0-1.9 1.9C2 8.9 2 12 2 12s0 3.1.4 4.8a2.7 2.7 0 0 0 1.9 1.9c1.7.5 7.7.5 7.7.5s6 0 7.7-.5a2.7 2.7 0 0 0 1.9-1.9c.4-1.7.4-4.8.4-4.8s0-3.1-.4-4.8ZM10 15.1V8.9l5.3 3.1L10 15.1Z' },\n { id: 'loom', name: 'Loom', color: '#8f7bff', hosts: /(^|\\.)loom\\.com$/, glyph: 'M21 11h-5.2l4.5-2.6-1-1.7-4.5 2.6 2.6-4.5-1.7-1-2.6 4.5V3h-2v5.3L8.5 3.8l-1.7 1 2.6 4.5-4.5-2.6-1 1.7L8.2 11H3v2h5.2l-4.5 2.6 1 1.7 4.5-2.6-2.6 4.5 1.7 1 2.6-4.5V21h2v-5.2l2.6 4.5 1.7-1-2.6-4.5 4.5 2.6 1-1.7-4.5-2.6H21v-2Zm-9 3.4a2.4 2.4 0 1 1 0-4.8 2.4 2.4 0 0 1 0 4.8Z' },\n { id: 'vimeo', name: 'Vimeo', color: '#1ab7ea', hosts: /(^|\\.)vimeo\\.com$/, glyph: 'M22 7.4c-.1 2-1.5 4.7-4.2 8.1-2.8 3.6-5.1 5.4-7 5.4-1.2 0-2.2-1.1-3-3.3L6.2 11.6C5.6 9.4 5 8.3 4.3 8.3c-.1 0-.6.3-1.4.9L2 8l2.7-2.4C5.9 4.6 6.8 4 7.4 4c1.4-.1 2.3.9 2.6 2.9.4 2.2.6 3.6.8 4.1.4 1.8.9 2.7 1.4 2.7.4 0 1-.6 1.8-1.9.8-1.2 1.2-2.2 1.3-2.8.1-1.1-.3-1.6-1.3-1.6-.5 0-.9.1-1.4.3.9-3 2.7-4.5 5.3-4.4 1.9.1 2.8 1.3 2.7 3.7Z' },\n { id: 'twitch', name: 'Twitch', color: '#a970ff', hosts: /(^|\\.)twitch\\.tv$/, glyph: 'M5 2.5 3 6.5v13h4.5V22H10l2.5-2.5h3.8L21 14.8V2.5H5Zm14 11.4-2.9 2.9h-4.3L9.4 19.2v-2.4H6V4.5h13v9.4ZM15.2 7.4h1.9v5.2h-1.9V7.4Zm-5 0h1.9v5.2h-1.9V7.4Z' },\n { id: 'facebook', name: 'Facebook', color: '#3b82f6', hosts: /(^|\\.)(facebook\\.com|fb\\.watch|fb\\.com)$/, glyph: 'M13.9 21.5v-8h2.7l.4-3.1h-3.1V8.4c0-.9.3-1.5 1.6-1.5H17V4.1c-.3 0-1.3-.1-2.4-.1-2.4 0-4 1.4-4 4.1v2.3H7.9v3.1h2.7v8h3.3Z' },\n { id: 'instagram', name: 'Instagram', color: '#f56aa0', hosts: /(^|\\.)instagram\\.com$/, glyph: 'M7.5 2.5h9a5 5 0 0 1 5 5v9a5 5 0 0 1-5 5h-9a5 5 0 0 1-5-5v-9a5 5 0 0 1 5-5Zm0 1.8a3.2 3.2 0 0 0-3.2 3.2v9a3.2 3.2 0 0 0 3.2 3.2h9a3.2 3.2 0 0 0 3.2-3.2v-9a3.2 3.2 0 0 0-3.2-3.2h-9ZM12 7.5a4.5 4.5 0 1 1 0 9 4.5 4.5 0 0 1 0-9Zm0 1.8a2.7 2.7 0 1 0 0 5.4 2.7 2.7 0 0 0 0-5.4Zm5.1-3.4a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z' },\n { id: 'dailymotion', name: 'Dailymotion', color: '#4aa3ff', hosts: /(^|\\.)(dailymotion\\.com|dai\\.ly)$/, glyph: 'M14.6 3.5h3.2V20h-3v-1.2a5.4 5.4 0 0 1-3.6 1.4c-3.3 0-5.9-2.7-5.9-6.1S7.9 8 11.2 8c1.3 0 2.5.4 3.4 1.2V3.5Zm-3.1 7.4a3.2 3.2 0 1 0 0 6.4 3.2 3.2 0 0 0 0-6.4Z' },\n { id: 'tiktok', name: 'TikTok', color: '#25f4ee', hosts: /(^|\\.)tiktok\\.com$/, glyph: 'M16.6 2.5c.3 2.3 1.7 3.8 3.9 4v2.7a6.8 6.8 0 0 1-3.9-1.3v6.5a5.7 5.7 0 1 1-5.7-5.7l.9.1v2.8a2.9 2.9 0 1 0 2 2.8V2.5h2.8Z' },\n { id: 'x', name: 'X', color: '#e8eaf2', hosts: /(^|\\.)(x\\.com|twitter\\.com)$/, glyph: 'M17.8 3h3.1l-6.7 7.7L22 21h-6.2l-4.8-6.3L5.5 21H2.4l7.2-8.2L2.1 3h6.3l4.4 5.8L17.8 3Zm-1.1 16.2h1.7L7.4 4.7H5.6l11.1 14.5Z' },\n { id: 'soundcloud', name: 'SoundCloud', color: '#ff7a1a', hosts: /(^|\\.)soundcloud\\.com$/, audioOnly: true, glyph: 'M11 8.6a5 5 0 0 1 7.8 3.1 3 3 0 0 1-.3 6H11V8.6ZM8.6 9.4h1.3v8.3H8.6V9.4Zm-2.4 1.2h1.3v7.1H6.2v-7.1Zm-2.4 1.6h1.3v5.5H3.8v-5.5Zm-2.4 1.6h1.3v3.9H1.4v-3.9Z' },\n { id: 'kick', name: 'Kick', color: '#53fc18', hosts: /(^|\\.)kick\\.com$/, glyph: 'M4 3h5.5v5H11V6h2V3h5.5v6.5h-2V11h-2v2h2v1.5h2V21H13v-3h-2v-2H9.5v5H4V3Z' },\n { id: 'mixcloud', name: 'Mixcloud', color: '#7f8cff', hosts: /(^|\\.)mixcloud\\.com$/, audioOnly: true, glyph: 'M17.5 9.5a5.5 5.5 0 0 0-10.6 1.2A3.8 3.8 0 0 0 7.3 18h10.2a4.25 4.25 0 0 0 0-8.5Z' },\n { id: 'streamable', name: 'Streamable', color: '#0f90fa', hosts: /(^|\\.)streamable\\.com$/, glyph: 'M4 6.5A2.5 2.5 0 0 1 6.5 4h11A2.5 2.5 0 0 1 20 6.5v11a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 4 17.5v-11Zm6 2.3v6.4l5.2-3.2L10 8.8Z' },\n { id: 'bandcamp', name: 'Bandcamp', color: '#1da0c3', hosts: /(^|\\.)bandcamp\\.com$/, audioOnly: true, glyph: 'M2 18 8.5 6H22l-6.5 12H2Z' },\n { id: 'ted', name: 'TED', color: '#e62b1e', hosts: /(^|\\.)ted\\.com$/, glyph: 'M2 6h6.5v2.3H6.4V18H4V8.3H2V6Zm7.5 0h5.3v2.3h-2.9v2.6h2.6v2.3h-2.6v2.5h2.9V18H9.5V6Zm6.4 0h2.3A3.8 3.8 0 0 1 22 9.8v4.4a3.8 3.8 0 0 1-3.8 3.8h-2.3V6Zm2.4 2.3v7.4c.9 0 1.4-.7 1.4-1.6v-4.2c0-.9-.5-1.6-1.4-1.6Z' },\n { id: 'linkedin', name: 'LinkedIn', color: '#0a66c2', hosts: /(^|\\.)linkedin\\.com$/, glyph: 'M5 3.5a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5ZM3 9.5h4V21H3V9.5Zm6.5 0h3.8v1.6h.1c.5-1 1.8-2 3.8-2 4 0 4.8 2.6 4.8 6V21h-4v-5.2c0-1.2 0-2.8-1.7-2.8s-2 1.3-2 2.7V21h-4V9.5Z' },\n { id: 'archive', name: 'Internet Archive', color: '#c8c8c8', hosts: /(^|\\.)archive\\.org$/, glyph: 'M3 19h18v2H3v-2Zm1-2h16v1.2H4V17Zm1.5-9h2v8h-2V8Zm5.5 0h2v8h-2V8Zm5.5 0h2v8h-2V8ZM3 5.5 12 3l9 2.5V7H3V5.5Z' },\n { id: 'odysee', name: 'Odysee', color: '#ef1970', hosts: /(^|\\.)(odysee\\.com|lbry\\.tv)$/, glyph: 'M12 3a9 9 0 1 1 0 18 9 9 0 0 1 0-18Zm0 4a5 5 0 1 0 0 10 5 5 0 0 0 0-10Z' },\n { id: 'niconico', name: 'Niconico', color: '#e6e6e6', hosts: /(^|\\.)(nicovideo\\.jp|nico\\.ms)$/, glyph: 'M4 8h16a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2Zm3.5-5L11 7H9.3L6.5 4.2 7.5 3Zm9 0 1 1.2L14.7 7H13l3.5-4Z' },\n { id: 'vk', name: 'VK', color: '#0077ff', hosts: /(^|\\.)(vk\\.com|vkvideo\\.ru)$/, glyph: 'M12.8 17.5c-5.5 0-8.6-3.8-8.8-10h2.8c.1 4.6 2.1 6.5 3.7 6.9V7.5h2.6v3.9c1.6-.2 3.3-2 3.8-3.9h2.6c-.4 2.4-2.2 4.2-3.4 4.9 1.3.6 3.3 2.1 4.1 5.1h-2.9c-.6-1.9-2.2-3.4-4.2-3.6v3.6h-.3Z' },\n { id: 'bitchute', name: 'BitChute', color: '#ef4137', hosts: /(^|\\.)bitchute\\.com$/, glyph: 'M12 3a9 9 0 1 1 0 18 9 9 0 0 1 0-18Zm-2 5.5v7l6-3.5-6-3.5Z' },\n { id: 'wistia', name: 'Wistia', color: '#54bbff', hosts: /(^|\\.)(wistia\\.com|wistia\\.net|wi\\.st)$/, glyph: 'M3 7h13l-2.5 4H3V7Zm0 6h15.5L21 9v4.5L18.5 17H3v-4Z' },\n { id: 'vidyard', name: 'Vidyard', color: '#38c172', hosts: /(^|\\.)vidyard\\.com$/, glyph: 'M3 5h4l5 9 5-9h4l-9 15L3 5Z' },\n { id: 'kaltura', name: 'Kaltura', color: '#00a8e1', hosts: /(^|\\.)kaltura\\.com$/, glyph: 'M5 4h3v7l6-7h4l-6.5 7.3L18.5 20h-4l-5-6.4L8 15.3V20H5V4Z' },\n { id: 'jwplayer', name: 'JW Player', color: '#ff0046', hosts: /(^|\\.)(jwplayer\\.com|jwplatform\\.com)$/, glyph: 'M6 5h3v9.5a4 4 0 0 1-4 4H4v-2.8h1c.6 0 1-.5 1-1.2V5Zm5 0h3l1.5 7L17 5h3l-3 13h-3l-1.5-6.5L11.9 18H9.5L11 5Z' },\n { id: 'pinterest', name: 'Pinterest', color: '#e60023', hosts: /(^|\\.)(pinterest\\.[a-z.]+|pin\\.it)$/, glyph: 'M12 2.5a9.5 9.5 0 0 0-3.5 18.3c-.1-.8-.2-2 0-2.9l1.3-5.4s-.3-.7-.3-1.6c0-1.5.9-2.7 2-2.7.9 0 1.4.7 1.4 1.6 0 1-.6 2.4-.9 3.7-.3 1.1.6 2 1.7 2 2 0 3.5-2.1 3.5-5.2 0-2.7-2-4.6-4.8-4.6-3.3 0-5.2 2.5-5.2 5 0 1 .4 2.1.9 2.7l.1.4-.3 1.3c0 .2-.2.3-.4.2-1.4-.7-2.3-2.7-2.3-4.4 0-3.6 2.6-6.9 7.5-6.9 3.9 0 7 2.8 7 6.6 0 3.9-2.5 7.1-5.9 7.1-1.2 0-2.2-.6-2.6-1.3l-.7 2.7c-.3 1-.9 2.2-1.4 2.9A9.5 9.5 0 1 0 12 2.5Z' },\n { id: 'bluesky', name: 'Bluesky', color: '#1185fe', hosts: /(^|\\.)bsky\\.app$/, glyph: 'M6.3 4.4c2.3 1.7 4.7 5.2 5.7 7 1-1.8 3.4-5.3 5.7-7 1.6-1.2 4.3-2.2 4.3.9 0 .6-.4 5.2-.6 5.9-.7 2.6-3.3 3.2-5.6 2.8 4 .7 5 2.9 2.8 5.2-4.2 4.3-6-1.1-6.5-2.5l-.1-.4-.1.4c-.5 1.4-2.3 6.8-6.5 2.5-2.2-2.3-1.2-4.5 2.8-5.2-2.3.4-4.9-.2-5.6-2.8C2.4 10.5 2 5.9 2 5.3c0-3.1 2.7-2.1 4.3-.9Z' },\n { id: 'gdrive', name: 'Google Drive', color: '#34a853', hosts: /^drive\\.google\\.com$/, glyph: 'M8.2 3h7.6l6.2 10.8-3.8 6.6H5.8L2 13.8 8.2 3Zm1.2 2L5 12.6h4.4L13.8 5H9.4Zm6.4 1.2-2.2 3.8 4 6.8 2.2-3.8-4-6.8ZM4.4 14.6l2.2 3.8h8.8l2.2-3.8H4.4Z' },\n { id: 'spreaker', name: 'Spreaker', color: '#f5c300', hosts: /(^|\\.)spreaker\\.com$/, audioOnly: true, glyph: 'M12 9a3 3 0 1 1 0 6 3 3 0 0 1 0-6ZM6.3 6.3l1.4 1.4a6 6 0 0 0 0 8.6l-1.4 1.4a8 8 0 0 1 0-11.4Zm11.4 0a8 8 0 0 1 0 11.4l-1.4-1.4a6 6 0 0 0 0-8.6l1.4-1.4Z' },\n { id: 'iheart', name: 'iHeartRadio', color: '#c6002b', hosts: /(^|\\.)iheart\\.com$/, audioOnly: true, glyph: 'M12 21s-7.5-4.6-9.4-9.4C1.2 8 3.4 4 7.3 4c2 0 3.6 1.1 4.7 2.6C13.1 5.1 14.7 4 16.7 4c3.9 0 6.1 4 4.7 7.6C19.5 16.4 12 21 12 21Z' },\n { id: 'audioboom', name: 'Audioboom', color: '#1ea2e0', hosts: /(^|\\.)audioboom\\.com$/, audioOnly: true, glyph: 'M12 3a9 9 0 1 1 0 18 9 9 0 0 1 0-18Zm-4 6v6h2V9H8Zm3-2v10h2V7h-2Zm3 3v4h2v-4h-2Z' },\n { id: 'cnn', name: 'CNN', color: '#cc0000', hosts: /(^|\\.)cnn\\.com$/, glyph: 'M2 7h20v10H2V7Zm3.5 2.2a2.8 2.8 0 1 0 0 5.6h1.4v-1.6H5.6a1.2 1.2 0 1 1 0-2.4h1.3V9.2H5.5Zm3 0v5.6h1.6v-3.3l2.4 3.3H14V9.2h-1.6v3.3L10 9.2H8.5Zm6.2 0v5.6h1.6v-3.3l2.4 3.3h1.5V9.2h-1.6v3.3l-2.4-3.3h-1.5Z' },\n];\n\nconst BY_ID = new Map(SITES.map((s) => [s.id, s]));\n\nexport function siteById(id: string | null | undefined): Site | null {\n return id ? BY_ID.get(id as SiteId) ?? null : null;\n}\n\nexport function hostOfUrl(url: string | null | undefined): string | null {\n const raw = url?.trim();\n if (!raw) return null;\n try { return new URL(/^[a-z][a-z0-9+.-]*:\\/\\//i.test(raw) ? raw : `https://${raw}`).hostname.toLowerCase().replace(/^www\\./, ''); } catch { return null; }\n}\n\nexport function siteOf(url: string | null | undefined): Site | null {\n const host = hostOfUrl(url);\n if (!host) return null;\n return SITES.find((s) => s.hosts.test(host)) ?? null;\n}\n","import { siteOf } from './sites';\n\nexport interface EmbedAt { t: number; play: boolean; host?: string }\n\nfunction u(raw: string): URL | null {\n try { return new URL(/^[a-z][a-z0-9+.-]*:\\/\\//i.test(raw) ? raw : `https://${raw}`); } catch { return null; }\n}\n\nconst secs = (t: number) => Math.max(0, Math.floor(t));\n\nexport function loomId(raw: string): string | null {\n const m = /\\/(?:share|embed)\\/(?:[^/?#]*-)?([0-9a-f]{32})(?:[/?#]|$)/i.exec(u(raw)?.pathname ?? '');\n return m ? m[1].toLowerCase() : null;\n}\n\nexport function vimeoIds(raw: string): { id: string; h: string | null } | null {\n const x = u(raw);\n if (!x) return null;\n const parts = x.pathname.split('/').filter(Boolean);\n const at = parts.map((p, i) => (/^\\d+$/.test(p) ? i : -1)).filter((i) => i >= 0).pop();\n if (at == null) return null;\n const next = parts[at + 1];\n return { id: parts[at], h: x.searchParams.get('h') ?? (next && /^[0-9a-f]{6,}$/i.test(next) ? next : null) };\n}\n\nexport function dailymotionId(raw: string): string | null {\n const x = u(raw);\n if (!x) return null;\n if (/(^|\\.)dai\\.ly$/i.test(x.hostname)) return x.pathname.split('/').filter(Boolean)[0] ?? null;\n const m = /\\/video\\/([a-z0-9]+)/i.exec(x.pathname);\n return m ? m[1] : null;\n}\n\nexport function twitchTarget(raw: string): { video?: string; channel?: string; clip?: string } | null {\n const x = u(raw);\n if (!x) return null;\n const parts = x.pathname.split('/').filter(Boolean);\n if (/^clips\\.twitch\\.tv$/i.test(x.hostname)) return parts[0] ? { clip: parts[0] } : null;\n const v = parts.indexOf('videos');\n if (v >= 0 && parts[v + 1]) return { video: parts[v + 1].replace(/^v/, '') };\n const c = parts.indexOf('clip');\n if (c >= 0 && parts[c + 1]) return { clip: parts[c + 1] };\n return parts[0] ? { channel: parts[0] } : null;\n}\n\nconst hms = (t: number) => { const s = secs(t); return `${Math.floor(s / 3600)}h${Math.floor((s % 3600) / 60)}m${s % 60}s`; };\n\nexport function embedUrl(raw: string, at: EmbedAt): string | null {\n const site = siteOf(raw);\n if (!site) return null;\n const play = at.play ? 1 : 0;\n switch (site.id) {\n case 'loom': {\n const id = loomId(raw);\n if (!id) return null;\n const q = new URLSearchParams({ hide_owner: 'true', hide_share: 'true', hide_title: 'true', hideEmbedTopBar: 'true', hide_speed: 'true', muted: 'true', autoplay: at.play ? 'true' : 'false', t: String(secs(at.t)) });\n return `https://www.loom.com/embed/${id}?${q}`;\n }\n case 'vimeo': {\n const v = vimeoIds(raw);\n if (!v) return null;\n const q = new URLSearchParams({ autoplay: String(play), muted: '1', controls: '0', title: '0', byline: '0', portrait: '0', dnt: '1' });\n if (v.h) q.set('h', v.h);\n return `https://player.vimeo.com/video/${v.id}?${q}#t=${secs(at.t)}s`;\n }\n case 'dailymotion': {\n const id = dailymotionId(raw);\n if (!id) return null;\n const q = new URLSearchParams({ autoplay: String(play), mute: '1', controls: '0', 'queue-enable': '0', 'sharing-enable': '0', 'ui-start-screen-info': '0', start: String(secs(at.t)), api: 'postMessage' });\n return `https://www.dailymotion.com/embed/video/${id}?${q}`;\n }\n case 'twitch': {\n const tg = twitchTarget(raw);\n if (!tg || !at.host) return null;\n if (tg.clip) return `https://clips.twitch.tv/embed?${new URLSearchParams({ clip: tg.clip, parent: at.host, autoplay: String(!!at.play), muted: 'true' })}`;\n const q = new URLSearchParams({ parent: at.host, autoplay: String(!!at.play), muted: 'true' });\n if (tg.video) { q.set('video', `v${tg.video}`); q.set('time', hms(at.t)); } else if (tg.channel) q.set('channel', tg.channel);\n return `https://player.twitch.tv/?${q}`;\n }\n case 'facebook':\n return `https://www.facebook.com/plugins/video.php?${new URLSearchParams({ href: raw, autoplay: String(!!at.play), mute: '1', show_text: 'false', show_captions: 'false' })}`;\n case 'tiktok': {\n const m = /\\/video\\/(\\d+)/.exec(u(raw)?.pathname ?? '');\n return m ? `https://www.tiktok.com/embed/v2/${m[1]}?${new URLSearchParams({ autoplay: String(play), muted: '1', controls: '0' })}` : null;\n }\n case 'x': {\n const m = /\\/status(?:es)?\\/(\\d+)/.exec(u(raw)?.pathname ?? '');\n return m ? `https://platform.twitter.com/embed/Tweet.html?${new URLSearchParams({ id: m[1], theme: 'dark', dnt: 'true' })}` : null;\n }\n case 'instagram': {\n const m = /\\/(?:p|reel|reels|tv)\\/([\\w-]+)/.exec(u(raw)?.pathname ?? '');\n return m ? `https://www.instagram.com/p/${m[1]}/embed` : null;\n }\n case 'kick': {\n const name = u(raw)?.pathname.split('/').filter(Boolean)[0];\n return name ? `https://player.kick.com/${encodeURIComponent(name.toLowerCase())}?${new URLSearchParams({ autoplay: String(!!at.play), muted: 'true' })}` : null;\n }\n case 'ted': {\n const m = /\\/talks\\/([\\w-]+)/.exec(u(raw)?.pathname ?? '');\n return m ? `https://embed.ted.com/talks/${m[1]}` : null;\n }\n case 'wistia': {\n const x = u(raw);\n const m = /\\/(?:medias|embed\\/iframe|embed\\/medias)\\/([a-z0-9]+)/i.exec(x?.pathname ?? '') ?? (x && /(^|\\.)wi\\.st$/i.test(x.hostname) ? /\\/([a-z0-9]+)/i.exec(x.pathname) : null);\n return m ? `https://fast.wistia.net/embed/iframe/${m[1]}?${new URLSearchParams({ autoPlay: String(!!at.play), muted: 'true', playbar: 'false', controlsVisibleOnLoad: 'false', time: String(secs(at.t)) })}` : null;\n }\n case 'vidyard': {\n const m = /\\/(?:watch\\/)?([A-Za-z0-9_-]{16,})(?:\\.html)?\\/?$/.exec(u(raw)?.pathname ?? '');\n return m ? `https://play.vidyard.com/${m[1]}.html?${new URLSearchParams({ autoplay: String(play), muted: '1', hidden_controls: '1' })}` : null;\n }\n case 'archive': {\n const m = /\\/(?:details|embed)\\/([^/?#]+)/.exec(u(raw)?.pathname ?? '');\n return m ? `https://archive.org/embed/${m[1]}` : null;\n }\n case 'odysee': {\n const x = u(raw);\n const path = x?.pathname.replace(/^\\/\\$\\/embed\\//, '/').replace(/^\\//, '');\n return path && path.includes(':') ? `https://odysee.com/$/embed/${path}?${new URLSearchParams({ autoplay: 'false', t: String(secs(at.t)) })}` : null;\n }\n case 'bluesky': {\n const m = /\\/profile\\/([^/]+)\\/post\\/([^/?#]+)/.exec(u(raw)?.pathname ?? '');\n return m ? `https://embed.bsky.app/embed/${m[1]}/app.bsky.feed.post/${m[2]}` : null;\n }\n case 'gdrive': {\n const x = u(raw);\n const id = /\\/file\\/d\\/([\\w-]+)/.exec(x?.pathname ?? '')?.[1] ?? x?.searchParams.get('id');\n return id ? `https://drive.google.com/file/d/${id}/preview` : null;\n }\n case 'streamable': {\n const id = u(raw)?.pathname.split('/').filter(Boolean).pop();\n return id ? `https://streamable.com/e/${id}?${new URLSearchParams({ autoplay: String(play), muted: '1', nocontrols: '1' })}${at.t ? `#t=${secs(at.t)}` : ''}` : null;\n }\n default:\n return null;\n }\n}\n\nconst FOLLOWS = new Set(['loom', 'vimeo', 'dailymotion', 'twitch', 'facebook', 'tiktok', 'kick', 'streamable', 'wistia', 'vidyard']);\n\nexport function hasEmbed(raw: string | null | undefined): boolean {\n const site = siteOf(raw);\n return !!raw && !!site && FOLLOWS.has(site.id) && embedUrl(raw, { t: 0, play: false, host: 'localhost' }) != null;\n}\n\nexport function urlFromEmbed(site: string | null | undefined, id: string | null | undefined): string | null {\n const v = id?.trim();\n if (!site || !v) return null;\n switch (site) {\n case 'loom': return /^[0-9a-f]{32}$/i.test(v) ? `https://www.loom.com/share/${v}` : null;\n case 'vimeo': return /^\\d+(\\/[0-9a-z]+)?$/i.test(v) ? `https://vimeo.com/${v}` : null;\n case 'dailymotion': return /^[a-z0-9]+$/i.test(v) ? `https://www.dailymotion.com/video/${v}` : null;\n case 'youtube': return /^[\\w-]{6,}$/.test(v) ? `https://www.youtube.com/watch?v=${v}` : null;\n case 'tiktok': return /^\\d+$/.test(v) ? `https://www.tiktok.com/@_/video/${v}` : null;\n case 'x': return /^\\d+$/.test(v) ? `https://x.com/i/status/${v}` : null;\n case 'instagram': return /^[\\w-]+$/.test(v) ? `https://www.instagram.com/p/${v}/` : null;\n case 'kick': return v.startsWith('channel:') ? `https://kick.com/${encodeURIComponent(v.slice(8))}` : null;\n case 'streamable': return /^\\w+$/.test(v) ? `https://streamable.com/${v}` : null;\n case 'facebook': return /^\\d+$/.test(v) ? `https://www.facebook.com/watch/?v=${v}` : null;\n case 'ted': return /^[\\w-]+$/.test(v) ? `https://www.ted.com/talks/${v}` : null;\n case 'wistia': return /^[a-z0-9]+$/i.test(v) ? `https://fast.wistia.net/embed/iframe/${v}` : null;\n case 'vidyard': return /^[\\w-]{16,}$/.test(v) ? `https://play.vidyard.com/${v}.html` : null;\n case 'archive': return /^[^/?#\\s]+$/.test(v) ? `https://archive.org/details/${v}` : null;\n case 'odysee': return /^[^?#\\s]+:[^?#\\s]+$/.test(v) ? `https://odysee.com/${v}` : null;\n case 'bluesky': return /^[^/\\s]+\\/[^/\\s]+$/.test(v) ? `https://bsky.app/profile/${v.split('/')[0]}/post/${v.split('/')[1]}` : null;\n case 'gdrive': return /^[\\w-]+$/.test(v) ? `https://drive.google.com/file/d/${v}/view` : null;\n case 'twitch':\n if (/^v\\d+$/.test(v)) return `https://www.twitch.tv/videos/${v.slice(1)}`;\n if (v.startsWith('clip:')) return `https://clips.twitch.tv/${encodeURIComponent(v.slice(5))}`;\n if (v.startsWith('channel:')) return `https://www.twitch.tv/${encodeURIComponent(v.slice(8))}`;\n return null;\n default: return null;\n }\n}\n\nexport function sourceVideoUrl(src: { kind?: string; url?: string | null; site?: string | null; embedId?: string | null } | null | undefined): string | null {\n if (!src || src.kind !== 'url') return null;\n return urlFromEmbed(src.site, src.embedId) ?? src.url ?? null;\n}\n\nexport function wistiaId(raw: string): string | null {\n const x = u(raw);\n if (!x) return null;\n const m = /\\/(?:medias|embed\\/iframe|embed\\/medias)\\/([a-z0-9]+)/i.exec(x.pathname) ?? (/(^|\\.)wi\\.st$/i.test(x.hostname) ? /\\/([a-z0-9]+)/i.exec(x.pathname) : null);\n return m ? m[1] : null;\n}\n\nexport function vidyardId(raw: string): string | null {\n const m = /\\/(?:watch\\/)?([A-Za-z0-9_-]{16,})(?:\\.html)?\\/?$/.exec(u(raw)?.pathname ?? '');\n return m ? m[1] : null;\n}\n\nconst SIGNALS: Record<string, RegExp> = { dailymotion: /(^|\\.)dailymotion\\.com$/ };\n\nexport function embedSignal(raw: string | null | undefined): RegExp | null {\n const site = siteOf(raw);\n return site ? SIGNALS[site.id] ?? null : null;\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { embedSignal, embedUrl } from '../core/embeds';\nimport { PlayGlyph } from '../ds/Icons';\n\nexport function EmbedFollow({ url, t, playing, seekN, title, onToggle }: { url: string; t: number; playing: boolean; seekN: number; title: string; onToggle?: () => void }) {\n const tRef = useRef(t); tRef.current = t;\n const [ready, setReady] = useState(false);\n const host = typeof window !== 'undefined' ? window.location.hostname : 'localhost';\n const src = useMemo(() => embedUrl(url, { t: tRef.current, play: playing, host }), [url, playing, seekN, host]); // eslint-disable-line react-hooks/exhaustive-deps\n const [failed, setFailed] = useState(false);\n const heard = useRef(false);\n useEffect(() => {\n const sig = embedSignal(url);\n if (!sig) return;\n heard.current = false;\n setFailed(false);\n const onMsg = (e: MessageEvent) => { try { if (sig.test(new URL(e.origin).hostname)) heard.current = true; } catch { } };\n window.addEventListener('message', onMsg);\n const h = window.setTimeout(() => { if (!heard.current) setFailed(true); }, 8000);\n return () => { window.removeEventListener('message', onMsg); window.clearTimeout(h); };\n }, [url]);\n if (!src || failed) return null;\n return (\n <div className=\"txyt vsp-follow\" style={ready ? { background: '#000' } : undefined}>\n <iframe\n key={src}\n className=\"vsp-embed\"\n src={src}\n title={title}\n style={{ opacity: ready ? 1 : 0, pointerEvents: playing ? 'auto' : 'none' }}\n onLoad={() => setReady(true)}\n allow=\"autoplay; encrypted-media; picture-in-picture; fullscreen\"\n referrerPolicy=\"strict-origin-when-cross-origin\"\n tabIndex={-1}\n aria-hidden=\"true\"\n />\n {!playing && <div aria-hidden=\"true\" className=\"txyt__tap\" onClick={onToggle} style={{ cursor: onToggle ? 'pointer' : 'default' }} />}\n {ready && <div className={`txyt__paused${!playing ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div>}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { PlayGlyph } from '../ds/Icons';\n\ninterface FbPlayer { play(): void; pause(): void; seek(s: number): void; mute(): void; unmute(): void; setVolume(v: number): void; getCurrentPosition(): number }\ninterface FbSdk { init(o: object): void; XFBML: { parse(el?: Element): void }; Event: { subscribe(e: string, cb: (m: { type: string; id: string; instance: FbPlayer }) => void): void; unsubscribe(e: string, cb: unknown): void } }\ntype W = Window & { FB?: FbSdk; fbAsyncInit?: () => void };\n\nlet sdk: Promise<FbSdk | null> | null = null;\n\nfunction loadSdk(): Promise<FbSdk | null> {\n if (sdk) return sdk;\n sdk = new Promise((resolve) => {\n const w = window as W;\n if (w.FB) { resolve(w.FB); return; }\n const prev = w.fbAsyncInit;\n w.fbAsyncInit = () => { prev?.(); w.FB?.init({ xfbml: false, version: 'v19.0' }); resolve(w.FB ?? null); };\n const s = document.createElement('script');\n s.src = 'https://connect.facebook.net/en_US/sdk.js';\n s.async = true;\n s.crossOrigin = 'anonymous';\n s.onerror = () => resolve(null);\n document.body.appendChild(s);\n });\n return sdk;\n}\n\nlet seq = 0;\n\nexport function FacebookFollow({ url, t, playing, seekN, onToggle }: { url: string; t: number; playing: boolean; seekN: number; onToggle?: () => void }) {\n const box = useRef<HTMLDivElement>(null);\n const player = useRef<FbPlayer | null>(null);\n const tRef = useRef(t); tRef.current = t;\n const [ready, setReady] = useState(false);\n const [id] = useState(() => `vsp-fb-${++seq}`);\n useEffect(() => {\n let live = true;\n const el = box.current;\n if (!el) return;\n el.innerHTML = '';\n const host = document.createElement('div');\n host.className = 'fb-video';\n host.id = id;\n host.setAttribute('data-href', url);\n host.setAttribute('data-width', String(Math.max(320, Math.round(el.clientWidth))));\n host.setAttribute('data-allowfullscreen', 'false');\n host.setAttribute('data-show-text', 'false');\n host.setAttribute('data-show-captions', 'false');\n el.appendChild(host);\n let fb: FbSdk | null = null;\n const onReady = (m: { type: string; id: string; instance: FbPlayer }) => {\n if (!live || m.type !== 'video' || m.id !== id) return;\n player.current = m.instance;\n try { m.instance.setVolume(0); m.instance.unmute(); m.instance.setVolume(0); m.instance.seek(Math.max(0, tRef.current)); } catch { }\n setReady(true);\n };\n void loadSdk().then((f) => {\n if (!live || !f) return;\n fb = f;\n f.Event.subscribe('xfbml.ready', onReady);\n f.XFBML.parse(el);\n });\n return () => { live = false; player.current = null; setReady(false); try { fb?.Event.unsubscribe('xfbml.ready', onReady); } catch { } el.innerHTML = ''; };\n }, [url, id]);\n useEffect(() => {\n const p = player.current;\n if (!p || !ready) return;\n try { if (playing) { p.setVolume(0); p.play(); } else p.pause(); } catch { }\n }, [playing, ready]);\n useEffect(() => {\n const p = player.current;\n if (!p || !ready) return;\n try { p.seek(Math.max(0, tRef.current)); } catch { }\n }, [seekN, ready]);\n useEffect(() => {\n const p = player.current;\n if (!p || !ready || !playing) return;\n const h = setInterval(() => {\n try { if (Math.abs(p.getCurrentPosition() - tRef.current) > 1) p.seek(Math.max(0, tRef.current)); } catch { }\n }, 1000);\n return () => clearInterval(h);\n }, [ready, playing]);\n return (\n <div className=\"txyt vsp-follow vsp-fb\" style={ready ? { background: '#000' } : undefined}>\n <div ref={box} className={`vsp-fb__box${playing ? ' vsp-fb__box--live' : ''}`} style={{ opacity: ready ? 1 : 0 }} />\n {ready && !playing && <div aria-hidden=\"true\" className=\"txyt__tap\" onClick={onToggle} style={{ cursor: onToggle ? 'pointer' : 'default' }} />}\n {ready && <div className={`txyt__paused${!playing ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div>}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { PlayGlyph } from '../ds/Icons';\n\ninterface WVideo { play(): void; pause(): void; time(t?: number): number; mute(): void; volume(v?: number): number; hashedId(): string }\ntype W = Window & { _wq?: unknown[] };\n\nlet script: Promise<void> | null = null;\n\nfunction loadScript(): Promise<void> {\n if (script) return script;\n script = new Promise((resolve) => {\n const s = document.createElement('script');\n s.src = 'https://fast.wistia.net/assets/external/E-v1.js';\n s.async = true;\n s.onload = () => resolve();\n s.onerror = () => resolve();\n document.head.appendChild(s);\n });\n return script;\n}\n\nexport function WistiaFollow({ id, t, playing, seekN, onToggle }: { id: string; t: number; playing: boolean; seekN: number; onToggle?: () => void }) {\n const video = useRef<WVideo | null>(null);\n const tRef = useRef(t); tRef.current = t;\n const playRef = useRef(playing); playRef.current = playing;\n const [ready, setReady] = useState(false);\n useEffect(() => {\n let live = true;\n const w = window as W;\n w._wq = w._wq || [];\n w._wq.push({\n id,\n onReady: (v: WVideo) => {\n if (!live) return;\n video.current = v;\n try { v.mute(); v.time(Math.max(0, tRef.current)); if (playRef.current) v.play(); } catch { }\n setReady(true);\n },\n });\n void loadScript();\n return () => { live = false; video.current = null; setReady(false); };\n }, [id]);\n useEffect(() => {\n const v = video.current;\n if (!v || !ready) return;\n try { if (playing) { v.time(Math.max(0, tRef.current)); v.play(); } else v.pause(); } catch { }\n }, [playing, ready]);\n useEffect(() => {\n const v = video.current;\n if (!v || !ready) return;\n try { v.time(Math.max(0, tRef.current)); } catch { }\n }, [seekN, ready]);\n useEffect(() => {\n const v = video.current;\n if (!v || !ready || !playing) return;\n const h = setInterval(() => {\n try { if (Math.abs(v.time() - tRef.current) > 0.5) v.time(Math.max(0, tRef.current)); } catch { }\n }, 500);\n return () => clearInterval(h);\n }, [ready, playing]);\n const src = `https://fast.wistia.net/embed/iframe/${encodeURIComponent(id)}?${new URLSearchParams({ muted: 'true', playbar: 'false', controlsVisibleOnLoad: 'false', playButton: 'false', smallPlayButton: 'false', volumeControl: 'false', fullscreenButton: 'false', settingsControl: 'false', endVideoBehavior: 'reset' })}`;\n return (\n <div className=\"txyt vsp-follow\" style={ready ? { background: '#000' } : undefined}>\n <iframe src={src} className=\"wistia_embed vsp-embed\" name=\"wistia_embed\" title=\"Video\" allow=\"autoplay; fullscreen\" style={{ opacity: ready ? 1 : 0, pointerEvents: playing ? 'auto' : 'none' }} tabIndex={-1} aria-hidden=\"true\" />\n {!playing && <div aria-hidden=\"true\" className=\"txyt__tap\" onClick={onToggle} style={{ cursor: onToggle ? 'pointer' : 'default' }} />}\n {ready && <div className={`txyt__paused${!playing ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div>}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { PlayGlyph } from '../ds/Icons';\n\ninterface VPlayer { play(): void; pause(): void; seek(s: number): void; currentTime(): number; setVolume(v: number): void; uuid: string }\ninterface VApi { renderPlayer(o: { uuid: string; container: HTMLElement; type?: string; autoplay?: number; muted?: number; controls?: number }): Promise<VPlayer> }\ntype W = Window & { VidyardV4?: { api: VApi } };\n\nlet script: Promise<VApi | null> | null = null;\n\nfunction loadApi(): Promise<VApi | null> {\n if (script) return script;\n script = new Promise((resolve) => {\n const w = window as W;\n if (w.VidyardV4) { resolve(w.VidyardV4.api); return; }\n const s = document.createElement('script');\n s.src = 'https://play.vidyard.com/embed/v4.js';\n s.async = true;\n s.onload = () => {\n const started = Date.now();\n const wait = () => { if (w.VidyardV4) resolve(w.VidyardV4.api); else if (Date.now() - started > 8000) resolve(null); else setTimeout(wait, 50); };\n wait();\n };\n s.onerror = () => resolve(null);\n document.head.appendChild(s);\n });\n return script;\n}\n\nexport function VidyardFollow({ uuid, t, playing, seekN, onToggle }: { uuid: string; t: number; playing: boolean; seekN: number; onToggle?: () => void }) {\n const box = useRef<HTMLDivElement>(null);\n const player = useRef<VPlayer | null>(null);\n const tRef = useRef(t); tRef.current = t;\n const playRef = useRef(playing); playRef.current = playing;\n const [ready, setReady] = useState(false);\n useEffect(() => {\n let live = true;\n const el = box.current;\n if (!el) return;\n el.innerHTML = '';\n void loadApi().then((api) => {\n if (!live || !api) return;\n return api.renderPlayer({ uuid, container: el, type: 'inline', autoplay: 0, muted: 1, controls: 0 }).then((p) => {\n if (!live) return;\n player.current = p;\n try { p.setVolume(0); p.seek(Math.max(0, tRef.current)); if (playRef.current) p.play(); } catch { }\n setReady(true);\n });\n }).catch(() => {});\n return () => { live = false; player.current = null; setReady(false); el.innerHTML = ''; };\n }, [uuid]);\n useEffect(() => {\n const p = player.current;\n if (!p || !ready) return;\n try { if (playing) { p.seek(Math.max(0, tRef.current)); p.play(); } else p.pause(); } catch { }\n }, [playing, ready]);\n useEffect(() => {\n const p = player.current;\n if (!p || !ready) return;\n try { p.seek(Math.max(0, tRef.current)); } catch { }\n }, [seekN, ready]);\n useEffect(() => {\n const p = player.current;\n if (!p || !ready || !playing) return;\n const h = setInterval(() => {\n try { if (Math.abs(p.currentTime() - tRef.current) > 0.5) p.seek(Math.max(0, tRef.current)); } catch { }\n }, 500);\n return () => clearInterval(h);\n }, [ready, playing]);\n return (\n <div className=\"txyt vsp-follow\" style={ready ? { background: '#000' } : undefined}>\n <div ref={box} className={`vsp-fb__box${playing ? ' vsp-fb__box--live' : ''}`} style={{ opacity: ready ? 1 : 0 }} />\n {!playing && <div aria-hidden=\"true\" className=\"txyt__tap\" onClick={onToggle} style={{ cursor: onToggle ? 'pointer' : 'default' }} />}\n {ready && <div className={`txyt__paused${!playing ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div>}\n </div>\n );\n}\n","import type { FollowSetup } from '../ui/FileFollow';\n\nexport async function loomStreamUrl(id: string): Promise<string | null> {\n try {\n const r = await fetch(`https://www.loom.com/api/campaigns/sessions/${id}/raw-url`, { method: 'POST' });\n if (!r.ok || r.status === 204) return null;\n const j = await r.json() as { url?: unknown };\n return typeof j.url === 'string' && /^https:\\/\\//.test(j.url) ? j.url : null;\n } catch {\n return null;\n }\n}\n\nexport function signedLoader(master: string) {\n const query = master.includes('?') ? master.slice(master.indexOf('?') + 1) : '';\n return (xhr: XMLHttpRequest, u: string) => { if (query && !u.includes('Signature=')) xhr.open('GET', u + (u.includes('?') ? '&' : '?') + query, true); };\n}\n\nexport function loomSetup(id: string): FollowSetup {\n return (v, fail) => {\n let live = true;\n let destroy: (() => void) | null = null;\n void (async () => {\n const url = await loomStreamUrl(id);\n if (!live) return;\n if (!url) { fail(); return; }\n const mod = await import('hls.js').catch(() => null);\n if (!live) return;\n const Hls = mod?.default;\n if (!Hls || !Hls.isSupported()) { fail(); return; }\n const hls = new Hls({ xhrSetup: signedLoader(url), capLevelToPlayerSize: true, startLevel: 0, maxBufferLength: 20 });\n hls.on(Hls.Events.ERROR, (_e, d) => { if (d.fatal) { hls.destroy(); fail(); } });\n hls.loadSource(url);\n hls.attachMedia(v);\n destroy = () => hls.destroy();\n })();\n return () => { live = false; destroy?.(); };\n };\n}\n","import { useEffect, useState } from 'react';\n\nconst cache = new Map<string, string | null>();\n\nexport function useYtTitle(ytId: string | null): string | null {\n const [title, setTitle] = useState<string | null>(() => (ytId ? cache.get(ytId) ?? null : null));\n useEffect(() => {\n if (!ytId) { setTitle(null); return; }\n if (cache.has(ytId)) { setTitle(cache.get(ytId) ?? null); return; }\n let live = true;\n fetch(`https://www.youtube.com/oembed?format=json&url=${encodeURIComponent(`https://www.youtube.com/watch?v=${ytId}`)}`)\n .then((r) => (r.ok ? r.json() : null))\n .then((j: { title?: unknown } | null) => {\n const t = j && typeof j.title === 'string' && j.title.trim() ? j.title.trim() : null;\n cache.set(ytId, t);\n if (live) setTitle(t);\n })\n .catch(() => { cache.set(ytId, null); });\n return () => { live = false; };\n }, [ytId]);\n return title;\n}\n\nconst HASH = /^(?:[0-9a-f]{16,}|(?:https?:\\/\\/)?(?:[\\w-]+\\.)+[a-z]{2,}(?::\\d+)?\\/\\S*)$/i;\nconst ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport function displayName(parts: { name?: string | null; sourceName?: string | null; ytTitle?: string | null; url?: string | null; id: string }): string {\n const clean = (s?: string | null) => { const t = s?.trim(); return t && t !== parts.id && !ID.test(t) && !HASH.test(t) ? t : null; };\n const host = (() => { if (!parts.url) return null; try { return new URL(parts.url).hostname.replace(/^www\\./, ''); } catch { return null; } })();\n return clean(parts.name) ?? clean(parts.sourceName) ?? clean(parts.ytTitle) ?? host ?? (ID.test(parts.id) ? 'VocalStack' : parts.id);\n}\n","import { useEffect, useRef, useState } from 'react';\n\nexport type BedState = 'off' | 'making' | 'ready' | 'unavailable';\n\nexport const BED_DRIFT_S = 0.3;\n\nexport interface BedMedia {\n currentTime: number;\n paused: boolean;\n muted: boolean;\n play: () => Promise<void> | void;\n pause: () => void;\n}\n\nexport function followBed(a: BedMedia, want: { t: number; playing: boolean; muted: boolean }): void {\n a.muted = want.muted;\n if (Math.abs(a.currentTime - want.t) > BED_DRIFT_S) a.currentTime = Math.max(0, want.t);\n if (want.playing) {\n if (a.paused) void Promise.resolve(a.play()).catch(() => {});\n } else if (!a.paused) a.pause();\n}\n\nexport const REMOVE_BG_LABEL = 'Remove background sound';\nexport const REMOVE_BG_NOTE = \"Takes out everything that isn't speech: music, ambience and noise.\";\n\nfunction clockOf(s: number): string {\n const t = Math.max(0, Math.floor(s));\n const h = Math.floor(t / 3600);\n const m = Math.floor((t % 3600) / 60);\n const sec = String(t % 60).padStart(2, '0');\n return h ? `${h}:${String(m).padStart(2, '0')}:${sec}` : `${m}:${sec}`;\n}\n\nexport function bedNote(on: boolean, state: BedState, what: 'transcription' | 'video' = 'transcription', untilS = 0): string {\n if (state === 'unavailable') return `Not available for this ${what}`;\n if (state === 'making') return untilS > 0 ? `Separating the speech from the background… ready up to ${clockOf(untilS)}` : 'Separating the speech from the background…';\n return REMOVE_BG_NOTE;\n}\n\nexport interface TrackPlan {\n bed: boolean;\n speech: boolean;\n}\n\nexport function trackPlan(removeBg: boolean, voiceOn: boolean): TrackPlan {\n return { bed: voiceOn && !removeBg, speech: !voiceOn && removeBg };\n}\n\nexport function removeBgOf(stored: boolean | null, oldKeep: boolean | null): boolean {\n if (typeof stored === 'boolean') return stored;\n return oldKeep === false;\n}\n\nexport function removeBgFromQuery(q: URLSearchParams): boolean {\n const v = q.get('bg');\n return v === 'off' || v === 'remove';\n}\n\nexport function withRemoveBg(u: URL, removeBg: boolean): void {\n if (removeBg) u.searchParams.set('bg', 'remove'); else u.searchParams.delete('bg');\n}\n\nexport function bedRetryS(status: number, body: unknown): number | null {\n if (status !== 503) return null;\n const s = (body as { data?: { details?: { retryAfterS?: unknown } } } | null)?.data?.details?.retryAfterS;\n return typeof s === 'number' && s > 0 ? Math.max(2, s) : 3;\n}\n\nexport interface SepPart {\n startS: number;\n endS: number;\n url: string;\n}\n\nexport const SEAM_S = 0.05;\n\nexport function partsOf(body: unknown): { untilS: number; parts: SepPart[] } {\n const d = (body as { data?: { details?: { parts?: unknown } } } | null)?.data?.details?.parts;\n const parts: SepPart[] = [];\n if (Array.isArray(d)) {\n for (const x of d as Array<Partial<SepPart>>) {\n if (!x || typeof x.startS !== 'number' || typeof x.endS !== 'number' || typeof x.url !== 'string' || !(x.endS > x.startS)) break;\n const at = parts.length ? parts[parts.length - 1].endS : 0;\n if (Math.abs(x.startS - at) > 0.01) break;\n parts.push({ startS: x.startS, endS: x.endS, url: x.url });\n }\n }\n return { untilS: parts.length ? parts[parts.length - 1].endS : 0, parts };\n}\n\nexport function partAt(parts: SepPart[], t: number): number {\n if (!parts.length || t < 0 || t >= parts[parts.length - 1].endS - SEAM_S) return -1;\n let lo = 0;\n let hi = parts.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (parts[mid].startS <= t) lo = mid; else hi = mid - 1;\n }\n return lo;\n}\n\nexport function slotsFor(parts: SepPart[], i: number, held: [number, number], cur: 0 | 1): { play: 0 | 1; load: Array<[0 | 1, number]> } {\n const want = parts[i].startS;\n const play: 0 | 1 = held[cur] === want ? cur : held[1 - cur] === want ? ((1 - cur) as 0 | 1) : cur;\n const load: Array<[0 | 1, number]> = [];\n if (held[play] !== want) load.push([play, i]);\n const other = (1 - play) as 0 | 1;\n if (i + 1 < parts.length && held[other] !== parts[i + 1].startS) load.push([other, i + 1]);\n return { play, load };\n}\n\ntype Probe = { ready: true } | { ready: false; retryS: number | null; untilS: number; parts: SepPart[] };\n\nasync function probe(url: string): Promise<Probe> {\n const r = await fetch(url, { redirect: 'manual', credentials: 'omit' });\n if (r.type === 'opaqueredirect' || (r.status >= 300 && r.status < 400) || r.ok) return { ready: true };\n const body = await r.json().catch(() => null);\n return { ready: false, retryS: bedRetryS(r.status, body), ...partsOf(body) };\n}\n\nexport interface Separated {\n state: BedState;\n on: boolean;\n untilS: number;\n}\n\ntype Want = { t: number; playing: boolean; muted: boolean };\n\nfunction release(a: HTMLAudioElement | null): void {\n if (!a) return;\n a.pause();\n a.removeAttribute('src');\n a.load();\n}\n\nexport function useSeparatedTrack(url: string | null, want: Want): Separated {\n const [state, setState] = useState<BedState>('off');\n const [parts, setParts] = useState<SepPart[]>([]);\n const [on, setOn] = useState(false);\n const full = useRef<HTMLAudioElement | null>(null);\n const els = useRef<[HTMLAudioElement | null, HTMLAudioElement | null]>([null, null]);\n const held = useRef<[number, number]>([NaN, NaN]);\n const cur = useRef<0 | 1>(0);\n useEffect(() => {\n setParts([]);\n setOn(false);\n if (!url) { setState('off'); return; }\n let stop = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n setState('making');\n const check = () => {\n probe(url).then((r) => {\n if (stop) return;\n if (r.ready) {\n const a = new Audio();\n a.preload = 'auto';\n const done = () => { if (!stop && full.current === a) setState('ready'); };\n a.addEventListener('canplay', done, { once: true });\n a.addEventListener('error', done, { once: true });\n a.src = url;\n full.current = a;\n return;\n }\n if (r.retryS == null) { setState('unavailable'); setParts([]); return; }\n setParts((old) => (old.length === r.parts.length && old.every((p, i) => p.startS === r.parts[i].startS) ? old : r.parts));\n timer = setTimeout(check, r.retryS * 1000);\n }).catch(() => { if (!stop) timer = setTimeout(check, 5000); });\n };\n check();\n return () => {\n stop = true;\n if (timer) clearTimeout(timer);\n release(full.current);\n full.current = null;\n release(els.current[0]);\n release(els.current[1]);\n els.current = [null, null];\n held.current = [NaN, NaN];\n };\n }, [url]);\n useEffect(() => {\n const pauseParts = () => { for (const a of els.current) if (a && !a.paused) a.pause(); };\n if (state === 'ready' && full.current) {\n pauseParts();\n followBed(full.current, want);\n setOn(true);\n return;\n }\n const i = state === 'making' ? partAt(parts, want.t) : -1;\n if (i < 0) { pauseParts(); setOn(false); return; }\n const plan = slotsFor(parts, i, held.current, cur.current);\n for (const [slot, n] of plan.load) {\n let a = els.current[slot];\n if (!a) { a = new Audio(); a.preload = 'auto'; els.current[slot] = a; }\n a.pause();\n a.src = parts[n].url;\n held.current[slot] = parts[n].startS;\n }\n cur.current = plan.play;\n const a = els.current[plan.play]!;\n const other = els.current[(1 - plan.play) as 0 | 1];\n if (other && !other.paused) other.pause();\n followBed(a, { ...want, t: want.t - parts[i].startS });\n setOn(!want.playing || a.readyState >= 3);\n }, [state, parts, want.t, want.playing, want.muted]); // eslint-disable-line react-hooks/exhaustive-deps\n return { state, on, untilS: state === 'ready' ? Infinity : parts.length ? parts[parts.length - 1].endS : 0 };\n}\n\nexport function useBackgroundBed(url: string | null, want: Want): BedState {\n return useSeparatedTrack(url, want).state;\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\n\nexport interface FollowLine { sid: number; start: number; end: number }\nexport interface FollowClip { src: string; part: number; parts: number; durationS?: number | null }\n\nexport type FollowTarget =\n | { kind: 'play'; sid: number; src: string; offset: number }\n | { kind: 'missing'; sid: number }\n | { kind: 'done'; sid: number }\n | { kind: 'none' };\n\nexport const FOLLOW_DRIFT_S = 0.5;\nexport const FOLLOW_AHEAD = 3;\n\nexport function lineAt(lines: readonly FollowLine[], t: number): number {\n let k = -1;\n for (let i = 0; i < lines.length && lines[i].start <= t + 0.02; i++) k = i;\n return k;\n}\n\nexport function followTarget(lines: readonly FollowLine[], clips: ReadonlyMap<number, readonly FollowClip[]>, t: number): FollowTarget {\n const k = lineAt(lines, t);\n if (k < 0) return { kind: 'none' };\n const line = lines[k];\n if (t >= line.end) return { kind: 'none' };\n const parts = [...(clips.get(line.sid) ?? [])].sort((a, b) => a.part - b.part);\n if (!parts.length) return { kind: 'missing', sid: line.sid };\n const total = Math.max(1, ...parts.map((p) => p.parts));\n let elapsed = Math.max(0, t - line.start);\n for (let p = 0; p < total; p++) {\n const c = parts.find((x) => x.part === p);\n if (!c) return { kind: 'missing', sid: line.sid };\n const d = c.durationS && c.durationS > 0 ? c.durationS : Infinity;\n if (elapsed < d) return { kind: 'play', sid: line.sid, src: c.src, offset: elapsed };\n elapsed -= d;\n }\n return { kind: 'done', sid: line.sid };\n}\n\nexport function mayRunOn(lines: readonly FollowLine[], t: number, playingSid: number | null): boolean {\n if (playingSid == null) return false;\n const k = lineAt(lines, t);\n if (k < 0) return false;\n const line = lines[k];\n if (t >= line.end) return line.sid === playingSid;\n return k > 0 && lines[k - 1].sid === playingSid && t - line.start < 1.5;\n}\n\nexport function upcomingSrcs(lines: readonly FollowLine[], clips: ReadonlyMap<number, readonly FollowClip[]>, t: number, n = FOLLOW_AHEAD): string[] {\n const k = Math.max(0, lineAt(lines, t));\n const out: string[] = [];\n for (let i = k; i < lines.length && i <= k + n; i++) {\n const first = (clips.get(lines[i].sid) ?? []).find((c) => c.part === 0);\n if (first) out.push(first.src);\n }\n return out;\n}\n\nexport interface FollowState { missing: number | null; sid: number | null }\n\nexport function useVoiceFollow(o: { on: boolean; lines: readonly FollowLine[]; clips: readonly (FollowClip & { sentenceId: number })[]; t: number; playing: boolean; muted: boolean }): FollowState {\n const bySid = useMemo(() => {\n const m = new Map<number, FollowClip[]>();\n for (const c of o.clips) m.set(c.sentenceId, [...(m.get(c.sentenceId) ?? []), c]);\n return m;\n }, [o.clips]);\n const cache = useRef(new Map<string, HTMLAudioElement>());\n const cur = useRef<{ src: string; sid: number; el: HTMLAudioElement } | null>(null);\n const [state, setState] = useState<FollowState>({ missing: null, sid: null });\n const el = (src: string) => {\n let a = cache.current.get(src);\n if (!a) {\n a = new Audio();\n a.preload = 'auto';\n a.src = src;\n cache.current.set(src, a);\n }\n return a;\n };\n const stopCurrent = () => { cur.current?.el.pause(); cur.current = null; };\n useEffect(() => () => { for (const a of cache.current.values()) { a.pause(); a.removeAttribute('src'); } cache.current.clear(); cur.current = null; }, []);\n useEffect(() => {\n if (!o.on) { stopCurrent(); setState((s) => (s.missing == null && s.sid == null ? s : { missing: null, sid: null })); return; }\n const want = followTarget(o.lines, bySid, o.t);\n const missing = want.kind === 'missing' ? want.sid : null;\n const sid = want.kind === 'none' ? null : want.sid;\n setState((s) => (s.missing === missing && s.sid === sid ? s : { missing, sid }));\n const keep = new Set(upcomingSrcs(o.lines, bySid, o.t));\n for (const src of keep) el(src);\n const c = cur.current;\n if (c) keep.add(c.src);\n for (const [src, a] of cache.current) if (!keep.has(src) && (!c || c.el !== a)) { a.pause(); cache.current.delete(src); }\n if (!o.playing) { c?.el.pause(); return; }\n if (want.kind !== 'play') {\n const stillSpeaking = c && !c.el.paused && !c.el.ended;\n if (stillSpeaking && mayRunOn(o.lines, o.t, c.sid)) return;\n if (c) c.el.pause();\n cur.current = null;\n return;\n }\n if (c && c.src === want.src) {\n c.el.muted = o.muted;\n if (!c.el.ended && Math.abs(c.el.currentTime - want.offset) > FOLLOW_DRIFT_S) { try { c.el.currentTime = want.offset; } catch { } }\n if (c.el.paused && !c.el.ended) void c.el.play().catch(() => {});\n return;\n }\n c?.el.pause();\n const a = el(want.src);\n a.muted = o.muted;\n try { a.currentTime = want.offset; } catch { }\n cur.current = { src: want.src, sid: want.sid, el: a };\n void a.play().catch(() => {});\n }, [o.on, o.t, o.playing, o.muted, o.lines, bySid]); // eslint-disable-line react-hooks/exhaustive-deps\n return state;\n}\n","import { useEffect, useRef } from 'react';\n\nexport type MediaKey = 'play' | 'pause' | 'stop' | 'nexttrack' | 'previoustrack';\n\nexport interface MediaKeyTarget {\n playing: boolean;\n toggle: () => void;\n next?: () => void;\n prev?: () => void;\n}\n\nexport const MEDIA_KEYS: MediaKey[] = ['play', 'pause', 'stop', 'nexttrack', 'previoustrack'];\n\nexport function onMediaKey(key: MediaKey, t: MediaKeyTarget): void {\n if (key === 'play') { if (!t.playing) t.toggle(); return; }\n if (key === 'pause' || key === 'stop') { if (t.playing) t.toggle(); return; }\n if (key === 'nexttrack') { t.next?.(); return; }\n t.prev?.();\n}\n\nexport interface MediaSessionLike {\n setActionHandler: (action: MediaKey, handler: (() => void) | null) => void;\n}\n\nexport function bindMediaKeys(ms: MediaSessionLike, get: () => MediaKeyTarget | null): () => void {\n for (const k of MEDIA_KEYS) {\n try { ms.setActionHandler(k, () => { const t = get(); if (t) onMediaKey(k, t); }); } catch { }\n }\n return () => {\n for (const k of MEDIA_KEYS) {\n try { ms.setActionHandler(k, null); } catch { }\n }\n };\n}\n\nexport function useMediaKeys(target: MediaKeyTarget | null, title?: string | null): void {\n const ref = useRef(target);\n ref.current = target;\n const on = !!target;\n useEffect(() => {\n const ms = typeof navigator !== 'undefined' ? navigator.mediaSession : undefined;\n if (!ms || !on) return;\n return bindMediaKeys(ms, () => ref.current);\n }, [on]);\n const playing = !!target?.playing;\n useEffect(() => {\n const ms = typeof navigator !== 'undefined' ? navigator.mediaSession : undefined;\n if (!ms || !on) return;\n ms.playbackState = playing ? 'playing' : 'paused';\n }, [on, playing]);\n useEffect(() => {\n const ms = typeof navigator !== 'undefined' ? navigator.mediaSession : undefined;\n if (!ms || !on || !title || typeof MediaMetadata === 'undefined') return;\n try { ms.metadata = new MediaMetadata({ title, artist: 'VocalStack' }); } catch { }\n }, [on, title]);\n}\n","export function clock(s: number): string {\n const t = Math.max(0, Math.floor(s));\n const h = Math.floor(t / 3600), m = Math.floor((t % 3600) / 60), sec = t % 60;\n const mm = String(m).padStart(2, '0'), ss = String(sec).padStart(2, '0');\n return h > 0 ? `${h}:${mm}:${ss}` : `${mm}:${ss}`;\n}\n\nexport function durationLabel(s?: number | null): string {\n if (!s || s <= 0) return '—';\n const m = Math.round(s / 60);\n if (m < 1) return `${Math.round(s)}s`;\n if (m < 60) return `${m} min`;\n const h = Math.floor(m / 60), r = m % 60;\n return `${h} h ${String(r).padStart(2, '0')} min`;\n}\n\nconst WD = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nconst MON = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'];\n\nexport function monDay(iso?: string | null): { mon: string; day: string } {\n if (!iso) return { mon: '—', day: '' };\n const d = new Date(iso);\n return { mon: MON[d.getMonth()], day: String(d.getDate()).padStart(2, '0') };\n}\n\nexport function timeOfDay(iso?: string | null): string {\n if (!iso) return '';\n const d = new Date(iso);\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`;\n}\n\nexport function recordingWhen(iso?: string | null): string {\n if (!iso) return '';\n const d = new Date(iso);\n const mon = MON[d.getMonth()];\n return `${WD[d.getDay()]}, ${String(d.getDate()).padStart(2, '0')} ${mon[0]}${mon.slice(1).toLowerCase()} · ${timeOfDay(iso)}`;\n}\n\nfunction sameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n}\n\nexport function dayGroup(iso?: string | null): string {\n if (!iso) return 'UNDATED';\n const d = new Date(iso), now = new Date();\n if (sameDay(d, now)) return 'TODAY';\n const y = new Date(now); y.setDate(y.getDate() - 1);\n if (sameDay(d, y)) return 'YESTERDAY';\n const days = (now.getTime() - d.getTime()) / 86400000;\n if (days < 7) return 'LAST WEEK';\n if (days < 31) return 'LAST MONTH';\n return 'OLDER';\n}\n\nexport function whenLabel(iso?: string | null): string {\n if (!iso) return 'Recording';\n const d = new Date(iso), now = new Date();\n const t = timeOfDay(iso);\n if (sameDay(d, now)) return `Today at ${t}`;\n return `${d.toLocaleDateString(undefined, { day: 'numeric', month: 'short' })} at ${t}`;\n}\n\nexport function ago(iso?: string | null): string {\n if (!iso) return '';\n const s = Math.max(0, (Date.now() - new Date(iso).getTime()) / 1000);\n if (s < 60) return 'just now';\n if (s < 3600) return `${Math.round(s / 60)} min ago`;\n if (s < 86400) return `${Math.round(s / 3600)} h ago`;\n const d = Math.round(s / 86400);\n return d === 1 ? 'yesterday' : `${d} days ago`;\n}\n\nexport function dwell(s: number): string {\n const m = Math.floor(s / 60), sec = Math.floor(s % 60);\n return `${String(m).padStart(2, '0')}:${String(sec).padStart(2, '0')}`;\n}\n\nexport function highlightParts(text: string, query: string): { t: string; hit: boolean }[] {\n const q = query.trim();\n if (!q) return [{ t: text, hit: false }];\n const tokens = q.toLowerCase().split(/\\s+/).filter((t) => t.length > 1);\n if (!tokens.length) return [{ t: text, hit: false }];\n const re = new RegExp(`(${tokens.map((t) => t.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('|')})`, 'ig');\n const out: { t: string; hit: boolean }[] = [];\n let last = 0;\n for (const m of text.matchAll(re)) {\n const i = m.index ?? 0;\n if (i > last) out.push({ t: text.slice(last, i), hit: false });\n out.push({ t: m[0], hit: true });\n last = i + m[0].length;\n }\n if (last < text.length) out.push({ t: text.slice(last), hit: false });\n return out;\n}\n\nexport function pluralize(n: number, one: string, many = `${one}s`) {\n return `${n} ${n === 1 ? one : many}`;\n}\n","import type { Correction, TranscriptSnapshot } from '@vocalstack/js-sdk';\n\nexport function fixedSlots(corrections: Correction[]): Set<string> {\n const evs: { at: string; c: Correction; undo: boolean }[] = [];\n for (const c of corrections) {\n if (c.kind !== 'word' || c.seq == null || c.wordIdx == null) continue;\n evs.push({ at: c.appliedAt, c, undo: false });\n if (c.revertedAt) evs.push({ at: c.revertedAt, c, undo: true });\n }\n evs.sort((a, b) => (a.at < b.at ? -1 : a.at > b.at ? 1 : a.undo === b.undo ? 0 : a.undo ? 1 : -1));\n const slots = new Map<string, { seq: number; idx: number; n: number }>();\n for (const { c, undo } of evs) {\n const seq = c.seq as number, idx = c.wordIdx as number;\n const n = Math.max(1, c.to.split(/\\s+/).filter(Boolean).length);\n if (undo) {\n const s = slots.get(c.id);\n if (!s) continue;\n slots.delete(c.id);\n for (const o of slots.values()) if (o.seq === s.seq && o.idx > s.idx) o.idx -= s.n - 1;\n } else {\n for (const o of slots.values()) if (o.seq === seq && o.idx > idx) o.idx += n - 1;\n slots.set(c.id, { seq, idx, n });\n }\n }\n const out = new Set<string>();\n for (const s of slots.values()) for (let k = 0; k < s.n; k++) out.add(`${s.seq}:${s.idx + k}`);\n return out;\n}\n\nexport interface Word {\n text: string;\n prob?: number | null;\n start: number;\n end: number;\n alts?: { text: string; prob: number }[];\n script?: boolean;\n recognized?: string;\n seq: number;\n idx: number;\n}\n\nexport interface Row {\n id: string;\n sentenceId?: number;\n seqs: number[];\n speaker: number;\n start: number;\n end?: number;\n wallStart: number;\n text: string;\n words: Word[];\n status: 'open' | 'closed';\n settled: boolean;\n corrected: boolean;\n catchup: boolean;\n suppressed: boolean;\n unclear?: boolean;\n confidence?: number;\n latencyS?: number;\n language?: string;\n translations: Record<string, string>;\n provisional: boolean;\n translationLatencyS?: Record<string, number>;\n}\n\nexport interface Segment {\n seq: number;\n speaker: number;\n start: number;\n end: number;\n text: string;\n words: Word[];\n catchup: boolean;\n corrected: boolean;\n settled: boolean;\n suppressed: boolean;\n unclear?: boolean;\n confidence?: number;\n latencyS?: number;\n language?: string;\n translations: Record<string, string>;\n scriptPos?: number;\n scriptFrom?: number;\n}\n\nexport interface Model {\n segments: Map<number, Segment>;\n sentences: Map<number, Omit<Row, 'words' | 'text' | 'seqs'> & { text: string; seqs: number[] }>;\n speakers: Record<number, string>;\n speakerSpeechS: Record<number, number>;\n speakerSex: Record<number, 'male' | 'female'>;\n speakerIds: Record<number, { name: string; voiceId?: string; color?: string; confidence?: number; tone?: boolean }>;\n labels?: 'auto' | 'on' | 'off';\n lastSeq: number;\n state: string;\n spans: { wallStart: number; wallEnd?: number | null; mediaStart: number; mediaEnd?: number | null }[];\n held?: { fromMediaS: number; language?: string } | null;\n numbers?: Map<number, number>;\n}\n\nexport function empty(): Model {\n return {\n segments: new Map(),\n sentences: new Map(),\n speakers: {},\n speakerSpeechS: {},\n speakerSex: {},\n speakerIds: {},\n lastSeq: -1,\n state: 'pending',\n spans: [],\n };\n}\n\nexport function mediaToWall(m: Model, media: number): number {\n for (const s of m.spans) {\n const end = s.mediaEnd ?? Infinity;\n if (media < end || s.mediaEnd == null) return s.wallStart + Math.max(0, media - s.mediaStart);\n }\n const last = m.spans[m.spans.length - 1];\n return last ? (last.wallEnd ?? last.wallStart) + Math.max(0, media - (last.mediaEnd ?? last.mediaStart)) : media;\n}\n\nfunction toWords(seq: number, raw: any[] | undefined): Word[] {\n return (raw ?? []).map((w, i) => ({ text: String(w.text ?? ''), prob: w.prob ?? null, start: w.start ?? 0, end: w.end ?? 0, alts: w.alts, ...(w.script === true ? { script: true } : {}), ...(w.script === true && typeof w.recognized === 'string' ? { recognized: w.recognized } : {}), seq, idx: i }));\n}\n\nexport function fromSnapshot(snap: TranscriptSnapshot, base?: Model): Model {\n const m = base ?? empty();\n delete m.numbers;\n m.state = snap.state;\n if (snap.speakerLabels) m.labels = snap.speakerLabels;\n m.lastSeq = Math.max(m.lastSeq, snap.lastSeq);\n m.spans = snap.spans.map((s) => ({ wallStart: s.wallStart, wallEnd: s.wallEnd ?? null, mediaStart: s.mediaStart, mediaEnd: s.mediaEnd ?? null }));\n for (const s of snap.segments) {\n const sp = (s as { scriptPos?: number | null }).scriptPos;\n m.segments.set(s.seq, {\n scriptPos: sp ?? undefined,\n scriptFrom: (s as { scriptFrom?: number | null }).scriptFrom ?? undefined,\n seq: s.seq,\n speaker: s.speaker,\n start: s.start,\n end: s.end,\n text: s.text,\n words: toWords(s.seq, s.words as any),\n catchup: !!s.catchup,\n corrected: !!s.corrected,\n settled: !!s.settled,\n suppressed: !!s.suppressed,\n unclear: !!s.unclear,\n confidence: s.confidence ?? undefined,\n latencyS: s.latencyS ?? undefined,\n language: s.language ?? undefined,\n translations: (s.translations as Record<string, string>) ?? {},\n });\n }\n for (const s of snap.sentences) {\n m.sentences.set(s.sentenceId, {\n id: `s:${s.sentenceId}`,\n sentenceId: s.sentenceId,\n seqs: s.seqs,\n speaker: s.speaker,\n start: s.start,\n wallStart: s.wallStart,\n text: s.text,\n status: s.status === 'open' ? 'open' : 'closed',\n settled: !!s.settled,\n corrected: false,\n catchup: false,\n suppressed: !!s.suppressed,\n unclear: !!s.unclear,\n language: s.language ?? undefined,\n translations: (s.translations as Record<string, string>) ?? {},\n provisional: !!s.provisional,\n });\n }\n m.speakers = Object.fromEntries(\n snap.speakers.filter((s) => !!s.name).map((s) => [s.speaker, s.name]),\n );\n m.speakerSpeechS = Object.fromEntries(\n snap.speakers.filter((s) => typeof s.speechS === 'number').map((s) => [s.speaker, s.speechS as number]),\n );\n m.speakerSex = Object.fromEntries(\n snap.speakers.filter((s) => s.gender === 'male' || s.gender === 'female').map((s) => [s.speaker, s.gender as 'male' | 'female']),\n );\n m.speakerIds = Object.fromEntries(\n snap.speakers\n .filter((s) => !!s.identified || !!s.voiceId || !!s.voiceColor)\n .map((s) => [\n s.speaker,\n {\n name: s.name ?? '',\n voiceId: s.voiceId ?? undefined,\n color: s.voiceColor ?? undefined,\n confidence: s.identifiedConfidence ?? undefined,\n },\n ]),\n );\n return m;\n}\n\nexport function scriptPosAt(m: Model, at?: number): number | undefined {\n let best: Segment | undefined;\n for (const s of m.segments.values()) {\n if (s.scriptPos == null) continue;\n if (at != null && s.end > at) continue;\n if (!best || s.seq > best.seq) best = s;\n }\n if (best) return best.scriptPos;\n return at != null && [...m.segments.values()].some((s) => s.scriptPos != null) ? 0 : undefined;\n}\n\nexport function scriptSpan(m: Model, seqs: number[]): [number, number] | null {\n let from = Infinity, to = -Infinity;\n for (const q of seqs) {\n const s = m.segments.get(q);\n if (s?.scriptFrom == null || s.scriptPos == null) continue;\n from = Math.min(from, s.scriptFrom);\n to = Math.max(to, s.scriptPos);\n }\n return from < to ? [from, to] : null;\n}\n\nfunction foldTr(prev: Record<string, string> | undefined, next: unknown): Record<string, string> {\n const n = (next ?? {}) as Record<string, string>;\n if (!prev || !Object.keys(prev).length) return n;\n if (!Object.keys(n).length) return prev;\n return { ...prev, ...n };\n}\n\nfunction undoesAutoFix(words: Word[], f: any): boolean {\n const tail = f.tail;\n if (!tail || !Array.isArray(tail.words) || tail.replaced !== words.length || tail.words.length !== words.length) return false;\n let changed = false;\n for (let i = 0; i < words.length; i++) {\n const o = words[i], n = tail.words[i];\n const marked = !!o.script;\n if (n.script) { if (n.text !== o.text) return false; continue; }\n if (n.text === o.text && !marked) continue;\n if (!marked) return false;\n changed = true;\n }\n return changed;\n}\n\nexport function applyFrame(m: Model, f: any): Model {\n delete m.numbers;\n switch (f.type) {\n case 'transcript.committed': {\n const seg = f.segment;\n const prev = m.segments.get(seg.seq);\n m.segments.set(seg.seq, {\n seq: seg.seq,\n speaker: seg.speaker,\n start: seg.start,\n end: seg.end,\n text: seg.text,\n words: seg.words ? toWords(seg.seq, seg.words) : prev?.words ?? [],\n catchup: !!seg.catchup,\n corrected: prev?.corrected ?? false,\n settled: prev?.settled ?? false,\n suppressed: !!seg.suppressed,\n unclear: !!seg.unclear,\n confidence: seg.confidence ?? prev?.confidence,\n latencyS: seg.latencyS,\n language: seg.language,\n translations: foldTr(prev?.translations, seg.translations),\n scriptPos: seg.scriptPos ?? prev?.scriptPos,\n scriptFrom: seg.scriptPos != null ? seg.scriptFrom ?? undefined : prev?.scriptFrom,\n });\n if (seg.speakerName) m.speakers[seg.speaker] = seg.speakerName;\n break;\n }\n case 'transcript.held': {\n m.held = f.held ? { fromMediaS: f.fromMediaS ?? 0, language: f.language ?? undefined } : null;\n break;\n }\n case 'transcript.retracted': {\n for (const seq of f.seqs ?? []) m.segments.delete(seq);\n break;\n }\n case 'transcript.translated': {\n const s = m.segments.get(f.seq);\n if (s) s.translations = { ...s.translations, ...(f.translations ?? {}) };\n break;\n }\n case 'transcript.amended': {\n const s = m.segments.get(f.seq);\n if (s && s.corrected && undoesAutoFix(s.words, f)) {\n s.text = f.text;\n s.words = toWords(f.seq, f.tail.words);\n break;\n }\n if (s && !s.corrected) {\n s.text = f.text;\n if (f.speaker >= 0) s.speaker = f.speaker;\n const parts = String(f.text).split(/\\s+/).filter(Boolean);\n if (f.tail && f.tail.replaced <= s.words.length) {\n const kept = s.words.slice(0, s.words.length - f.tail.replaced);\n s.words = toWords(f.seq, [...kept, ...f.tail.words]);\n } else if (parts.length === s.words.length) {\n s.words = s.words.map((w, i) => ({ ...w, text: parts[i] }));\n }\n if (f.scriptWords?.length) {\n const norm = (t: string) => t.toLowerCase().replace(/[^\\p{L}\\p{N}]/gu, '');\n const fixes = ((f.fixes ?? []) as { orig?: string; repl?: string; kind?: string }[]).filter((x) => String(x.kind ?? '').endsWith('script') && String(x.orig ?? '').trim());\n const heard = (w: Word) => w.recognized ?? fixes.find((x) => String(x.repl ?? '').split(/\\s+/).map(norm).includes(norm(w.text)))?.orig?.trim();\n s.words = s.words.map((w, i) => {\n if (!f.scriptWords!.includes(i)) return w;\n const h = heard(w);\n return { ...w, script: true, ...(h ? { recognized: h } : {}) };\n });\n }\n }\n break;\n }\n case 'transcript.latency': {\n const s = m.segments.get(f.seq);\n if (s) s.latencyS = f.latencyS;\n break;\n }\n case 'transcript.speaker': {\n const s = m.segments.get(f.seq);\n if (s && f.speaker >= 0) s.speaker = f.speaker;\n break;\n }\n case 'transcript.sentence': {\n const s = f.sentence;\n if (s.status === 'dropped') {\n m.sentences.delete(s.sentenceId);\n break;\n }\n const prev = m.sentences.get(s.sentenceId);\n const keep = !!prev?.corrected && !s.corrected;\n m.sentences.set(s.sentenceId, {\n id: `s:${s.sentenceId}`,\n sentenceId: s.sentenceId,\n seqs: s.seqs,\n speaker: s.speaker,\n start: s.start,\n wallStart: mediaToWall(m, s.start),\n text: keep ? prev!.text : s.text,\n status: s.status === 'open' ? 'open' : 'closed',\n settled: !!s.settled,\n corrected: !!s.corrected || (prev?.corrected ?? false),\n catchup: false,\n suppressed: !!s.suppressed,\n unclear: !!s.unclear,\n language: s.language,\n translations: keep ? prev!.translations : foldTr(prev?.translations, s.translations),\n provisional: !!s.provisional,\n translationLatencyS: s.translationLatencyS,\n });\n if (s.speakerName) m.speakers[s.speaker] = s.speakerName;\n if (s.settled) for (const q of s.seqs as number[]) { const g = m.segments.get(q); if (g) g.settled = true; }\n break;\n }\n case 'transcript.corrected': {\n const s = m.segments.get(f.seq);\n if (s) {\n s.text = f.text;\n s.corrected = !f.reverted || s.corrected;\n const parts = String(f.text).split(/\\s+/).filter(Boolean);\n if (Array.isArray((f as any).words)) s.words = toWords(f.seq, (f as any).words);\n else if (parts.length === s.words.length) s.words = s.words.map((w, i) => ({ ...w, text: parts[i], prob: i === f.wordIdx ? 1 : w.prob }));\n s.translations = {};\n }\n if (typeof f.sentenceId === 'number') {\n const t = m.sentences.get(f.sentenceId);\n if (t) {\n if (f.sentenceText) t.text = f.sentenceText;\n t.corrected = true;\n t.translations = {};\n }\n }\n break;\n }\n case 'transcript.speakerNamed':\n if (f.name) m.speakers[f.speaker] = f.name;\n else delete m.speakers[f.speaker];\n break;\n case 'transcript.speakerGender':\n if (f.gender === 'male' || f.gender === 'female') m.speakerSex[f.speaker] = f.gender;\n break;\n case 'transcript.speakerIdentified':\n if (f.name) {\n m.speakerIds[f.speaker] = {\n name: f.name,\n voiceId: f.voiceId,\n color: f.color,\n confidence: f.confidence,\n tone: !!f.tone,\n };\n } else delete m.speakerIds[f.speaker];\n break;\n case 'recording.state':\n m.state = f.state;\n break;\n default:\n break;\n }\n if (typeof f.seq === 'number') m.lastSeq = Math.max(m.lastSeq, f.seq);\n return m;\n}\n\nexport function rows(m: Model): Row[] {\n const out: Row[] = [];\n const sentences = [...m.sentences.values()].sort((a, b) => a.start - b.start || (a.sentenceId ?? 0) - (b.sentenceId ?? 0));\n for (const s of sentences) {\n const segs = s.seqs.map((q) => m.segments.get(q)).filter(Boolean) as Segment[];\n const words = segs.length === s.seqs.length || !s.text ? segs.flatMap((g) => g.words) : [];\n const last = segs[segs.length - 1];\n out.push({\n ...s,\n words,\n ...(segs.length ? { end: Math.max(...segs.map((g) => g.end)) } : {}),\n text: s.text || segs.map((g) => g.text).join(' '),\n corrected: s.corrected || segs.some((g) => g.corrected),\n catchup: segs.some((g) => g.catchup),\n suppressed: s.suppressed || (segs.length > 0 && segs.every((g) => g.suppressed)),\n unclear: s.unclear || (segs.length > 0 && segs.every((g) => g.unclear)),\n confidence: sentenceConfidence(segs),\n latencyS: last?.latencyS,\n settled: s.settled || (segs.length > 0 && segs.every((g) => g.settled)),\n translations: Object.keys(s.translations).length ? s.translations : mergeSegTranslations(segs),\n speaker: s.speaker >= 0 ? s.speaker : last?.speaker ?? -1,\n });\n }\n out.sort((a, b) => a.start - b.start);\n return out;\n}\n\nfunction languageName(code?: string): string | undefined {\n if (!code) return undefined;\n try {\n return new Intl.DisplayNames(['en'], { type: 'language' }).of(code) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function heldLine(m: Model): string | null {\n if (!m.held) return null;\n const name = languageName(m.held.language);\n return name ? `${name} · transcribing…` : 'Transcribing…';\n}\n\nfunction sentenceConfidence(segs: Segment[]): number | undefined {\n let sum = 0;\n let n = 0;\n for (const g of segs) {\n if (g.confidence == null) continue;\n const w = Math.max(1, g.words.length);\n sum += g.confidence * w;\n n += w;\n }\n return n ? sum / n : undefined;\n}\n\nfunction mergeSegTranslations(segs: Segment[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const g of segs) for (const [k, v] of Object.entries(g.translations)) out[k] = out[k] ? `${out[k]} ${v}` : v;\n return out;\n}\n\nexport const CONF_MID = 0.85;\nexport const CONF_LOW = 0.75;\n\nexport function confClass(p?: number | null): '' | 'mid' | 'low' {\n if (p == null) return '';\n if (p < CONF_LOW) return 'low';\n if (p < CONF_MID) return 'mid';\n return '';\n}\n\nexport function lowWords(r: Row, threshold = CONF_LOW): Word[] {\n return r.words.filter((w) => w.prob != null && w.prob < threshold);\n}\n\nexport const LANES = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] as const;\nexport type Lane = (typeof LANES)[number];\n\nexport function lane(speaker: number): Lane {\n return LANES[((speaker % LANES.length) + LANES.length) % LANES.length];\n}\n\nexport function speakerNumbers(m: Model): Map<number, number> {\n if (m.numbers) return m.numbers;\n const first = new Map<number, number>();\n const see = (speaker: number, at: number) => {\n if (speaker < 0) return;\n const was = first.get(speaker);\n if (was === undefined || at < was) first.set(speaker, at);\n };\n for (const s of m.sentences.values()) {\n const last = s.seqs.length ? m.segments.get(s.seqs[s.seqs.length - 1]) : undefined;\n see(s.speaker >= 0 ? s.speaker : last?.speaker ?? -1, s.start);\n }\n const order = [...first].sort((a, b) => a[1] - b[1] || a[0] - b[0]).map(([k]) => k);\n const rest = [...new Set([...Object.keys(m.speakers), ...Object.keys(m.speakerIds)].map(Number))]\n .filter((k) => k >= 0 && !first.has(k))\n .sort((a, b) => a - b);\n m.numbers = new Map([...order, ...rest].map((k, i) => [k, i + 1]));\n return m.numbers;\n}\n\nexport function speakerNumber(m: Model, speaker: number): number {\n if (speaker < 0) return 0;\n const n = speakerNumbers(m);\n return n.get(speaker) ?? n.size + 1 + speaker;\n}\n\nconst GENERIC_NAME = /^\\s*speaker\\s+\\d+\\s*$/i;\n\nfunction given(name?: string): string | undefined {\n return name && name.trim() && !GENERIC_NAME.test(name) ? name : undefined;\n}\n\nexport function speakerName(m: Model, speaker: number): string | undefined {\n return given(m.speakers[speaker]) ?? given(m.speakerIds[speaker]?.name);\n}\n\nexport function speakerLabel(m: Model, speaker: number): string {\n if (speaker < 0) return '';\n return speakerName(m, speaker) ?? `Speaker ${speakerNumber(m, speaker)}`;\n}\n\nexport function speakerInitial(m: Model, speaker: number): string {\n if (speaker < 0) return '?';\n const named = speakerName(m, speaker);\n if (!named) return `S${speakerNumber(m, speaker)}`;\n const initials = named\n .split(' ')\n .filter(Boolean)\n .slice(0, 2)\n .map((w) => w[0])\n .join('');\n return (initials || `S${speakerNumber(m, speaker)}`).toUpperCase();\n}\n\nexport function speakerColor(voiceColor?: string | null): { fg: string; soft: string } | undefined {\n if (!voiceColor) return undefined;\n if (voiceColor.startsWith('#')) {\n return { fg: voiceColor, soft: `color-mix(in srgb, ${voiceColor} 16%, transparent)` };\n }\n if (!/^[1-6]$/.test(voiceColor)) return undefined;\n return { fg: `var(--vx-${voiceColor})`, soft: `var(--vx-${voiceColor}-soft)` };\n}\n\nexport function speakerLook(m: Model, speaker: number): {\n fg?: string;\n soft?: string;\n lane: Lane;\n hasVoice: boolean;\n} {\n const id = m.speakerIds[speaker];\n const c = speakerColor(id?.color);\n return { fg: c?.fg, soft: c?.soft, lane: lane(speakerNumber(m, speaker) - 1), hasVoice: !!id };\n}\n\nexport function latestLatency(m: Model): number | undefined {\n let best: Segment | undefined;\n for (const g of m.segments.values()) if (!best || g.seq > best.seq) best = g;\n return best?.latencyS;\n}\n\nexport function peakLatency(m: Model): number {\n let p = 0;\n for (const g of m.segments.values()) p = Math.max(p, g.latencyS ?? 0);\n return p;\n}\n\nexport function showLabels(m: Model, rows: { speaker: number }[], fallback?: { speakerLabels?: 'auto' | 'on' | 'off' | null } | null, own = false): boolean {\n const said = fallback ? fallback.speakerLabels ?? 'auto' : null;\n const mode = (own ? said : null) ?? m.labels ?? said ?? 'on';\n if (mode !== 'auto') return mode === 'on';\n const seen = new Set<number>();\n for (const r of rows) if (r.speaker >= 0) { seen.add(r.speaker); if (seen.size > 1) return true; }\n return false;\n}\n","import { VocalStackError } from '@vocalstack/js-sdk';\nimport { reportError } from '../core/audio';\n\nexport interface ErrorLike { message: string; code?: string; status?: number; details?: any; requestId?: string }\n\nconst THEIRS = new Set([\n 'invalid_audio', 'invalid_options', 'invalid_token', 'invalid_body', 'session_expired', 'forbidden',\n 'not_found', 'conflict', 'invalid_state', 'password_required', 'rate_limited', 'language_unavailable', 'suspended',\n 'key_expired', 'key_revoked', 'key_from_browser', 'insufficient_credit', 'usage_cap_reached', 'payment_method_required',\n 'range_too_long', 'quota_exceeded', 'invalid_request', 'aborted', 'unauthorized',\n]);\n\nconst OURS: Record<string, string> = {\n internal: 'Something went wrong on our side. Please try again.',\n unavailable: 'VocalStack is briefly unavailable. Please try again in a moment.',\n engine_unavailable: 'No transcription engine is available right now. Please try again in a moment.',\n engine_lost: 'The transcription engine stopped. Please try again.',\n capacity_exceeded: 'Every transcription engine is busy right now. Please try again in a moment.',\n timeout: 'That took too long. Please try again.',\n};\nexport const GENERIC = OURS.internal;\nexport const OFFLINE = \"Can't reach VocalStack. Check your connection.\";\n\nconst BROWSER: Record<string, string> = {\n NotAllowedError: 'The browser blocked this. Allow it for this site, then try again.',\n NotSupportedError: \"The audio couldn't be loaded. Try again in a moment.\",\n AbortError: 'It was cancelled.',\n};\n\nexport function describe(e: unknown): ErrorLike {\n const any = e as any;\n const code: string | undefined = typeof any?.code === 'string' ? any.code : undefined;\n const status: number | undefined = typeof any?.status === 'number' ? any.status : undefined;\n const details = any?.details;\n if (code || (status && status >= 400)) {\n const rid = typeof any?.requestId === 'string' && any.requestId ? { requestId: any.requestId as string } : {};\n if (code && THEIRS.has(code) && typeof any?.message === 'string') return { message: any.message, code, status, details, ...rid };\n if (code === 'unavailable' && status === undefined) return { message: OFFLINE, code, details, ...rid };\n if (status === 0) return { message: typeof any?.message === 'string' ? any.message : OFFLINE, code, status, details, ...rid };\n return { message: (code && OURS[code]) || GENERIC, code, status, details, ...rid };\n }\n const name: string = any?.name ?? '';\n if (name === 'TypeError' && /fetch|network|load failed/i.test(String(any?.message ?? ''))) {\n if (typeof navigator !== 'undefined' && navigator.onLine !== false) reportError(e instanceof Error ? e : new Error(String(e)));\n return { message: OFFLINE };\n }\n if (BROWSER[name]) return { message: BROWSER[name] };\n if (e instanceof Error && name === 'Error' && !(e instanceof VocalStackError)) return { message: e.message };\n return { message: GENERIC };\n}\n","import { createContext, useContext, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { VocalStack, type Recording, type TranscriptionJob, type ReadAs } from '@vocalstack/js-sdk';\nimport type { MediaCred } from '../core/audio';\nimport { describe, type ErrorLike } from './errors';\n\nexport const DEFAULT_API = 'https://api.vocalstack.com';\n\nexport interface PlayerApi {\n client: VocalStack;\n origin: string;\n owner: boolean;\n shareCode: string | null;\n listen: Listen | null;\n bearer: () => Promise<string | undefined>;\n cred: MediaCred;\n readAs: ReadAs;\n}\n\nexport interface PlayerSource {\n key: string;\n code: string | null;\n transcriptionId: string | null;\n name: string;\n recording: Recording;\n job: TranscriptionJob | null;\n allowDownload: boolean;\n allowExport: boolean;\n allowTranslate: boolean;\n sharedBy: string | null;\n}\n\nconst Ctx = createContext<PlayerApi | null>(null);\n\nexport function usePlayerApi(): PlayerApi {\n const v = useContext(Ctx);\n if (!v) throw new Error('VocalStack player hooks must be used inside <VocalStackPlayer> or <PlayerApiProvider>');\n return v;\n}\n\nexport type PlayerApiProviderProps = { children: ReactNode } & ({ value: PlayerApi } | (Partial<ApiOptions> & { value?: undefined }));\n\nexport function PlayerApiProvider(props: PlayerApiProviderProps) {\n if (props.value) return <Ctx.Provider value={props.value}>{props.children}</Ctx.Provider>;\n return <OwnApi {...props} />;\n}\n\nfunction OwnApi({ children, ...o }: Partial<ApiOptions> & { children: ReactNode }) {\n const api = useApi(o);\n return <Ctx.Provider value={api}>{children}</Ctx.Provider>;\n}\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport function isTranscriptionId(id: string): boolean {\n return UUID.test(id);\n}\n\nexport type TokenSource = string | (() => string | undefined | null | Promise<string | undefined | null>);\n\nexport interface Listen { transcriptionId: string; recordingId: string; token: string }\n\nexport interface ApiOptions { id?: string | null; token?: TokenSource | null; baseUrl?: string | null; listen?: Listen | null; listenerToken?: string | null; client?: VocalStack | null }\n\nexport function useApi(o: ApiOptions): PlayerApi {\n const listen = o.listen ?? null;\n const listenerToken = listen ? null : o.listenerToken ?? null;\n const owner = !listen && !listenerToken && !!o.token && (!o.id || isTranscriptionId(o.id));\n const origin = (o.baseUrl ?? DEFAULT_API).replace(/\\/$/, '');\n const tokRef = useRef(o.token);\n tokRef.current = o.token;\n const hasToken = !!o.token;\n const bearer = useMemo(() => async () => {\n const t = tokRef.current;\n const v = typeof t === 'function' ? await t() : t;\n return v || undefined;\n }, []);\n const [ownerTok, setOwnerTok] = useState<string | null>(() => {\n const t = o.token;\n const v = typeof t === 'function' ? t() : t;\n return typeof v === 'string' && v ? v : null;\n });\n useEffect(() => {\n if (!owner) return;\n let live = true;\n void bearer().then((v) => { if (live && v) setOwnerTok((cur) => cur ?? v); });\n return () => { live = false; };\n }, [owner, bearer]);\n const given = o.client ?? null;\n const client = useMemo(() => given ?? new VocalStack({ baseUrl: origin, token: hasToken && !listen ? bearer : undefined }), [given, origin, hasToken, bearer, listen]);\n return useMemo(() => {\n if (listen) return { client, origin, owner: false, shareCode: null, listen, bearer, cred: { listenerToken: listen.token }, readAs: { listenerToken: listen.token } };\n if (listenerToken) return { client, origin, owner: false, shareCode: null, listen: null, bearer, cred: { listenerToken }, readAs: { listenerToken } };\n const shareCode = owner ? null : o.id || null;\n const readAs: ReadAs = shareCode ? { shareCode } : {};\n return { client, origin, owner, shareCode, listen: null, bearer, cred: owner ? { accessToken: ownerTok ?? undefined } : { shareCode }, readAs };\n }, [client, origin, owner, o.id, bearer, listen, listenerToken, ownerTok]);\n}\n\nexport function withMedia(api: PlayerApi, media: string | null): PlayerApi {\n return media ? { ...api, cred: { ...api.cred, media } } : api;\n}\n\nexport async function loadSource(api: PlayerApi, id: string): Promise<PlayerSource> {\n if (api.listen) {\n const recording = await api.client.recordings.get(api.listen.recordingId, api.readAs);\n const r: any = recording;\n return { key: id, code: null, transcriptionId: api.listen.transcriptionId, name: r.name ?? r.title ?? '', recording, job: r.job ?? (r.source ? { source: r.source } : null), allowDownload: true, allowExport: true, allowTranslate: true, sharedBy: null };\n }\n if (api.owner) {\n const tx = await api.client.transcriptions.get(id);\n const job = (tx as any).job ?? null;\n const rid: string | null = job?.recordingId ?? null;\n if (!rid) throw Object.assign(new Error('This transcription has no recording yet.'), { code: 'not_found', status: 404 });\n const recording = await api.client.recordings.get(rid);\n return { key: id, code: null, transcriptionId: tx.id, name: tx.name ?? '', recording, job, allowDownload: true, allowExport: true, allowTranslate: true, sharedBy: null };\n }\n const s = await api.client.shareLinks.open(id);\n return {\n key: id, code: s.code ?? id, transcriptionId: s.transcriptionId ?? null, name: s.name ?? '', recording: s.recording, job: s.job ?? null,\n allowDownload: !!s.allowDownload, allowExport: !!s.allowExport, allowTranslate: !!s.allowTranslate, sharedBy: s.sharedBy ?? null,\n };\n}\n\nexport function useSource(api: PlayerApi, id: string): { source: PlayerSource | null; gone: boolean; error: ErrorLike | null; reload: () => void } {\n const [source, setSource] = useState<PlayerSource | null>(null);\n const [gone, setGone] = useState(false);\n const [error, setError] = useState<ErrorLike | null>(null);\n const [n, setN] = useState(0);\n useEffect(() => {\n let alive = true;\n loadSource(api, id)\n .then((s) => { if (alive) { setSource(s); setGone(false); setError(null); } })\n .catch((e) => { if (!alive) return; const d = describe(e); if (d.code === 'not_found' || d.status === 404) setGone(true); else setError(d); });\n return () => { alive = false; };\n }, [api, id, n]);\n return { source, gone, error, reload: () => setN((x) => x + 1) };\n}\n\nexport function useMediaToken(api: PlayerApi, recordingId: string | null): string | null {\n const [tok, setTok] = useState<string | null>(null);\n useEffect(() => {\n if (!api.owner || !recordingId) { setTok(null); return; }\n let alive = true;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const get = () => api.client.recordings.mediaToken(recordingId).then((t) => {\n if (!alive) return;\n setTok(t.token);\n const left = Date.parse(t.expiresAt) - Date.now();\n timer = setTimeout(get, Math.max(60_000, left - 10 * 60_000));\n }).catch(() => { if (alive) timer = setTimeout(get, 30_000); });\n void get();\n return () => { alive = false; clearTimeout(timer); };\n }, [api, recordingId]);\n return tok;\n}\n\nexport async function apiFetch(api: PlayerApi, path: string, init: { method?: string; body?: unknown; query?: Record<string, string | undefined> } = {}): Promise<Response> {\n const q = new URLSearchParams();\n for (const [k, v] of Object.entries(init.query ?? {})) if (v != null) q.set(k, v);\n if (api.shareCode) q.set('shareCode', api.shareCode);\n if (api.listen) q.set('listenerToken', api.listen.token);\n const headers: Record<string, string> = {};\n if (init.body !== undefined) headers['content-type'] = 'application/json';\n if (api.owner) { const t = await api.bearer(); if (t) headers.authorization = `Bearer ${t}`; }\n const qs = q.toString();\n return fetch(`${api.origin}${path}${qs ? `${path.includes('?') ? '&' : '?'}${qs}` : ''}`, { method: init.method ?? 'GET', headers, body: init.body === undefined ? undefined : JSON.stringify(init.body) });\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { LanguageLists, Subscription } from '@vocalstack/js-sdk';\nimport { applyFrame, empty, fromSnapshot, type Model } from '../core/transcript';\nimport { describe, type ErrorLike } from './errors';\nimport { usePlayerApi, type PlayerApi } from './context';\n\nexport { describe, type ErrorLike };\n\nconst langCache = new Map<string, LanguageLists>();\nexport function useLanguages(): LanguageLists | null {\n const api = usePlayerApi();\n const [l, setL] = useState<LanguageLists | null>(langCache.get(api.origin) ?? null);\n useEffect(() => {\n if (langCache.has(api.origin)) return;\n api.client.languages.list().then((x) => { langCache.set(api.origin, x); setL(x); }).catch(() => {});\n }, [api]);\n return l;\n}\n\nexport function useAsync<T>(fn: () => Promise<T>, deps: unknown[]): { data: T | null; error: ErrorLike | null; reload: () => void } {\n const [data, setData] = useState<T | null>(null);\n const [error, setError] = useState<ErrorLike | null>(null);\n const [n, setN] = useState(0);\n useEffect(() => {\n let alive = true;\n fn().then((d) => alive && setData(d)).catch((e) => alive && setError(describe(e)));\n return () => { alive = false; };\n }, [...deps, n]); // eslint-disable-line react-hooks/exhaustive-deps\n return { data, error, reload: () => setN((x) => x + 1) };\n}\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nconst PENDING_REFETCH_MS = 2500;\nconst PENDING_REFETCHES = 72;\n\nexport function useTranscript(recordingId: string | null, opts: { lang?: string | null; voice?: string | null; onState?: (s: string, reason?: string) => void; onFrame?: (f: any) => void }) {\n const api: PlayerApi = usePlayerApi();\n const apiRef = useRef(api);\n apiRef.current = api;\n const [model, setModel] = useState<Model>(empty);\n const modelRef = useRef<Model>(empty());\n const subRef = useRef<Subscription | null>(null);\n const langRef = useRef<string | null>(opts.lang ?? null);\n const [connected, setConnected] = useState(false);\n const [error, setError] = useState<ErrorLike | null>(null);\n const [notFound, setNotFound] = useState(false);\n const bump = useCallback(() => {\n const m = modelRef.current;\n setModel({ ...m });\n }, []);\n const optsRef = useRef(opts);\n optsRef.current = opts;\n\n useEffect(() => {\n if (!recordingId) return;\n let alive = true;\n let attempt = 0;\n modelRef.current = empty();\n setModel(empty());\n setNotFound(false);\n const client = api.client;\n let announced = modelRef.current.state;\n const announceState = () => {\n const s = modelRef.current.state;\n if (s === announced) return;\n announced = s;\n optsRef.current.onState?.(s);\n };\n (async () => {\n while (alive) {\n let sub: Subscription | null = null;\n try {\n const asked = langRef.current;\n sub = await client.recordings.subscribe(recordingId, { lang: asked ?? undefined, ...api.readAs, asOwner: api.owner, voice: opts.voice ?? undefined });\n if (!alive) { sub.close(); return; }\n attempt = 0;\n subRef.current = sub;\n if (langRef.current !== asked) sub.setLanguage(langRef.current);\n setConnected(true);\n setError(null);\n modelRef.current = fromSnapshot(sub.snapshot!, modelRef.current);\n bump();\n announceState();\n for await (const ev of sub) {\n if (!alive) break;\n if (ev.type === 'snapshot') { modelRef.current = fromSnapshot(ev.snapshot, ev.reason === 'gap' ? modelRef.current : empty()); bump(); announceState(); }\n else if (ev.type === 'frame') {\n applyFrame(modelRef.current, ev.frame);\n const f: any = ev.frame;\n if (f.type === 'recording.state') { announced = modelRef.current.state; optsRef.current.onState?.(f.state, f.reason); }\n optsRef.current.onFrame?.(f);\n bump();\n } else if (ev.type === 'closed') {\n setConnected(false);\n }\n }\n } catch (e) {\n if (!alive) return;\n const d = describe(e);\n if (d.code === 'not_found' || d.status === 404) { setNotFound(true); setError(d); return; }\n try {\n await client.recordings.get(recordingId, api.readAs);\n } catch (pe) {\n const pd = describe(pe);\n if (pd.code === 'not_found' || pd.status === 404) { setNotFound(true); setError(pd); return; }\n if (pd.code === 'forbidden' || pd.code === 'invalid_token' || pd.code === 'password_required' || pd.status === 401 || pd.status === 403) { setError(pd); return; }\n }\n if (d.code === 'forbidden' || d.code === 'invalid_token' || d.code === 'password_required' || d.status === 401 || d.status === 403) { setError(d); return; }\n setError(d);\n } finally {\n if (subRef.current === sub) subRef.current = null;\n setConnected(false);\n }\n const st = modelRef.current.state;\n if (!alive || st === 'ended' || st === 'finalized' || st === 'processing') return;\n attempt += 1;\n await sleep(Math.min(15000, 1000 * 2 ** Math.min(attempt, 4)));\n }\n })();\n return () => {\n alive = false;\n subRef.current?.close();\n subRef.current = null;\n setConnected(false);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recordingId, api, opts.voice]);\n\n const [translating, setTranslating] = useState(false);\n const [translateFailed, setTranslateFailed] = useState<string | null>(null);\n const langTurn = useRef(0);\n const [shownLang, setShownLang] = useState<string | null>(null);\n const setLanguage = useCallback((lang: string | null) => {\n langRef.current = lang;\n subRef.current?.setLanguage(lang);\n if (!recordingId) return;\n const client = apiRef.current.client;\n const turn = ++langTurn.current;\n setTranslating(true);\n setTranslateFailed(null);\n const fetchOnce = (again: number) => client.recordings.transcript(recordingId, { lang: lang ?? undefined, ...apiRef.current.readAs, asListener: !apiRef.current.owner })\n .then((snap) => {\n if (turn !== langTurn.current) return;\n modelRef.current = fromSnapshot(snap, modelRef.current);\n setShownLang(lang);\n bump();\n if (snap.translationPending && again > 0) window.setTimeout(() => { if (turn === langTurn.current) void fetchOnce(again - 1).catch(() => {}); }, PENDING_REFETCH_MS);\n });\n fetchOnce(PENDING_REFETCHES)\n .catch(() => { if (turn === langTurn.current && lang) setTranslateFailed(lang); })\n .finally(() => { if (turn === langTurn.current) setTranslating(false); });\n }, [bump, recordingId]);\n\n const mergeTranslations = useCallback((lang: string, made: Record<string, string>) => {\n const m = modelRef.current;\n let touched = false;\n for (const [id, text] of Object.entries(made)) {\n const s = m.sentences.get(Number(id));\n if (!s) continue;\n s.translations = { ...s.translations, [lang]: text };\n touched = true;\n }\n if (touched) bump();\n }, [bump]);\n const clearError = useCallback(() => setError(null), []);\n\n\n return { model, connected, error, notFound, clearError, setLanguage, mergeTranslations, translating, translateFailed, shownLang };\n}\n","export type I18nKey = keyof typeof I18N.English;\nexport type Strings = Record<I18nKey, string>;\nexport const I18N = {\n English: { vcFor: 'Voice for', vcMute: 'Mute', vcUnmute: 'Unmute', vcMuted: 'MUTED', vcShared: 'Also used by', vcUsedBy: 'Used by', vcUnknownSpk: 'Unknown', vcUse: 'Use this voice', vcGetting: 'Downloading…', vcSample: 'Here’s how it sounds.', vcPreview: 'PREVIEW', vcMale: 'Male', vcFemale: 'Female', vcSynth: 'SYNTHETIC', origAudio: 'ORIGINAL AUDIO', vcCloned: 'VOICES', vcBadge: 'CLONED', vcNone: 'TEXT ONLY', vcNoVoice: 'No voice for ', vcSheet: 'VOICE', vcNeutral: 'SYNTHETIC VOICE', vcWarm: 'SYNTHETIC VOICE', searchPlaceholder: 'Search this broadcast', noise: 'Audio unclear', newLines: 'new', live: 'LIVE', ended: 'ENDED', waiting: 'WAITING', corrected: 'CORRECTED', hostLine: 'Hosted by Marcus Reed · 4 speakers', langLabel: 'LANGUAGE', langCount: '100+ languages', read: 'Read', listen: 'Listen', watch: 'Watch', waitTitle: 'The broadcast hasn’t started yet', waitBody: 'The transcript appears here as soon as the host starts speaking.', english: 'ENGLISH', playing: 'Playing the live audio', ready: 'Tap to start audio', readyNote: 'Set your volume first', voiceMeta: 'ORIGINAL AUDIO', voice: 'Voice', sheetTitle: 'APP LANGUAGE', done: 'Done', search: 'Search 100+ languages', sheetNote: 'Follow along in your language.', moreLangs: 'more', confTitle: 'Some words weren\\'t heard clearly', confBody: 'The transcript marks words the model is unsure about with a dashed underline. The words keep their colour, so only the underline tells you where to look.', confMid: 'Slightly unsure — probably right', confHigh: 'Low confidence — may be wrong', settings: 'BROADCAST', setOrig: 'Show original language', setTheme: 'Appearance', light: 'Light', dark: 'Dark', setConf: 'Show uncertain words', setConfHint1: 'Colours words the model is unsure about — ', setConfMid: 'amber', setConfSep: ' or ', setConfLow: 'red', setConfHint2: '', behindLive: 'TRANSLATION LATENCY', behindNote: 'How far the translation trails the speaker right now.', shareLabel: 'LIVE TRANSLATION LINK', copy: 'Copy', copied: 'Copied' },\n Spanish: { vcFor: 'Voz de', vcMute: 'Silenciar', vcUnmute: 'Activar', vcMuted: 'SILENCIADO', vcShared: 'También la usa', vcUsedBy: 'La usa', vcUnknownSpk: 'Desconocido', vcUse: 'Usar esta voz', vcGetting: 'Descargando…', vcSample: 'Así suena esta voz.', vcPreview: 'MUESTRA', vcMale: 'Hombre', vcFemale: 'Mujer', vcSynth: 'SINTÉTICA', origAudio: 'AUDIO ORIGINAL', vcCloned: 'VOCES', vcBadge: 'CLONADA', vcNone: 'SOLO TEXTO', vcNoVoice: 'Sin voz para ', vcSheet: 'VOZ', vcNeutral: 'VOZ SINTÉTICA', vcWarm: 'VOZ SINTÉTICA', searchPlaceholder: 'Buscar en esta emisión', noise: 'Audio poco claro', newLines: 'nuevas', live: 'EN VIVO', ended: 'FINALIZADA', waiting: 'EN ESPERA', corrected: 'CORREGIDO', hostLine: 'Presenta Marcus Reed · 4 hablantes', langLabel: 'IDIOMA', langCount: '100+ idiomas', read: 'Leer', listen: 'Escuchar', watch: 'Ver', waitTitle: 'La emisión aún no ha comenzado', waitBody: 'La transcripción aparecerá aquí en cuanto el anfitrión empiece a hablar.', english: 'INGLÉS', playing: 'Reproduciendo la traducción al español', ready: 'Toca para iniciar el audio', readyNote: 'Ajusta el volumen primero', voiceMeta: 'VOZ NEUTRA', voice: 'Voz', sheetTitle: 'IDIOMA DE LA APP', done: 'Listo', search: 'Buscar entre 100+ idiomas', sheetNote: 'Sigue la emisión en tu idioma.', moreLangs: 'más', confTitle: 'Algunas palabras no se oyeron bien', confBody: 'La transcripción marca las palabras dudosas con un subrayado discontinuo. Las palabras conservan su color, así que solo el subrayado te indica dónde mirar.', confMid: 'Poca duda: probablemente correcta', confHigh: 'Baja confianza: puede estar mal', settings: 'EMISIÓN', setOrig: 'Mostrar idioma original', setTheme: 'Apariencia', light: 'Claro', dark: 'Oscuro', setConf: 'Mostrar palabras dudosas', setConfHint1: 'Colorea las palabras dudosas: ', setConfMid: 'ámbar', setConfSep: ' o ', setConfLow: 'rojo', setConfHint2: '', behindLive: 'LATENCIA DE TRADUCCIÓN', behindNote: 'Cuánto se retrasa la traducción respecto a quien habla.', shareLabel: 'ENLACE PARA SEGUIR', copy: 'Copiar', copied: 'Copiado' },\n French: { vcFor: 'Voix de', vcMute: 'Couper', vcUnmute: 'Réactiver', vcMuted: 'COUPÉ', vcShared: 'Aussi utilisée par', vcUsedBy: 'Utilisée par', vcUnknownSpk: 'Inconnu', vcUse: 'Utiliser cette voix', vcGetting: 'Téléchargement…', vcSample: 'Voici le rendu.', vcPreview: 'APERÇU', vcMale: 'Homme', vcFemale: 'Femme', vcSynth: 'SYNTHÉTIQUE', origAudio: 'AUDIO ORIGINAL', vcCloned: 'VOIX', vcBadge: 'CLONÉE', vcNone: 'TEXTE SEUL', vcNoVoice: 'Aucune voix pour ', vcSheet: 'VOIX', vcNeutral: 'VOIX SYNTHÉTIQUE', vcWarm: 'VOIX SYNTHÉTIQUE', searchPlaceholder: 'Rechercher dans la diffusion', noise: 'Audio peu clair', newLines: 'nouvelles', live: 'EN DIRECT', ended: 'TERMINÉ', waiting: 'EN ATTENTE', corrected: 'CORRIGÉ', hostLine: 'Animé par Marcus Reed · 4 intervenants', langLabel: 'LANGUE', langCount: '100+ langues', read: 'Lire', listen: 'Écouter', watch: 'Regarder', waitTitle: 'La diffusion n’a pas encore commencé', waitBody: 'La transcription s’affichera ici dès que l’animateur prendra la parole.', english: 'ANGLAIS', playing: 'Lecture de la traduction française', ready: \"Touchez pour lancer l'audio\", readyNote: \"Réglez le volume d'abord\", voiceMeta: 'VOIX NEUTRE', voice: 'Voix', sheetTitle: 'LANGUE DE L\\'APP', done: 'Terminé', search: 'Rechercher parmi 100+ langues', sheetNote: 'Suivez la diffusion dans votre langue.', moreLangs: 'autres', confTitle: 'Certains mots n\\'ont pas été bien entendus', confBody: 'La transcription marque les mots incertains d\\'un soulignement en pointillés. Les mots gardent leur couleur : seul le soulignement attire l\\'attention.', confMid: 'Léger doute — probablement juste', confHigh: 'Faible confiance — peut être faux', settings: 'DIFFUSION', setOrig: 'Afficher la langue d\\'origine', setTheme: 'Apparence', light: 'Clair', dark: 'Sombre', setConf: 'Afficher les mots incertains', setConfHint1: 'Colore les mots incertains — ', setConfMid: 'ambre', setConfSep: ' ou ', setConfLow: 'rouge', setConfHint2: '', behindLive: 'LATENCE DE TRADUCTION', behindNote: 'De combien la traduction suit le locuteur en ce moment.', shareLabel: 'LIEN DE SUIVI', copy: 'Copier', copied: 'Copié' },\n Japanese: { vcFor: '話者の音声', vcMute: 'ミュート', vcUnmute: '解除', vcMuted: 'ミュート', vcShared: '同じ音声', vcUsedBy: '使用中', vcUnknownSpk: '不明', vcUse: 'この音声を使う', vcGetting: 'ダウンロード中…', vcSample: 'こう聞こえます。', vcPreview: 'プレビュー', vcMale: '男性', vcFemale: '女性', vcSynth: '合成', origAudio: '元の音声', vcCloned: '音声', vcBadge: 'クローン', vcNone: 'テキストのみ', vcNoVoice: '音声がありません: ', vcSheet: '音声', vcNeutral: '合成音声', vcWarm: '合成音声', searchPlaceholder: 'この配信を検索', noise: '音声が不明瞭です', newLines: '件', live: 'ライブ', ended: '終了', waiting: '待機中', corrected: '修正済み', hostLine: '主催 Marcus Reed · 話者4人', langLabel: '言語', langCount: '100以上の言語', read: '読む', listen: '聞く', watch: '視聴', waitTitle: '配信はまだ始まっていません', waitBody: 'ホストが話し始めると、ここに文字起こしが表示されます。', english: '英語', playing: '日本語の翻訳を再生中', ready: 'タップして音声を再生', readyNote: '先に音量を調整してください', voiceMeta: 'ニュートラル音声', voice: '音声', sheetTitle: 'アプリの言語', done: '完了', search: '100以上の言語を検索', sheetNote: 'あなたの言語で追いかけられます。', moreLangs: '言語', confTitle: '聞き取りが不明瞭な語があります', confBody: 'モデルが自信を持てない語には破線の下線が付きます。文字色は変わらないため、注目すべき箇所は下線だけが示します。', confMid: 'やや不確か — おおむね正しい', confHigh: '信頼度が低い — 誤りの可能性', settings: '配信', setOrig: '原文の言語を表示', setTheme: '外観', light: 'ライト', dark: 'ダーク', setConf: '不確かな語を表示', setConfHint1: '自信のない語に色を付けます — ', setConfMid: '黄', setConfSep: ' か ', setConfLow: '赤', setConfHint2: '', behindLive: '翻訳のレイテンシ', behindNote: '現在、翻訳が話者からどれだけ遅れているか。', shareLabel: '共有リンク', copy: 'コピー', copied: 'コピー済み' },\n Romanian: { vcFor: 'Vocea pentru', vcMute: 'Oprește', vcUnmute: 'Pornește', vcMuted: 'OPRIT', vcShared: 'Folosită și de', vcUsedBy: 'Folosită de', vcUnknownSpk: 'Necunoscut', vcUse: 'Folosește această voce', vcGetting: 'Se descarcă…', vcSample: 'Așa sună această voce.', vcPreview: 'MOSTRĂ', vcMale: 'Bărbat', vcFemale: 'Femeie', vcSynth: 'SINTETICĂ', origAudio: 'AUDIO ORIGINAL', vcCloned: 'VOCI', vcBadge: 'CLONATĂ', vcNone: 'DOAR TEXT', vcNoVoice: 'Nicio voce pentru ', vcSheet: 'VOCE', vcNeutral: 'VOCE SINTETICĂ', vcWarm: 'VOCE SINTETICĂ', searchPlaceholder: 'Caută în transmisiune', noise: 'Sunet neclar', newLines: 'noi', live: 'ÎN DIRECT', ended: 'ÎNCHEIAT', waiting: 'ÎN AȘTEPTARE', corrected: 'CORECTAT', hostLine: 'Prezentat de Marcus Reed · 4 vorbitori', langLabel: 'LIMBĂ', langCount: '100+ de limbi', read: 'Citește', listen: 'Ascultă', watch: 'Vizionează', waitTitle: 'Transmisiunea nu a început încă', waitBody: 'Transcrierea va apărea aici imediat ce gazda începe să vorbească.', english: 'ENGLEZĂ', playing: 'Se redă traducerea în română', ready: 'Atinge pentru a porni audio', readyNote: 'Reglează întâi volumul', voiceMeta: 'VOCE NEUTRĂ', voice: 'Voce', sheetTitle: 'LIMBA APLICAȚIEI', done: 'Gata', search: 'Caută printre 100+ de limbi', sheetNote: 'Urmărește transmisiunea în limba ta.', moreLangs: 'în plus', confTitle: 'Unele cuvinte nu s-au auzit clar', confBody: 'Transcrierea marchează cuvintele incerte cu o subliniere întreruptă. Cuvintele își păstrează culoarea, doar sublinierea îți arată unde să te uiți.', confMid: 'Ușoară nesiguranță — probabil corect', confHigh: 'Încredere scăzută — poate fi greșit', settings: 'TRANSMISIUNE', setOrig: 'Arată limba originală', setTheme: 'Aspect', light: 'Luminos', dark: 'Întunecat', setConf: 'Arată cuvintele incerte', setConfHint1: 'Colorează cuvintele incerte — ', setConfMid: 'galben', setConfSep: ' sau ', setConfLow: 'roșu', setConfHint2: '', behindLive: 'LATENȚA TRADUCERII', behindNote: 'Cu cât urmează traducerea vorbitorul în acest moment.', shareLabel: 'LINK DE URMĂRIRE', copy: 'Copiază', copied: 'Copiat' },\n Portuguese: { vcFor: 'Voz de', vcMute: 'Silenciar', vcUnmute: 'Ativar', vcMuted: 'SILENCIADO', vcShared: 'Também usada por', vcUsedBy: 'Usada por', vcUnknownSpk: 'Desconhecido', vcUse: 'Usar esta voz', vcGetting: 'Baixando…', vcSample: 'É assim que soa.', vcPreview: 'AMOSTRA', vcMale: 'Homem', vcFemale: 'Mulher', vcSynth: 'SINTÉTICA', origAudio: 'ÁUDIO ORIGINAL', vcCloned: 'VOZES', vcBadge: 'CLONADA', vcNone: 'SÓ TEXTO', vcNoVoice: 'Sem voz para ', vcSheet: 'VOZ', vcNeutral: 'VOZ SINTÉTICA', vcWarm: 'VOZ SINTÉTICA', searchPlaceholder: 'Pesquisar nesta transmissão', noise: 'Áudio pouco claro', newLines: 'novas', live: 'AO VIVO', ended: 'ENCERRADA', waiting: 'AGUARDANDO', corrected: 'CORRIGIDO', hostLine: 'Apresentado por Marcus Reed · 4 falantes', langLabel: 'IDIOMA', langCount: '100+ idiomas', read: 'Ler', listen: 'Ouvir', watch: 'Assistir', waitTitle: 'A transmissão ainda não começou', waitBody: 'A transcrição aparece aqui assim que o apresentador começar a falar.', english: 'INGLÊS', playing: 'Reproduzindo a tradução em português', ready: 'Toque para iniciar o áudio', readyNote: 'Ajuste o volume primeiro', voiceMeta: 'VOZ NEUTRA', voice: 'Voz', sheetTitle: 'IDIOMA DO APP', done: 'Concluído', search: 'Pesquisar entre 100+ idiomas', sheetNote: 'Acompanhe a transmissão no seu idioma.', moreLangs: 'mais', confTitle: 'Algumas palavras não foram bem ouvidas', confBody: 'A transcrição marca as palavras duvidosas com um sublinhado tracejado. As palavras mantêm a sua cor, por isso só o sublinhado indica onde olhar.', confMid: 'Pouca dúvida — provavelmente certa', confHigh: 'Baixa confiança — pode estar errada', settings: 'TRANSMISSÃO', setOrig: 'Mostrar idioma original', setTheme: 'Aparência', light: 'Claro', dark: 'Escuro', setConf: 'Mostrar palavras duvidosas', setConfHint1: 'Colore as palavras duvidosas: ', setConfMid: 'âmbar', setConfSep: ' ou ', setConfLow: 'vermelho', setConfHint2: '', behindLive: 'LATÊNCIA DE TRADUÇÃO', behindNote: 'Quanto a tradução está atrás de quem fala agora.', shareLabel: 'LINK PARA ACOMPANHAR', copy: 'Copiar', copied: 'Copiado' },\n};\n\nexport function strings(name?: string | null): Strings {\n return (name && (I18N as Record<string, Strings>)[name]) || I18N.English;\n}\n","import type { ExportFormat, TranscriptionJob } from '@vocalstack/js-sdk';\nimport { VocalStackError } from '@vocalstack/js-sdk';\nimport { voiceTrackDownloadUrl, type MediaCred } from '../core/audio';\nimport { rowForVoice, type VoiceTrackRow } from '../core/voiceplayer';\nimport type { PlayerApi } from './context';\nimport { GENERIC } from './errors';\n\nasync function answerError(r: Response): Promise<VocalStackError> {\n const j: any = await r.json().catch(() => null);\n const code = j?.error?.code ?? j?.code;\n const message = j?.error?.message ?? j?.message;\n return new VocalStackError(typeof code === 'string' ? code as never : 'internal', typeof message === 'string' ? message : GENERIC, { status: r.status, details: j?.error?.data?.details ?? j?.data?.details });\n}\n\nexport type TxRowStatus = 'queued' | 'cropping' | 'transcribing' | 'done' | 'failed' | 'stopped' | 'live';\n\nexport interface TxProgress {\n state: TranscriptionJob['state'];\n processedS: number;\n totalS: number | null;\n segmentsDone: number;\n segmentsTotal: number | null;\n pct: number;\n error?: string | null;\n}\n\nexport function rowStatusOf(state: TranscriptionJob['state'] | undefined | null): TxRowStatus {\n switch (state) {\n case 'transcribing': return 'transcribing';\n case 'cropping': return 'cropping';\n case 'done': return 'done';\n case 'failed': return 'failed';\n case 'stopped': return 'stopped';\n default: return 'queued';\n }\n}\n\nexport function progressOf(job: TranscriptionJob | null): TxProgress | null {\n if (!job) return null;\n if (!job.progress) return job.state ? { state: job.state, processedS: 0, totalS: null, segmentsDone: 0, segmentsTotal: null, pct: 0, error: job.error ?? null } : null;\n return { state: job.state, processedS: job.progress.processedS, totalS: job.progress.totalS ?? null, segmentsDone: job.progress.segmentsDone, segmentsTotal: job.progress.segmentsTotal ?? null, pct: job.progress.pct, error: job.error ?? null };\n}\n\nexport const segsLabel = (p: TxProgress | null, fallbackDone: number) => {\n const done = p?.segmentsDone ?? fallbackDone;\n const total = Math.max(done, p?.segmentsTotal ?? done);\n return `${done} / ${total} SEGMENTS`;\n};\n\nexport function jobLengthS(job: TranscriptionJob | null | undefined, progress?: TxProgress | null): number | null {\n const full = job?.source?.durationS ?? progress?.totalS ?? null;\n const c = job?.crop;\n if (c && (c.startS != null || c.endS != null)) {\n const end = c.endS ?? full;\n if (end != null) return Math.max(0, end - (c.startS ?? 0));\n }\n return full;\n}\n\nexport const TX_FORMATS: { key: ExportFormat; name: string; ext: string; note: string; icon: string }[] = [\n { key: 'pdf', name: 'PDF', ext: 'PDF', note: 'Formatted transcript in paragraphs, with timestamps and speaker labels.', icon: 'M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z' },\n { key: 'xlsx', name: 'Excel', ext: 'XLSX', note: 'One row per segment: start, end, speaker, text, confidence.', icon: 'M3.375 19.5h17.25m-17.25 0a1.125 1.125 0 0 1-1.125-1.125M3.375 19.5h7.5c.621 0 1.125-.504 1.125-1.125m-9.75 0V5.625m0 12.75v-1.5c0-.621.504-1.125 1.125-1.125m18.375 2.625V5.625m0 12.75c0 .621-.504 1.125-1.125 1.125m1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125m0 3.75h-7.5A1.125 1.125 0 0 1 12 18.375m9.75-12.75c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125m19.5 0v1.5c0 .621-.504 1.125-1.125 1.125M2.25 5.625v1.5c0 .621.504 1.125 1.125 1.125m0 0h17.25m-17.25 0h7.5c.621 0 1.125.504 1.125 1.125M3.375 8.25c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125m17.25-3.75h-7.5c-.621 0-1.125.504-1.125 1.125m8.625-1.125c.621 0 1.125.504 1.125 1.125v1.5c0 .621-.504 1.125-1.125 1.125m0 0h-7.5m-9 0h7.5m0 0c.621 0 1.125.504 1.125 1.125M12 10.875v-1.5m0 1.5c0 .621-.504 1.125-1.125 1.125M12 10.875c0 .621.504 1.125 1.125 1.125m-2.25 0c.621 0 1.125.504 1.125 1.125M13.125 12h7.5m-7.5 0c-.621 0-1.125.504-1.125 1.125M20.625 12c.621 0 1.125.504 1.125 1.125v1.5c0 .621-.504 1.125-1.125 1.125m-17.25 0h7.5M12 14.625v-1.5m0 1.5c0 .621-.504 1.125-1.125 1.125M12 14.625c0 .621.504 1.125 1.125 1.125m-2.25 0c.621 0 1.125.504 1.125 1.125m0 1.5v-1.5m0 0c0-.621.504-1.125 1.125-1.125m0 0h7.5' },\n { key: 'srt', name: 'Subtitles', ext: 'SRT / VTT', note: 'Timed caption cues, ready for a video editor or a player.', icon: 'M2.25 15.75V8.25A2.25 2.25 0 0 1 4.5 6h15a2.25 2.25 0 0 1 2.25 2.25v7.5A2.25 2.25 0 0 1 19.5 18h-15a2.25 2.25 0 0 1-2.25-2.25Zm4.5-4.5h4.5m-4.5 3h1.5m3 0h6m-3-3h3' },\n { key: 'json', name: 'JSON', ext: 'JSON', note: 'Word-level timings, confidence scores and speaker turns.', icon: 'M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5' },\n];\n\nexport function saveUrl(url: string) {\n const a = document.createElement('a');\n a.href = url; a.style.display = 'none';\n document.body.appendChild(a); a.click(); a.remove();\n}\n\nexport async function saveWhenReady(url: string) {\n const r = await fetch(url, { redirect: 'manual' });\n if (r.type !== 'opaqueredirect' && !r.ok) throw await answerError(r);\n saveUrl(url);\n}\n\nexport async function exportTranscript(api: PlayerApi, recordingId: string, key: ExportFormat, opts: { lang?: string | null } = {}) {\n const res = await api.client.recordings.export(recordingId, key, { lang: opts.lang ?? undefined, ...api.readAs });\n if (!res.ok) throw await answerError(res);\n const blob = await res.blob();\n const cd = res.headers.get('content-disposition') ?? '';\n const star = /filename\\*=UTF-8''([^;]+)/i.exec(cd)?.[1];\n const plain = /filename=\"([^\"]+)\"/i.exec(cd)?.[1];\n const name = star ? decodeURIComponent(star) : plain ?? `transcript.${key}`;\n const href = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = href; a.download = name; a.style.display = 'none';\n document.body.appendChild(a); a.click(); a.remove();\n window.setTimeout(() => URL.revokeObjectURL(href), 60_000);\n}\n\nexport async function downloadVoiceTrack(api: PlayerApi, opts: {\n recordingId: string;\n lang: string;\n voiceKey: string;\n cred: MediaCred;\n request: () => Promise<unknown>;\n timeoutMs?: number;\n}) {\n const { recordingId, lang, voiceKey, cred } = opts;\n const list = async (): Promise<VoiceTrackRow[]> => {\n const got = (await api.client.recordings.voice(recordingId, lang, api.readAs)) as unknown as VoiceTrackRow[];\n return got.filter((x) => x.lang === lang);\n };\n const mine = (rows: VoiceTrackRow[]) => rowForVoice(rows, voiceKey);\n let row = mine(await list());\n if (!row || row.state === 'clips' || row.state === 'failed') await opts.request();\n const until = Date.now() + (opts.timeoutMs ?? 10 * 60_000);\n while (!row || row.state !== 'sealed') {\n if (row?.state === 'failed') throw new Error(row.error || 'The spoken track could not be made.');\n if (Date.now() > until) throw new Error('The spoken track is taking too long; try again in a moment.');\n await new Promise((r) => setTimeout(r, 4000));\n row = mine(await list());\n }\n saveUrl(voiceTrackDownloadUrl(api.origin, recordingId, lang, row.voiceKey, cred));\n}\n","export const ytIdOf = (u: string | null | undefined) => u?.match(/(?:youtu\\.be\\/|[?&]v=|\\/shorts\\/|\\/embed\\/|\\/live\\/)([\\w-]{11})/)?.[1] ?? null;\n\nexport const YOUTUBE_LINK = /(youtube\\.com|youtu\\.be)/i;\n\nexport const isLiveRefusal = (url: string | null | undefined, error: string | null | undefined) =>\n !!ytIdOf(url) && /live stream/i.test(error ?? '');\n\nexport const previewEmbedUrl = (id: string) =>\n `https://www.youtube-nocookie.com/embed/${id}?modestbranding=1&rel=0&playsinline=1`;\n\nexport const ytThumbUrl = (id: string) => `https://i.ytimg.com/vi/${id}/mqdefault.jpg`;\n\nexport const YT_D = 'M2.25 12c0-2.6.2-4.3.5-5.2a2.3 2.3 0 0 1 1.6-1.6C5.8 4.8 12 4.8 12 4.8s6.2 0 7.65.4a2.3 2.3 0 0 1 1.6 1.6c.3.9.5 2.6.5 5.2s-.2 4.3-.5 5.2a2.3 2.3 0 0 1-1.6 1.6c-1.45.4-7.65.4-7.65.4s-6.2 0-7.65-.4a2.3 2.3 0 0 1-1.6-1.6c-.3-.9-.5-2.6-.5-5.2ZM10 9.25v5.5L14.75 12 10 9.25Z';\n\nexport async function youtubeTitle(id: string, signal?: AbortSignal): Promise<string | null> {\n try {\n const watch = `https://www.youtube.com/watch?v=${id}`;\n const res = await fetch(`https://www.youtube.com/oembed?format=json&url=${encodeURIComponent(watch)}`, { signal });\n if (!res.ok) return null;\n const j = (await res.json()) as { title?: unknown };\n return typeof j.title === 'string' && j.title.trim() ? j.title.trim() : null;\n } catch {\n return null;\n }\n}\n\nexport async function youtubeChannel(id: string, signal?: AbortSignal): Promise<string | null> {\n try {\n const watch = `https://www.youtube.com/watch?v=${id}`;\n const res = await fetch(`https://www.youtube.com/oembed?format=json&url=${encodeURIComponent(watch)}`, { signal });\n if (!res.ok) return null;\n const j = (await res.json()) as { author_name?: unknown; title?: unknown };\n const name = typeof j.author_name === 'string' && j.author_name.trim() ? j.author_name : typeof j.title === 'string' ? j.title : '';\n return name.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport const liveEmbedUrl = (id: string) =>\n `https://www.youtube-nocookie.com/embed/${id}?autoplay=1&mute=1&controls=0&rel=0&modestbranding=1&playsinline=1&iv_load_policy=3`;\n","export const SUB_LEAD_S = 0.3;\nexport const SUB_LINGER_S = 1.5;\n\nexport interface Timed { start: number; end?: number; words: { start: number; end: number }[] }\n\nexport function lineSpeechEnd(r: Timed, next: Timed | undefined, fallback: number): number {\n const w = r.words[r.words.length - 1]?.end;\n if (w != null && w > r.start) return w;\n if (r.end != null && r.end > r.start) return r.end;\n return next?.start ?? fallback;\n}\n\nexport function subtitleShown(rows: Timed[], i: number, t: number): boolean {\n const r = rows[i];\n if (!r) return false;\n const from = (r.words[0]?.start ?? r.start) - SUB_LEAD_S;\n const next = rows[i + 1];\n const end = lineSpeechEnd(r, next, r.start + 4) + SUB_LINGER_S;\n const until = next ? Math.min(end, (next.words[0]?.start ?? next.start) - SUB_LEAD_S) : end;\n return t >= from && t < Math.max(until, from + 0.5);\n}\n\nexport function spreadWords(tokens: string[], from: number, to: number): { text: string; start: number; end: number }[] {\n const span = Math.max(0, to - from);\n const weight = tokens.map((w) => Math.max(1, [...w.replace(/[^\\p{L}\\p{N}]/gu, '')].length));\n const total = weight.reduce((a, b) => a + b, 0) || 1;\n let at = from;\n return tokens.map((text, k) => {\n const start = at;\n at += (span * weight[k]) / total;\n return { text, start, end: at };\n });\n}\n","import { Fragment, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { liveEmbedUrl } from '../core/youtube';\nimport type { Correction, LanguageLists, ExportFormat, Voice } from '@vocalstack/js-sdk';\nimport { Card, CopyButton, Eyebrow, IconButton, Sheet, Switch, Toggle, Tooltip } from '../ds/Controls';\nimport { D, EqBars, Icon, PauseGlyph, PlayGlyph, Spinner, StopGlyph } from '../ds/Icons';\nimport { clock } from '../core/format';\nimport { confClass, fixedSlots, lane, speakerInitial, speakerNumber, speakerLabel, speakerLook, speakerName, type Lane, type Model, type Row, type Word } from '../core/transcript';\nimport { audioClipUrl, type MediaCred } from '../core/audio';\nimport { archiveClips, readCursor, readTokens, rowForVoice, type ReadPos, type VoiceTrackRow } from '../core/voiceplayer';\nimport { TX_FORMATS } from '../data/tx';\nimport { describe, useAsync, type ErrorLike } from '../data/transcript';\nimport { apiFetch, usePlayerApi } from '../data/context';\nimport type { Strings } from '../data/i18n';\n\nexport function feedInset(el: HTMLElement): { top: number; bottom: number } {\n const cs = getComputedStyle(el);\n const cap = el.clientHeight * 0.45;\n return {\n top: Math.min(parseFloat(cs.paddingTop) || 0, cap),\n bottom: Math.min(parseFloat(cs.paddingBottom) || 0, cap),\n };\n}\n\nexport const NO_VOICE_TIP = 'This language has no synthetic voice yet, so you can read it but not listen.';\n\nexport function rowKey(onClick: () => void) {\n return (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick(); }\n };\n}\n\n\nexport function useFeedBar(ref: React.RefObject<HTMLDivElement>, thumbRef: React.RefObject<HTMLDivElement>, extra = 0) {\n const paintRef = useRef<() => void>(() => {});\n useEffect(() => { paintRef.current(); }, [extra]);\n useEffect(() => {\n const el = ref.current, thumb = thumbRef.current;\n if (!el || !thumb) return;\n const glassBar = (): HTMLElement | null => {\n let n: HTMLElement | null = el.parentElement;\n for (let i = 0; i < 4 && n; i++) {\n const b = n.querySelector<HTMLElement>('[data-transport]');\n if (b) return b;\n n = n.parentElement;\n }\n return null;\n };\n const geom = () => {\n const bar = glassBar();\n const covered = bar ? bar.offsetHeight : 0;\n const vis = el.clientHeight - covered - 36;\n const max = el.scrollHeight - el.clientHeight;\n const size = vis > 0 ? Math.max(30, Math.round(vis * (el.clientHeight - covered) / el.scrollHeight)) : 0;\n return { vis, max, size };\n };\n let want = -1;\n let hide: any = null;\n let dragging = false, from = 0, at = 0;\n const clearGlass = () => {\n const bar = glassBar();\n if (!bar) return;\n const extra = parseFloat(el.dataset.glassExtra || '0') || 0;\n const w = bar.offsetHeight + 14 + extra;\n if (w === want) return;\n want = w;\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40;\n el.style.paddingBottom = w + 'px';\n if (atBottom) el.scrollTop = el.scrollHeight;\n };\n const show = () => {\n thumb.style.opacity = '1';\n clearTimeout(hide);\n hide = setTimeout(() => { if (!dragging) thumb.style.opacity = '0'; }, 900);\n };\n let barRO: ResizeObserver | null = null;\n let watched: HTMLElement | null = null;\n const paint = (reveal?: boolean) => {\n clearGlass();\n const bar = glassBar();\n if (bar && bar !== watched && barRO) { watched = bar; barRO.observe(bar); }\n const g = geom();\n if (g.vis < 60 || g.max < 6) { thumb.style.opacity = '0'; thumb.style.pointerEvents = 'none'; return; }\n thumb.style.pointerEvents = 'auto';\n thumb.style.height = g.size + 'px';\n thumb.style.transform = 'translateY(' + Math.round((el.scrollTop / g.max) * (g.vis - g.size)) + 'px)';\n if (reveal) show();\n };\n const gutter = parseFloat(getComputedStyle(el).paddingRight) || 0;\n thumb.style.right = (gutter >= 12 ? -(gutter - 6) : 2) + 'px';\n const onScroll = () => paint(true);\n const down = (e: PointerEvent) => {\n const g = geom();\n if (g.vis - g.size <= 0) return;\n e.preventDefault();\n e.stopPropagation();\n thumb.setPointerCapture(e.pointerId);\n dragging = true;\n from = e.clientY;\n at = el.scrollTop;\n thumb.style.cursor = 'grabbing';\n show();\n };\n const move = (e: PointerEvent) => {\n if (!dragging) return;\n const g = geom();\n el.scrollTop = at + ((e.clientY - from) / (g.vis - g.size)) * g.max;\n show();\n };\n const end = () => {\n if (!dragging) return;\n dragging = false;\n thumb.style.cursor = 'grab';\n show();\n };\n el.addEventListener('scroll', onScroll, { passive: true });\n thumb.addEventListener('pointerdown', down);\n thumb.addEventListener('pointermove', move);\n thumb.addEventListener('pointerup', end);\n thumb.addEventListener('pointercancel', end);\n if (typeof ResizeObserver !== 'undefined') {\n barRO = new ResizeObserver(() => paint());\n barRO.observe(el);\n }\n paintRef.current = () => paint();\n paint();\n return () => {\n paintRef.current = () => {};\n el.removeEventListener('scroll', onScroll);\n thumb.removeEventListener('pointerdown', down);\n thumb.removeEventListener('pointermove', move);\n thumb.removeEventListener('pointerup', end);\n thumb.removeEventListener('pointercancel', end);\n barRO?.disconnect();\n clearTimeout(hide);\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n}\n\nexport function FeedBar({ thumbRef }: { thumbRef: React.RefObject<HTMLDivElement> }) {\n return <div className=\"feedbar\" aria-hidden=\"true\"><div ref={thumbRef} className=\"feedbar__thumb\" /></div>;\n}\n\nexport function Toast({ error, onClose }: { error: ErrorLike | null; onClose: () => void }) {\n const closeRef = useRef(onClose);\n closeRef.current = onClose;\n const [hover, setHover] = useState(false);\n const [copied, setCopied] = useState(false);\n const copiedT = useRef<number>();\n useEffect(() => { setCopied(false); setHover(false); window.clearTimeout(copiedT.current); }, [error]);\n useEffect(() => () => window.clearTimeout(copiedT.current), []);\n useEffect(() => {\n if (!error || hover || copied) return;\n const t = setTimeout(() => closeRef.current(), 10500);\n return () => clearTimeout(t);\n }, [error, hover, copied]);\n if (!error) return null;\n const copy = () => {\n const text = error.requestId ? `${error.message}\\nRequest id: ${error.requestId}` : error.message;\n void navigator.clipboard?.writeText(text).then(() => { setCopied(true); window.clearTimeout(copiedT.current); copiedT.current = window.setTimeout(() => setCopied(false), 1800); }, () => {});\n };\n const credit = error.code === 'insufficient_credit' || error.code === 'quota_exceeded' || error.status === 402;\n return (\n <div className=\"toast\" role=\"alert\" onPointerEnter={() => setHover(true)} onPointerLeave={() => setHover(false)}>\n <Icon d={D.warn} size={16} style={{ color: 'var(--conf-low)', flex: 'none' }} />\n <span style={{ flex: 1 }}>{error.message}{credit && <> <a href=\"https://app.vocalstack.com/billing\" target=\"_blank\" rel=\"noopener\" className=\"dev-link\" style={{ fontSize: 'inherit', fontWeight: 600, whiteSpace: 'nowrap' }}>Add credit</a></>}</span>\n <button type=\"button\" onClick={copy} aria-label={copied ? 'Copied' : 'Copy error'} title={copied ? 'Copied' : 'Copy error'}><Icon d={copied ? D.check : D.copy} size={14} /></button>\n <button type=\"button\" onClick={onClose} aria-label=\"Dismiss\"><Icon d={D.close} size={14} /></button>\n </div>\n );\n}\n\n\nexport function SpeakerTag({ model, speaker, showLabels, pending, diarized }: { model: Model; speaker: number; showLabels: boolean; pending?: boolean; diarized?: boolean }) {\n if (speaker < 0) {\n if (!showLabels) return null;\n if (!pending) {\n if (!diarized) return null;\n return (\n <>\n <span className=\"lanechip lanechip--unknown\">?</span>\n <span className=\"line__who line__who--unknown\">Unknown Speaker</span>\n </>\n );\n }\n return (\n <span className=\"whopending\" aria-hidden=\"true\">\n <span className=\"whopending__ghost\"><span style={{ width: 9, height: 9 }} /><span className=\"line__who\">Speaker 1</span></span>\n <span className=\"whopending__live\"><span className=\"whopending__chip\" /><span className=\"whopending__pill\" /></span>\n </span>\n );\n }\n if (!showLabels) return null;\n const look = speakerLook(model, speaker);\n const l = look.lane;\n return (\n <>\n <span className={`lanechip bg-lane-${l}`} style={look.soft ? { background: look.soft, color: look.fg } : undefined}>\n {speakerInitial(model, speaker)}\n </span>\n <span className={`line__who lane-${l}`} style={look.fg ? { color: look.fg } : undefined}>\n {speakerLabel(model, speaker)}\n </span>\n {look.hasVoice && <VoiceIdGlyph color={look.fg ?? `var(--lane-${l})`} />}\n </>\n );\n}\n\nexport function VoiceIdGlyph({ color }: { color: string }) {\n return (\n <span title=\"Cloned voice\" style={{ flex: 'none', display: 'inline-flex' }}>\n <Icon d={D.voiceClone} size={13} sw={1.7} stroke={color} />\n </span>\n );\n}\n\nexport function Transport({ chip, note, scrub, mute, voice, prev, play, next }: { chip: ReactNode; note?: ReactNode; scrub: ReactNode; mute: ReactNode; voice: ReactNode; prev: ReactNode; play: ReactNode; next: ReactNode }) {\n return (\n <div className=\"vs-tt\">\n <div className=\"vs-tt__r1\">\n <div className=\"vs-tt__chip\">{chip}</div>\n {note ? <div className=\"vs-tt__scrub\">{note}</div> : (\n <>\n <div className=\"vs-tt__scrub\">{scrub}</div>\n <div className=\"vs-tt__spk\">{mute}</div>\n <div className=\"vs-tt__voice\">{voice}</div>\n </>\n )}\n </div>\n {!note && (\n <div className=\"vs-tt__r2\">\n <div className=\"vs-tt__side\" style={{ justifyContent: 'flex-end' }}><div className=\"vs-tt__prev\">{prev}</div></div>\n <div className=\"vs-tt__play\">{play}</div>\n <div className=\"vs-tt__side\" style={{ justifyContent: 'flex-start' }}><div className=\"vs-tt__next\">{next}</div></div>\n </div>\n )}\n </div>\n );\n}\n\nexport function ReplayScrub({ index, total, atLabel, durLabel, stepLabel, onSeek, onSeekFrac, onScrubStart, onScrubEnd, frac, glideMs = 260 }: { index: number; total: number; atLabel: string; durLabel: string; stepLabel: string; onSeek: (i: number) => void; onSeekFrac?: (f: number) => void; onScrubStart?: () => void; onScrubEnd?: () => void; frac?: number; glideMs?: number }) {\n const track = useRef<HTMLDivElement>(null);\n const drag = useRef(false);\n const [held, setHeld] = useState<number | null>(null);\n const n = Math.max(1, total);\n const shown = held ?? frac;\n const pct = shown != null ? Math.min(100, Math.max(0, shown * 100)) : (index / Math.max(1, n - 1)) * 100;\n const glide = frac != null && glideMs > 0 && held == null ? `width ${glideMs}ms linear, left ${glideMs}ms linear` : 'none';\n const emit = (e: React.PointerEvent) => {\n const r = track.current?.getBoundingClientRect();\n if (!r) return;\n const f = Math.min(1, Math.max(0, (e.clientX - r.left) / Math.max(1, r.width)));\n if (onSeekFrac) { setHeld(f); onSeekFrac(f); return; }\n const i = Math.round(f * (n - 1));\n if (i !== index) onSeek(i);\n };\n const up = () => { if (!drag.current) return; drag.current = false; setHeld(null); onScrubEnd?.(); };\n return (\n <div className=\"rscrub\">\n <div ref={track} className=\"rscrub__track\"\n onPointerDown={(e) => { drag.current = true; track.current?.setPointerCapture(e.pointerId); onScrubStart?.(); emit(e); e.preventDefault(); }}\n onPointerMove={(e) => { if (drag.current) emit(e); }}\n onPointerUp={up} onPointerCancel={up}>\n <div className=\"rscrub__rail\" />\n <div className=\"rscrub__fill\" style={{ width: `${pct}%`, transition: glide }} />\n <div className=\"rscrub__knob\" style={{ left: `${pct}%`, transition: glide }} />\n </div>\n <div className=\"rscrub__labels\"><span className=\"at\">{atLabel}</span><span className=\"step\">{stepLabel}</span><span className=\"dur\">{durLabel}</span></div>\n </div>\n );\n}\n\n\nexport interface RowFixes { script: number; manual: boolean; manualCount: number }\n\nexport function rowFixes(r: Row, corrections: Correction[] | undefined, slots?: Set<string>): RowFixes {\n const seqs = new Set(r.seqs ?? r.words.map((w) => w.seq));\n const live = (corrections ?? []).filter((c) => !c.revertedAt && c.seq != null && seqs.has(c.seq) && (c.kind === 'word' || c.kind === 'line'));\n const rewritten = live.some((c) => c.kind === 'line');\n const mine = (w: Word) => !!slots?.has(`${w.seq}:${w.idx}`);\n return {\n script: rewritten ? 0 : r.words.filter((w) => w.script && !mine(w)).length,\n manual: live.length > 0 || (corrections === undefined && r.corrected),\n manualCount: rewritten ? 0 : live.filter((c) => c.kind === 'word').length,\n };\n}\n\nexport const isFixedWord = (w: Word, slots?: Set<string>, listener = false) => (!listener && !!w.script) || !!slots?.has(`${w.seq}:${w.idx}`);\n\nexport function FixBadges({ f, desk, onOpen }: { f: RowFixes; desk?: boolean; onOpen?: () => void }) {\n const one = (label: string, n: number, first: boolean) => (\n <span key={label} role=\"button\" title=\"Open this line in Fix\" className=\"badge badge--fix\" style={{ marginLeft: first ? 'auto' : 0 }} onClick={(e) => { e.stopPropagation(); onOpen?.(); }}>\n <Icon d={D.pencilFix} size={desk ? 10 : 9} sw={2} />{label}{n > 0 && <span className=\"badge__n\">{n}</span>}\n </span>\n );\n return (\n <>\n {f.script > 0 && one(desk ? 'SCRIPT FIX' : 'SCRIPT', f.script, true)}\n {f.manual && one(desk ? 'MANUAL FIX' : 'MANUAL', f.manualCount, f.script === 0)}\n </>\n );\n}\n\nexport function FixPen({ onOpen, alone }: { onOpen: () => void; alone: boolean }) {\n const [over, setOver] = useState(false);\n return (\n <span role=\"button\" title=\"Fix this line\" className={`badge badge--pen${over ? ' is-over' : ''}`} style={{ marginLeft: alone ? 'auto' : 0 }} onMouseEnter={() => setOver(true)} onMouseLeave={() => setOver(false)} onClick={(e) => { e.stopPropagation(); onOpen(); }}>\n <Icon d={D.pencilFix} size={11} sw={2} />{over && 'FIX'}\n </span>\n );\n}\n\nexport function CorrectedBadge({ desk }: { desk?: boolean }) {\n return <span className=\"badge badge--corrected\"><Icon d={D.check} size={desk ? 10 : 9} sw={desk ? 2.6 : 3} />CORRECTED</span>;\n}\n\nfunction readStyle(j: number, cursor: number | null, warm: boolean, reading: boolean): React.CSSProperties | undefined {\n if (warm) {\n return { color: 'transparent', WebkitTextFillColor: 'transparent', background: 'var(--fill-10)', borderRadius: '99px', textShadow: 'none', opacity: 1 };\n }\n if (cursor == null) return reading ? { color: 'var(--ink-40)', WebkitTextFillColor: 'var(--ink-40)', opacity: 1 } : undefined;\n if (j > cursor) return { color: 'var(--ink-40)', WebkitTextFillColor: 'var(--ink-40)', opacity: 1 };\n if (j === cursor) return { color: 'var(--ink-96)', WebkitTextFillColor: 'var(--ink-96)', opacity: 1, textShadow: '0 0 2px currentColor, 0 0 4px currentColor' };\n return { color: 'var(--ink-96)', WebkitTextFillColor: 'var(--ink-96)', opacity: 1 };\n}\n\nexport function TrText({ text, query, pos, warm }: { text: string; query?: string; pos?: ReadPos | null; warm: boolean }) {\n const tokens = useMemo(() => readTokens(text), [text]);\n const cursor = pos ? readCursor(tokens, pos) : null;\n const q = (query ?? '').trim().toLowerCase().split(/\\s+/).filter((t) => t.length > 1);\n return (\n <>\n {tokens.map((k, j) => {\n const hit = q.length > 0 && q.some((n) => k.t.toLowerCase().includes(n));\n return <span key={j} className={`rw${hit ? ' w--hit' : ''}`} style={readStyle(j, cursor, warm, !!pos)}>{k.t}{k.sp}</span>;\n })}\n </>\n );\n}\n\nexport function Words({ words, text, query, colour, tappable, tapAll = false, onWord, corrected, pos = null, warm = false, slots, listener = false, fixes = true }: { fixes?: boolean; slots?: Set<string>; listener?: boolean; words: Word[]; text: string; query?: string; colour: boolean; tappable?: boolean; tapAll?: boolean; onWord?: (w: Word) => void; corrected?: boolean; pos?: ReadPos | null; warm?: boolean }) {\n const cursor = pos ? readCursor(words.length ? words.map((w) => ({ t: w.text, sp: ' ' })) : readTokens(text), pos) : null;\n if (!words.length || (corrected && words.map((w) => w.text).join(' ') !== text)) {\n return <TrText text={text} query={query} pos={pos} warm={warm} />;\n }\n const q = (query ?? '').trim().toLowerCase().split(/\\s+/).filter((t) => t.length > 1);\n return (\n <>\n {words.map((w, i) => {\n const fx = fixes && isFixedWord(w, slots, listener);\n const cls = fx ? 'fixed' : colour ? confClass(w.prob) : '';\n const hit = q.length > 0 && q.some((t) => w.text.toLowerCase().includes(t));\n const tap = tapAll || (tappable && cls !== '');\n return (\n <span key={`${w.seq}:${w.idx}`}>\n {i > 0 ? ' ' : ''}\n <span className={`w rw${cls ? ` w--${cls}` : ''}${hit ? ' w--hit' : ''}${tap ? ' w--tap' : ''}`} style={readStyle(i, cursor, warm, !!pos)} onClick={tap && onWord ? (e) => { e.stopPropagation(); onWord(w); } : undefined}>{w.text}</span>\n </span>\n );\n })}\n </>\n );\n}\n\nexport function worstConf(r: Row): '' | 'mid' | 'low' {\n let worst: '' | 'mid' | 'low' = '';\n for (const w of r.words) {\n const c = confClass(w.prob);\n if (c === 'low') return 'low';\n if (c === 'mid') worst = 'mid';\n }\n return worst;\n}\n\n\nconst SETTLE_MS = 400;\n\nexport function useViewportTranslation(\n recordingId: string | null,\n lang: string | null,\n rows: Row[],\n merge: (lang: string, made: Record<string, string>) => void,\n) {\n const api = usePlayerApi();\n const [visible, setVisible] = useState<number[]>([]);\n const [tick, setTick] = useState(0);\n const asked = useRef<Set<string>>(new Set());\n const busy = useRef(false);\n const byId = useMemo(() => new Map(rows.filter((r) => r.sentenceId != null).map((r) => [r.sentenceId!, r])), [rows]);\n useEffect(() => { asked.current = new Set(); }, [recordingId, lang]);\n const onVisible = useCallback((ids: number[]) => setVisible(ids), []);\n useEffect(() => {\n if (!recordingId || !lang || !visible.length || busy.current) return;\n void tick;\n const want = visible.filter((id) => {\n const r = byId.get(id);\n if (!r || !r.text.trim()) return false;\n if (!r.settled) return false;\n if (r.translations[lang]) return false;\n if (r.language && r.language.slice(0, 2).toLowerCase() === lang.slice(0, 2).toLowerCase()) return false;\n return !asked.current.has(`${lang}:${id}`);\n }).slice(0, 40);\n if (!want.length) return;\n busy.current = true;\n for (const id of want) asked.current.add(`${lang}:${id}`);\n api.client.recordings.translation(recordingId, lang, want, api.readAs)\n .then((r) => { if (r.translations && Object.keys(r.translations).length) merge(lang, r.translations); })\n .catch((e: unknown) => { const st = (e as { status?: number })?.status; if (st && st >= 400 && st < 500) return; for (const id of want) asked.current.delete(`${lang}:${id}`); })\n .finally(() => { busy.current = false; setTick((n) => n + 1); });\n }, [recordingId, lang, visible, tick, byId, merge]); // eslint-disable-line react-hooks/exhaustive-deps\n return onVisible;\n}\n\n\nexport interface AvailableVoice {\n id: string;\n name: string;\n cloned: boolean;\n default: boolean;\n previewUrl?: string;\n quality?: 1 | 2 | 3 | null;\n lagS?: number | null;\n accent?: string | null;\n gender?: 'male' | 'female' | null;\n ready?: boolean;\n consent?: 'pending' | 'granted' | null;\n speaker?: number | null;\n auto?: boolean;\n library?: boolean;\n live?: boolean;\n}\n\nexport function voiceDetail(v: AvailableVoice): string {\n return v.live || v.auto ? 'From this session' : v.cloned ? (v.library === false ? 'This transcription only' : 'Saved in Voices') : '';\n}\n\nfunction groupOf(v: AvailableVoice, t: Strings): { rank: number; head: string } {\n if (v.cloned) return { rank: 0, head: t.vcSheet };\n if (v.gender === 'male') return { rank: 1, head: t.vcMale.toUpperCase() };\n if (v.gender === 'female') return { rank: 2, head: t.vcFemale.toUpperCase() };\n return { rank: 3, head: t.vcSynth };\n}\n\ninterface VoiceGroupRow {\n v: AvailableVoice;\n headOn: boolean;\n head: string;\n headCount: number;\n rule: string;\n}\n\nexport function voiceGroups(list: AvailableVoice[], t: Strings): VoiceGroupRow[] {\n const shown = list.slice().sort((a, b) =>\n groupOf(a, t).rank - groupOf(b, t).rank\n || a.name.localeCompare(b.name, undefined, { numeric: true }));\n const counts: Record<string, number> = {};\n for (const v of shown) { const g = groupOf(v, t).head; counts[g] = (counts[g] ?? 0) + 1; }\n return shown.map((v, i) => {\n const head = groupOf(v, t).head;\n const headOn = i === 0 || groupOf(shown[i - 1], t).head !== head;\n return { v, headOn, head, headCount: counts[head], rule: headOn ? '0' : '1px solid var(--hair)' };\n });\n}\n\nexport interface CastMember {\n key: number;\n voiceId?: string | null;\n name: string;\n initial: string;\n lane: Lane | null;\n sex?: 'male' | 'female' | null;\n fg?: string;\n soft?: string;\n hasVoice?: boolean;\n}\n\nexport function speakerRoster(rows: { speaker: number }[], model: Model, unknownLabel: string): CastMember[] {\n const seen = new Set<number>();\n let unknown = false;\n for (const r of rows) { if (r.speaker < 0) unknown = true; else seen.add(r.speaker); }\n const out: CastMember[] = [...seen].sort((a, b) => a - b)\n .map((sp) => {\n const look = speakerLook(model, sp);\n return {\n key: sp,\n name: speakerLabel(model, sp),\n initial: speakerInitial(model, sp),\n lane: look.lane,\n sex: model.speakerSex[sp] ?? null,\n voiceId: model.speakerIds[sp]?.voiceId ?? null,\n fg: look.fg,\n soft: look.soft,\n hasVoice: look.hasVoice,\n };\n });\n if (unknown) out.push({ key: -1, name: unknownLabel, initial: '?', lane: null, sex: null });\n return out;\n}\n\nexport function castKey(map: Map<number, string>): string {\n const body = [...map.entries()]\n .filter(([, v]) => v.trim())\n .sort((a, b) => a[0] - b[0])\n .map(([k, v]) => `${k}=${v.trim()}`)\n .join(';');\n return body ? `cast:${body}` : '';\n}\n\nexport function parseCast(key: string | null | undefined): Map<number, string> | null {\n if (!key || !key.startsWith('cast:')) return null;\n const out = new Map<number, string>();\n for (const part of key.slice(5).split(';')) {\n const at = part.indexOf('=');\n if (at < 1) continue;\n const spk = Number(part.slice(0, at));\n const voice = part.slice(at + 1).trim();\n if (Number.isInteger(spk) && voice) out.set(spk, voice);\n }\n return out.size ? out : null;\n}\n\nexport function autoCast(roster: CastMember[], voices: AvailableVoice[], clones = true): Map<number, string> {\n const pool = voices.filter((v) => !v.cloned);\n const used = new Set<string>();\n const out = new Map<number, string>();\n for (const sp of roster) {\n const saved = sp.voiceId ? voices.find((v) => v.cloned && !v.auto && v.consent !== 'pending' && v.id === `clone:${sp.voiceId}`) : undefined;\n const own = saved ?? (!clones ? undefined : (sp.voiceId ? voices.find((v) => v.cloned && v.consent !== 'pending' && v.id === `clone:${sp.voiceId}`) : undefined)\n ?? (sp.key >= 0 ? voices.find((v) => v.cloned && v.auto && v.consent !== 'pending' && v.speaker === sp.key) : undefined));\n if (own) {\n out.set(sp.key, own.id);\n used.add(own.id);\n continue;\n }\n const free = pool.filter((v) => !used.has(v.id));\n const suits = sp.sex ? free.filter((v) => v.gender === sp.sex) : [];\n const pick = suits[0] ?? free[0] ?? pool[0];\n if (!pick) continue;\n out.set(sp.key, pick.id);\n used.add(pick.id);\n }\n return out;\n}\n\nexport function SpeakerCast({ roster, selected, onSelect, noClone, building, short, warn, sexOf, t }: {\n roster: CastMember[];\n selected: number | null;\n onSelect: (key: number) => void;\n noClone: (p: CastMember) => boolean;\n building?: (p: CastMember) => boolean;\n short?: (p: CastMember) => boolean;\n warn?: (p: CastMember) => string | null;\n sexOf: (p: CastMember) => 'male' | 'female' | null;\n t: Strings;\n}) {\n const sel = roster.find((p) => p.key === selected) ?? roster[0] ?? null;\n if (!sel) return null;\n return (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, padding: '0 2px 9px', margin: '0 -2px' }}>\n {roster.map((p) => {\n const on = p.key === sel.key;\n const alert = p.key >= 0 ? warn?.(p) ?? null : null;\n const busy = p.key >= 0 && !alert && !!building?.(p);\n const dot = p.key >= 0 && !alert && !busy && noClone(p);\n const few = p.key >= 0 && !alert && !busy && !dot && !p.hasVoice && !!short?.(p);\n return (\n <button\n type=\"button\"\n key={p.key}\n aria-selected={on}\n onClick={() => onSelect(p.key)}\n title={p.name}\n style={{ flex: 'none', boxSizing: 'border-box', display: 'flex', alignItems: 'center', gap: 7, minHeight: 34, padding: '5px 11px', borderRadius: 9, font: 'inherit', background: on ? 'var(--brand-tint)' : 'var(--fill-05)', border: `1px solid ${on ? 'var(--brand-line)' : 'transparent'}`, cursor: 'pointer' }}\n >\n <span\n className={`lanechip${p.lane ? ` bg-lane-${p.lane}` : ' lanechip--unknown'}`}\n style={{ width: 19, height: 19, border: 'none', ...(p.soft ? { background: p.soft, color: p.fg } : null) }}\n >\n {p.initial}\n </span>\n <span style={{ fontSize: 12.5, fontWeight: 500, color: on ? 'var(--ink-96)' : 'var(--ink-62)', whiteSpace: 'nowrap' }}>{p.name}</span>\n {p.hasVoice && !alert && <VoiceIdGlyph color={p.fg ?? (on ? 'var(--ink-62)' : 'var(--ink-45)')} />}\n {alert && <span title={alert} aria-label={alert} style={{ flex: 'none', width: 15, height: 15, marginRight: -2, borderRadius: '50%', background: '#c27c00', color: '#fff', font: '900 10.5px/1 system-ui, sans-serif', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>!</span>}\n {few && <span title=\"Not enough audio to clone\" aria-label=\"Not enough audio to clone\" style={{ flex: 'none', display: 'flex', marginRight: -2, color: on ? 'var(--ink-45)' : 'var(--ink-35)' }}><Icon d={D.micOff} size={13} sw={1.7} /></span>}\n {(dot || busy) && (\n <span title={busy ? 'Cloning this voice…' : 'No voice clone yet'} aria-label={busy ? 'Cloning this voice' : 'No voice clone yet'} style={{ flex: 'none', width: 10, height: 10, marginRight: -2, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {busy ? <Spinner size={10} color=\"var(--brand)\" track=\"var(--fill-10)\" sw={1.6} /> : <span style={{ width: 7, height: 7, borderRadius: '50%', background: 'var(--brand)' }} />}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n}\n\n\nexport function VoiceSheetBody({ cast, voices, currentId, armedId = null, sampleId = null, dlId = null, onPick, onAdd, onUse, usedBy, foldKey, foldFor = null, problem, noClone = null, t }: {\n cast?: ReactNode;\n voices: AvailableVoice[];\n currentId: string | null;\n armedId?: string | null;\n sampleId?: string | null;\n dlId?: string | null;\n problem?: string | null;\n noClone?: { title: string; sub: string; tip?: string; busy?: boolean; action?: () => void } | null;\n onPick: (v: AvailableVoice) => void;\n onAdd?: (v: AvailableVoice) => void;\n onUse: (id: string) => void;\n usedBy?: (v: AvailableVoice) => string | null;\n foldKey?: string | number | null;\n foldFor?: 'male' | 'female' | null;\n t: Strings;\n}) {\n const rows = useMemo(() => voiceGroups(voices, t), [voices, t]);\n const [fold, setFold] = useState<Record<string, boolean>>({});\n useEffect(() => { setFold({}); }, [foldKey, foldFor]);\n const gendered = (g: string) => g === t.vcMale.toUpperCase() || g === t.vcFemale.toUpperCase();\n const open = (g: string) => {\n if (g === t.vcSheet) return true;\n const said = fold[g];\n if (said != null) return !said;\n if (!foldFor || !gendered(g)) return true;\n return g === (foldFor === 'female' ? t.vcFemale : t.vcMale).toUpperCase();\n };\n const useOn = !!armedId && armedId !== currentId;\n return (\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n {problem && (\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 9, padding: '10px 11px', marginBottom: 10, borderRadius: 11, background: 'var(--conf-low-soft)' }}>\n <Icon d={D.warnTri} size={15} sw={1.7} style={{ flex: 'none', marginTop: 1, color: 'var(--conf-low)' }} />\n <span style={{ flex: 1, minWidth: 0, fontSize: 12.5, fontWeight: 300, lineHeight: 1.45, color: 'var(--ink-80)', textWrap: 'pretty' } as React.CSSProperties}>{problem}</span>\n <span style={{ flex: 'none', marginTop: -1 }}><CopyButton value={problem} label=\"Copy this error\" /></span>\n </div>\n )}\n {cast}\n {noClone && (\n <>\n <div style={{ display: 'flex', alignItems: 'center', gap: 7, padding: '14px 2px 6px', userSelect: 'none' }}>\n <span style={{ font: '600 9px var(--vs-font-mono)', letterSpacing: '.13em', color: 'var(--ink-62)' }}>{t.vcSheet}</span>\n </div>\n <div role={noClone.action ? 'button' : 'status'} tabIndex={noClone.action ? 0 : undefined} title={noClone.tip} onClick={noClone.action} onKeyDown={noClone.action ? (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); noClone.action!(); } } : undefined} style={{ display: 'flex', alignItems: 'center', gap: 11, padding: '11px 8px', margin: '0 -6px', borderRadius: 10, cursor: noClone.action ? 'pointer' : 'default' }}>\n <span style={{ flex: 'none', width: 32, height: 32, boxSizing: 'border-box', borderRadius: '50%', border: noClone.busy ? 0 : noClone.action ? '1.5px solid var(--brand)' : '1.5px dashed var(--fill-20)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {noClone.busy\n ? <span style={{ width: 16, height: 16, borderRadius: '50%', border: '2px solid var(--fill-10)', borderTopColor: 'var(--brand)', animation: 'vs-spin .7s linear infinite' }} />\n : <Icon d={noClone.action ? D.plus : D.mic} size={15} sw={noClone.action ? 2 : 1.6} style={{ color: noClone.action ? 'var(--brand)' : 'var(--ink-45)' }} />}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontSize: 14.5, fontWeight: noClone.action ? 500 : 400, color: noClone.action ? 'var(--brand)' : 'var(--ink-62)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{noClone.title}</div>\n <div style={{ fontSize: 12, fontWeight: 300, color: 'var(--ink-62)', marginTop: 2, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{noClone.sub}</div>\n </div>\n </div>\n </>\n )}\n {rows.map(({ v, headOn, head, headCount, rule }, i) => {\n const detail = voiceDetail(v);\n const dling = dlId === v.id;\n const shown = open(head);\n const shares = usedBy?.(v) ?? null;\n return (\n <Fragment key={v.id}>\n {headOn && head === t.vcSheet && (\n <div style={{ display: 'flex', alignItems: 'center', padding: '14px 2px 6px', borderTop: i === 0 && !noClone ? '0' : '1px solid var(--hair)', userSelect: 'none' }}>\n <span style={{ font: '600 9px var(--vs-font-mono)', letterSpacing: '.13em', color: 'var(--ink-62)' }}>{head}</span>\n </div>\n )}\n {headOn && head !== t.vcSheet && (\n <button\n type=\"button\"\n onClick={(e) => { e.stopPropagation(); setFold((f) => ({ ...f, [head]: open(head) })); }}\n title={`${shown ? 'Hide ' : 'Show '}${head.toLowerCase()} voices`}\n aria-expanded={shown}\n style={{ width: '100%', textAlign: 'left', font: 'inherit', display: 'flex', alignItems: 'center', gap: 7, padding: shown ? '14px 2px 6px' : '14px 2px 14px', border: 0, borderTop: i === 0 && !noClone ? '0' : '1px solid var(--hair)', background: 'transparent', cursor: 'pointer', userSelect: 'none' }}\n >\n <Icon d={D.chevronDown} size={12} sw={2.4} style={{ flex: 'none', color: 'var(--ink-45)', transform: `rotate(${shown ? '0deg' : '-90deg'})`, transition: 'transform .18s ease' }} />\n <span style={{ font: '600 9px var(--vs-font-mono)', letterSpacing: '.13em', color: 'var(--ink-62)' }}>{head}</span>\n <span style={{ font: '600 9px var(--vs-font-mono)', color: 'var(--ink-62)' }}>{headCount}</span>\n </button>\n )}\n <button\n type=\"button\"\n aria-selected={v.id === currentId}\n aria-hidden={!shown}\n tabIndex={shown ? undefined : -1}\n onClick={() => onPick(v)}\n style={{ width: '100%', textAlign: 'left', font: 'inherit', border: 0, borderTop: shown ? rule : '0', display: 'flex', alignItems: 'center', gap: 11, padding: shown ? '11px 8px' : '0px 8px', margin: '0 -6px', borderRadius: 10, background: armedId === v.id ? 'var(--brand-tint)' : 'transparent', cursor: 'pointer', opacity: shown ? 1 : 0, maxHeight: shown ? 120 : 0, overflow: 'hidden', transition: 'max-height 280ms cubic-bezier(.32,.72,0,1),padding 280ms cubic-bezier(.32,.72,0,1),opacity 200ms ease' }}\n >\n <span title={dling ? 'Downloading this voice' : undefined} style={{ flex: 'none', width: 32, height: 32, borderRadius: '50%', background: dling ? 'transparent' : v.cloned ? 'var(--brand-soft)' : 'var(--fill-06)', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {dling\n ? <span style={{ width: 16, height: 16, borderRadius: '50%', border: '2px solid var(--fill-10)', borderTopColor: 'var(--brand)', animation: 'vs-spin .7s linear infinite' }} />\n : sampleId === v.id\n ? <span className=\"vcplay\"><span className=\"vcplay__eq\"><Equaliser height={13} width={2.5} /></span><span className=\"vcplay__stop\"><StopGlyph size={11} /></span></span>\n : <Icon d={v.cloned ? D.voiceClone : v.gender === 'female' ? D.venus : v.gender === 'male' ? D.mars : D.mic} size={15} sw={1.6} style={{ color: v.cloned ? 'var(--brand)' : 'var(--ink-55)' }} />}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 7, minWidth: 0 }}>\n <span style={{ minWidth: 0, fontSize: 14.5, fontWeight: v.id === currentId ? 600 : 400, color: 'var(--ink-96)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{v.name}</span>\n </div>\n {detail && <div style={{ fontSize: 12, fontWeight: 300, color: 'var(--ink-62)', marginTop: 2, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{detail}</div>}\n {shares && (v.id === currentId ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: 5, marginTop: 3, minWidth: 0 }}>\n <Icon d={D.notice} size={12} sw={1.7} style={{ flex: 'none', color: 'var(--conf-mid)' }} />\n <span style={{ minWidth: 0, fontSize: 11, fontWeight: 300, color: 'var(--conf-mid)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{`${t.vcShared} ${shares}`}</span>\n </div>\n ) : (\n <div style={{ marginTop: 2, minWidth: 0, fontSize: 12, fontWeight: 300, color: 'var(--ink-50)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{`${t.vcUsedBy} ${shares}`}</div>\n ))}\n </div>\n <div style={{ flex: 'none', width: v.live ? (v.id === currentId ? 18 : 0) : 42, overflow: 'hidden', display: 'flex', alignItems: 'center', justifyContent: 'flex-end', gap: 6 }}>\n <span style={{ flex: 'none', width: 18, height: 18 }} />\n <span style={{ flex: 'none', width: 18, height: 18, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n {v.id === currentId && <Icon d={D.check} size={17} sw={2.2} style={{ flex: 'none', color: 'var(--brand)' }} />}\n </span>\n </div>\n {(v.live || (v.cloned && v.library === false && !v.auto && !!onAdd)) && (\n <span className=\"gvadd\" role=\"button\" title={v.live ? `Save ${v.name}’s voice from this session` : `Add ${v.name} to My voices`} onClick={onAdd ? (e) => { e.stopPropagation(); onAdd(v); } : undefined}>\n <Icon d={D.plus} size={14} sw={2} />Add\n </span>\n )}\n </button>\n </Fragment>\n );\n })}\n {useOn && (\n <div style={{ position: 'sticky', bottom: 0, zIndex: 3, marginTop: 6, padding: '11px 0 3px', animation: 'vs-slide-up .18s ease-out' }}>\n <button type=\"button\" className=\"vcuse\" title=\"Apply this voice\" onClick={() => armedId && onUse(armedId)}>\n <span>{t.vcUse}</span>\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport function Equaliser({ height, width = 2 }: { height: number; width?: number }) {\n const bar = { width, height: '100%', borderRadius: 1, background: 'var(--brand)' } as const;\n return (\n <span style={{ flex: 'none', display: 'flex', alignItems: 'flex-end', gap: 2, height }}>\n <span style={{ ...bar, animation: 'vs-eq .62s ease-in-out infinite' }} />\n <span style={{ ...bar, animation: 'vs-eq .62s ease-in-out .2s infinite' }} />\n <span style={{ ...bar, animation: 'vs-eq .62s ease-in-out .38s infinite' }} />\n </span>\n );\n}\n\nconst ORIGINAL_FLAG = (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 3 }}>\n <Icon d={D.langAuto} size={19} sw={1.7} style={{ color: 'var(--ink-62)', display: 'block' }} />\n <Icon d={D.globe} size={18} sw={1.6} style={{ color: 'var(--ink-62)', display: 'block' }} />\n </span>\n);\n\nexport function langMeta(langs: LanguageLists | null, code: string | null) {\n const l = code ? langs?.languages.find((x) => x.code === code) : null;\n return { flag: code ? (l?.flag ?? '\\u{1F310}') : ORIGINAL_FLAG, code: code ? code.toUpperCase() : '', label: l?.native ?? 'As spoken', name: l?.name ?? 'Original' };\n}\n\nexport const PLAIN_CHIP: React.CSSProperties = { background: 'transparent', minHeight: 38, height: 38, width: 'auto' };\n\nexport const BAR_CHIP: React.CSSProperties = { minHeight: 36, height: 36, padding: '0 11px', background: 'var(--fill-06)' };\n\nexport function useVoiceCatalogue(\n lang: string | null,\n active: boolean,\n version: number = 0,\n rec?: { id: string | null; token?: string | null; shareCode?: string | null },\n) {\n const recId = rec?.id ?? null;\n const recToken = rec?.token ?? null;\n const recShare = rec?.shareCode ?? null;\n const api = usePlayerApi();\n const { data } = useAsync(async () => {\n if (!lang || !active) return null;\n try {\n return (await api.client.voices.available(lang, { recording: recId ?? undefined, shareCode: recId ? recShare ?? undefined : undefined, asOwner: api.owner })) as unknown as { voices: AvailableVoice[] };\n } catch {\n return null;\n }\n }, [lang, active, version, recId, recToken, recShare]);\n return data;\n}\n\nexport function namedCount(model: Model): number {\n return new Set([...Object.keys(model.speakers), ...Object.keys(model.speakerIds)]).size;\n}\n\n\nexport function useArchiveVoice({ recordingId, lang, ended, cred, pickedVoice, sentenceIds }: {\n recordingId: string | null;\n lang: string | null;\n ended: boolean;\n cred: MediaCred;\n pickedVoice: string | null;\n sentenceIds?: number[];\n}) {\n const api = usePlayerApi();\n const { data: listed, reload } = useAsync(async () => {\n if (!recordingId || !lang) return null;\n const got = (await api.client.recordings.voice(recordingId, lang, api.readAs).catch(() => [])) as unknown as VoiceTrackRow[];\n return { recordingId, lang, rows: got.filter((x) => x.lang === lang) };\n }, [recordingId, lang, api, ended]);\n const rows = useMemo(\n () => (listed && listed.lang === lang && listed.recordingId === recordingId ? listed.rows : []),\n [listed, lang, recordingId],\n );\n const track = useMemo(() => rowForVoice(rows, pickedVoice), [rows, pickedVoice]);\n const renderVoiceId = track ? track.voiceKey || null : pickedVoice;\n const [asking, setAsking] = useState<string | null>(null);\n const [renderError, setRenderError] = useState<string | null>(null);\n const asked = useRef(new Set<string>());\n const renderKey = `${recordingId ?? ''}|${lang ?? ''}|${renderVoiceId ?? ''}`;\n const requestRender = useCallback(async (voiceId: string | null, cast?: Map<number, string> | null) => {\n if (!recordingId || !lang || !ended) return;\n const fromKey = cast?.size ? null : parseCast(voiceId);\n const use = cast?.size ? cast : fromKey;\n const castObj = use && use.size ? Object.fromEntries([...use].map(([k2, v]) => [String(k2), v])) : null;\n const k = `${recordingId}|${lang}|${castObj ? JSON.stringify(castObj) : voiceId ?? ''}`;\n if (asked.current.has(k)) return;\n asked.current.add(k);\n setAsking(k);\n setRenderError(null);\n const body: { langs: string[]; voice?: string; voiceBySpeaker?: Record<string, string> } = { langs: [lang] };\n if (castObj) body.voiceBySpeaker = castObj;\n else if (voiceId) body.voice = voiceId;\n const r = await apiFetch(api, `/v1/recordings/${recordingId}/voice`, { method: 'POST', body }).catch(() => null);\n setAsking((a) => (a === k ? null : a));\n if (!r?.ok) {\n asked.current.delete(k);\n const e = r ? await r.json().catch(() => null) : null;\n setRenderError((e?.message as string) || 'This voice could not be prepared.');\n return;\n }\n reload();\n }, [recordingId, lang, ended, api, reload]);\n const forget = useCallback(() => {\n const prefix = `${recordingId ?? ''}|${lang ?? ''}|`;\n for (const k of [...asked.current]) if (k.startsWith(prefix)) asked.current.delete(k);\n setRenderError(null);\n }, [recordingId, lang]);\n const rendering = (!!track && (track.state === 'queued' || track.state === 'running')) || asking === renderKey;\n const failed = track?.state === 'failed' ? track.error || 'the render failed' : renderError;\n const sentenceKey = sentenceIds?.join(',') ?? '';\n const [near, setNear] = useState<number | null>(null);\n const made = useMemo(() => new Set(track?.clips ?? []), [track]);\n const missing = useMemo(() => (ended && sentenceKey ? sentenceKey.split(',').map(Number).filter((id) => !made.has(id)) : []), [ended, sentenceKey, made]);\n const kicked = useRef<{ key: string; near: number; at: number } | null>(null);\n useEffect(() => {\n if (!ended || !recordingId || !lang || !missing.length) return;\n const at = near ?? missing[0];\n const target = missing.find((id) => id >= at) ?? missing[0];\n const key = `${recordingId}|${lang}|${renderVoiceId ?? ''}`;\n const prev = kicked.current;\n if (prev && prev.key === key && Math.abs(prev.near - target) < 12 && Date.now() - prev.at < 60_000) return;\n kicked.current = { key, near: target, at: Date.now() };\n const castMap = parseCast(renderVoiceId);\n const body: { langs: string[]; near: number; voice?: string; voiceBySpeaker?: Record<string, string> } = { langs: [lang], near: target };\n if (castMap && castMap.size) body.voiceBySpeaker = Object.fromEntries([...castMap].map(([k2, v]) => [String(k2), v]));\n else if (renderVoiceId) body.voice = renderVoiceId;\n void apiFetch(api, `/v1/recordings/${recordingId}/voice`, { method: 'POST', body })\n .then((r) => { if (!r.ok) kicked.current = null; })\n .catch(() => { kicked.current = null; });\n }, [ended, recordingId, lang, renderVoiceId, near, missing, api]);\n const missingNow = missing.length > 0;\n const lastCount = useRef({ n: -1, at: 0 });\n useEffect(() => {\n if (!missingNow) return;\n const t = setInterval(() => {\n const n = made.size;\n if (n !== lastCount.current.n) lastCount.current = { n, at: Date.now() };\n if (Date.now() - lastCount.current.at > 10 * 60_000) return;\n reload();\n }, 3000);\n return () => clearInterval(t);\n }, [missingNow, reload, made]);\n const clips = useMemo(() => {\n if (!recordingId) return [];\n const ids = sentenceKey ? sentenceKey.split(',').map(Number).filter((id) => !ended || made.has(id)) : undefined;\n const row = track ?? (ids?.length && lang\n ? { lang, voiceKey: pickedVoice ?? '', state: 'clips', clips: [], voice: null } as VoiceTrackRow\n : null);\n return archiveClips(row, recordingId, api.origin, cred, ids);\n }, [track, recordingId, api, cred, sentenceKey, lang, pickedVoice, ended, made]);\n const coming = useMemo(() => new Set(missing), [missing]);\n return { listed, rows, track, renderVoiceId, rendering, failed, clips, requestRender, forget, reload, setNear, missing: missing.length, coming };\n}\n\nexport interface TabSpec<K extends string> { key: K; label: string; icon?: string; sw?: number }\nexport function HeadTap({ onBack, children }: { onBack: () => void; children: React.ReactNode }) {\n const lead = useRef<HTMLDivElement>(null);\n useLayoutEffect(() => {\n const el = lead.current, head = el?.parentElement;\n if (!el || !head) return;\n const ro = new ResizeObserver(() => fit());\n const watched = new Set<Element>();\n const sideCol = () => {\n for (let a: HTMLElement | null = head.parentElement; a; a = a.parentElement) {\n const c = [...a.querySelectorAll<HTMLElement>('[data-tab-col]')].find((x) => x.offsetWidth > 0);\n if (c) return c;\n }\n return null;\n };\n const fit = () => {\n const pins = [...head.querySelectorAll<HTMLElement>('.dhead__clock--pin, .dhead__lib')];\n const col = pins.length ? sideCol() : null;\n if (col && !watched.has(col)) { watched.add(col); ro.observe(col); }\n const right = col ? `${Math.round(head.getBoundingClientRect().right - col.getBoundingClientRect().left + 20)}px` : '';\n pins.forEach((p) => { if (p.style.right !== right) p.style.right = right; });\n const left = Math.min(...pins.map((p) => p.getBoundingClientRect().left));\n const mw = pins.length ? `${Math.max(160, Math.floor(left - el.getBoundingClientRect().left - 16))}px` : '';\n if (el.style.maxWidth !== mw) el.style.maxWidth = mw;\n };\n fit();\n ro.observe(head);\n const mo = new MutationObserver(fit);\n mo.observe(document.documentElement, { attributes: true, attributeFilter: ['style'] });\n mo.observe(head, { childList: true });\n return () => { ro.disconnect(); mo.disconnect(); };\n }, []);\n return (\n <div className=\"dhead__lead\" ref={lead}>\n <div className=\"dhead__tap\" role=\"button\" tabIndex={0} title=\"Back\" aria-label=\"Back\" onClick={(e) => { e.currentTarget.blur(); onBack(); }} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onBack(); } }}>\n <span className=\"dhead__back\" aria-hidden=\"true\"><Icon d={D.chevronLeft} size={19} sw={1.7} /></span>\n {children}\n </div>\n </div>\n );\n}\n\nconst TAB_ICON: Record<string, string> = { share: D.share, delay: D.tabGauge, video: D.video, source: D.tabSources, script: D.tabScript, fix: D.tabFix, ending: D.tabEnding, summary: D.tabSummary, export: D.tabExport, settings: D.tabSettings, sources: D.tabSources, recs: D.mic };\n\nexport function TabBar<K extends string>({ tabs, current, onPick, gap, fold = true, side = !fold }: { tabs: TabSpec<K>[]; current: K | 'none'; onPick: (k: K | 'none') => void; side?: boolean; gap?: boolean; fold?: boolean }) {\n const few = fold && tabs.length <= 3;\n const anyOn = tabs.some((t) => t.key === current);\n const [tip, setTip] = useState<{ k: K; label: string; x: number; y: number } | null>(null);\n const tipRef = useRef<HTMLDivElement>(null);\n const [tipW, setTipW] = useState(0);\n useEffect(() => { if (tipRef.current) setTipW(tipRef.current.offsetWidth); }, [tip?.k]);\n const showTip = (e: React.MouseEvent<HTMLElement>, t: TabSpec<K>) => {\n const l = e.currentTarget.querySelector<HTMLElement>('.tabbar__label');\n if (few || fold || t.key === current || (l && getComputedStyle(l).opacity === '1')) { if (tip) setTip(null); return; }\n if (tip?.k === t.key) return;\n const tab = e.currentTarget.getBoundingClientRect();\n const strip = (e.currentTarget.parentElement as HTMLElement).getBoundingClientRect();\n setTip({ k: t.key, label: t.label, x: tab.left + tab.width / 2, y: strip.top });\n };\n const hideTip = () => setTip(null);\n let tipEl: ReactNode = null;\n if (tip) {\n const strip = { l: 0, r: typeof window !== 'undefined' ? window.innerWidth : 0 };\n const w = tipW || 80;\n const left = Math.max(strip.l + 8, Math.min(strip.r - w - 8, tip.x - w / 2));\n tipEl = createPortal(\n <div className=\"vsp vsp-portal\" data-theme=\"dark\"><div ref={tipRef} data-theme=\"dark\" className=\"vs-tip__bubble vs-tip__bubble--top tabtip\" style={{ position: 'fixed', left, top: tip.y - 8, bottom: 'auto', width: 'auto', whiteSpace: 'nowrap', transform: 'translateY(-100%)', zIndex: 2147483000, pointerEvents: 'none' }}>\n <span className=\"vs-tip__row\"><span className=\"vs-tip__copy\">{tip.label}</span></span>\n <span className=\"vs-tip__arrow\" style={{ left: Math.round(Math.max(8, Math.min(w - 19, tip.x - left - 5.5))) }} />\n </div></div>,\n document.body,\n );\n }\n return (\n <div role=\"tablist\" className={`tabbar tabbar--icons${fold ? '' : ' tabbar--desk'}`} data-desk-tabs={side ? '' : undefined} data-tab-n={side ? tabs.length : undefined} style={{ marginBottom: gap ? 12 : 0 }} onMouseLeave={hideTip}>\n {tabs.map((t) => {\n const on = current === t.key;\n const labelled = few || on;\n const flex = few ? '1 1 0' : on ? '1 1 auto' : fold && !anyOn ? '1 1 0' : '0 0 auto';\n const icon = t.icon ?? TAB_ICON[t.key];\n const pick = () => { hideTip(); onPick(fold && on ? 'none' : t.key); };\n return fold ? (\n <button key={t.key} type=\"button\" role=\"tab\" aria-selected={on} title={t.label} className={`tabbar__tab${on ? ' is-on' : ''}`} style={{ flex }} onClick={pick}>\n {icon && <Icon d={icon} size={15} sw={t.sw ?? 2} style={{ flex: 'none' }} />}\n {labelled && <span className=\"tabbar__label\">{t.label}</span>}\n </button>\n ) : (\n <div key={t.key} className=\"tabbar__slot\" data-tab-cell=\"\" style={{ flex }} onMouseEnter={(e) => showTip(e, t)} onMouseMove={(e) => showTip(e, t)} onClick={pick}>\n <button type=\"button\" role=\"tab\" aria-selected={on} aria-label={t.label} className={`tabbar__tab${on ? ' is-on' : ''}${tip?.k === t.key ? ' is-tip' : ''}`}>\n {icon && <Icon d={icon} size={15} sw={t.sw ?? 2} className=\"tabbar__icon\" style={{ flex: 'none', transform: on && !few ? 'scale(1.12)' : 'none' }} />}\n <span className=\"tabbar__grow\" data-tab-lw=\"\" style={{ gridTemplateColumns: labelled ? '1fr' : '0fr', marginLeft: labelled && icon ? 6 : 0 }}>\n <span className=\"tabbar__label\" data-tab-l=\"\" style={{ opacity: labelled ? 1 : 0, transform: labelled ? 'none' : 'translateX(-6px)' }}>{t.label}</span>\n </span>\n </button>\n </div>\n );\n })}\n {tipEl}\n </div>\n );\n}\n\nconst DL_D = 'M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3';\nconst MUSIC_D = 'm9 9 10.5-3m0 6.553v3.75a2.25 2.25 0 0 1-1.632 2.163l-1.32.377a1.803 1.803 0 1 1-.99-3.467l2.31-.66a2.25 2.25 0 0 0 1.632-2.163Zm0 0V2.25L9 5.25v10.303m0 0v3.75a2.25 2.25 0 0 1-1.632 2.163l-1.32.377a1.803 1.803 0 0 1-.99-3.467l2.31-.66A2.25 2.25 0 0 0 9 15.553Z';\n\ntype Download = { name: string; meta: string; onClick: () => void | Promise<unknown> };\n\nexport function ExportPanel({ audio, video, formats, onExport }: { audio?: Download | null; video?: Download | null; formats?: boolean; onExport: (k: ExportFormat) => void | Promise<unknown> }) {\n const [done, setDone] = useState<string | null>(null);\n const [busy, setBusy] = useState<string | null>(null);\n const timer = useRef<number | undefined>(undefined);\n const alive = useRef(true);\n useEffect(() => { alive.current = true; return () => { alive.current = false; window.clearTimeout(timer.current); }; }, []);\n const flash = (k: string) => { window.clearTimeout(timer.current); setDone(k); timer.current = window.setTimeout(() => setDone(null), 1600); };\n const exportAs = (k: ExportFormat) => {\n if (busy) return;\n setBusy(k);\n Promise.resolve()\n .then(() => onExport(k))\n .then(() => { if (alive.current) flash(k); })\n .catch(() => { })\n .finally(() => { if (alive.current) setBusy(null); });\n };\n const save = (k: 'audio' | 'video', dl: Download) => {\n if (busy) return;\n setBusy(k);\n Promise.resolve()\n .then(() => dl.onClick())\n .then(() => { if (alive.current) flash(k); })\n .catch(() => { })\n .finally(() => { if (alive.current) setBusy(null); });\n };\n const row = (k: 'audio' | 'video', dl: Download, icon: string, label: string) => (\n <>\n <Eyebrow style={{ letterSpacing: '.12em', color: 'var(--ink-35)' }}>{label}</Eyebrow>\n <button type=\"button\" className=\"dlrow\" disabled={busy != null} aria-busy={busy === k || undefined} onClick={() => save(k, dl)} style={busy && busy !== k ? { opacity: 0.45 } : undefined}>\n {busy === k\n ? <Spinner size={17} color=\"var(--brand)\" track=\"var(--fill-12)\" />\n : <Icon d={icon} size={17} sw={1.5} style={{ flex: 'none', color: 'var(--ink-70)' }} />}\n <span style={{ flex: 1, minWidth: 0, display: 'flex', flexDirection: 'column', gap: 1, textAlign: 'left' }}>\n <span style={{ fontSize: 13, fontWeight: 500, color: 'var(--ink-96)', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>{dl.name}</span>\n <span style={{ font: '500 9.5px var(--vs-font-mono)', color: 'var(--ink-40)', letterSpacing: '.04em' }}>{dl.meta}</span>\n </span>\n <Icon d={done === k ? D.check : DL_D} size={17} sw={1.6} style={{ flex: 'none', color: done === k ? 'var(--brand)' : 'var(--ink-62)' }} />\n </button>\n </>\n );\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n {audio && row('audio', audio, MUSIC_D, 'DOWNLOAD AUDIO')}\n {video && row('video', video, D.video, 'DOWNLOAD VIDEO')}\n {formats !== false && (\n <>\n <Eyebrow style={{ letterSpacing: '.12em', color: 'var(--ink-35)' }}>EXPORT AS</Eyebrow>\n <div className=\"fmtgrid\">\n {TX_FORMATS.map((f) => (\n <button key={f.key} type=\"button\" className=\"fmtgrid__cell\" title={busy === f.key ? `Building the ${f.name}…` : f.note} disabled={busy != null} aria-busy={busy === f.key || undefined} onClick={() => exportAs(f.key)} style={busy && busy !== f.key ? { opacity: 0.45 } : undefined}>\n {busy === f.key\n ? <Spinner size={16} color=\"var(--brand)\" track=\"var(--fill-12)\" />\n : <Icon d={done === f.key ? D.check : f.icon} size={16} sw={1.6} style={{ color: done === f.key ? 'var(--brand)' : 'var(--ink-62)' }} />}\n <span>{f.name}</span>\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n );\n}\n\n\n\nexport function shareLink(url: string, title: string, onCopied?: () => void) {\n const copy = () => { void navigator.clipboard?.writeText(url).then(() => onCopied?.(), () => {}); };\n if (navigator.share) { navigator.share({ title, url }).catch((e) => { if (!e || (e as Error).name !== 'AbortError') copy(); }); return; }\n copy();\n}\n\n\nexport type SummaryState = {\n state: 'idle' | 'pending' | 'ready' | 'unavailable' | 'not_requested';\n request?: () => void;\n title?: string;\n summary?: string;\n slow?: boolean;\n retry: () => void;\n};\n\nconst SUMMARY_POLL_MS = 4000;\nconst SUMMARY_REASK_MS = 60_000;\nconst SUMMARY_SLOW_MS = 180_000;\n\nexport function useSummaryIn(base: SummaryState, recordingId: string | null, lang: string | null): SummaryState {\n const [got, setGot] = useState<{ key: string; s: SummaryState } | null>(null);\n const ready = base.state === 'ready';\n const key = `${recordingId ?? ''}|${lang ?? ''}|${ready ? `${base.title}\\n${base.summary}` : ''}`;\n const api = usePlayerApi();\n useEffect(() => {\n if (!recordingId || !lang || !ready) return;\n let alive = true;\n api.client.recordings.summary(recordingId, { lang, ...api.readAs })\n .then((r) => r as unknown as { state: string; title?: string; summary?: string })\n .then((r) => {\n if (!alive) return;\n const s: SummaryState = r?.state === 'ready' && r.title && r.summary ? { state: 'ready', title: r.title, summary: r.summary, retry: base.retry } : base;\n setGot({ key, s });\n })\n .catch(() => { if (alive) setGot({ key, s: base }); });\n return () => { alive = false; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [key, api]);\n if (!lang || !ready) return base;\n if (got?.key === key) return got.s;\n return { state: 'pending', retry: base.retry };\n}\n\nexport function summaryOf(rec: { title?: string | null; summary?: string | null } | null | undefined): SummaryState {\n return rec?.title && rec?.summary ? { state: 'ready', title: rec.title, summary: rec.summary, retry: () => {} } : { state: 'unavailable', retry: () => {} };\n}\n\nexport function SummaryPanel({ s }: { s: SummaryState }) {\n const [copied, setCopied] = useState(false);\n const timer = useRef<number | undefined>(undefined);\n useEffect(() => () => window.clearTimeout(timer.current), []);\n const title = s.title ?? '';\n const body = s.summary ?? '';\n const copy = () => {\n void navigator.clipboard?.writeText(`${title}\\n\\n${body}`).catch(() => {});\n window.clearTimeout(timer.current);\n setCopied(true);\n timer.current = window.setTimeout(() => setCopied(false), 1600);\n };\n const note = (text: string, action?: { label: string; onClick: () => void }) => (\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, fontSize: 13, fontWeight: 300, lineHeight: 1.45, color: 'var(--ink-45)' }}>\n <span style={{ flex: 1 }}>{text}</span>\n {action && <button type=\"button\" className=\"txlinks__manage\" onClick={action.onClick}>{action.label}</button>}\n </div>\n );\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8, minHeight: 24 }}>\n <Eyebrow style={{ letterSpacing: '.12em', color: 'var(--ink-35)' }}>SUMMARY</Eyebrow>\n {s.state === 'ready' && (\n <button type=\"button\" className=\"sumcopy\" title=\"Copy title and summary\" style={{ color: copied ? 'var(--brand)' : 'var(--ink-70)' }} onClick={copy}>\n <Icon d={copied ? D.check : COPY_D} size={13} sw={1.6} />{copied ? 'Copied' : 'Copy'}\n </button>\n )}\n </div>\n {s.state === 'ready' ? (\n <>\n <div style={{ fontSize: 15, fontWeight: 600, lineHeight: 1.3, letterSpacing: '-.15px', color: 'var(--ink-96)', textWrap: 'pretty' } as React.CSSProperties}>{title}</div>\n <div style={{ fontSize: 13, fontWeight: 300, lineHeight: 1.55, color: 'var(--ink-80)', textWrap: 'pretty', whiteSpace: 'pre-line' } as React.CSSProperties}>{body}</div>\n </>\n ) : s.state === 'unavailable' ? (\n note('No summary for this recording.')\n ) : s.state === 'not_requested' ? (\n s.request ? note('This recording was made without a summary.', { label: 'Summarize', onClick: s.request }) : note('Recordings under a minute and files of a batch are not summarised.')\n ) : (\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, fontSize: 13, fontWeight: 300, color: 'var(--ink-45)' }}>\n <Spinner size={14} color=\"var(--brand)\" track=\"var(--fill-12)\" />{s.slow ? 'Still writing the summary…' : 'Writing the summary…'}\n </div>\n )}\n </div>\n );\n}\n\nexport function LiveVideo({ ytId, title, timeLabel, radius, style, large, children, picture }: { ytId: string; title: string; timeLabel?: string | null; radius?: number; style?: React.CSSProperties; large?: boolean; children?: React.ReactNode; picture?: React.ReactNode }) {\n return (\n <div className=\"livevid\" style={{ ...(radius != null ? { borderRadius: radius } : null), ...style }}>\n <Icon d=\"m15.75 10.5 4.72-4.72a.75.75 0 0 1 1.28.53v11.38a.75.75 0 0 1-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25h-9A2.25 2.25 0 0 0 2.25 7.5v9a2.25 2.25 0 0 0 2.25 2.25Z\" size={large ? 34 : 30} sw={1.2} />\n {picture ?? <iframe src={liveEmbedUrl(ytId)} title={title} referrerPolicy=\"strict-origin-when-cross-origin\" allow=\"autoplay; encrypted-media; picture-in-picture\" />}\n {timeLabel && <span className=\"livevid__t\" style={large ? { bottom: 10, right: 10 } : undefined}>{timeLabel}</span>}\n {children}\n </div>\n );\n}\n\n\n\nexport function useDragScroll(enabled = true, external?: React.RefObject<HTMLDivElement>) {\n const own = useRef<HTMLDivElement | null>(null);\n const ref = (external ?? own) as React.MutableRefObject<HTMLDivElement | null>;\n useEffect(() => {\n const el = ref.current;\n if (!el || !enabled) return;\n let startY = 0, startTop = 0, dragging = false;\n const down = (e: PointerEvent) => {\n if (e.button !== 0 || (e.target as HTMLElement).closest('button,a,input,textarea,select')) return;\n dragging = true;\n startY = e.clientY;\n startTop = el.scrollTop;\n el.classList.add('is-dragging');\n };\n const move = (e: PointerEvent) => {\n if (!dragging) return;\n const dy = e.clientY - startY;\n if (Math.abs(dy) > 2) el.setPointerCapture?.(e.pointerId);\n el.scrollTop = startTop - dy;\n };\n const up = () => { dragging = false; el.classList.remove('is-dragging'); };\n el.addEventListener('pointerdown', down);\n el.addEventListener('pointermove', move);\n window.addEventListener('pointerup', up);\n return () => {\n el.removeEventListener('pointerdown', down);\n el.removeEventListener('pointermove', move);\n window.removeEventListener('pointerup', up);\n };\n }, [enabled]);\n return ref;\n}\n\nconst COPY_D = 'M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75';\n","import { useEffect, useRef, type CSSProperties, type ReactNode } from 'react';\nimport { D, Icon } from '../ds/Icons';\nimport { useColW, useSidePins } from '../data/prefs';\nimport { TabBar, type TabSpec } from './shared';\n\nexport interface SideTabsOpts<K extends string> {\n tabs: TabSpec<K>[];\n tabbed?: boolean;\n pinnable?: K[];\n autoPin?: K[];\n forcePin?: K[];\n cur: K | 'none' | null;\n pref?: K;\n onPick: (k: K) => void;\n}\n\nexport interface SidePanelState { show: boolean; pinned: boolean; order: number; pill: boolean; title: string; toggle: () => void }\n\nexport interface SideTabs<K extends string> {\n id: string;\n tabbed: boolean;\n cur: K | null;\n seq: K[];\n pinnable: K[];\n tabKeys: K[];\n stripTabs: TabSpec<K>[];\n panel: (k: K) => SidePanelState;\n pin: (k: K, at?: number) => void;\n unpin: (k: K) => void;\n}\n\nexport function useSideTabs<K extends string>(id: string, o: SideTabsOpts<K>): SideTabs<K> {\n const [stored, setStored] = useSidePins(id);\n const keys = o.tabs.map((t) => t.key);\n const tabbed = o.tabbed !== false;\n const pinnable = o.pinnable ?? keys;\n let list = stored;\n [...(o.autoPin ?? [])].reverse().forEach((k) => { if (keys.includes(k) && !list.includes(k) && !list.includes(`!${k}`)) list = [k, ...list]; });\n const kept = list;\n (o.forcePin ?? []).forEach((k) => { list = list.filter((x) => x !== `!${k}`); if (keys.includes(k) && !list.includes(k)) list = [k, ...list]; });\n const forced = (k: string) => (o.forcePin ?? []).includes(k as K) && !kept.includes(k);\n const seq = tabbed ? (list.filter((k) => keys.includes(k as K) && pinnable.includes(k as K)) as K[]) : [];\n const tabKeys = keys.filter((k) => !seq.includes(k));\n const cur = o.cur && o.cur !== 'none' && tabKeys.includes(o.cur) ? o.cur : o.pref && tabKeys.includes(o.pref) ? o.pref : (tabKeys[0] ?? null);\n const after = (k: K) => { const rest = tabKeys.filter((x) => x !== k); return rest[tabKeys.indexOf(k)] ?? rest[rest.length - 1] ?? null; };\n const pin = (k: K, at?: number) => {\n if (!pinnable.includes(k)) return;\n const next = seq.filter((x) => x !== k);\n next.splice(at == null ? next.length : at, 0, k);\n if (cur === k) { const n = after(k); if (n) o.onPick(n); }\n setStored([...next.filter((x) => !forced(x) || x === k), ...kept.filter((x) => !next.includes(x as K) && x !== `!${k}`)]);\n };\n const unpin = (k: K) => {\n setStored([...kept.filter((x) => x !== k && x !== `!${k}`), ...((o.autoPin ?? []).includes(k) ? [`!${k}`] : [])]);\n o.onPick(k);\n };\n const label = (k: K) => o.tabs.find((t) => t.key === k)?.label ?? k;\n const panel = (k: K): SidePanelState => {\n const p = seq.includes(k), avail = keys.includes(k);\n return {\n show: avail && (!tabbed || p || cur === k), pinned: p, order: p ? seq.indexOf(k) + 1 : 1000,\n pill: tabbed && avail && pinnable.includes(k) && tabKeys.length > 0 && (p || tabKeys.length > 1),\n title: p ? `Unpin — return ${label(k)} to the tabs` : `Pin ${label(k)} open above the tabs`,\n toggle: () => (p ? unpin(k) : pin(k)),\n };\n };\n return { id, tabbed: tabbed && tabKeys.length > 1, cur, seq, pinnable, tabKeys, stripTabs: o.tabs.filter((t) => tabKeys.includes(t.key)), panel, pin, unpin };\n}\n\nexport function SidePanels<K extends string>({ col, order, render, grip, onPick, wrapClass }: {\n col: SideTabs<K>; order: K[]; render: (k: K) => ReactNode; grip?: Partial<Record<K, number>>; onPick?: (k: K) => void;\n wrapClass?: (k: K, pinned: boolean) => string;\n}) {\n usePanelGrip(col);\n return (\n <>\n {order.map((k) => {\n const p = col.panel(k);\n if (!p.show) return null;\n const body = render(k);\n if (!body) return null;\n return (\n <div key={k} data-panel-key={k} data-pinned={p.pinned ? 'true' : 'false'} className={`pinwrap sidepanel ${wrapClass?.(k, p.pinned) ?? ''}`} style={{ order: p.order, ['--grip-h' as string]: `${grip?.[k] ?? 30}px` }}>\n {body}\n {p.pill && <button type=\"button\" data-pin-pill=\"\" className={`pinpill${p.pinned ? ' is-on' : ''}`} title={p.title} aria-label={p.title} aria-pressed={p.pinned} onClick={p.toggle}><Icon d={D.pin} size={12} sw={2} /></button>}\n </div>\n );\n })}\n {col.tabbed && col.cur && (\n <div className=\"deskstrip\" style={{ order: 999 }}>\n <TabBar tabs={col.stripTabs} current={col.cur} onPick={(k) => { if (k !== 'none') (onPick ?? (() => {}))(k); }} fold={false} />\n </div>\n )}\n </>\n );\n}\n\nfunction usePanelGrip<K extends string>(col: SideTabs<K>) {\n const live = useRef(col);\n live.current = col;\n const id = col.id;\n useEffect(() => {\n let hot: HTMLElement | null = null;\n type Drag = { el: HTMLElement; col: HTMLElement; key: K; x0: number; y0: number; on: boolean; px?: number; py?: number; raf?: number; clone?: HTMLElement;\n grid?: boolean; orig?: [HTMLElement, string][]; snap?: Record<string, DOMRect>; tabsSnap?: DOMRect | null; sig?: string; target?: { zone: 'pin' | 'tabs'; idx?: number } | null };\n let drag: Drag | null = null;\n const set = (w: HTMLElement | null) => {\n if (hot === w) return;\n if (hot) hot.removeAttribute('data-grip-hot');\n hot = w;\n if (w) w.setAttribute('data-grip-hot', '');\n };\n const tabsEl = (d: Drag) => d.col.querySelector<HTMLElement>('[data-desk-tabs]');\n const begin = (d: Drag) => {\n const r = d.el.getBoundingClientRect();\n const c = d.el.cloneNode(true) as HTMLElement;\n c.querySelectorAll<HTMLElement>('*').forEach((x) => { x.style.animation = 'none'; x.style.transition = 'none'; });\n c.querySelectorAll('iframe,video').forEach((f) => { const b = document.createElement('div'); b.style.cssText = 'width:100%;height:100%;background:#000'; f.replaceWith(b); });\n c.removeAttribute('data-panel-key');\n c.querySelectorAll('[data-panel-key],[data-pin-pill]').forEach((x) => (x.hasAttribute('data-pin-pill') ? x.remove() : x.removeAttribute('data-panel-key')));\n Object.assign(c.style, { position: 'fixed', left: `${r.left}px`, top: `${r.top}px`, width: `${r.width}px`, height: `${r.height}px`, margin: '0', zIndex: '1000', pointerEvents: 'none', opacity: '.95', borderRadius: '14px', boxShadow: '0 14px 36px rgba(0,0,0,.3)', animation: 'none', transition: 'none', cursor: 'move', willChange: 'transform', contain: 'layout paint', overflow: 'hidden' });\n const cs = getComputedStyle(d.el);\n for (let i = 0; i < cs.length; i++) { const p = cs[i]; if (p.startsWith('--')) c.style.setProperty(p, cs.getPropertyValue(p)); }\n c.style.fontFamily = cs.fontFamily; c.style.color = cs.color;\n let g: HTMLElement | null = d.el.parentElement, ground = '';\n while (g && !ground) { const bg = getComputedStyle(g).backgroundColor; if (bg && !/rgba?\\(0, 0, 0, 0\\)|transparent/.test(bg) && !/\\/ 0\\.|, 0\\.\\d+\\)$/.test(bg)) ground = bg; g = g.parentElement; }\n c.style.background = ground || getComputedStyle(document.body).backgroundColor;\n document.body.appendChild(c);\n d.orig = [...d.col.querySelectorAll<HTMLElement>('[data-panel-key]')].map((x) => [x, x.style.order]);\n d.snap = {}; d.orig.forEach(([x]) => { d.snap![x.getAttribute('data-panel-key')!] = x.getBoundingClientRect(); });\n d.tabsSnap = tabsEl(d)?.getBoundingClientRect() ?? null;\n const pg = d.col.querySelector('[data-panel-grid]'); d.grid = !!pg && getComputedStyle(pg).display === 'grid';\n d.el.classList.add('is-dragging');\n document.documentElement.style.cursor = 'move'; document.body.style.userSelect = 'none'; document.body.style.webkitUserSelect = 'none';\n Object.assign(d, { on: true, clone: c });\n set(null);\n };\n const frame = () => {\n const d = drag;\n if (!d || !d.on || d.px == null || d.py == null) return;\n d.raf = 0;\n d.clone!.style.transform = `translate3d(${d.px - d.x0}px,${d.py - d.y0}px,0)`;\n const c = live.current, k = d.key, tabs = tabsEl(d);\n const pinned = c.seq.includes(k), canPin = pinned || c.tabKeys.length > 1;\n const tr = tabs && d.tabsSnap;\n const zone = !tr || d.py < tr.top + tr.height / 2 ? (canPin ? 'pin' : null) : 'tabs';\n let t: Drag['target'] = null;\n if (zone === 'pin') {\n const rs = c.seq.filter((x) => x !== k).map((x) => d.snap![x]).filter(Boolean);\n const idx = d.grid\n ? rs.filter((r) => r.bottom < d.py! || (r.top <= d.py! && r.left + r.width / 2 < d.px!)).length\n : rs.filter((r) => r.top + r.height / 2 < d.py!).length;\n if (!(pinned && c.seq.indexOf(k) === idx)) t = { zone, idx };\n } else if (zone === 'tabs' && pinned) t = { zone };\n const sig = t ? t.zone + (t.idx ?? '') : '';\n if (sig === d.sig) return;\n d.sig = sig; d.target = t;\n d.orig!.forEach(([x, o]) => { x.style.order = o; });\n if (t?.zone === 'pin') {\n const next = c.seq.filter((x) => x !== k); next.splice(t.idx!, 0, k);\n next.forEach((x, i) => { const n = d.col.querySelector<HTMLElement>(`[data-panel-key=\"${x}\"]`); if (n) n.style.order = String(i + 1); });\n } else if (t?.zone === 'tabs') d.el.style.order = '998';\n if (tabs) { if (t?.zone === 'tabs') tabs.setAttribute('data-drop-hot', ''); else tabs.removeAttribute('data-drop-hot'); }\n };\n const end = (commit: boolean) => {\n const d = drag; drag = null;\n if (!d || !d.on) return;\n if (d.raf) cancelAnimationFrame(d.raf);\n d.clone!.remove(); d.orig!.forEach(([x, o]) => { x.style.order = o; });\n d.el.classList.remove('is-dragging');\n document.documentElement.style.cursor = ''; document.body.style.userSelect = ''; document.body.style.webkitUserSelect = '';\n tabsEl(d)?.removeAttribute('data-drop-hot');\n if (commit && d.target) { const c = live.current; if (d.target.zone === 'tabs') { if (c.seq.includes(d.key)) c.unpin(d.key); } else c.pin(d.key, d.target.idx); }\n };\n const myCol = (t: EventTarget | null) => { const el = t instanceof Element ? t.closest<HTMLElement>('[data-tab-col]') : null; return el && el.getAttribute('data-tab-col') === id ? el : null; };\n const onMove = (e: PointerEvent) => {\n if (drag) {\n if (!drag.on) { if (Math.hypot(e.clientX - drag.x0, e.clientY - drag.y0) < 4) return; begin(drag); }\n drag.px = e.clientX; drag.py = e.clientY;\n if (!drag.raf) drag.raf = requestAnimationFrame(frame);\n return;\n }\n const t = e.target as Element | null;\n if (!myCol(t)) { if (hot && hot.closest('[data-tab-col]')?.getAttribute('data-tab-col') === id) set(null); return; }\n const w = t!.closest<HTMLElement>('[data-panel-key]');\n const surf = w?.firstElementChild;\n if (!w || !surf || !live.current.tabbed || !live.current.pinnable.includes(w.getAttribute('data-panel-key') as K) || t!.closest('[role=button],[role=tab],button,a,input,textarea,select,iframe,[data-pin-pill],[contenteditable=true]')) return set(null);\n const r = surf.getBoundingClientRect(), h = parseFloat(getComputedStyle(w).getPropertyValue('--grip-h')) || 30;\n set(e.clientY >= r.top && e.clientY <= r.top + h ? w : null);\n };\n const onDown = (e: PointerEvent) => {\n if (!hot || e.button !== 0) return;\n const c = myCol(hot); if (!c) return;\n e.preventDefault(); e.stopImmediatePropagation();\n drag = { el: hot, col: c, key: hot.getAttribute('data-panel-key') as K, x0: e.clientX, y0: e.clientY, on: false };\n };\n const onUp = () => end(true);\n const onCancel = () => end(false);\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape' && drag) { e.preventDefault(); e.stopImmediatePropagation(); end(false); } };\n const onLeave = () => { if (!drag) set(null); };\n document.addEventListener('pointermove', onMove, true);\n document.addEventListener('pointerdown', onDown, true);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onCancel);\n window.addEventListener('keydown', onKey, true);\n document.addEventListener('pointerleave', onLeave);\n return () => {\n end(false); set(null);\n document.removeEventListener('pointermove', onMove, true);\n document.removeEventListener('pointerdown', onDown, true);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onCancel);\n window.removeEventListener('keydown', onKey, true);\n document.removeEventListener('pointerleave', onLeave);\n };\n }, [id]);\n}\n\nexport function SideFrame({ id, className, gap, hidden, plain, children }: { id: string; className: string; gap: number; hidden?: boolean; plain?: boolean; children: ReactNode }) {\n const [w, setW] = useColW(id);\n const col = useRef<HTMLDivElement | null>(null);\n const grid = useRef<HTMLDivElement | null>(null);\n useMasonry(grid);\n useEffect(() => { document.documentElement.style.setProperty('--colw', `${w}px`); }, [w]);\n const onGrip = (e: React.PointerEvent<HTMLDivElement>) => {\n const el = col.current, row = el?.parentElement;\n if (e.button !== 0 || !el || !row) return;\n e.preventDefault();\n const g = e.currentTarget;\n const cs = getComputedStyle(row);\n const avail = row.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight) - (parseFloat(cs.columnGap) || 0);\n const MIN = 320, CONTENT = 320, max = Math.max(MIN, avail - CONTENT);\n const x0 = e.clientX, w0 = el.getBoundingClientRect().width;\n let nw = w0;\n g.classList.add('is-on');\n const prev = { cur: document.body.style.cursor, sel: document.body.style.userSelect };\n document.body.style.cursor = 'col-resize'; document.body.style.userSelect = 'none';\n const move = (ev: PointerEvent) => { nw = Math.round(Math.min(max, Math.max(MIN, w0 + (x0 - ev.clientX)))); el.style.flexBasis = `${nw}px`; document.documentElement.style.setProperty('--colw', `${nw}px`); };\n const up = () => {\n window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', up); window.removeEventListener('pointercancel', up);\n document.body.style.cursor = prev.cur; document.body.style.userSelect = prev.sel; g.classList.remove('is-on');\n setW(nw);\n };\n window.addEventListener('pointermove', move); window.addEventListener('pointerup', up); window.addEventListener('pointercancel', up);\n };\n const shown: CSSProperties | undefined = hidden ? { display: 'none' } : undefined;\n return (\n <>\n <div aria-hidden=\"true\" className=\"colgrip\" style={{ marginRight: -gap, ...shown }}>\n <div className=\"colgrip__bar\" style={{ left: -(gap / 2 + 6) }} title=\"Drag to resize · double-click to reset\" onPointerDown={onGrip} onDoubleClick={() => setW(null)} />\n </div>\n <div ref={col} data-tab-col={id} className={`${className} sidecol`} style={{ flex: `0 0 ${w}px`, ...shown }}>\n {plain ? children : <div ref={grid} data-panel-grid=\"\" className=\"panelgrid\">{children}</div>}\n </div>\n </>\n );\n}\n\nfunction useMasonry(ref: React.RefObject<HTMLDivElement | null>) {\n useEffect(() => {\n const g = ref.current;\n if (!g) return;\n const GAP = 16;\n let raf = 0;\n const layout = () => {\n raf = 0;\n const on = getComputedStyle(g).display === 'grid';\n [...g.children].forEach((c) => {\n const el = c as HTMLElement;\n if (!on) { if (el.style.gridRowEnd) el.style.gridRowEnd = ''; return; }\n const h = el.getBoundingClientRect().height;\n const v = h > 0 ? `span ${Math.ceil(h + GAP)}` : 'span 1';\n if (el.style.gridRowEnd !== v) el.style.gridRowEnd = v;\n });\n };\n const mark = () => { if (!raf) raf = requestAnimationFrame(layout); };\n const ro = new ResizeObserver(mark);\n const watch = () => { ro.disconnect(); ro.observe(g); [...g.children].forEach((c) => ro.observe(c)); mark(); };\n const mo = new MutationObserver(watch);\n mo.observe(g, { childList: true });\n watch();\n return () => { ro.disconnect(); mo.disconnect(); if (raf) cancelAnimationFrame(raf); };\n }, [ref]);\n}\n","export interface AudioFacts {\n state?: string | null;\n mediaDurationS?: number | null;\n ingest?: { state?: string | null; error?: string | null; startedAt?: string | null } | null;\n}\n\nexport type NoAudio = { none: false } | { none: true; message: string };\n\nexport function recordingAudio(rec: AudioFacts | null | undefined, lines: number): NoAudio {\n if (!rec || (rec.state !== 'ended' && rec.state !== 'finalized')) return { none: false };\n if (lines > 0 || (rec.mediaDurationS ?? 0) > 0) return { none: false };\n const i = rec.ingest;\n if (i && i.startedAt && i.state !== 'failed') return { none: false };\n if (!i && rec.state !== 'finalized') return { none: false };\n return { none: true, message: noAudioMessage(i?.error) };\n}\n\nexport function noAudioMessage(reason?: string | null): string {\n const r = (reason ?? '').trim().replace(/\\.$/, '');\n return r ? `No audio was recorded: ${r[0].toLowerCase()}${r.slice(1)}.` : 'No audio was recorded: the recording ended before any audio arrived.';\n}\n\nexport function isNotCaptured(message?: string | null): boolean {\n return /\\bwas not captured\\b/i.test(message ?? '');\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { deliveryFormat } from '../core/audio';\nimport { describe, type ErrorLike } from './errors';\nimport { usePlayerApi } from './context';\n\nexport interface PreviewableVoice { id: string; previewUrl?: string }\nconst SAMPLE_RETRY_MS = 1500;\nconst SAMPLE_GIVE_UP_MS = 300_000;\n\nexport function useVoicePreview(lang: string | null) {\n const api = usePlayerApi();\n const [armId, setArmId] = useState<string | null>(null);\n const [sampleId, setSampleId] = useState<string | null>(null);\n const [dlId, setDlId] = useState<string | null>(null);\n const [error, setError] = useState<ErrorLike | null>(null);\n const el = useRef<HTMLAudioElement | null>(null);\n const url = useRef<string | null>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const run = useRef(0);\n\n const release = useCallback(() => {\n if (timer.current) { clearTimeout(timer.current); timer.current = null; }\n if (el.current) { el.current.pause(); el.current.removeAttribute('src'); el.current.load(); el.current = null; }\n if (url.current) { URL.revokeObjectURL(url.current); url.current = null; }\n }, []);\n\n const stop = useCallback(() => {\n run.current += 1;\n release();\n setSampleId(null);\n setDlId(null);\n }, [release]);\n\n const reset = useCallback(() => { stop(); setArmId(null); }, [stop]);\n\n useEffect(() => () => { run.current += 1; release(); }, [release]);\n\n const arm = useCallback((v: PreviewableVoice) => {\n run.current += 1;\n const mine = run.current;\n release();\n setArmId(v.id);\n setSampleId(null);\n setDlId(null);\n setError(null);\n if (!lang) return;\n let src = v.previewUrl\n ? `${api.origin}${v.previewUrl}`\n : `${api.origin}/v1/voices/preview?voice=${encodeURIComponent(v.id)}&lang=${encodeURIComponent(lang)}`;\n if (deliveryFormat() === 'caf') src += `${src.includes('?') ? '&' : '?'}format=caf`;\n const started = Date.now();\n if (api.shareCode && src.includes('recording=')) src += `&shareCode=${encodeURIComponent(api.shareCode)}`;\n const ask = async () => {\n if (run.current !== mine) return;\n let res: Response;\n try {\n const token = api.owner ? await api.bearer() : undefined;\n res = await fetch(src, { headers: token ? { Authorization: `Bearer ${token}` } : {} });\n } catch (e) {\n if (run.current !== mine) return;\n setDlId(null);\n setError(describe(e));\n return;\n }\n if (run.current !== mine) return;\n if (res.status === 202 || res.status === 503) {\n if (Date.now() - started > SAMPLE_GIVE_UP_MS) {\n setDlId(null);\n setError({ message: 'This voice is still being fetched. Try it again in a moment.' });\n return;\n }\n setDlId(v.id);\n timer.current = setTimeout(() => { void ask(); }, SAMPLE_RETRY_MS);\n return;\n }\n if (!res.ok) {\n setDlId(null);\n const body = await res.json().catch(() => null) as { code?: string } | null;\n setError(body?.code === 'language_unavailable'\n ? { message: 'No voice can speak this language yet.', status: res.status }\n : { message: `This voice could not be previewed (${res.status}).`, status: res.status });\n return;\n }\n const blob = await res.blob();\n if (run.current !== mine) return;\n setDlId(null);\n url.current = URL.createObjectURL(blob);\n const a = new Audio(url.current);\n (a as HTMLAudioElement & { playsInline?: boolean }).playsInline = true;\n const done = () => { if (run.current === mine) { release(); setSampleId(null); } };\n a.onended = done;\n a.onerror = done;\n el.current = a;\n void a.play().then(() => { if (run.current === mine) setSampleId(v.id); }).catch(done);\n };\n void ask();\n }, [lang, release, api]);\n\n return { armId, sampleId, dlId, error, clearError: () => setError(null), arm, stop, reset };\n}\n","export interface PlaySlot { sentenceId?: number | null; start: number }\n\nexport interface PlayPos {\n t: number;\n playing: boolean;\n sentenceId: number | null;\n offset: number;\n ended: boolean;\n}\n\nexport interface PlayPlace { t: number; playing: boolean; index: number }\n\nconst EPS = 0.05;\n\nconst indexAt = (rows: readonly PlaySlot[], t: number): number => {\n let i = 0;\n for (let k = 0; k < rows.length; k++) if (rows[k].start <= t + 1e-6) i = k;\n return i;\n};\n\nexport function snapPosition(rows: readonly PlaySlot[], t: number, playing: boolean, dur: number): PlayPos {\n const at = Math.max(0, t);\n const ended = dur > 0 && at >= dur - EPS;\n const i = rows.length && rows[0].start <= at + 1e-6 ? indexAt(rows, at) : -1;\n if (i < 0) return { t: at, playing: playing && !ended, sentenceId: null, offset: 0, ended };\n return { t: at, playing: playing && !ended, sentenceId: rows[i].sentenceId ?? null, offset: Math.max(0, at - rows[i].start), ended };\n}\n\nexport function placePosition(pos: PlayPos, rows: readonly PlaySlot[], dur: number): PlayPlace {\n const end = Math.max(0, dur);\n if (pos.ended) return { t: end, playing: false, index: Math.max(0, rows.length - 1) };\n const j = pos.sentenceId == null ? -1 : rows.findIndex((r) => r.sentenceId === pos.sentenceId);\n let t = pos.t;\n if (j >= 0) {\n const from = rows[j].start;\n const len = Math.max(0, Math.min(rows[j + 1]?.start ?? end, end) - from);\n t = from + Math.min(pos.offset, Math.max(0, len - EPS));\n }\n t = Math.max(0, Math.min(end, t));\n const atEnd = end > 0 && t >= end - EPS && j < 0;\n return { t, playing: pos.playing && !atEnd, index: j >= 0 ? j : indexAt(rows, t) };\n}\n","export type VoiceWait = 'asked' | 'line' | null;\n\nexport function voiceWait(o: { on: boolean; want: boolean; relang: boolean; playing: boolean; preparing: boolean; starting: number | null | undefined }): VoiceWait {\n if (!o.on) return null;\n if (o.want || o.relang) return 'asked';\n if (o.playing && (o.preparing || o.starting != null)) return 'line';\n return null;\n}\n\nexport const VOICE_WAIT_TITLE = 'Preparing the voice…';\n","import { useEffect, useState } from 'react';\nimport { D, Icon } from '../ds/Icons';\n\n\nexport type PlayerWaitKind = 'translating' | 'voice' | 'starting' | 'translateFailed' | 'voiceFailed';\nexport interface PlayerWaitState {\n kind: PlayerWaitKind;\n lang: string;\n since?: number | null;\n}\n\nexport function playerWaitOf(o: {\n lang: string | null; langName: string;\n translating: boolean; translateFailed: string | null;\n voiceFailed: boolean; relang: boolean; starting: number | null | undefined;\n slowLine: boolean; lineSince: number | null;\n}): PlayerWaitState | null {\n if (!o.lang) return null;\n const lang = o.langName;\n if (o.translateFailed === o.lang) return { kind: 'translateFailed', lang };\n if (o.voiceFailed) return { kind: 'voiceFailed', lang };\n if (o.translating) return { kind: 'translating', lang };\n if (o.starting != null) return { kind: 'starting', lang, since: o.starting };\n if (o.relang || o.slowLine) return { kind: 'voice', lang, since: o.lineSince };\n return null;\n}\n\nexport function useHeld(on: boolean, ms: number): [boolean, number | null] {\n const [since, setSince] = useState<number | null>(null);\n const [held, setHeld] = useState(false);\n useEffect(() => {\n if (!on) { setSince(null); setHeld(false); return; }\n const at = Date.now();\n setSince(at);\n const h = setTimeout(() => setHeld(true), ms);\n return () => clearTimeout(h);\n }, [on, ms]);\n return [held, since];\n}\n\nconst clockOf = (s: number) => `${Math.floor(s / 60)}:${String(s % 60).padStart(2, '0')}`;\n\nexport function PlayerWait({ state, line, onRetry, onOriginal }: {\n state: PlayerWaitState;\n line?: string | null;\n onRetry: () => void;\n onOriginal: () => void;\n}) {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (state.since == null) return;\n const h = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(h);\n }, [state.since]);\n const elapsed = state.since != null ? Math.max(0, Math.floor((now - state.since) / 1000)) : null;\n const failed = state.kind === 'translateFailed' || state.kind === 'voiceFailed';\n const title = {\n translating: `Translating into ${state.lang}`,\n voice: `Preparing the ${state.lang} voice`,\n starting: `Starting the ${state.lang} voice`,\n translateFailed: `Couldn’t translate into ${state.lang}`,\n voiceFailed: `The ${state.lang} voice didn’t start`,\n }[state.kind];\n const note = {\n translating: 'The video carries on in the new language as soon as the words are ready — usually a few seconds.',\n voice: 'It plays on its own as soon as the first line is ready.',\n starting: 'The voice is waking up. The first line can take up to a minute; after that it reads straight on.',\n translateFailed: 'Something went wrong on our side. Try again, or watch with the original sound.',\n voiceFailed: 'It took too long to start. Try again, or watch with the original sound.',\n }[state.kind];\n return (\n <div className={`pwait${failed ? ' pwait--failed' : ''}`} data-kind={state.kind} role={failed ? 'alert' : 'status'} aria-live={failed ? 'assertive' : 'polite'}\n onClick={(e) => e.stopPropagation()} onPointerDown={(e) => e.stopPropagation()}>\n <div className=\"pwait__head\">\n {failed\n ? <div className=\"pwait__mark\" aria-hidden=\"true\"><Icon d={D.warnCircle} size={18} sw={1.8} /></div>\n : <div className=\"pwait__spin\" aria-hidden=\"true\" />}\n <div className=\"pwait__t\">{title}</div>\n {!failed && elapsed != null && elapsed >= 3 && <div className=\"pwait__clock\" aria-label={`${elapsed} seconds`}>{clockOf(elapsed)}</div>}\n </div>\n <div className=\"pwait__note\">{note}</div>\n {!failed && <div className=\"pwait__bar\" aria-hidden=\"true\"><div /></div>}\n {failed && (\n <div className=\"pwait__acts\">\n <button type=\"button\" className=\"vs-btn vs-btn--primary vs-btn--sm\" onClick={onRetry}>Try again</button>\n <button type=\"button\" className=\"vs-btn vs-btn--ghost vs-btn--sm\" onClick={onOriginal}>Watch in the original</button>\n </div>\n )}\n {!failed && line && <div className=\"pwait__line\" aria-hidden=\"true\">{line}</div>}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, useLayoutEffect } from 'react';\nimport type { Correction, LanguageLists } from '@vocalstack/js-sdk';\nimport { LanguageChip, Sheet, Switch } from '../ds/Controls';\nimport { D, Icon, PlayGlyph, Spinner } from '../ds/Icons';\nimport { isNotCaptured } from '../core/noAudio';\nimport { pickerLanguages, useRecentLangs } from '../data/prefs';\nimport { useVoicePreview } from '../data/voicePreview';\nimport { LanguagePicker, type LanguageListProps } from '../ds/LanguagePicker';\nimport { explainAudioError, mediaErrorText, reportMediaError, type MediaCred } from '../core/audio';\nimport { clock } from '../core/format';\nimport { describe, useAsync, type ErrorLike } from '../data/transcript';\nimport { usePlayerApi } from '../data/context';\nimport { strings } from '../data/i18n';\nimport { confClass, fixedSlots, lane, speakerInitial, speakerLabel, speakerLook, type Model, type Row, type Word } from '../core/transcript';\nimport { ClipQueue, newMediaElement, readCursor, VoiceNotStarted, type ReadPos, type VoiceClip } from '../core/voiceplayer';\nimport { placePosition, snapPosition, type PlayPos } from '../core/playPosition';\nimport { voiceWait, VOICE_WAIT_TITLE } from '../core/voiceWait';\nimport { useHeld } from './wait';\nimport { lineSpeechEnd, spreadWords } from '../core/readalong';\nimport { type AvailableVoice, type CastMember, FixBadges, FixPen, rowFixes, FeedBar, NO_VOICE_TIP, feedInset, SpeakerCast, VoiceIdGlyph, VoiceSheetBody, autoCast, castKey, langMeta, namedCount, rowKey, speakerRoster, useArchiveVoice, useFeedBar, useVoiceCatalogue, useDragScroll } from './shared';\n\nexport function lineWords(rows: Row[], i: number, lang?: string | null): Word[] {\n const r = rows[i];\n const tr = lang && r.translations[lang] && r.language !== lang ? r.translations[lang] : null;\n if (!tr && r.words.length) return r.words;\n const ws = (tr ?? r.text).split(/\\s+/).filter(Boolean);\n const from = r.words[0]?.start ?? r.start;\n const to = lineSpeechEnd(r, rows[i + 1], r.start + Math.max(2, ws.length * 0.4));\n return spreadWords(ws, from, to).map((w, k) => ({ ...w, seq: r.seqs[0] ?? 0, idx: k } as Word));\n}\n\nexport function spokenWordOf(player: Pick<TxPlayer, 't' | 'idx' | 'engaged' | 'wordSync' | 'clipPos'>, i: number, words: Word[]): number | null {\n if (!player.engaged || i !== player.idx || !words.length) return null;\n if (!player.wordSync) return player.clipPos ? readCursor(words.map((w) => ({ t: w.text, sp: ' ' })), player.clipPos) : null;\n const t = player.t;\n let at = -1;\n for (let j = 0; j < words.length && words[j].start <= t; j++) at = j;\n return at;\n}\n\nexport function pictureT(player: Pick<TxPlayer, 't' | 'idx' | 'wordSync' | 'clipPos' | 'dur' | 'timed'>, rows: Row[]): number {\n const cp = player.clipPos;\n if (player.wordSync || player.timed || !cp || !(cp.dur > 0)) return player.t;\n const r = rows[player.idx];\n const from = r?.start ?? player.t;\n const next = rows[player.idx + 1]?.start ?? lineEnd(r, from, player.dur);\n const span = Math.max(0, next - from);\n return from + Math.min(span, (cp.t / cp.dur) * span);\n}\n\nexport function lineEnd(r: Row | undefined, from: number, dur: number): number {\n const w = r?.words[r.words.length - 1]?.end;\n if (w != null && w > from) return w;\n if (r?.end != null && r.end > from) return r.end;\n return dur > from ? dur : from + 4;\n}\n\nexport interface YtLead { muted: boolean; onInfo: (i: { t?: number; state?: number; ready?: boolean; muted?: boolean }) => void; bind: (cmd: ((func: string, args?: unknown[]) => void) | null) => void }\n\nexport function YtFollow({ ytId, title, t, playing: wantPlay, seekN, onToggle, onAd, endT, onGone, onKnown, lead, onTime, waiting = false }: { waiting?: boolean; onTime?: (t: number) => void; lead?: YtLead; ytId: string; title: string; t: number; playing: boolean; seekN: number; onToggle?: () => void; onAd?: (on: boolean) => void; endT?: number | null; onGone?: () => void; onKnown?: (gone: boolean) => void }) {\n const ref = useRef<HTMLIFrameElement>(null);\n const [held, setHeld] = useState(false);\n useEffect(() => {\n if (!waiting) { setHeld(false); return; }\n const h = setTimeout(() => setHeld(true), 300);\n return () => clearTimeout(h);\n }, [waiting]);\n const playing = wantPlay && !held;\n const adRef = useRef(false);\n const [ad, setAd] = useState(false);\n const cmd = (func: string, args: unknown[] = []) => {\n if (adRef.current && (func === 'pauseVideo' || func === 'seekTo' || func === 'setPlaybackRate')) return;\n try { ref.current?.contentWindow?.postMessage(JSON.stringify({ event: 'command', func, args }), '*'); } catch { }\n };\n const contentDur = useRef<number | null>(null);\n const liveVideo = useRef(false);\n const adByDur = useRef(false);\n const adByStall = useRef(false);\n const toggleRef = useRef(onToggle); toggleRef.current = onToggle;\n const leadRef = useRef(lead); leadRef.current = lead;\n const adCb = useRef(onAd); adCb.current = onAd;\n const resumeAfterAd = useRef(false);\n const adCheck = () => {\n const now = adByDur.current || adByStall.current;\n if (now === adRef.current) return;\n adRef.current = now;\n setAd(now);\n adCb.current?.(now);\n if (now) {\n cmd('playVideo');\n if (leadRef.current) return;\n if (playingRef.current && toggleRef.current) { resumeAfterAd.current = true; toggleRef.current(); }\n } else if (resumeAfterAd.current && !leadRef.current) {\n resumeAfterAd.current = false;\n if (!playingRef.current) toggleRef.current?.();\n }\n };\n const tRef = useRef(t); tRef.current = t;\n const timeCb = useRef(onTime); timeCb.current = onTime;\n const ytT = useRef<number | null>(null);\n const ytState = useRef<number | null>(null);\n const [ytPaused, setYtPaused] = useState(true);\n const [ready, setReady] = useState(false);\n const noCaptions = () => { cmd('unloadModule', ['captions']); cmd('unloadModule', ['cc']); };\n const capT = useRef<number[]>([]);\n const noCaptionsSoon = () => { noCaptions(); capT.current.forEach(clearTimeout); capT.current = [400, 1200, 2500, 5000].map((ms) => window.setTimeout(noCaptions, ms)); };\n useEffect(() => () => capT.current.forEach(clearTimeout), []);\n const onLoad = () => {\n try { ref.current?.contentWindow?.postMessage(JSON.stringify({ event: 'listening', id: 'reader' }), '*'); } catch { }\n if (!leadRef.current || leadRef.current.muted) cmd('mute');\n setReady(true);\n };\n useEffect(() => { lead?.bind(cmd); return () => lead?.bind(null); }, [!!lead]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => { if (!lead && ready) cmd('mute'); }, [!!lead]); // eslint-disable-line react-hooks/exhaustive-deps\n const win = useRef<{ start: number; end: number } | null>(null);\n const endRef = useRef(endT); endRef.current = endT;\n const playingRef = useRef(playing); playingRef.current = playing;\n const probed = useRef(false);\n const goneRef = useRef(onGone); goneRef.current = onGone;\n const knownRef = useRef(onKnown); knownRef.current = onKnown;\n const goneSaid = useRef(false);\n const [gone, setGone] = useState(false);\n const outside = (x: number) => { const w = win.current; return !!w && (x < w.start - 1 || x > w.end + 5); };\n const seek = () => { if (!outside(tRef.current)) cmd('seekTo', [tRef.current, true]); };\n const at = () => ytT.current;\n useEffect(() => {\n const on = (m: MessageEvent) => {\n if (m.source !== ref.current?.contentWindow || typeof m.data !== 'string') return;\n let d: { event?: string; info?: { currentTime?: number; duration?: number; videoData?: { isLive?: boolean }; muted?: boolean; playerState?: number; progressState?: { seekableStart?: number; seekableEnd?: number } | null } } | null = null;\n try { d = JSON.parse(m.data); } catch { return; }\n if (d?.info?.videoData?.isLive) liveVideo.current = true;\n const dur = d?.info?.duration;\n if (typeof dur === 'number' && dur > 0 && !liveVideo.current) {\n if (contentDur.current == null) contentDur.current = dur;\n else { adByDur.current = Math.abs(dur - contentDur.current) > 1.5; adCheck(); }\n }\n if (d?.event === 'onReady') { if (!leadRef.current || leadRef.current.muted) cmd('mute'); noCaptionsSoon(); leadRef.current?.onInfo({ ready: true }); }\n if (typeof d?.info?.playerState === 'number') { if (d.info.playerState !== ytState.current && (d.info.playerState === 1 || d.info.playerState === 2)) noCaptionsSoon(); ytState.current = d.info.playerState; setYtPaused(d.info.playerState !== 1 && d.info.playerState !== 3); leadRef.current?.onInfo({ state: d.info.playerState }); }\n const ps = d?.info?.progressState;\n if (ps && typeof ps.seekableStart === 'number' && typeof ps.seekableEnd === 'number' && ps.seekableEnd > ps.seekableStart) {\n const first = win.current == null;\n win.current = { start: ps.seekableStart, end: ps.seekableEnd };\n if (first && !playingRef.current) { cmd('pauseVideo'); if (!outside(tRef.current)) cmd('seekTo', [tRef.current, true]); }\n if (!goneSaid.current && endRef.current != null) {\n goneSaid.current = true;\n const all = endRef.current < ps.seekableStart - 1;\n knownRef.current?.(all);\n if (all) goneRef.current?.();\n }\n }\n if (typeof d?.info?.currentTime === 'number') { ytT.current = d.info.currentTime; leadRef.current?.onInfo({ t: d.info.currentTime }); if (!adRef.current && ytState.current === 1) timeCb.current?.(d.info.currentTime); }\n if (d?.info?.muted === false && !leadRef.current) cmd('mute');\n if (typeof d?.info?.muted === 'boolean') leadRef.current?.onInfo({ muted: d.info.muted });\n };\n window.addEventListener('message', on);\n return () => window.removeEventListener('message', on);\n }, []);\n useEffect(() => {\n if (lead) return;\n const now = outside(t);\n if (now !== gone) { setGone(now); if (now) cmd('pauseVideo'); else if (ready) { cmd('seekTo', [t, true]); if (playing) cmd('playVideo'); } }\n }); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!ready || gone || lead) return;\n if (!playing && win.current == null && !probed.current) { probed.current = true; cmd('seekTo', [tRef.current, true]); cmd('playVideo'); return; }\n const y = at();\n if (playing && (y == null || Math.abs(y - tRef.current) > 1.5)) seek();\n if (playing) cmd('playVideo'); else cmd('pauseVideo');\n }, [playing, ready, gone]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!ready || seekN === 0 || gone || lead) return;\n const y = at();\n if (y == null || Math.abs(y - tRef.current) > 0.5) seek();\n if (!playing) cmd('pauseVideo');\n }, [seekN, ready]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!ready) return;\n let last: number | null = null;\n let still = 0;\n const h = setInterval(() => {\n const y = ytT.current;\n still = ytState.current === 1 && y != null && last != null && Math.abs(y - last) < 0.05 ? still + 1 : 0;\n last = y;\n const now = still >= 3;\n if (now !== adByStall.current) { adByStall.current = now; adCheck(); }\n }, 1000);\n return () => clearInterval(h);\n }, [ready]); // eslint-disable-line react-hooks/exhaustive-deps\n return (\n <div className={`txyt${ad ? ' txyt--ad' : ''}`}>\n <iframe ref={ref} onLoad={onLoad} referrerPolicy=\"strict-origin-when-cross-origin\" src={`https://www.youtube-nocookie.com/embed/${ytId}?enablejsapi=1&mute=1&controls=0&rel=0&modestbranding=1&playsinline=1&iv_load_policy=3`} title={title} allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" />\n {!ad && <div aria-hidden=\"true\" className=\"txyt__tap\" onClick={onToggle} style={{ cursor: onToggle ? 'pointer' : 'default' }} />}\n <div className={`txyt__paused${ytPaused && !ad && !gone ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div>\n {ad && <div className=\"txyt__ad\" aria-live=\"polite\">Ad on YouTube · the transcript carries on after it</div>}\n {gone && <div className=\"txyt__gone\"><span>YouTube no longer has this part of the broadcast</span><small>A live stream can be rewound only 12 hours</small></div>}\n </div>\n );\n}\nexport const PAUSE_D = <><rect x=\"6.5\" y=\"5\" width=\"3.75\" height=\"14\" rx=\"1.2\" /><rect x=\"13.75\" y=\"5\" width=\"3.75\" height=\"14\" rx=\"1.2\" /></>;\nexport const PLAY_D = <path d=\"M7.5 5.6a1 1 0 0 1 1.52-.85l9.1 5.55a1 1 0 0 1 0 1.7l-9.1 5.55a1 1 0 0 1-1.52-.85V5.6Z\" />;\n\nexport function MuteButton({ player, size }: { player: Pick<TxPlayer, 'muted' | 'toggleMute'>; size: number }) {\n const label = player.muted ? 'Unmute' : 'Mute';\n return (\n <button type=\"button\" className={`mutebtn${size < 36 ? ' mutebtn--sm' : size > 36 ? ' mutebtn--lg' : ''}`} aria-label={label} title={label} aria-pressed={player.muted} onClick={player.toggleMute}>\n <Icon d={player.muted ? D.volumeOff : D.volume} size={17} sw={1.6} style={{ color: player.muted ? 'var(--ink-38)' : 'var(--ink-70)' }} />\n </button>\n );\n}\nexport function useFlash(): [string, (m: string) => void] {\n const [msg, setMsg] = useState('');\n const t = useRef<any>(null);\n const flash = useCallback((m: string) => { clearTimeout(t.current); setMsg(m); t.current = setTimeout(() => setMsg(''), 3000); }, []);\n useEffect(() => () => clearTimeout(t.current), []);\n return [msg, flash];\n}\n\nexport interface TxPlayer {\n ended?: boolean;\n playing: boolean;\n t: number;\n idx: number;\n dur: number;\n muted: boolean;\n wordSync: boolean;\n timed?: boolean;\n videoAt?: (t: number) => void;\n engaged: boolean;\n clipPos?: ReadPos | null;\n has: boolean;\n preparing?: boolean;\n starting?: number | null;\n autoplay?: () => Promise<boolean | null>;\n edgeWait?: boolean;\n silent?: boolean;\n joinAt?: (t: number) => void;\n error: ErrorLike | null;\n seekN: number;\n toggleMute: () => void;\n stop: () => void;\n toggle: () => void;\n pause: () => void;\n seekRow: (i: number) => void;\n seekFrac?: (f: number) => void;\n resumeAt?: (p: PlayPos) => void;\n seekWord?: (w: Word) => void;\n playRow: (i: number) => void;\n prev: () => void;\n next: () => void;\n hold: () => void;\n release: () => void;\n clearError: () => void;\n setVolume: (v: number) => void;\n silence?: (on: boolean) => void;\n}\n\nconst DUCK = 0.2;\nconst DUCK_MS = 140;\nconst UNDUCK_MS = 320;\n\nexport function useDuck(players: TxPlayer[], ducked: boolean) {\n const live = useRef(players);\n live.current = players;\n const raf = useRef(0);\n const at = useRef(1);\n const fade = useCallback((to: number, ms: number) => {\n cancelAnimationFrame(raf.current);\n const from = at.current;\n const t0 = performance.now();\n const step = () => {\n const k = ms > 0 ? Math.min(1, (performance.now() - t0) / ms) : 1;\n at.current = from + (to - from) * k;\n for (const p of live.current) p.setVolume(at.current);\n if (k < 1) raf.current = requestAnimationFrame(step);\n };\n step();\n }, []);\n useEffect(() => { fade(ducked ? DUCK : 1, ducked ? DUCK_MS : UNDUCK_MS); }, [ducked, fade]);\n useEffect(() => () => { cancelAnimationFrame(raf.current); at.current = 1; for (const p of live.current) p.setVolume(1); }, []);\n}\nexport function useYtLead(rows: Row[], lenS: number | null, offsetS: number, edgeS: number | null): { player: TxPlayer; lead: YtLead; setVideoSound: (on: boolean) => void } {\n const cmdRef = useRef<((func: string, args?: unknown[]) => void) | null>(null);\n const readyRef = useRef(false);\n const pending = useRef(false);\n const [state, setState] = useState<number | null>(null);\n const [muted, setMuted] = useState(true);\n const mutedRef = useRef(true);\n const soundOff = useRef(false);\n const [t, setT] = useState(0);\n const tRef = useRef(0); tRef.current = t;\n const base = useRef<{ t: number; at: number }>({ t: 0, at: 0 });\n const offset = useRef(offsetS); offset.current = offsetS;\n const edgeRef = useRef(edgeS); edgeRef.current = edgeS;\n const [edgeWait, setEdgeWait] = useState(false);\n const edgeWaitRef = useRef(false);\n const setWait = (w: boolean) => { edgeWaitRef.current = w; setEdgeWait(w); };\n const send = (func: string, args?: unknown[]) => cmdRef.current?.(func, args);\n const playing = state === 1 || state === 3;\n const stateRef = useRef<number | null>(null);\n const ytMuted = useRef<boolean | null>(null);\n const lead = useMemo<YtLead>(() => ({\n muted: true,\n bind: (c) => { cmdRef.current = c; if (!c) readyRef.current = false; },\n onInfo: (i) => {\n if (i.ready && !readyRef.current) { readyRef.current = true; if (pending.current) { pending.current = false; send(lead.muted ? 'mute' : 'unMute'); send('playVideo'); } }\n if (typeof i.state === 'number') { stateRef.current = i.state; setState(i.state); }\n if (typeof i.muted === 'boolean') ytMuted.current = i.muted;\n if (typeof i.t === 'number') {\n const at = i.t - offset.current;\n base.current = { t: at, at: performance.now() };\n if (!(at < tRef.current && tRef.current - at < 0.35)) setT(Math.max(0, at));\n }\n },\n }), []); // eslint-disable-line react-hooks/exhaustive-deps\n lead.muted = mutedRef.current || soundOff.current;\n useEffect(() => {\n if (state !== 1) return;\n let raf = 0;\n const tick = () => {\n const b = base.current;\n const at = b.t + Math.min(1.2, (performance.now() - b.at) / 1000);\n if (edgeRef.current != null && at >= edgeRef.current) { setWait(true); send('pauseVideo'); setT(at); return; }\n if (at > tRef.current) setT(at);\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [state]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!edgeWait || edgeS == null || edgeS < t + 1.5) return;\n setWait(false);\n send('playVideo');\n }, [edgeWait, edgeS, t]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => { if (edgeS == null && edgeWaitRef.current) { setWait(false); send('playVideo'); } }, [edgeS]); // eslint-disable-line react-hooks/exhaustive-deps\n const lastEnd = rows.length ? rows[rows.length - 1].words[rows[rows.length - 1].words.length - 1]?.end ?? rows[rows.length - 1].start + 4 : 0;\n const dur = lenS || lastEnd || 1;\n const idx = useMemo(() => {\n if (!rows.length) return 0;\n let i = 0;\n for (let k = 0; k < rows.length; k++) if (rows[k].start <= t + 0.05) i = k;\n return i;\n }, [rows, t]);\n const [seekN, setSeekN] = useState(0);\n const seek = (s0: number) => {\n const s = Math.max(0, edgeRef.current != null ? Math.min(s0, Math.max(0, edgeRef.current - 0.5)) : s0);\n send('seekTo', [s + offset.current, true]);\n base.current = { t: s, at: performance.now() };\n setT(s); setSeekN((n) => n + 1);\n };\n const wantPlay = useRef(false);\n const playRetry = useRef<number | undefined>(undefined);\n const nudgePlay = (n: number) => {\n window.clearTimeout(playRetry.current);\n playRetry.current = window.setTimeout(() => {\n if (!wantPlay.current || n <= 0 || stateRef.current === 1 || stateRef.current === 3) return;\n send('playVideo');\n nudgePlay(n - 1);\n }, 1200);\n };\n useEffect(() => () => window.clearTimeout(playRetry.current), []);\n const play = () => { wantPlay.current = true; if (!chosen.current && mutedRef.current) soundUp(); if (!readyRef.current) { pending.current = true; return; } send('playVideo'); nudgePlay(3); };\n const pause = () => { wantPlay.current = false; window.clearTimeout(playRetry.current); pending.current = false; setWait(false); send('pauseVideo'); };\n const toggle = () => {\n if (!readyRef.current) { if (!chosen.current && mutedRef.current) soundUp(); wantPlay.current = true; pending.current = true; return; }\n if (playing) { pause(); return; }\n if (edgeWaitRef.current) { setWait(false); return; }\n if (t >= dur - 0.25) seek(0);\n play();\n };\n const seekRow = (i: number) => { const r = rows[Math.max(0, Math.min(rows.length - 1, i))]; if (r) seek(r.start); };\n const held = useRef(false);\n const applyMute = () => { const v = mutedRef.current || soundOff.current; lead.muted = v; send(v ? 'mute' : 'unMute'); };\n const setMute = (m: boolean) => { mutedRef.current = m; setMuted(m); applyMute(); };\n const chosen = useRef(false);\n const soundUp = () => { setMute(false); if (soundOff.current) return; setTimeout(() => { if (stateRef.current === 2 && wantPlay.current && !mutedRef.current) { setMute(true); send('playVideo'); } }, 900); };\n const setVideoSound = (on: boolean) => { if (soundOff.current === !on) return; soundOff.current = !on; applyMute(); };\n const autoplay = async () => {\n const wait = (ms: number) => new Promise((r) => setTimeout(r, ms));\n const until = async (ok: () => boolean, ms: number) => { for (let i = 0; i < ms / 250 && !ok(); i++) await wait(250); return ok(); };\n if (!await until(() => readyRef.current, 10000)) return null;\n setMute(true);\n for (let i = 0; i < 5 && stateRef.current !== 1; i++) { send('playVideo'); await until(() => stateRef.current === 1, 1500); }\n if (stateRef.current !== 1) return null;\n if (soundOff.current) { setMute(true); return false; }\n setMute(false);\n await wait(1200);\n if (stateRef.current === 1 && ytMuted.current === false) return true;\n setMute(true); send('playVideo');\n return false;\n };\n const player: TxPlayer = {\n autoplay,\n playing, ended: state === 0, t, idx, dur, muted, seekN, toggle, seekRow,\n toggleMute: () => { chosen.current = true; const m = !mutedRef.current; setMute(m); if (!m && !soundOff.current && stateRef.current === 1) setTimeout(() => { if (stateRef.current === 2 && !mutedRef.current) { setMute(true); send('playVideo'); } }, 900); },\n seekFrac: (f: number) => seek(Math.max(0, Math.min(1, f)) * dur),\n seekWord: (w: Word) => seek(w.start),\n playRow: (i: number) => { seekRow(i); if (!playing) play(); },\n stop: () => { pause(); seek(0); },\n engaged: playing || t > 0,\n prev: () => seekRow(idx - 1), next: () => seekRow(idx + 1),\n hold: () => { if (playing) { send('pauseVideo'); held.current = true; } },\n release: () => { if (held.current) { held.current = false; play(); } },\n error: null, clearError: () => {}, has: true, edgeWait, wordSync: true,\n pause,\n setVolume: (v: number) => send('setVolume', [Math.round(v * 100)]),\n };\n return { player, lead, setVideoSound };\n}\n\nexport function useTxPlayer(url: string | null, available: boolean, rows: Row[], lenS: number | null, offsetS = 0, edgeS: number | null = null): TxPlayer {\n const audio = useRef<HTMLMediaElement | null>(null);\n const [playing, setPlaying] = useState(false);\n const [t, setT] = useState(0);\n const [muted, setMuted] = useState(false);\n const mutedRef = useRef(muted); mutedRef.current = muted;\n const silenced = useRef(false);\n const [error, setError] = useState<ErrorLike | null>(null);\n const [ready, setReady] = useState(false);\n const offset = useRef(offsetS); offset.current = offsetS;\n const carry = useRef<{ t: number; playing: boolean; asked?: boolean } | null>(null);\n const [attempt, setAttempt] = useState(0);\n useEffect(() => {\n setReady(false);\n const from = carry.current;\n carry.current = null;\n if (!from) setT(0);\n if (!url) { setPlaying(false); audio.current = null; return; }\n const a = newMediaElement(url);\n const off = offset.current;\n a.preload = 'metadata';\n a.muted = mutedRef.current || silenced.current;\n a.onplay = () => setPlaying(true);\n a.onpause = () => setPlaying(false);\n a.onended = () => setPlaying(false);\n a.onloadedmetadata = () => {\n setReady(true);\n a.currentTime = (from?.t ?? 0) + off;\n if (from?.playing) void a.play().catch((e) => { if (!(from.asked && e?.name === 'NotAllowedError')) setError(describe(e)); });\n };\n a.onerror = () => {\n setPlaying(false);\n const err = a.error;\n const fallback = mediaErrorText(err, false);\n void explainAudioError(url).then((why) => {\n if (!isNotCaptured(why?.message)) reportMediaError(err);\n if (audio.current !== a) return;\n setError({ message: why?.message ?? fallback });\n if (!why?.permanent) audio.current = null;\n });\n };\n audio.current = a;\n return () => {\n carry.current = { t: Math.max(0, a.currentTime - off), playing: !a.paused && !a.ended };\n a.pause(); a.onplay = a.onpause = a.onended = a.onloadedmetadata = a.onerror = null; audio.current = null;\n };\n }, [url, attempt]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => () => { carry.current = null; }, []);\n const lastEnd = rows.length ? rows[rows.length - 1].words[rows[rows.length - 1].words.length - 1]?.end ?? rows[rows.length - 1].start + 4 : 0;\n const windowed = offsetS > 0 || (lenS != null && ready && audio.current != null && Number.isFinite(audio.current.duration) && audio.current.duration > lenS + 1);\n const dur = (!windowed && ready && audio.current && Number.isFinite(audio.current.duration) && audio.current.duration) || lenS || lastEnd || 1;\n const durRef = useRef(dur); durRef.current = dur;\n const windowedRef = useRef(windowed); windowedRef.current = windowed;\n const edgeRef = useRef(edgeS); edgeRef.current = edgeS;\n const [edgeWait, setEdgeWait] = useState(false);\n const edgeWaitRef = useRef(false);\n const setWait = (w: boolean) => { edgeWaitRef.current = w; setEdgeWait(w); };\n useEffect(() => { if (edgeS == null && edgeWaitRef.current) { setWait(false); void audio.current?.play().catch(() => {}); } }, [edgeS]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!edgeWait || edgeS == null || edgeS < t + 1.5) return;\n setWait(false);\n void audio.current?.play().catch(() => {});\n }, [edgeWait, edgeS, t]);\n useEffect(() => {\n if (!playing) return;\n let raf = 0;\n const tick = () => {\n const a = audio.current;\n if (a) {\n const at = a.currentTime - offset.current;\n if (windowedRef.current && at >= durRef.current) { a.pause(); setT(durRef.current); return; }\n if (edgeRef.current != null && at >= edgeRef.current) { setWait(true); a.pause(); setT(at); return; }\n setT(at);\n }\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [playing]);\n const idx = useMemo(() => {\n if (!rows.length) return 0;\n let i = 0;\n for (let k = 0; k < rows.length; k++) if (rows[k].start <= t + 0.05) i = k;\n return i;\n }, [rows, t]);\n const [seekN, setSeekN] = useState(0);\n const seek = (s0: number) => { const s = edgeRef.current != null ? Math.min(s0, Math.max(0, edgeRef.current - 0.5)) : s0; const a = audio.current; setT(s); if (a) a.currentTime = s + offset.current; setSeekN((n) => n + 1); };\n const playFailed = (e: unknown) => { if ((e as { name?: string } | null)?.name !== 'AbortError') setError(describe(e)); };\n const toggle = () => {\n const a = audio.current;\n if (!a) {\n if (!url && available) { carry.current = carry.current?.asked ? null : { t, playing: true, asked: true }; return; }\n if (url) setAttempt((n) => n + 1);\n setError({ message: available ? 'The audio player is not ready yet — try again in a moment.' : 'There is no audio for this transcription.' });\n return;\n }\n if (playing) { a.pause(); return; }\n if (edgeWaitRef.current) { setWait(false); return; }\n if (a.currentTime < offset.current) a.currentTime = offset.current;\n if (t >= dur - 0.25) seek(0);\n void a.play().catch(playFailed);\n };\n const seekRow = (i: number) => { const r = rows[Math.max(0, Math.min(rows.length - 1, i))]; if (r) seek(r.start); };\n const seekFrac = (f: number) => seek(Math.max(0, Math.min(1, f)) * dur);\n const resumeAt = (p: PlayPos) => {\n const at = placePosition(p, rows, dur);\n seek(at.t);\n const a = audio.current;\n if (!a) return;\n if (!at.playing) { a.pause(); return; }\n setWait(false);\n void a.play().catch(playFailed);\n };\n const seekWord = (w: Word) => seek(w.start);\n const playRow = (i: number) => {\n seekRow(i);\n const a = audio.current;\n if (a && a.paused) void a.play().catch(playFailed);\n };\n const held = useRef(false);\n const lastNudge = useRef(0);\n const hold = () => { if (playing) { audio.current?.pause(); held.current = true; } };\n const release = () => { if (held.current) { held.current = false; void audio.current?.play().catch(playFailed); } };\n const toggleMute = () => { const m = !mutedRef.current; mutedRef.current = m; if (audio.current) audio.current.muted = m || silenced.current; setMuted(m); };\n const autoplay = async (): Promise<boolean | null> => {\n const a = audio.current;\n if (!a) return null;\n if (a.currentTime < offset.current) a.currentTime = offset.current;\n const mute = (m: boolean) => { mutedRef.current = m; a.muted = m || silenced.current; setMuted(m); };\n try { mute(false); await a.play(); return true; } catch (e) {\n if ((e as { name?: string } | null)?.name !== 'NotAllowedError') { mute(true); return null; }\n }\n try { mute(true); await a.play(); return false; } catch { return null; }\n };\n return {\n autoplay,\n playing, t, idx, dur, muted, toggleMute, toggle, seekRow, seekFrac, resumeAt, seekWord, playRow, seekN,\n stop: () => { const a = audio.current; if (a) { a.pause(); a.currentTime = offset.current; } setT(0); },\n videoAt: (vt: number) => {\n const a = audio.current;\n if (!a || a.paused || a.ended || held.current || Date.now() - lastNudge.current < 3000) return;\n const want = vt + offset.current;\n if (Math.abs(a.currentTime - want) <= 0.2) return;\n lastNudge.current = Date.now();\n a.currentTime = want;\n },\n engaged: playing || t > 0,\n prev: () => seekRow(idx - 1), next: () => seekRow(idx + 1), hold, release,\n error, clearError: () => setError(null), has: available, edgeWait,\n wordSync: true,\n pause: () => { setWait(false); if (carry.current?.asked) carry.current = null; audio.current?.pause(); },\n setVolume: (v: number) => { if (audio.current) audio.current.volume = v; },\n silence: (on: boolean) => { silenced.current = on; if (audio.current) audio.current.muted = mutedRef.current || on; },\n };\n}\n\nfunction useTxVoicePlayer(clips: VoiceClip[], rows: Row[], lenS: number | null, key: string, muted?: Set<number>, wordTimes?: Record<string, [number, number][]>, timed = false, coming?: ReadonlySet<number>): TxPlayer {\n const comingRef = useRef<ReadonlySet<number>>(new Set());\n comingRef.current = coming ?? comingRef.current;\n const q = useRef<ClipQueue | null>(null);\n const [playing, setPlaying] = useState(false);\n const [pos, setPos] = useState(0);\n const [seekN, setSeekN] = useState(0);\n const [quiet, setQuiet] = useState(false);\n const quietRef = useRef(quiet); quietRef.current = quiet;\n const [error, setError] = useState<ErrorLike | null>(null);\n const [waiting, setWaiting] = useState<number | null>(null);\n const [starting, setStarting] = useState<number | null>(null);\n const [aim, setAim] = useState<{ t: number; sid: number | null } | null>(null);\n const aimRef = useRef(aim); aimRef.current = aim;\n const [clipPos, setClipPos] = useState<ReadPos | null>(null);\n const [restS, setRestS] = useState<number | null>(null);\n const [restBase, setRestBase] = useState<number | null>(null);\n const [silent, setSilent] = useState(false);\n const rowsRef = useRef(rows);\n rowsRef.current = rows;\n const timedRef = useRef(timed);\n const lineIdsRef = useRef<number[]>([]);\n timedRef.current = timed;\n if (q.current) q.current.flow = timed;\n const videoRef = useRef<{ t: number; at: number } | null>(null);\n const mutedRef = useRef(muted);\n mutedRef.current = muted;\n const timesRef = useRef(wordTimes);\n timesRef.current = wordTimes;\n const wire = useCallback((queue: ClipQueue) => {\n queue.finite = true;\n queue.coming = (id) => comingRef.current.has(id);\n queue.readAhead = 6;\n queue.readAheadS = 45;\n queue.onWaiting = (id) => setWaiting(id);\n queue.onStarting = (since) => setStarting(since);\n queue.onSentence = (id) => {\n setPlaying(queue.playing);\n if (id == null) return;\n const i = rowsRef.current.findIndex((r) => r.sentenceId === id);\n if (i >= 0) setPos(i);\n };\n queue.onError = (e) => { setPlaying(queue.playing); setError(e instanceof VoiceNotStarted ? { message: 'The voice could not be started. Press Play to try again.', code: 'voice_not_started' } : { message: 'A line of this reading could not be played.' }); };\n queue.gapBefore = (prev, next) => {\n if (!timedRef.current) return 0;\n const rs = rowsRef.current;\n const a = rs.find((r) => r.sentenceId === prev);\n const b = rs.find((r) => r.sentenceId === next);\n if (!b) return 0;\n const aimed = aimRef.current;\n if (prev == null) return aimed && aimed.sid === next ? Math.max(0, b.start - aimed.t) : 0;\n const v = videoRef.current;\n if (v && Date.now() - v.at < 2000) return Math.max(0, b.start - (v.t + (Date.now() - v.at) / 1000 * queue.rate));\n if (!a || b.start <= a.start) return 0;\n return Math.max(0, b.start - lineEnd(a, a.start, a.start + 4));\n };\n queue.flow = timedRef.current;\n queue.silentSpan = (id) => {\n const rs = rowsRef.current;\n const i = rs.findIndex((r) => r.sentenceId === id);\n const r = rs[i];\n if (!r) return null;\n const end = rs[i + 1]?.start ?? lineEnd(r, r.start, r.start + 4);\n const span = Math.max(0, end - r.start);\n const v = videoRef.current;\n const now = v && Date.now() - v.at < 2000 ? v.t + (Date.now() - v.at) / 1000 * (queue.rate || 1) : r.start;\n const fromS = Math.max(0, Math.min(span, now - r.start));\n return { fromS, ms: ((span - fromS) * 1000) / (queue.rate || 1) };\n };\n queue.speakable = (id) => {\n const m = mutedRef.current;\n if (!m || !m.size) return true;\n const r = rowsRef.current.find((x) => x.sentenceId === id);\n return !r || !m.has(r.speaker);\n };\n }, []);\n const keyRef = useRef<string | null>(null);\n const snapRef = useRef<PlayPos | null>(null);\n const pendingRef = useRef<PlayPos | null>(null);\n const [resuming, setResuming] = useState(false);\n const applyRef = useRef<(p: PlayPos) => void>(() => {});\n const park = (p: PlayPos | null) => {\n pendingRef.current = p;\n setResuming(!!p?.playing);\n if (!p) return;\n const i = placePosition(p, rowsRef.current, dur).index;\n setPos(i);\n posRef.current = i;\n };\n const drop = () => { if (pendingRef.current) park(null); };\n useEffect(() => {\n if (keyRef.current !== key) {\n const was = keyRef.current != null ? snapRef.current : null;\n keyRef.current = key;\n q.current?.stop();\n q.current = new ClipQueue();\n wire(q.current);\n q.current.setSequence(lineIdsRef.current);\n setPlaying(false);\n setPos(0);\n setError(null);\n setStarting(null);\n setAim(null);\n park(was && (was.playing || was.t > 0) ? was : null);\n }\n const queue = q.current!;\n queue.setMuted(quietRef.current);\n for (const c of clips) queue.add(c);\n const p = pendingRef.current;\n if (p && (timedRef.current || clips.some((c) => c.sentenceId >= (p.sentenceId ?? 0)))) { park(null); applyRef.current(p); }\n }, [key, clips]); // eslint-disable-line react-hooks/exhaustive-deps\n const lineIds = useMemo(() => (timed ? rows.map((r) => r.sentenceId).filter((id): id is number => id != null) : []), [rows, timed]);\n lineIdsRef.current = lineIds;\n useEffect(() => { q.current?.setSequence(lineIds); }, [lineIds, key]);\n useEffect(() => () => { q.current?.stop(); q.current = null; keyRef.current = null; }, []);\n const hasPos = clipPos != null || restS != null;\n useEffect(() => {\n if (!playing && !hasPos) { setClipPos(null); setRestS(null); return; }\n const tick = () => {\n const rest = q.current?.resting() ?? null;\n setSilent(!!rest?.silent);\n if (rest?.silent && aimRef.current) { aimRef.current = null; setAim(null); }\n setRestS((prev) => (rest == null ? null : prev != null && Math.abs(prev - rest.s) < 0.05 ? prev : rest.s));\n const a = aimRef.current;\n if (rest == null) setRestBase(null);\n else if (a && a.sid === rest.sentenceId) { setRestBase(a.t); aimRef.current = null; setAim(null); }\n const at = q.current?.position() ?? null;\n const w = at && timesRef.current ? timesRef.current[String(at.sentenceId)] ?? null : null;\n if (a && at && at.sentenceId === a.sid && at.t > 0.1) setAim(null);\n setClipPos((prev) => {\n if (!at) return prev == null ? prev : null;\n if (prev && Math.abs(prev.t - at.t) < 0.05 && prev.dur === at.dur && prev.words === w) return prev;\n return { t: at.t, dur: at.dur, words: w };\n });\n };\n tick();\n const h = setInterval(tick, 100);\n return () => clearInterval(h);\n }, [playing, hasPos]);\n const voiced = useMemo(() => new Set(clips.map((c) => c.sentenceId)), [clips]);\n const heard = (i: number) => { const sid = rows[i]?.sentenceId; return sid != null && voiced.has(sid); };\n const step = (from: number, dir: 1 | -1): number | null => {\n for (let i = from; i >= 0 && i < rows.length; i += dir) if (heard(i)) return i;\n return null;\n };\n const idx = Math.max(0, Math.min(pos, Math.max(0, rows.length - 1)));\n const lastEnd = rows.length ? rows[rows.length - 1].start + 4 : 0;\n const dur = lenS || lastEnd || 1;\n const held = useRef(false);\n const posRef = useRef(pos); posRef.current = pos;\n const start = (i: number) => { q.current?.play(rows[i]?.sentenceId ?? null); setPlaying(!!q.current?.playing); };\n const goRow = (i: number) => {\n const at = Math.max(0, Math.min(Math.max(0, rows.length - 1), i));\n setPos(at);\n posRef.current = at;\n setSeekN((n) => n + 1);\n q.current?.seek(rows[at]?.sentenceId ?? null);\n setPlaying(!!q.current?.playing);\n };\n const seekRow = (i: number) => { drop(); setAim(null); q.current?.startWithin(-1, 0); goRow(i); };\n const spanOf = (i: number) => {\n const r = rows[i];\n const from = r?.start ?? 0;\n const next = rows[i + 1]?.start ?? lineEnd(r, from, dur);\n return { from, span: Math.max(0, next - from) };\n };\n const cur = spanOf(idx);\n const speech = Math.max(0, Math.min(cur.span, lineEnd(rows[idx], cur.from, cur.from + 4) - cur.from));\n const tNow = aim ? aim.t\n : !timed ? (clipPos && clipPos.dur > 0 ? cur.from + Math.min(cur.span, (clipPos.t / clipPos.dur) * cur.span) : cur.from)\n : restS != null && silent ? cur.from + Math.min(cur.span, restS)\n : restS != null ? (restBase != null ? Math.min(cur.from, restBase + restS) : cur.from + Math.min(cur.span, speech + restS))\n : clipPos && clipPos.dur > 0 ? cur.from + Math.min(speech, (clipPos.t / clipPos.dur) * speech)\n : cur.from;\n useEffect(() => { snapRef.current = pendingRef.current ?? snapPosition(rows, tNow, playing, dur); });\n const api: TxPlayer = {\n playing: playing || resuming,\n t: tNow,\n idx, dur, muted: quiet, wordSync: false, timed, clipPos: aim ? null : clipPos,\n videoAt: (t: number) => { videoRef.current = { t, at: Date.now() }; },\n engaged: playing || clipPos != null,\n has: clips.length > 0,\n preparing: waiting != null || resuming,\n silent: playing && silent,\n starting,\n error, seekN,\n toggleMute: () => { const m = !quietRef.current; quietRef.current = m; q.current?.setMuted(m); setQuiet(m); },\n toggle: () => {\n if (resuming) { drop(); return; }\n drop();\n if (playing) { q.current?.pause(); setPlaying(false); return; }\n setError(null);\n const at = posRef.current;\n if (!aimRef.current && q.current?.resume(rows[at]?.sentenceId ?? null)) { setPlaying(true); return; }\n start(at);\n },\n pause: () => { drop(); q.current?.pause(); setPlaying(false); },\n stop: () => { drop(); q.current?.pause(); setPlaying(false); setPos(0); setClipPos(null); q.current?.seek(rows[0]?.sentenceId ?? null); },\n seekRow,\n resumeAt: (p: PlayPos) => { park(p); if (clips.some((c) => c.sentenceId >= (p.sentenceId ?? 0))) { park(null); applyRef.current(p); } },\n seekFrac: (f: number) => {\n drop();\n const t = Math.max(0, Math.min(1, f)) * dur;\n let i = 0;\n for (let k = 0; k < rows.length; k++) if (rows[k].start <= t) i = k;\n const r = rows[i];\n const before = timed && r && t < r.start - 0.05;\n if (timed && r && (before || (rows[i + 1] && t >= lineEnd(r, r.start, r.start + 4)))) {\n const k = before ? i : i + 1;\n const n = rows[k];\n q.current?.startWithin(-1, 0);\n const a = { t, sid: n.sentenceId ?? null };\n aimRef.current = a;\n setAim(a);\n goRow(k);\n return;\n }\n const sid = r?.sentenceId ?? null;\n const { from, span } = spanOf(i);\n let share = span > 0 ? Math.max(0, Math.min(1, (t - from) / span)) : 0;\n const wt = sid != null ? timesRef.current?.[String(sid)] : undefined;\n const clipEnd = wt?.length ? wt[wt.length - 1][1] : 0;\n if (r && wt && wt.length === r.words.length && clipEnd > 0) {\n let j = 0;\n for (let k = 0; k < r.words.length; k++) if (r.words[k].start <= t) j = k;\n const w = r.words[j];\n const into = w.end > w.start ? Math.max(0, Math.min(1, (t - w.start) / (w.end - w.start))) : 0;\n share = Math.min(1, (wt[j][0] + into * (wt[j][1] - wt[j][0])) / clipEnd);\n }\n if (sid != null) q.current?.startWithin(sid, share);\n setAim(share > 0.01 ? { t, sid } : null);\n goRow(i);\n },\n seekWord: wordTimes ? (w: Word) => {\n const r = rows[idx];\n if (!r || r.sentenceId == null) return;\n const j = r.words.findIndex((x) => x.seq === w.seq && x.idx === w.idx);\n const t = j >= 0 ? timesRef.current?.[String(r.sentenceId)]?.[j]?.[0] : undefined;\n if (t != null) q.current?.seekWithin(t);\n } : undefined,\n playRow: (i: number) => {\n drop();\n const at = Math.max(0, Math.min(Math.max(0, rows.length - 1), i));\n setAim(null);\n q.current?.startWithin(-1, 0);\n setPos(at);\n posRef.current = at;\n setSeekN((n) => n + 1);\n start(at);\n },\n prev: () => { const i = step(idx - 1, -1); if (i != null) seekRow(i); },\n next: () => { const i = step(idx + 1, 1); if (i != null) seekRow(i); },\n hold: () => { if (playing) { q.current?.pause(); held.current = true; } },\n release: () => { if (held.current) { held.current = false; start(posRef.current); } },\n clearError: () => setError(null),\n setVolume: (v: number) => q.current?.setVolume(v),\n };\n function joinRow(i: number) {\n const sid = rows[i]?.sentenceId;\n if (sid == null) return;\n setPos(i);\n posRef.current = i;\n setAim(null);\n aimRef.current = null;\n q.current?.joinSilently(sid);\n const rest = q.current?.resting() ?? null;\n setRestS(rest?.s ?? null);\n setSilent(!!rest?.silent);\n setPlaying(!!q.current?.playing);\n }\n api.joinAt = timed ? (t: number) => { drop(); joinRow(placePosition({ t, playing: true, sentenceId: null, offset: 0, ended: false }, rows, dur).index); } : undefined;\n applyRef.current = (p: PlayPos) => {\n const at = placePosition(p, rows, dur);\n if (timedRef.current) {\n setPos(at.index);\n posRef.current = at.index;\n if (at.playing) joinRow(at.index);\n return;\n }\n api.seekFrac?.(at.t / dur);\n if (at.playing) start(posRef.current);\n };\n return api;\n}\n\nexport const NO_SEEK = () => {};\nconst TX_PICKER_NOTE = 'The language this recording is read aloud in.';\n\nconst TX_SIDE = { title: 'TRANSCRIPT LANGUAGE', note: 'The transcript and its voice switch to this language.' };\nexport const PUB_SIDE = { title: 'READ IN', note: 'The transcript and its voice switch to this language.' };\n\n\nexport interface VoiceSheetCtx {\n people: CastMember[];\n gvList: AvailableVoice[];\n autoOf: (key: number) => AvailableVoice | null;\n savedFor: (sp: CastMember) => AvailableVoice | null;\n}\n\nexport interface NoCloneNote { busy?: boolean; title: string; sub: string; tip?: string; action?: () => void }\n\nexport interface VoiceSheetHooks {\n cloneOn?: boolean;\n pendingClones?: boolean;\n titleNode?: React.ReactNode;\n badge?: (ctx: VoiceSheetCtx) => number;\n onAddVoice?: (v: AvailableVoice) => void;\n onPickVoice?: (v: AvailableVoice) => boolean | void;\n onSelectSpeaker?: (key: number) => void;\n noCloneFor?: (sp: CastMember, auto: AvailableVoice | null, ctx: VoiceSheetCtx) => NoCloneNote | null;\n castNoClone?: (sp: CastMember, ctx: VoiceSheetCtx) => boolean;\n castShort?: (sp: CastMember, ctx: VoiceSheetCtx) => boolean;\n castBuilding?: (sp: CastMember, ctx: VoiceSheetCtx) => boolean;\n castWarn?: (sp: CastMember, ctx: VoiceSheetCtx) => string | null;\n}\n\nexport function useTxVoice({ recordingId, model, rows, lenS, ended, cred, langs, srcLang, canTranslate, pickedLang, setPickedLang, side, hearOriginal = false, timed = false, stockVoices = false, stickyPicker = false, pickerBusy = null, voiceSheet , forcedVoice = null }: {\n voiceSheet?: VoiceSheetHooks;\n forcedVoice?: string | null;\n hearOriginal?: boolean;\n stockVoices?: boolean;\n stickyPicker?: boolean;\n pickerBusy?: string | null;\n timed?: boolean;\n recordingId: string | null;\n model: Model;\n rows: Row[];\n lenS: number | null;\n ended: boolean;\n cred: MediaCred;\n langs: LanguageLists | null;\n srcLang: string | null;\n canTranslate: boolean;\n pickedLang: string | null | undefined;\n setPickedLang: (l: string | null | undefined) => void;\n side?: { title: string; note: string };\n}) {\n const { onAddVoice, onPickVoice, onSelectSpeaker, noCloneFor, castNoClone, castShort, castBuilding, castWarn, badge, titleNode: voiceTitleNode } = voiceSheet ?? {};\n const hooked = !!voiceSheet;\n const pendingClones = !!voiceSheet?.pendingClones;\n const [recent, pushRecent] = useRecentLangs();\n const [picked, setPicked] = useState<string | null>(null);\n const [picker, setPicker] = useState(false);\n const [sheet, setSheet] = useState(false);\n const [fromVoices, setFromVoices] = useState(false);\n const [want, setWant] = useState(false);\n const lang = pickedLang ?? srcLang;\n const original = pickedLang === null;\n const on = pickedLang != null || picked != null;\n const speakable = (c: string | null | undefined) => !!c && !!langs?.voice.includes(c);\n const vLang = speakable(original ? srcLang : lang) ? (original ? srcLang : lang) : 'en';\n const preview = useVoicePreview(vLang);\n const cloneOn = voiceSheet?.cloneOn ?? true;\n const [catVer, setCatVer] = useState(0);\n const cloneSeen = useRef(cloneOn);\n useEffect(() => { if (cloneSeen.current !== cloneOn) { cloneSeen.current = cloneOn; setCatVer((n) => n + 1); } }, [cloneOn]);\n const catalogue = useVoiceCatalogue(vLang, on || ended || sheet, namedCount(model) * 1000 + catVer, { id: recordingId ?? null, shareCode: cred.shareCode ?? null });\n const gvList = useMemo(() => (catalogue?.voices ?? []).filter((v) => hooked || !v.cloned || v.speaker != null), [catalogue, hooked]);\n const gVoicePick = gvList.length > 1;\n const meta = langMeta(langs, lang);\n const t = strings();\n const trLangs = useMemo(() => pickerLanguages(langs, 'translation'), [langs]);\n\n const [spkSel, setSpkSel] = useState<number | null>(null);\n const [spkMute] = useState<Set<number>>(() => new Set());\n const [castByLang, setCastByLang] = useState<Record<string, Record<number, string>>>({});\n const spkRoster = useMemo(() => speakerRoster(rows, model, t.vcUnknownSpk), [rows, model, t]);\n const spkCastOn = gVoicePick && spkRoster.filter((p) => p.key >= 0).length > 1;\n const spkSelected = spkSel != null && spkRoster.some((p) => p.key === spkSel) ? spkSel : spkRoster[0]?.key ?? null;\n const cast = useMemo(() => {\n const out = autoCast(spkRoster, gvList, cloneOn);\n for (const [k, v] of Object.entries(castByLang[vLang ?? ''] ?? {})) out.set(Number(k), v);\n return out;\n }, [spkRoster, gvList, castByLang, vLang, cloneOn]);\n const castChosen = spkCastOn && Object.keys(castByLang[vLang ?? ''] ?? {}).length > 0;\n const stockCast = useMemo(() => (stockVoices && !castChosen ? autoCast(spkRoster, gvList, false) : null), [stockVoices, castChosen, spkRoster, gvList]);\n const castKeyStr = useMemo(() => (castChosen ? castKey(cast) || null : stockCast ? castKey(stockCast) || null : null), [castChosen, cast, stockCast]);\n const sentCast = castChosen ? cast : stockCast;\n const hasClone = gvList.some((v) => v.cloned && v.consent !== 'pending');\n const canSpeak = !!lang && !!langs?.voice.includes(lang);\n const speakHere = canSpeak && !hearOriginal;\n const sentenceIds = useMemo(\n () => rows.filter((r) => !r.suppressed && !r.unclear).map((r) => r.sentenceId).filter((id): id is number => id != null),\n [rows],\n );\n const arch = useArchiveVoice({ recordingId, lang, ended, cred, pickedVoice: forcedVoice || (castKeyStr ?? picked), sentenceIds: ended && speakHere ? sentenceIds : undefined });\n const gvPicked = gvList.find((v) => v.id === picked) ?? gvList.find((v) => v.id === arch.track?.voice) ?? gvList.find((v) => v.default) ?? gvList[0] ?? null;\n const gvId = gvPicked?.id ?? null;\n\n useEffect(() => {\n if (!arch.rendering) return;\n const id = setInterval(arch.reload, 4000);\n return () => clearInterval(id);\n }, [arch.rendering, arch.reload]);\n\n const clipKey = `${recordingId ?? ''}|${lang ?? ''}|${forcedVoice || (castKeyStr ?? picked ?? arch.track?.voiceKey ?? 'default')}`;\n const vp = useTxVoicePlayer(arch.clips, rows, lenS, clipKey, spkMute, arch.track?.wordTimes, timed, arch.coming);\n useEffect(() => { const id = rows[vp.idx]?.sentenceId; if (id != null) arch.setNear(id); }, [vp.idx]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!want || !vp.has) return;\n setWant(false);\n if (!vp.playing) vp.toggle();\n }, [want, vp.has]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const rendering = arch.rendering;\n const failed = rendering ? null : arch.failed ?? null;\n const noVoice = false;\n const speaks = on && speakHere;\n const relang = on && !original && speakHere\n && !(arch.listed && arch.listed.lang === lang && arch.listed.recordingId === recordingId);\n const player: TxPlayer = {\n ...vp,\n has: vp.has || (speaks && ended),\n toggle: () => {\n if (!vp.has && !vp.playing) { setWant(true); return; }\n vp.toggle();\n },\n pause: () => { setWant(false); vp.pause(); },\n };\n\n const openPicker = () => setPicker(true);\n const closePicker = () => { setPicker(false); setSheet(fromVoices); setFromVoices(false); };\n const selectLang = (c: string | null) => {\n setPickedLang(c);\n pushRecent(c);\n if ((side || stickyPicker) && !fromVoices) return;\n if (c != null) { closePicker(); return; }\n preview.reset();\n setPicker(false);\n setSheet(false);\n setFromVoices(false);\n };\n const openVoices = () => { preview.reset(); setSheet(true); };\n const closeVoices = () => { preview.reset(); setSheet(false); };\n const pickerMine = picker && !fromVoices;\n const voicesMine = sheet || (picker && fromVoices);\n const toggleChip = () => {\n if (pickerMine) { setPicker(false); return; }\n preview.reset(); setSheet(false); setFromVoices(false); setPicker(true);\n };\n const toggleVoices = () => {\n preview.reset();\n if (voicesMine) { setSheet(false); setPicker(false); setFromVoices(false); return; }\n setPicker(false); setFromVoices(false); setSheet(true);\n };\n const pickVoice = (id: string) => {\n preview.reset();\n setSheet(spkCastOn);\n if (lang !== vLang || original) setPickedLang(vLang);\n arch.forget();\n setWant(true);\n if (spkCastOn && spkSelected != null && vLang) {\n const next = new Map(cast);\n next.set(spkSelected, id);\n setCastByLang((m) => ({ ...m, [vLang]: Object.fromEntries(next) }));\n setPicked(null);\n return;\n }\n setPicked(id);\n };\n\n const chipMeta = original ? { ...langMeta(langs, null), flag: <Icon d={D.langAuto} size={21} sw={1.7} style={{ color: 'currentColor', display: 'block' }} /> } : meta;\n const chip = canTranslate ? (side ? (\n <span className=\"barchip\" style={pickerMine ? { background: 'var(--brand-tint)', boxShadow: '0 0 0 1.5px var(--brand)' } : undefined}>\n <LanguageChip flag={chipMeta.flag} code={chipMeta.code} bordered={false} onClick={toggleChip} flagOnly label={chipMeta.label} />\n </span>\n ) : <LanguageChip flag={chipMeta.flag} code={chipMeta.code} bordered={false} onClick={openPicker} flagOnly label={chipMeta.label} />) : null;\n const glyph = D.voiceClone;\n const active = on && (!!arch.track || rendering);\n const glyphFg = failed ? 'var(--conf-low)' : active || (side && voicesMine) ? 'var(--brand)' : 'var(--ink-55)';\n const waitKind = voiceWait({ on, want, relang, playing: vp.playing, preparing: !!vp.preparing, starting: vp.starting });\n const [lineHeld] = useHeld(waitKind === 'line', 400);\n const voiceWaiting = waitKind === 'asked' || (waitKind === 'line' && lineHeld);\n const busy = rendering || voiceWaiting;\n const voiceTitle = waitKind === 'asked'\n ? VOICE_WAIT_TITLE\n : vp.preparing\n ? `Speaking this line in ${gvPicked?.name ?? 'this voice'}…`\n : rendering\n ? `Preparing this recording in ${gvPicked?.name ?? 'this voice'} — it will play as soon as it is ready`\n : failed\n ? `This voice could not be prepared: ${failed}`\n : !canSpeak\n ? `${t.vcNoVoice}${meta.label}`\n : gVoicePick\n ? 'Choose a voice'\n : gvPicked\n ? gvPicked.name\n : t.vcNoVoice + meta.label;\n const pickerEl = (\n <LanguagePicker open={picker} onClose={closePicker} keepOpen={(!!side || stickyPicker) && !fromVoices} value={original ? null : lang} onSelect={selectLang} languages={trLangs} title={side?.title ?? 'SPOKEN LANGUAGE'} note={side?.note ?? TX_PICKER_NOTE} searchPlaceholder={t.search} none=\"Original\" pinned={(original ? srcLang : lang) ? [(original ? srcLang : lang)!] : []} recent={recent} requireVoice={fromVoices} sticky={stickyPicker} busy={pickerBusy} />\n );\n const savedClones = useMemo(() => gvList.filter((v) => v.cloned && !v.auto), [gvList]);\n const savedFor = (sp: CastMember) => (sp.voiceId ? savedClones.find((v) => v.id === `clone:${sp.voiceId}`) ?? null : null);\n const people = useMemo(() => spkRoster.filter((p2) => p2.key >= 0), [spkRoster]);\n const sheetList = useMemo(() => {\n const stock = gvList.filter((v) => !v.cloned);\n if (!spkCastOn) return [...stock, ...(ended && people.length === 1 ? savedClones.filter((v) => v.id === `clone:${people[0].voiceId}`) : [])];\n const own: AvailableVoice[] = [];\n for (const sp of people) {\n if (savedFor(sp)) continue;\n const auto = gvList.find((v) => v.cloned && v.auto && v.speaker === sp.key);\n if (!auto || auto.ready === false || (auto.consent === 'pending' && !pendingClones)) continue;\n own.push({ id: auto.id, name: sp.name, cloned: true, default: false, live: true, auto: true, gender: sp.sex ?? auto.gender ?? null, speaker: sp.key, consent: auto.consent ?? null });\n }\n return [...stock, ...savedClones, ...own];\n }, [gvList, savedClones, spkCastOn, people, pendingClones, ended]); // eslint-disable-line react-hooks/exhaustive-deps\n const selSp = spkCastOn ? people.find((p2) => p2.key === spkSelected) ?? null : null;\n const soleSp = !spkCastOn && gVoicePick && people.length === 1 && !gvList.some((v) => v.cloned && v.auto && v.speaker === people[0].key) ? people[0] : null;\n const noteSp = selSp ?? soleSp;\n const genderOf = (id: string | undefined) => (id ? gvList.find((v) => v.id === id)?.gender ?? null : null);\n const selSex = selSp ? selSp.sex ?? genderOf(cast.get(selSp.key)) : null;\n const shownList = useMemo(() => {\n if (!selSp) return sheetList;\n return sheetList.filter((v) => (v.cloned ? (v.live ? v.speaker === selSp.key : v.id === `clone:${selSp.voiceId}`) : true));\n }, [sheetList, selSp, selSex, people]); // eslint-disable-line react-hooks/exhaustive-deps\n const autoOf = (key: number) => gvList.find((v) => v.cloned && v.auto && v.speaker === key) ?? null;\n const ctx: VoiceSheetCtx = { people, gvList, autoOf, savedFor };\n const toClone = badge?.(ctx) ?? 0;\n const warns = castWarn ? people.map((p2) => castWarn(p2, ctx)).filter((w): w is string => !!w) : [];\n const voiceBtn = (\n <button type=\"button\" className=\"txvoice\" aria-label=\"Voice\" aria-pressed={side ? voicesMine : undefined} aria-busy={busy || undefined} title={busy || failed ? voiceTitle : undefined} style={{ cursor: 'pointer', background: active || busy || (side && voicesMine) ? 'var(--brand-tint)' : 'var(--fill-06)', boxShadow: side && voicesMine ? 'inset 0 0 0 1.5px var(--brand)' : undefined }} onClick={side ? toggleVoices : openVoices}>\n <Icon d={glyph} size={17} sw={1.6} style={{ color: glyphFg }} />\n {busy && <span aria-hidden=\"true\" style={{ position: 'absolute', inset: 0, boxSizing: 'border-box', borderRadius: '50%', border: '2px solid var(--fill-12)', borderTopColor: 'var(--brand)', animation: 'vs-spin .7s linear infinite', pointerEvents: 'none' }} />}\n {warns.length > 0\n ? <span className=\"txvoice__warn\" title={warns.join(' · ')}>!</span>\n : !!toClone && <span className=\"txvoice__n\" title={`${toClone} speaker${toClone === 1 ? '' : 's'} can get a cloned voice`}>{toClone}</span>}\n </button>\n );\n const voiceSheetEl = (\n <Sheet open={sheet} onClose={closeVoices} title={t.vcSheet} titleNode={voiceTitleNode} doneLabel={t.done}>\n <VoiceSheetBody\n t={t}\n cast={spkCastOn && (\n <SpeakerCast\n t={t}\n roster={spkRoster}\n selected={spkSelected}\n onSelect={(k) => { preview.reset(); setSpkSel(k); onSelectSpeaker?.(k); }}\n noClone={(p2) => !!castNoClone?.(p2, ctx)}\n short={(p2) => !!castShort?.(p2, ctx)}\n warn={(p2) => castWarn?.(p2, ctx) ?? null}\n building={(p2) => !savedFor(p2) && (gvList.some((v) => v.cloned && v.speaker === p2.key && v.ready === false) || !!castBuilding?.(p2, ctx))}\n sexOf={(p2) => p2.sex ?? genderOf(cast.get(p2.key))}\n />\n )}\n voices={shownList}\n onAdd={(v) => { preview.reset(); onAddVoice?.(v); }}\n noClone={noteSp && !shownList.some((v) => v.cloned) ? noCloneFor?.(noteSp, autoOf(noteSp.key), ctx) ?? null : null}\n usedBy={spkCastOn && spkSelected != null\n ? (v) => {\n const also = spkRoster.filter((p) => p.key !== spkSelected && cast.get(p.key) === v.id);\n return also.length ? also.map((p) => p.name).join(', ') : null;\n }\n : undefined}\n foldKey={spkSelected}\n foldFor={selSex}\n currentId={spkCastOn && spkSelected != null ? cast.get(spkSelected) ?? null : gvId}\n armedId={preview.armId}\n sampleId={preview.sampleId}\n dlId={preview.dlId}\n onPick={(v) => { if (preview.sampleId === v.id || preview.dlId === v.id) { preview.stop(); return; } if (onPickVoice?.(v) === false) { preview.reset(); return; } preview.arm(v); }}\n onUse={pickVoice}\n />\n </Sheet>\n );\n const sheets = side ? null : <>{pickerEl}{voiceSheetEl}</>;\n const sidePanel = side && (picker || sheet) ? <div className=\"vs-side\">{picker ? pickerEl : voiceSheetEl}</div> : null;\n const playTitle = !speaks\n ? null\n : failed\n ? `This voice could not be prepared: ${failed}`\n : voiceWaiting && (want || vp.playing)\n ? VOICE_WAIT_TITLE\n : null;\n const noVoiceNote = noVoice && (\n <div className=\"novoice\" title={NO_VOICE_TIP}>\n <Icon d={D.headphonesOff} size={17} sw={1.6} style={{ flex: 'none', color: 'var(--ink-45)' }} />\n <span className=\"novoice__text\">{`${t.vcNoVoice}${meta.label} yet — this transcript can be read, not played.`}</span>\n </div>\n );\n return {\n barChip: { flag: chipMeta.flag, code: chipMeta.code, label: chipMeta.label, onClick: side || stickyPicker ? toggleChip : openPicker, active: !!((side || stickyPicker) && pickerMine), can: canTranslate },\n sheetsOpen: picker || sheet,\n on: speaks, player, chip, voiceBtn, voiceWaiting: busy, sheets, sidePanel, voicesMine, toggleVoices, cloningOn: cloneOn, playTitle, noVoice, noVoiceNote, relang, sampling: preview.sampleId != null, error: preview.error, clearError: () => preview.clearError(), openVoices, openPicker, original, reloadVoices: () => setCatVer((n) => n + 1), voicesVer: catVer, people, gvList, autoOf, savedFor, closeVoices, setSheet,\n selectedSpeaker: selSp, armVoice: preview.arm, resetPreview: preview.reset, armedId: preview.armId, resetCast: () => setCastByLang((m) => ({ ...m, [vLang ?? '']: {} })),\n readLang: typeof pickedLang === 'string' && pickedLang !== srcLang ? pickedLang : null,\n readVoiceKey: forcedVoice || (castKeyStr ?? picked ?? arch.track?.voiceKey ?? ''),\n pickedVoiceKey: castKeyStr ?? picked ?? null,\n readVoiceName: gvPicked?.name ?? null,\n canSpeak,\n requestTrack: () => arch.requestRender(castKeyStr ?? picked, castKeyStr ? sentCast : null),\n hasClone,\n clips: arch.clips,\n setNear: arch.setNear,\n closePicker: () => { if (pickerMine) closePicker(); },\n langList: { value: original ? null : lang, onSelect: selectLang, languages: trLangs, searchPlaceholder: t.search, none: 'Original', pinned: (original ? srcLang : lang) ? [(original ? srcLang : lang)!] : [], recent } satisfies LanguageListProps,\n };\n}\n\nexport function TxLines({ model, rows, player, fixed, applied, onFixOpen, onWord, onFix, fixMode, fixingId, marks = true, fixBadges = true, tail, tailFg, running, desk, feedRef, listener, showLabels, find, findOpen, lang, warm, onVisible, wordHl = true }: { model: Model; rows: Row[]; player: TxPlayer; fixed?: Set<string>; applied?: Correction[]; onFixOpen?: (r: Row, hist: boolean) => void; onWord?: (r: Row, w: Word) => void; onFix?: (r: Row) => void; fixMode?: boolean; fixingId?: string | null; marks?: boolean; fixBadges?: boolean; tail: string; tailFg: string; running?: boolean; desk: boolean; feedRef: React.RefObject<HTMLDivElement>; listener?: boolean; showLabels: boolean; find?: string; findOpen?: boolean; lang?: string | null ; warm?: boolean; onVisible?: (ids: number[]) => void; wordHl?: boolean }) {\n const { playing, engaged, t, idx, seekN, wordSync, clipPos } = player;\n useDragScroll(true, feedRef);\n const thumbRef = useRef<HTMLDivElement>(null);\n useFeedBar(feedRef, thumbRef);\n const [hovId, setHovId] = useState<string | null>(null);\n const needle = (find ?? '').trim().toLowerCase();\n const [off, setOff] = useState<-1 | 0 | 1>(0);\n const glideUntil = useRef(0);\n const glide = useRef<number | null>(null);\n const lastIdx = useRef(idx);\n const rowEl = (i: number) => feedRef.current?.querySelector<HTMLElement>(`[data-tx-row=\"${i}\"]`) ?? null;\n const visKey = useRef('');\n useEffect(() => {\n const el = feedRef.current;\n if (!el || !onVisible) return;\n const measure = () => {\n const b = el.getBoundingClientRect();\n const ids: number[] = [];\n for (const c of Array.from(el.querySelectorAll<HTMLElement>('[data-sentence]'))) {\n const r = c.getBoundingClientRect();\n if (r.bottom > b.top && r.top < b.bottom) ids.push(Number(c.dataset.sentence));\n }\n const key = ids.join(',');\n if (key === visKey.current) return;\n visKey.current = key;\n onVisible(ids);\n };\n const t = window.setTimeout(measure, 120);\n let h: number | undefined;\n const onScroll = () => { window.clearTimeout(h); h = window.setTimeout(measure, 120); };\n el.addEventListener('scroll', onScroll, { passive: true });\n return () => { window.clearTimeout(t); window.clearTimeout(h); el.removeEventListener('scroll', onScroll); };\n }, [rows, onVisible, feedRef]);\n const centre = (i: number) => {\n const el = feedRef.current, row = rowEl(i);\n if (!el || !row) return;\n const top = row.getBoundingClientRect().top - el.getBoundingClientRect().top + el.scrollTop;\n const max = el.scrollHeight - el.clientHeight;\n const ins = feedInset(el);\n const visH = Math.max(80, el.clientHeight - ins.top - ins.bottom);\n const lead = row.offsetHeight > visH ? 8 : (visH - row.offsetHeight) / 2;\n el.scrollTop = Math.max(0, Math.min(max, top - ins.top - lead));\n };\n const rowOffscreen = (i: number): -1 | 0 | 1 => {\n const el = feedRef.current, row = rowEl(i);\n if (!el || !el.clientHeight || !el.offsetParent || !row) return 0;\n const r = row.getBoundingClientRect(), b = el.getBoundingClientRect();\n const ins = feedInset(el);\n const top = b.top + ins.top, bot = b.bottom - ins.bottom;\n if (r.height > bot - top) return r.top < top - 4 ? -1 : r.top > bot - 60 ? 1 : 0;\n if (r.bottom < top + 10) return -1;\n if (r.bottom > bot - 4) return 1;\n return 0;\n };\n const smoothRow = (i: number) => {\n glideUntil.current = performance.now() + 420;\n const el = feedRef.current, row = rowEl(i);\n if (!el || !el.clientHeight || !row) return;\n const r = row.getBoundingClientRect(), b = el.getBoundingClientRect();\n const max = el.scrollHeight - el.clientHeight;\n const from = el.scrollTop;\n const ins = feedInset(el);\n const visH = Math.max(80, el.clientHeight - ins.top - ins.bottom);\n const lead = r.height > visH ? 8 : (visH - r.height) / 2;\n const to = Math.max(0, Math.min(max, from + (r.top - b.top) - ins.top - lead));\n if (glide.current) cancelAnimationFrame(glide.current);\n if (Math.abs(to - from) < 2) { el.scrollTop = to; glide.current = null; return; }\n const t0 = performance.now(), ms = 360;\n const step = () => {\n const k = Math.min(1, (performance.now() - t0) / ms);\n el.scrollTop = from + (to - from) * (1 - Math.pow(1 - k, 3));\n glide.current = k < 1 ? requestAnimationFrame(step) : null;\n };\n glide.current = requestAnimationFrame(step);\n };\n useEffect(() => () => { if (glide.current) cancelAnimationFrame(glide.current); }, []);\n const offRef = useRef<-1 | 0 | 1>(0);\n useEffect(() => {\n if (!playing) { lastIdx.current = idx; offRef.current = 0; setOff(0); return; }\n const check = () => {\n const moved = idx !== lastIdx.current;\n lastIdx.current = idx;\n let o: -1 | 0 | 1 = performance.now() < glideUntil.current ? 0 : rowOffscreen(idx);\n if (moved && o && !offRef.current) { centre(idx); o = 0; }\n offRef.current = o;\n setOff(o);\n };\n check();\n const h = setInterval(check, 200);\n return () => clearInterval(h);\n }, [idx, playing]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => { if (seekN) smoothRow(idx); }, [seekN]); // eslint-disable-line react-hooks/exhaustive-deps\n const followJump = () => { smoothRow(idx); offRef.current = 0; setOff(0); };\n const follow = (dir: 'up' | 'down') => (\n <div className={`txfollow txfollow--${dir}`}>\n <button type=\"button\" className=\"txfollow__pill\" title=\"Jump to the line playing now\" onClick={followJump}>\n <Icon d={dir === 'up' ? 'm4.5 15.75 7.5-7.5 7.5 7.5' : 'm19.5 8.25-7.5 7.5-7.5-7.5'} size={15} sw={2} />Now playing\n </button>\n </div>\n );\n return (\n <div ref={feedRef} data-tx-feed=\"1\" className={`txfeed${desk ? ' txfeed--desk' : ''}${findOpen && !running ? ' is-find' : ''}`}>\n <FeedBar thumbRef={thumbRef} />\n {playing && off === -1 && follow('up')}\n {rows.map((r, i) => {\n const on = playing && i === idx;\n const held = engaged && i === idx;\n const fixing = !!fixingId && fixingId === r.id;\n const dim = needle && !r.text.toLowerCase().includes(needle) && !(lang && r.translations[lang]?.toLowerCase().includes(needle)) ? 0.22 : !engaged || i <= idx || fixing ? 1 : 0.38;\n const tapRow = listener ? () => player.playRow(i)\n : fixMode && onFix ? () => { if (playing && !on) player.seekRow(i); onFix(r); }\n : playing && on ? undefined : () => player.playRow(i);\n const fx = listener ? null : rowFixes(r, applied, fixed);\n const fxAny = !!fx && (fx.script > 0 || fx.manual);\n const pen = desk && !!onFixOpen && hovId === r.id && !!fx && !fxAny;\n const who = speakerLabel(model, r.speaker);\n const look = speakerLook(model, r.speaker);\n const ln = look.lane;\n const tr = lang && r.translations[lang] && r.language !== lang ? r.translations[lang] : null;\n const words = lineWords(rows, i, lang);\n const spokenWord = held && !wordSync && clipPos ? readCursor(words.map((w) => ({ t: w.text, sp: ' ' })), clipPos) : null;\n return (\n <div key={r.id} data-tx-row={i} data-sentence={r.sentenceId} className={`txline${warm ? ' txline--warm' : ''}${fixing ? ' txline--fixing' : ''}`} aria-current={fixing || undefined} style={{ opacity: dim }} onClick={tapRow} onMouseEnter={desk && onFixOpen ? () => setHovId(r.id) : undefined} onMouseLeave={desk && onFixOpen ? () => setHovId(null) : undefined}>\n <div className=\"txline__meta\">\n <span className=\"txline__at\">{clock(r.start)}</span>\n {showLabels && r.speaker >= 0 && (\n <>\n <div className={`lanechip bg-lane-${ln}`} style={look.soft ? { background: look.soft, color: look.fg } : undefined}>{speakerInitial(model, r.speaker)}</div>\n <span className={`txline__who lane-${ln}`} style={look.fg ? { color: look.fg } : undefined}>{who}</span>\n {look.hasVoice && <VoiceIdGlyph color={look.fg ?? `var(--lane-${ln})`} />}\n </>\n )}\n {on && <span title=\"Playing\" style={{ flex: 'none', display: 'inline-flex', alignItems: 'center' }}><Icon d={D.headphones} size={desk ? 15 : 14} sw={1.6} stroke={showLabels && r.speaker >= 0 ? look.fg ?? `var(--lane-${ln})` : 'var(--ink-45)'} /></span>}\n {fx && fixBadges && <FixBadges f={fx} desk={desk} onOpen={onFixOpen ? () => onFixOpen(r, true) : undefined} />}\n {pen && <FixPen alone onOpen={() => onFixOpen?.(r, false)} />}\n </div>\n <div className=\"txline__text\">\n {words.map((w, j) => {\n const key = `${w.seq}:${w.idx}`;\n const c = confClass(w.prob);\n const tracks = held && wordHl;\n const at = tracks && (wordSync\n ? t >= w.start && (t < w.end || j === words.length - 1 || t < words[j + 1].start)\n : j === spokenWord);\n const ahead = tracks && !at && (wordSync ? w.start > t : spokenWord != null && j > spokenWord);\n const fx = !tr && !listener && (!!fixed?.has(key) || !!w.script);\n const dash = !tr && !listener && marks && !!c && !fx;\n const half = dash ? (c === 'low' ? 'var(--conf-low-half)' : 'var(--conf-mid-half)') : null;\n const fg = fx ? 'var(--brand)' : ahead ? 'var(--ink-40)' : half ?? 'var(--ink-96)';\n return (\n <span key={key + j}>\n <span\n className=\"txw\"\n title={onWord && !tr ? (fixMode ? 'Correct this word' : on ? (playing && player.seekWord ? 'Play from this word' : 'Play from this line') : 'Play from this line') : on ? '' : 'Play from this line'}\n onClick={onWord && !tr ? (e) => { e.stopPropagation(); if (fixMode) { onWord(r, w); return; } if (playing && on) { player.seekWord?.(w); return; } player.playRow(i); } : undefined}\n style={{ color: fg, opacity: ahead ? 0.45 : 1, fontWeight: 300, cursor: onWord && !tr ? (fixMode || !on || !playing || player.seekWord ? 'pointer' : 'default') : on ? 'default' : 'pointer', textShadow: at ? '0 0 2px currentColor, 0 0 4px currentColor' : 'none', textDecorationLine: dash || fx ? 'underline' : 'none', textDecorationStyle: fx ? 'solid' : 'dotted', textDecorationColor: fx ? 'var(--brand)' : half ?? 'currentColor', textDecorationThickness: dash || fx ? '1.5px' : undefined, textUnderlineOffset: dash || fx ? '3px' : undefined }}\n >{w.text}</span>\n <span style={{ whiteSpace: 'pre-wrap' }}> </span>\n </span>\n );\n })}\n </div>\n </div>\n );\n })}\n {running\n ? <div className=\"txtail txtail--wave\" title=\"Still transcribing\"><span className=\"eq3\" aria-hidden=\"true\"><span /><span /><span /></span></div>\n : <div className=\"txtail\" style={{ color: tailFg }}>{tail}</div>}\n {playing && off === 1 && follow('down')}\n </div>\n );\n}\n\nexport function TxFind({ open, q, onQ, onClose, hits, desk, inline, flash }: { open: boolean; q: string; onQ: (q: string) => void; onClose: () => void; hits: number; desk: boolean; inline?: boolean; flash?: string | null }) {\n return (\n <div className={inline ? 'searchbar searchbar--inline' : `searchbar searchbar--float${desk ? ' searchbar--desk' : ''}${open ? '' : ' is-hidden'}`}>\n <div>\n <Icon d={D.search} size={16} sw={1.7} style={{ color: 'var(--ink-45)', flex: 'none' }} />\n <input value={q} onChange={(e) => onQ(e.target.value)} onKeyDown={(e) => { if (e.key !== 'Escape') return; e.stopPropagation(); if (q) onQ(''); else onClose(); }} placeholder=\"Search this transcript\" />\n {inline && flash && <span className=\"searchbar__flash\">{flash}</span>}\n {q.trim() && <span className=\"count\">{hits} found</span>}\n {q.trim() && <button type=\"button\" className=\"searchbar__x\" onClick={() => onQ('')} aria-label=\"Clear\" title=\"Clear\"><Icon d={D.close} size={15} sw={1.7} /></button>}\n </div>\n </div>\n );\n}\nexport function useFindPull(feedRef: React.RefObject<HTMLDivElement>, rows: Row[], open: boolean, q: string, setOpen: (v: boolean) => void) {\n const openRef = useRef(open); openRef.current = open;\n const qRef = useRef(q); qRef.current = q;\n const [hits, setHits] = useState(0);\n const needle = q.trim().toLowerCase();\n useEffect(() => { setHits(needle ? rows.filter((r) => r.text.toLowerCase().includes(needle)).length : 0); }, [rows, needle]);\n useEffect(() => {\n const el = feedRef.current;\n if (!el) return;\n let last = el.scrollTop, acc = 0, userUntil = 0;\n const touch = () => { userUntil = Date.now() + 1500; };\n const drag = (e: PointerEvent) => { if (e.buttons) touch(); };\n const onScroll = () => {\n const top = el.scrollTop, d = top - last;\n last = top;\n if (Date.now() > userUntil) { acc = 0; return; }\n acc = (d < 0) === (acc < 0) ? acc + d : d;\n if (acc < -14 && !openRef.current) { acc = 0; setOpen(true); }\n else if (acc > 56 && openRef.current && !qRef.current.trim()) { acc = 0; setOpen(false); }\n };\n el.addEventListener('wheel', touch, { passive: true });\n el.addEventListener('touchmove', touch, { passive: true });\n el.addEventListener('pointermove', drag);\n el.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n el.removeEventListener('wheel', touch);\n el.removeEventListener('touchmove', touch);\n el.removeEventListener('pointermove', drag);\n el.removeEventListener('scroll', onScroll);\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n return hits;\n}\n\n","const ECC_M = { formatBits: 0, perBlock: [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28], blocks: [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49] };\n\nfunction rawDataModules(ver: number): number {\n let n = (16 * ver + 128) * ver + 64;\n if (ver >= 2) {\n const a = Math.floor(ver / 7) + 2;\n n -= (25 * a - 10) * a - 55;\n if (ver >= 7) n -= 36;\n }\n return n;\n}\nconst dataCodewords = (ver: number) => Math.floor(rawDataModules(ver) / 8) - ECC_M.perBlock[ver] * ECC_M.blocks[ver];\n\nfunction gfMul(x: number, y: number): number {\n let z = 0;\n for (let i = 7; i >= 0; i--) {\n z = (z << 1) ^ ((z >>> 7) * 0x11d);\n z ^= ((y >>> i) & 1) * x;\n }\n return z;\n}\nfunction rsDivisor(degree: number): number[] {\n const out = new Array<number>(degree).fill(0);\n out[degree - 1] = 1;\n let root = 1;\n for (let i = 0; i < degree; i++) {\n for (let j = 0; j < degree; j++) out[j] = gfMul(out[j], root) ^ (j + 1 < degree ? out[j + 1] : 0);\n root = gfMul(root, 2);\n }\n return out;\n}\nfunction rsRemainder(data: number[], divisor: number[]): number[] {\n const out = new Array<number>(divisor.length).fill(0);\n for (const b of data) {\n const factor = b ^ (out.shift() as number);\n out.push(0);\n divisor.forEach((c, i) => { out[i] ^= gfMul(c, factor); });\n }\n return out;\n}\n\nfunction alignmentPositions(ver: number): number[] {\n if (ver === 1) return [];\n const n = Math.floor(ver / 7) + 2;\n const size = ver * 4 + 17;\n const step = ver === 32 ? 26 : Math.ceil((ver * 4 + 4) / (n * 2 - 2)) * 2;\n const out = [6];\n for (let pos = size - 7; out.length < n; pos -= step) out.splice(1, 0, pos);\n return out;\n}\n\nexport function qrMatrix(text: string): boolean[][] {\n const bytes = Array.from(new TextEncoder().encode(text));\n let ver = 1;\n for (; ver <= 40; ver++) {\n const countBits = ver <= 9 ? 8 : 16;\n if (4 + countBits + bytes.length * 8 <= dataCodewords(ver) * 8) break;\n }\n if (ver > 40) throw new Error('Text too long for a QR code');\n const size = ver * 4 + 17;\n const capacity = dataCodewords(ver) * 8;\n const bits: number[] = [];\n const push = (v: number, n: number) => { for (let i = n - 1; i >= 0; i--) bits.push((v >>> i) & 1); };\n push(4, 4);\n push(bytes.length, ver <= 9 ? 8 : 16);\n for (const b of bytes) push(b, 8);\n push(0, Math.min(4, capacity - bits.length));\n while (bits.length % 8) bits.push(0);\n for (let pad = 0xec; bits.length < capacity; pad ^= 0xec ^ 0x11) push(pad, 8);\n const data: number[] = [];\n for (let i = 0; i < bits.length; i += 8) data.push(bits.slice(i, i + 8).reduce((a, b) => (a << 1) | b, 0));\n const numBlocks = ECC_M.blocks[ver], eccLen = ECC_M.perBlock[ver];\n const rawCodewords = Math.floor(rawDataModules(ver) / 8);\n const numShort = numBlocks - (rawCodewords % numBlocks);\n const shortLen = Math.floor(rawCodewords / numBlocks);\n const blocks: number[][] = [];\n const div = rsDivisor(eccLen);\n for (let i = 0, k = 0; i < numBlocks; i++) {\n const dat = data.slice(k, k + shortLen - eccLen + (i < numShort ? 0 : 1));\n k += dat.length;\n const ecc = rsRemainder(dat, div);\n if (i < numShort) dat.push(0);\n blocks.push(dat.concat(ecc));\n }\n const codewords: number[] = [];\n for (let i = 0; i < blocks[0].length; i++) blocks.forEach((b, j) => { if (i !== shortLen - eccLen || j >= numShort) codewords.push(b[i]); });\n\n const m: boolean[][] = Array.from({ length: size }, () => new Array<boolean>(size).fill(false));\n const fn: boolean[][] = Array.from({ length: size }, () => new Array<boolean>(size).fill(false));\n const set = (x: number, y: number, dark: boolean) => { m[y][x] = dark; fn[y][x] = true; };\n for (let i = 0; i < size; i++) { set(6, i, i % 2 === 0); set(i, 6, i % 2 === 0); }\n const finder = (x: number, y: number) => {\n for (let dy = -4; dy <= 4; dy++) for (let dx = -4; dx <= 4; dx++) {\n const d = Math.max(Math.abs(dx), Math.abs(dy)), xx = x + dx, yy = y + dy;\n if (xx >= 0 && xx < size && yy >= 0 && yy < size) set(xx, yy, d !== 2 && d !== 4);\n }\n };\n finder(3, 3); finder(size - 4, 3); finder(3, size - 4);\n const ap = alignmentPositions(ver);\n for (let i = 0; i < ap.length; i++) for (let j = 0; j < ap.length; j++) {\n if ((i === 0 && j === 0) || (i === 0 && j === ap.length - 1) || (i === ap.length - 1 && j === 0)) continue;\n for (let dy = -2; dy <= 2; dy++) for (let dx = -2; dx <= 2; dx++) set(ap[i] + dx, ap[j] + dy, Math.max(Math.abs(dx), Math.abs(dy)) !== 1);\n }\n const formatBits = (mask: number) => {\n const d = (ECC_M.formatBits << 3) | mask;\n let rem = d;\n for (let i = 0; i < 10; i++) rem = (rem << 1) ^ ((rem >>> 9) * 0x537);\n const b = ((d << 10) | rem) ^ 0x5412;\n const bit = (i: number) => ((b >>> i) & 1) !== 0;\n for (let i = 0; i <= 5; i++) set(8, i, bit(i));\n set(8, 7, bit(6)); set(8, 8, bit(7)); set(7, 8, bit(8));\n for (let i = 9; i < 15; i++) set(14 - i, 8, bit(i));\n for (let i = 0; i < 8; i++) set(size - 1 - i, 8, bit(i));\n for (let i = 8; i < 15; i++) set(8, size - 15 + i, bit(i));\n set(8, size - 8, true);\n };\n formatBits(0);\n if (ver >= 7) {\n let rem = ver;\n for (let i = 0; i < 12; i++) rem = (rem << 1) ^ ((rem >>> 11) * 0x1f25);\n const b = (ver << 12) | rem;\n for (let i = 0; i < 18; i++) {\n const bit = ((b >>> i) & 1) !== 0, a = size - 11 + (i % 3), c = Math.floor(i / 3);\n set(a, c, bit); set(c, a, bit);\n }\n }\n let i = 0;\n for (let right = size - 1; right >= 1; right -= 2) {\n if (right === 6) right = 5;\n for (let vert = 0; vert < size; vert++) for (let j = 0; j < 2; j++) {\n const x = right - j, y = ((right + 1) & 2) === 0 ? size - 1 - vert : vert;\n if (!fn[y][x] && i < codewords.length * 8) { m[y][x] = ((codewords[i >>> 3] >>> (7 - (i & 7))) & 1) !== 0; i++; }\n }\n }\n const maskAt = (k: number, x: number, y: number) => {\n switch (k) {\n case 0: return (x + y) % 2 === 0;\n case 1: return y % 2 === 0;\n case 2: return x % 3 === 0;\n case 3: return (x + y) % 3 === 0;\n case 4: return (Math.floor(x / 3) + Math.floor(y / 2)) % 2 === 0;\n case 5: return ((x * y) % 2) + ((x * y) % 3) === 0;\n case 6: return (((x * y) % 2) + ((x * y) % 3)) % 2 === 0;\n default: return (((x + y) % 2) + ((x * y) % 3)) % 2 === 0;\n }\n };\n const apply = (k: number) => { for (let y = 0; y < size; y++) for (let x = 0; x < size; x++) if (!fn[y][x] && maskAt(k, x, y)) m[y][x] = !m[y][x]; };\n const penalty = () => {\n let score = 0;\n const count = (h: number[]) => {\n const n = h[1];\n const core = n > 0 && h[2] === n && h[3] === n * 3 && h[4] === n && h[5] === n;\n return (core && h[0] >= n * 4 && h[6] >= n ? 1 : 0) + (core && h[6] >= n * 4 && h[0] >= n ? 1 : 0);\n };\n const add = (h: number[], len: number) => { if (h[0] === 0) len += size; h.pop(); h.unshift(len); };\n const finish = (h: number[], color: boolean, len: number) => { if (color) { add(h, len); len = 0; } add(h, len + size); return count(h); };\n const line = (at: (i: number) => boolean) => {\n let color = false, run = 0;\n const h = [0, 0, 0, 0, 0, 0, 0];\n for (let i = 0; i < size; i++) {\n if (at(i) === color) { run++; if (run === 5) score += 3; else if (run > 5) score++; }\n else { add(h, run); if (!color) score += count(h) * 40; color = at(i); run = 1; }\n }\n score += finish(h, color, run) * 40;\n };\n for (let y = 0; y < size; y++) line((x) => m[y][x]);\n for (let x = 0; x < size; x++) line((y) => m[y][x]);\n for (let y = 0; y < size - 1; y++) for (let x = 0; x < size - 1; x++) {\n const c = m[y][x];\n if (c === m[y][x + 1] && c === m[y + 1][x] && c === m[y + 1][x + 1]) score += 3;\n }\n let dark = 0;\n for (const row of m) for (const c of row) if (c) dark++;\n const total = size * size;\n score += (Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1) * 10;\n return score;\n };\n let best = 0, min = Infinity;\n for (let k = 0; k < 8; k++) {\n apply(k); formatBits(k);\n const p = penalty();\n if (p < min) { min = p; best = k; }\n apply(k);\n }\n apply(best); formatBits(best);\n return m;\n}\n\nexport function qrSvgUrl(text: string): string {\n const m = qrMatrix(text);\n const n = m.length, q = 2;\n let d = '';\n for (let y = 0; y < n; y++) for (let x = 0; x < n; x++) if (m[y][x]) d += `M${x} ${y}h1v1h-1z`;\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${-q} ${-q} ${n + q * 2} ${n + q * 2}\" shape-rendering=\"crispEdges\"><rect x=\"${-q}\" y=\"${-q}\" width=\"${n + q * 2}\" height=\"${n + q * 2}\" fill=\"#fff\"/><path fill=\"#111\" d=\"${d}\"/></svg>`;\n return `data:image/svg+xml,${encodeURIComponent(svg)}`;\n}\n","import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { IconButton, Sheet } from '../ds/Controls';\nimport type { Strings } from '../data/i18n';\nimport { D, Icon, Logo, Mark, PauseGlyph, PlayGlyph, SITE } from '../ds/Icons';\nimport { qrSvgUrl } from '../core/qr';\nimport { shareLink } from './shared';\nimport { clock } from '../core/format';\n\nconst HINT_CODES = ['es', 'fr', 'ro', 'ja', 'pt'];\n\nconst DUCK = 0.5;\n\nconst ICON_FULL = 'M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15';\nconst ICON_EXIT = 'M9 9V4.5M9 9H4.5M9 9 3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5 5.25 5.25';\n\nfunction fullNow(): Element | null {\n const d = document as Document & { webkitFullscreenElement?: Element };\n return d.fullscreenElement ?? d.webkitFullscreenElement ?? null;\n}\n\nlet fullTarget: HTMLElement | null = null;\nexport function setFullTarget(el: HTMLElement | null) {\n fullTarget = el;\n}\n\nfunction canFull(): boolean {\n const d = document as Document & { webkitFullscreenEnabled?: boolean };\n return !!(d.fullscreenEnabled || d.webkitFullscreenEnabled);\n}\n\nfunction noBrowserFull(): boolean {\n if (typeof document === 'undefined' || !window.matchMedia?.('(pointer: coarse)').matches) return false;\n const el = (fullTarget ?? document.documentElement) as HTMLElement & { webkitRequestFullscreen?: unknown };\n return !el.requestFullscreen && !el.webkitRequestFullscreen;\n}\n\nexport function browserFull(on: boolean) {\n if (typeof document === 'undefined' || !window.matchMedia?.('(pointer: coarse)').matches) return;\n realFull(on);\n}\n\nexport function realFull(on: boolean) {\n if (typeof document === 'undefined') return;\n const d = document as Document & { webkitFullscreenElement?: Element; webkitExitFullscreen?: () => Promise<void> };\n const el = (fullTarget ?? document.documentElement) as HTMLElement & { webkitRequestFullscreen?: (o?: FullscreenOptions) => Promise<void> };\n const now = d.fullscreenElement ?? d.webkitFullscreenElement;\n try {\n if (on && !now) void (el.requestFullscreen ?? el.webkitRequestFullscreen)?.call(el, { navigationUI: 'hide' })?.catch(() => {});\n if (!on && now) void (d.exitFullscreen ?? d.webkitExitFullscreen)?.call(d)?.catch(() => {});\n } catch { }\n}\n\nfunction useMedia(q: string): boolean {\n const [on, setOn] = useState(() => typeof window !== 'undefined' && !!window.matchMedia?.(q).matches);\n useEffect(() => {\n const m = window.matchMedia?.(q);\n if (!m) return;\n const f = () => setOn(m.matches);\n f();\n m.addEventListener('change', f);\n return () => m.removeEventListener('change', f);\n }, [q]);\n return on;\n}\n\nexport type PlayerPos = { live: boolean; atEdge: boolean; edgeFrac: number | null; readyFrac?: number | null; pct: number; atLabel: string; labelAt: (frac: number) => string; endLabel: string; onSeek: (frac: number) => void };\nexport type VoicesBtn = { on: boolean; title: string; onClick: () => void; busy?: boolean };\nexport type PlayerTransport = { prevOn: boolean; nextOn: boolean; onPrev: () => void; onNext: () => void; playing: boolean; playable: boolean; playTitle: string; onPlay?: () => void; busy?: boolean };\n\nfunction SeekRow({ pos, interactive, axis = 'x' }: { pos: PlayerPos; interactive: boolean; axis?: 'x' | 'y' }) {\n const [drag, setDrag] = useState<number | null>(null);\n const fracOf = (e: React.PointerEvent<HTMLDivElement>) => {\n const r = e.currentTarget.getBoundingClientRect();\n const f = axis === 'y' ? (e.clientY - r.top) / Math.max(1, r.height) : (e.clientX - r.left) / Math.max(1, r.width);\n return Math.min(1, Math.max(0, f));\n };\n const up = (e: React.PointerEvent<HTMLDivElement>) => { if (drag == null) return; const f = fracOf(e); setDrag(null); pos.onSeek(f); };\n const shown = drag != null ? drag * 100 : pos.pct;\n return (\n <>\n <span className={`gfull__t${interactive ? ' gfull__t--at' : ''}`}>{drag != null ? pos.labelAt(drag) : pos.atLabel}</span>\n <div className={`gfull__seek${interactive ? ' gfull__seek--on' : ''}`} role={interactive ? 'slider' : undefined} aria-label={interactive ? 'Playback position' : undefined} aria-valuemin={interactive ? 0 : undefined} aria-valuemax={interactive ? 100 : undefined} aria-valuenow={interactive ? Math.round(shown) : undefined}\n onPointerDown={interactive ? (e) => { e.stopPropagation(); e.currentTarget.setPointerCapture?.(e.pointerId); setDrag(fracOf(e)); e.preventDefault(); } : undefined}\n onPointerMove={interactive ? (e) => { if (drag != null) setDrag(fracOf(e)); } : undefined}\n onPointerUp={interactive ? up : undefined} onPointerCancel={interactive ? () => setDrag(null) : undefined}>\n <div className={`gfull__track${pos.readyFrac != null ? ' gfull__track--part' : ''}`}>\n {pos.readyFrac != null && <div className=\"gfull__ready\" style={{ width: `${Math.min(100, pos.readyFrac * 100)}%` }} />}\n <div style={{ width: `${shown}%`, background: (drag == null ? pos.atEdge : pos.edgeFrac != null && drag >= pos.edgeFrac) ? '#ec634d' : '#55abe5', transition: drag != null ? 'none' : undefined }} />\n <i style={{ left: `${shown}%`, transition: drag != null ? 'none' : undefined }} />\n </div>\n </div>\n <span className=\"gfull__t gfull__end\" style={{ color: pos.live ? '#ec634d' : 'rgba(234,236,250,.6)' }}>{pos.endLabel}</span>\n </>\n );\n}\n\nexport function PanelSeek({ pos }: { pos: PlayerPos }) {\n const [drag, setDrag] = useState<number | null>(null);\n const fracOf = (e: React.PointerEvent<HTMLDivElement>) => {\n const r = e.currentTarget.getBoundingClientRect();\n return Math.min(1, Math.max(0, (e.clientX - r.left) / Math.max(1, r.width)));\n };\n const up = (e: React.PointerEvent<HTMLDivElement>) => { if (drag == null) return; const f = fracOf(e); setDrag(null); pos.onSeek(f); };\n const shown = drag != null ? drag * 100 : pos.pct;\n const glide = drag != null ? 'none' : undefined;\n return (\n <div className=\"gaseek\">\n <div className=\"gaseek__bar\" role=\"slider\" aria-label=\"Playback position\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={Math.round(shown)}\n onPointerDown={(e) => { e.currentTarget.setPointerCapture?.(e.pointerId); setDrag(fracOf(e)); e.preventDefault(); }}\n onPointerMove={(e) => { if (drag != null) setDrag(fracOf(e)); }}\n onPointerUp={up} onPointerCancel={() => setDrag(null)}>\n <div className=\"gaseek__track\" />\n <div className=\"gaseek__fill\" style={{ width: `${shown}%`, transition: glide }} />\n <i style={{ left: `${shown}%`, transition: glide }} />\n </div>\n <div className=\"gaseek__labels\">\n <span className=\"gaseek__t\">{drag != null ? pos.labelAt(drag) : pos.atLabel}</span>\n <span className=\"gaseek__t gaseek__end\">{pos.endLabel}</span>\n </div>\n </div>\n );\n}\n\nfunction GlassTransport({ t, mini }: { t: PlayerTransport; mini?: boolean }) {\n return (\n <div className=\"gfull__transport\">\n <button type=\"button\" className=\"gfull__step\" aria-label=\"Previous line\" title=\"Previous line\" style={{ opacity: t.prevOn ? 1 : 0.3 }} onClick={t.onPrev}><Icon d={D.chevronLeft} size={mini ? 13 : 16} sw={mini ? 1.8 : 1.9} /></button>\n <button type=\"button\" className=\"gfull__play\" aria-label={t.busy ? 'Preparing audio' : t.playing ? 'Pause' : 'Play'} title={t.playTitle} disabled={!t.playable}\n style={{ background: !t.playable ? 'rgba(5,6,21,.42)' : t.playing ? 'rgba(238,240,248,.92)' : 'var(--brand)', color: !t.playable ? 'rgba(234,236,250,.5)' : t.playing ? '#131326' : 'var(--brand-ink)', cursor: t.playable ? 'pointer' : 'default' }}\n onClick={t.onPlay}>{t.busy ? <span className=\"gfull__spin\" aria-hidden=\"true\" /> : t.playing ? <PauseGlyph size={mini ? 14 : 18} /> : <PlayGlyph size={mini ? 15 : 19} />}</button>\n <button type=\"button\" className=\"gfull__step\" aria-label=\"Next line\" title=\"Next line\" style={{ opacity: t.nextOn ? 1 : 0.3 }} onClick={t.onNext}><Icon d={D.chevronRight} size={mini ? 13 : 16} sw={mini ? 1.8 : 1.9} /></button>\n </div>\n );\n}\n\nfunction GlassBrand({ live, mini, desk, pct, mark }: { live: boolean; mini?: boolean; desk?: boolean; pct?: number | null; mark?: boolean }) {\n return <div className={`gfull__brand${mark ? ' gfull__brand--mark' : ''}`}><a href={SITE} target=\"_blank\" rel=\"noopener\" style={{ display: 'block', lineHeight: 0 }} aria-label=\"VocalStack\" title=\"VocalStack\">{mark ? <Mark dark size={22} /> : <Logo dark link={false} height={mini ? 11 : desk ? 18 : 15} />}</a>{live && <span className=\"gfull__live\"><i />LIVE</span>}{pct != null && <span className=\"gfull__txpct\" title=\"Still being transcribed: it plays as far as it is written\">{`TRANSCRIBING ${pct}%`}</span>}</div>;\n}\n\nfunction VoicesButton({ v, size }: { v: VoicesBtn; size: number }) {\n return <button type=\"button\" className=\"gfull__btn\" aria-label=\"Voices\" aria-busy={v.busy || undefined} title={v.busy ? 'Preparing the voice…' : v.title} disabled={!v.on} style={{ position: 'relative', opacity: v.on || v.busy ? 1 : 0.45, cursor: v.on ? 'pointer' : 'default' }} onClick={v.on ? v.onClick : undefined}><Icon d={D.headphones} size={size} sw={1.6} />{v.busy && <span aria-hidden=\"true\" style={{ position: 'absolute', inset: 0, boxSizing: 'border-box', borderRadius: '50%', border: '2px solid var(--fill-12)', borderTopColor: 'var(--brand)', animation: 'vs-spin .7s linear infinite', pointerEvents: 'none' }} />}</button>;\n}\n\nexport function MiniPlayer({ pos, transport, chip, voices, onShare, onFull, copied }: { pos: PlayerPos; transport: PlayerTransport; chip: React.ReactNode; voices: VoicesBtn; onShare?: () => void; onFull: () => void; copied: React.ReactNode }) {\n return (\n <div className=\"gmini\" data-theme=\"dark\">\n <div className=\"gmini__shade\" aria-hidden=\"true\" />\n <div className=\"gmini__top\"><GlassBrand live={pos.live} mini /></div>\n <div className=\"gmini__foot\">\n <div className=\"gmini__row\"><SeekRow pos={pos} interactive /></div>\n <div className=\"gmini__row gmini__row--ctl\">\n <GlassTransport t={transport} mini />\n <span style={{ flex: 1 }} />\n <div className=\"gfull__chip\">{chip}</div>\n <VoicesButton v={voices} size={14} />\n {onShare && <button type=\"button\" className=\"gfull__btn\" aria-label=\"Share\" title=\"Share\" onClick={(e) => { e.stopPropagation(); onShare(); }}><Icon d={D.share} size={13} sw={1.8} /></button>}\n <button type=\"button\" className=\"gfull__btn\" aria-label=\"Full screen\" title=\"Full screen\" onClick={onFull}><Icon d={ICON_FULL} size={14} sw={1.8} /></button>\n </div>\n </div>\n {copied}\n </div>\n );\n}\n\nconst DIM_WORD: React.CSSProperties = { color: 'rgba(255,255,255,.4)' };\n\nexport function FullVideo({ compact = false, noFull = false, page = true, picture, title, desk, pos, sub, wait, pct, mute, cc, ad, chip, transport, picker, sheet, voices, voicesBtn, sheetOpen, onShare, onSettings, paused, copied, onTouch, onClose }: { compact?: boolean; noFull?: boolean; page?: boolean; onTouch: () => void; onSettings?: () => void; paused?: { title: string; summary: string | null; share?: { url: (t: number | null) => string; at: number } | null } | null; voices: React.ReactNode; voicesBtn: VoicesBtn | null; picture: React.ReactNode; title: string; desk: boolean; pos: PlayerPos; sub: { who: string | null; color: string; words: { t: string; sp: string; dim: boolean }[]; cursor?: number | null } | null; wait?: React.ReactNode; pct?: number | null; mute?: { muted: boolean; onToggle: () => void }; cc?: { on: boolean; onToggle: () => void }; ad?: boolean; chip: React.ReactNode; transport: PlayerTransport; picker: React.ReactNode; sheet: React.ReactNode; sheetOpen: boolean; onShare?: () => void; copied: React.ReactNode; onClose?: () => void }) {\n const [isFull, setIsFull] = useState(() => !!fullNow());\n useEffect(() => {\n const on = () => setIsFull(!!fullNow());\n document.addEventListener('fullscreenchange', on);\n document.addEventListener('webkitfullscreenchange', on);\n return () => { document.removeEventListener('fullscreenchange', on); document.removeEventListener('webkitfullscreenchange', on); };\n }, []);\n const close = useRef(onClose);\n close.current = onClose;\n const play = useRef(transport.playable ? transport.onPlay : undefined);\n play.current = transport.playable ? transport.onPlay : undefined;\n const [calm, setCalm] = useState(false);\n const [touchN, setTouchN] = useState(0);\n const swallow = useRef(false);\n useEffect(() => () => realFull(false), []);\n useEffect(() => {\n if (!page) return;\n const els = [document.documentElement, document.body];\n const was = els.map((el) => el.style.background);\n els.forEach((el) => { el.style.background = '#050507'; });\n const meta = document.querySelector<HTMLMetaElement>('meta[name=\"theme-color\"]');\n const tint = meta?.content;\n if (meta) meta.content = '#050507';\n return () => { els.forEach((el, i) => { el.style.background = was[i]; }); if (meta && tint) meta.content = tint; };\n }, []);\n const swipeFull = useMemo(() => page && noBrowserFull(), [page]);\n const [barsUp, setBarsUp] = useState(swipeFull);\n useEffect(() => {\n if (!page) return;\n const els = [document.documentElement, document.body];\n const was = els.map((el) => [el.style.overflow, el.style.overscrollBehavior] as const);\n if (!swipeFull) {\n els.forEach((el) => { el.style.overflow = 'hidden'; el.style.overscrollBehavior = 'none'; });\n return () => els.forEach((el, i) => { el.style.overflow = was[i][0]; el.style.overscrollBehavior = was[i][1]; });\n }\n const strip = document.createElement('div');\n strip.setAttribute('aria-hidden', 'true');\n strip.style.cssText = 'position:absolute;top:0;left:0;width:1px;height:calc(100lvh + 160px);pointer-events:none';\n document.body.appendChild(strip);\n document.documentElement.style.overscrollBehavior = 'none';\n const onScroll = () => { if (window.scrollY > 24) setBarsUp(false); };\n window.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n window.removeEventListener('scroll', onScroll);\n strip.remove();\n document.documentElement.style.overscrollBehavior = was[0][1];\n window.scrollTo(0, 0);\n };\n }, [swipeFull, page]);\n const sheetUp = useRef(sheetOpen);\n sheetUp.current = sheetOpen;\n useEffect(() => {\n const typing = (el: EventTarget | null) => el instanceof HTMLElement && (el.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName));\n const key = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !sheetUp.current && close.current) { e.stopPropagation(); close.current(); }\n if (e.key === ' ' && !sheetUp.current && !typing(e.target)) { e.preventDefault(); e.stopPropagation(); if (!e.repeat) play.current?.(); }\n if ((e.key === 'f' || e.key === 'F') && !e.metaKey && !e.ctrlKey && !e.altKey && !sheetUp.current && !typing(e.target) && canFull()) { e.preventDefault(); if (!e.repeat) realFull(!fullNow()); }\n };\n const keyUp = (e: KeyboardEvent) => { if (e.key === ' ' && !sheetUp.current && !typing(e.target)) e.preventDefault(); };\n window.addEventListener('keydown', key, true);\n window.addEventListener('keyup', keyUp, true);\n return () => { window.removeEventListener('keydown', key, true); window.removeEventListener('keyup', keyUp, true); };\n }, []);\n const sideways = useMedia('(orientation: landscape) and (max-height: 540px)');\n const rootRef = useRef<HTMLDivElement>(null);\n const [boxW, setBoxW] = useState<number | null>(null);\n useLayoutEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n setBoxW(el.getBoundingClientRect().width);\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(([e]) => setBoxW(e.contentRect.width));\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n const small = compact && !isFull;\n const big = !small && desk && !sideways && (boxW == null || boxW >= 880);\n const mini = !big;\n useEffect(() => {\n setCalm(false);\n if (!transport.playing || sheetOpen) return;\n const h = setTimeout(() => setCalm(true), 3000);\n return () => clearTimeout(h);\n }, [transport.playing, sheetOpen, touchN]);\n const calmRef = useRef(calm); calmRef.current = calm;\n const movedAt = useRef(0);\n const onMove = (e: React.PointerEvent) => {\n if (e.pointerType !== 'mouse') return;\n const now = Date.now();\n if (!calmRef.current && now - movedAt.current < 1000) return;\n movedAt.current = now;\n setTouchN((n) => n + 1);\n };\n const land = !big && sideways;\n const subBox = useRef<HTMLDivElement>(null);\n const subKey = sub ? sub.words.map((w) => (w.dim ? 0 : 1)).join('') + sub.words.length + ':' + (sub.cursor ?? '') : '';\n useLayoutEffect(() => {\n const box = subBox.current;\n if (!box) return;\n const reading = !!sub?.words.some((w) => w.dim) || sub?.cursor != null;\n const said = box.querySelectorAll<HTMLElement>(sub?.cursor != null && !sub.words.some((w) => w.dim) ? '[data-at]' : '[data-said]');\n const row = parseFloat(getComputedStyle(box).lineHeight) || 24;\n const extra = Math.round(box.scrollHeight / row) - Math.round(box.clientHeight / row);\n const room = Math.max(0, extra) * row;\n if (room <= 0) { if (box.scrollTop) box.scrollTo({ top: 0 }); return; }\n const rowOf = (el: HTMLElement) => Math.round((el.getBoundingClientRect().top - box.getBoundingClientRect().top + box.scrollTop) / row);\n const page = Math.max(1, Math.round(box.clientHeight / row));\n const at = reading ? (said.length ? Math.floor(rowOf(said[said.length - 1]) / page) * page * row : 0) : room;\n const want = Math.max(0, Math.min(room, at));\n if (Math.abs(want - box.scrollTop) > 1) box.scrollTop = want;\n }, [subKey, land]); // eslint-disable-line react-hooks/exhaustive-deps\n const [shareAt, setShareAt] = useState(true);\n const [shareCopied, setShareCopied] = useState(false);\n const shareT = useRef<number | undefined>(undefined);\n useEffect(() => () => window.clearTimeout(shareT.current), []);\n const shareUrl = paused?.share ? paused.share.url(shareAt && paused.share.at >= 1 ? Math.floor(paused.share.at) : null) : '';\n const shareQr = useMemo(() => (big && shareUrl && !transport.playing ? qrSvgUrl(shareUrl) : ''), [big, shareUrl, transport.playing]);\n const copyShare = () => { void navigator.clipboard?.writeText(shareUrl).then(() => { setShareCopied(true); window.clearTimeout(shareT.current); shareT.current = window.setTimeout(() => setShareCopied(false), 1800); }, () => {}); };\n const shareCard = big && paused?.share && (\n <div className=\"gfull__sharecard\" onPointerDown={(e) => e.stopPropagation()} onClick={(e) => e.stopPropagation()}>\n {shareQr && <div className=\"gfull__shareqr\" role=\"img\" aria-label=\"QR code for this link\" style={{ backgroundImage: `url(\"${shareQr}\")` }} />}\n <div className=\"gfull__sharebody\">\n <div className=\"gfull__shareeyebrow\">SHARE THIS MOMENT</div>\n <label className=\"gfull__shareat\"><input type=\"checkbox\" checked={shareAt} onChange={(e) => setShareAt(e.target.checked)} disabled={paused.share.at < 1} />Start at {clock(Math.floor(paused.share.at))}</label>\n <div className=\"gfull__shareurl\"><span>{shareUrl.replace(/^https?:\\/\\//, '')}</span></div>\n <div className=\"gfull__shareacts\">\n <button type=\"button\" className=\"gfull__sharebtn gfull__sharebtn--main\" onClick={copyShare}><Icon d={shareCopied ? D.check : D.copy} size={14} sw={1.8} />{shareCopied ? 'Copied' : 'Copy link'}</button>\n <button type=\"button\" className=\"gfull__sharebtn\" onClick={() => shareLink(shareUrl, title)}><Icon d={D.share} size={14} sw={1.6} />Share</button>\n </div>\n </div>\n </div>\n );\n const glass = (lbl: string, d: string, sw: number, onClick: () => void, style?: React.CSSProperties, grow = 0) => (\n <button type=\"button\" className=\"gfull__btn\" title={lbl} aria-label={lbl} onClick={onClick}><Icon d={d} size={(big ? 20 : mini ? 15 : 18) + grow} sw={sw} style={style} /></button>\n );\n const acts = (\n <div className=\"gfull__acts\">\n {voicesBtn && <VoicesButton v={voicesBtn} size={big ? 20 : mini ? 15 : 18} />}\n {onShare && glass('Share', D.share, 1.6, onShare)}\n {canFull() && !noFull && glass(isFull ? 'Exit full screen' : 'Full screen', isFull ? ICON_EXIT : ICON_FULL, 1.7, () => realFull(!isFull))}\n {onClose && glass('Close player', D.close, 1.7, onClose)}\n </div>\n );\n const top = (mute || cc || onSettings) && (\n <div className=\"gfull__top\">\n {mute && glass(mute.muted ? 'Unmute' : 'Mute', mute.muted ? D.volumeOff : D.volume, 1.6, mute.onToggle)}\n {cc && glass(cc.on ? 'Hide subtitles' : 'Show subtitles', cc.on ? D.cc : D.ccOff, 1.7, cc.onToggle, undefined, 4)}\n {onSettings && glass('Settings', D.cog, 1.6, onSettings)}\n </div>\n );\n return (\n <div ref={rootRef} className={`gfull${big ? ' gfull--desk' : ''}${mini ? ' gfull--mini' : ''}${small ? ' gfull--small' : ''}${swipeFull ? ' gfull--swipe' : ''}${ad ? ' gfull--ad' : ''}${calm ? ' gfull--calm' : ''}`} data-theme=\"dark\" role=\"dialog\" aria-label={title} onPointerMove={onMove} onPointerDownCapture={(e) => { if (calm) swallow.current = true; setTouchN((n) => n + 1); if (!(e.target as Element).closest?.('[aria-label=\"Exit full screen\"], [aria-label=\"Full screen\"], [aria-label=\"Close player\"]')) onTouch(); }}\n onClickCapture={(e) => { if (swallow.current) { swallow.current = false; e.stopPropagation(); e.preventDefault(); } }}>\n {swipeFull && barsUp && <div className=\"gfull__swipe\" aria-live=\"polite\"><Icon d=\"m4.5 15.75 7.5-7.5 7.5 7.5\" size={14} sw={2} />Swipe up for full screen</div>}\n <div className={`gfull__frame${land ? ' gfull__frame--land' : ''}`}>\n {picture}\n <div className=\"gfull__shade\" aria-hidden=\"true\" />\n {paused && !ad && (\n <div className={`gfull__pausedinfo${!transport.playing ? ' gfull__pausedinfo--on' : ''}`} aria-hidden={transport.playing}>\n <div className=\"gfull__pausedtext\">\n <div className=\"gfull__pausedhead\">{(mini || small) && <span className=\"gfull__pausedmark\" aria-hidden=\"true\"><Mark dark size={20} /></span>}<div className=\"gfull__pausedtitle\">{paused.title}</div></div>\n {paused.summary && <div className=\"gfull__pausedsum\">{paused.summary}</div>}\n </div>\n {shareCard}\n </div>\n )}\n {top}\n {copied}\n {wait ? (\n typeof wait === 'string'\n ? <div className=\"gfull__sub\" aria-live=\"polite\"><div className=\"gfull__wait\"><span className=\"gfull__spin\" aria-hidden=\"true\" />{wait}</div></div>\n : <div className=\"gfull__sub\">{wait}</div>\n ) : sub && (\n <div className=\"gfull__sub\">\n <div ref={subBox}>\n <div className=\"gfull__subback\" aria-hidden=\"true\"><span>{sub.who && <><b>{sub.who}:</b> </>}{sub.words.map((w) => w.t + w.sp).join('')}</span></div>\n <span>{sub.who && <><b style={{ color: sub.color }}>{sub.who}:</b> </>}{sub.words.map((w, j) => <span key={j} data-said={w.dim ? undefined : ''} data-at={sub.cursor != null && j <= sub.cursor ? '' : undefined} style={w.dim ? DIM_WORD : undefined}>{w.t}{w.sp}</span>)}</span>\n </div>\n </div>\n )}\n <div className={`gfull__prog${big ? '' : ' gfull__prog--two'}`}>\n {big ? (\n <>\n <GlassBrand live={pos.live} desk pct={pct} />\n <GlassTransport t={transport} />\n <SeekRow pos={pos} interactive />\n <div className=\"gfull__chip\">{chip}</div>\n {acts}\n </>\n ) : mini ? (\n <div className=\"gfull__row\"><GlassTransport t={transport} mini /><SeekRow pos={pos} interactive /><div className=\"gfull__chip\">{chip}</div>{acts}</div>\n ) : (\n <>\n <div className=\"gfull__row\"><GlassBrand live={pos.live} pct={pct} mark /><SeekRow pos={pos} interactive /></div>\n <div className=\"gfull__row\"><GlassTransport t={transport} /><span style={{ flex: 1 }} /><div className=\"gfull__chip\">{chip}</div>{acts}</div>\n </>\n )}\n </div>\n {picker}\n {sheet}\n {voices}\n </div>\n </div>\n );\n}\n\n\nexport function ListenerHeader({ dark, back: onBack, home, live, title, badge, subline, onOptions, optionsActive }: { dark: boolean; back?: () => void; home?: boolean; live?: boolean; title?: string; badge?: React.ReactNode; subline?: string; onOptions: () => void; optionsActive?: boolean }) {\n return (\n <div className=\"ghead\">\n {onBack && <button type=\"button\" className=\"ghead__back\" aria-label=\"Back\" title=\"Back\" onClick={onBack}><Icon d={D.chevronLeft} size={19} sw={1.7} /></button>}\n {live && <span className=\"mark\"><Mark dark={dark} size={30} /></span>}\n <div style={{ flex: 1, minWidth: 0, display: 'flex' }}>\n {home ? (\n <div className=\"ghead__logo\"><Logo dark={dark} height={22} /></div>\n ) : (\n <div className=\"ghead__title\" onClick={onBack} title={onBack ? 'Back' : undefined} style={{ cursor: onBack ? 'pointer' : 'default' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <span className=\"ghead__name\">{title}</span>\n {badge}\n </div>\n {subline && <div className=\"ghead__sub\">{subline}</div>}\n </div>\n )}\n </div>\n <IconButton size=\"sm\" bordered={false} variant={optionsActive ? 'primary' : undefined} onClick={onOptions} label=\"Options\">\n <svg viewBox=\"0 0 24 24\" width=\"19\" height=\"19\" fill=\"currentColor\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"5.5\" r=\"1.85\" /><circle cx=\"12\" cy=\"12\" r=\"1.85\" /><circle cx=\"12\" cy=\"18.5\" r=\"1.85\" /></svg>\n </IconButton>\n </div>\n );\n}\nconst VIDEO_D = 'm15.75 10.5 4.72-4.72a.75.75 0 0 1 1.28.53v11.38a.75.75 0 0 1-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 0 0 2.25-2.25v-9a2.25 2.25 0 0 0-2.25-2.25h-9A2.25 2.25 0 0 0 2.25 7.5v9a2.25 2.25 0 0 0 2.25 2.25Z';\nexport const modeOptions = (t: Strings, video = false) => [{ value: 'read' as const, label: t.read, icon: <Icon d={D.book} size={17} /> }, { value: 'listen' as const, label: <span style={{ display: 'inline-block', minWidth: 52, textAlign: 'center' }}>{video ? t.watch : t.listen}</span>, icon: <Icon d={video ? VIDEO_D : D.headphones} size={19} sw={1.5} /> }];\n","export const DEFAULT_APP = 'https://app.vocalstack.com';\nconst PATH = '/connect/transcribe';\n\nexport interface Started { transcriptionId: string; recordingId: string; token: string; expiresAt: string | null }\n\nexport type PopupStatus = 'signing-in' | 'consent' | 'looking' | 'confirm' | 'checking' | 'starting';\n\nfunction nonce(): string {\n const b = new Uint8Array(24);\n crypto.getRandomValues(b);\n return btoa(String.fromCharCode(...b)).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nexport function openPopup(appUrl: string | undefined, ask: { url?: string; transcription?: string; ask?: boolean; connect?: boolean }, onStatus?: (s: PopupStatus) => void): Promise<Started | 'connected' | null> {\n const app = new URL(appUrl ?? DEFAULT_APP);\n const n = nonce();\n const u = new URL(PATH, app);\n if (ask.url) u.searchParams.set('url', ask.url);\n if (ask.transcription) u.searchParams.set('transcription', ask.transcription);\n if (ask.ask) u.searchParams.set('ask', '1');\n if (ask.connect) u.searchParams.set('connect', '1');\n u.searchParams.set('origin', window.location.origin);\n u.searchParams.set('nonce', n);\n const w = 480, h = 640;\n const left = Math.max(0, (window.screenX ?? 0) + ((window.outerWidth ?? w) - w) / 2);\n const top = Math.max(0, (window.screenY ?? 0) + ((window.outerHeight ?? h) - h) / 2);\n const pop = window.open(u.toString(), 'vocalstack-connect', `popup=yes,width=${w},height=${h},left=${Math.round(left)},top=${Math.round(top)}`);\n if (!pop) return Promise.reject(new Error('Your browser blocked the VocalStack window. Allow pop-ups for this site and try again.'));\n return new Promise((resolve, reject) => {\n let done = false;\n const finish = (fn: () => void) => { if (done) return; done = true; window.removeEventListener('message', on); clearInterval(watch); fn(); };\n const on = (ev: MessageEvent) => {\n if (ev.origin !== app.origin || ev.source !== pop) return;\n const d = ev.data as { source?: string; type?: string; nonce?: string; [k: string]: any } | null;\n if (!d || d.source !== 'vocalstack' || d.nonce !== n) return;\n if (d.type === 'vocalstack:hello') { pop.postMessage({ source: 'vocalstack', type: 'vocalstack:hello-ack', nonce: n }, app.origin); return; }\n if (d.type === 'vocalstack:status') { onStatus?.(d.status); return; }\n if (d.type === 'vocalstack:started' || d.type === 'vocalstack:token' || d.type === 'vocalstack:found') {\n finish(() => resolve({ transcriptionId: String(d.transcriptionId), recordingId: String(d.recordingId), token: String(d.token), expiresAt: d.expiresAt ?? null }));\n return;\n }\n if (d.type === 'vocalstack:connected') { finish(() => resolve('connected')); return; }\n if (d.type === 'vocalstack:declined') { finish(() => resolve(null)); return; }\n if (d.type === 'vocalstack:error') finish(() => reject(new Error(typeof d.message === 'string' && d.message ? d.message : 'VocalStack could not start this transcription.')));\n };\n window.addEventListener('message', on);\n const watch = setInterval(() => { if (pop.closed) finish(() => resolve(null)); }, 500);\n });\n}\n\nexport async function startFromEmbed(appUrl: string | undefined, url: string, onStatus?: (s: PopupStatus) => void): Promise<Started | null> {\n const r = await openPopup(appUrl, { url }, onStatus);\n return r === 'connected' ? null : r;\n}\n\nconst CONNECTED = 'vsp.connected';\n\nexport function wasConnected(appUrl: string | undefined): boolean {\n try { return localStorage.getItem(CONNECTED) === new URL(appUrl ?? DEFAULT_APP).origin; } catch { return false; }\n}\n\nexport function rememberConnected(appUrl: string | undefined): void {\n try { localStorage.setItem(CONNECTED, new URL(appUrl ?? DEFAULT_APP).origin); } catch { }\n}\n","import { useEffect, useState } from 'react';\nimport { D, Icon, Mark, Spinner } from '../ds/Icons';\nimport { startFromEmbed, type PopupStatus, type Started } from '../data/connect';\n\nexport interface EndCardOptions {\n appUrl?: string;\n title?: string;\n note?: string;\n}\n\nconst STATUS: Record<PopupStatus, string> = {\n 'signing-in': 'Sign in to VocalStack in the window that opened…',\n consent: 'Confirm in the VocalStack window…',\n looking: 'Looking for your transcription of this video…',\n confirm: 'Confirm in the VocalStack window…',\n checking: 'Checking the link…',\n starting: 'Starting the transcription…',\n};\n\nconst LINK = /^(https?:\\/\\/)?([\\w-]+\\.)+[a-z]{2,}(\\/\\S*)?$/i;\n\nexport function EndCard({ options, onStarted, onReplay, onClose }: { options: EndCardOptions; onStarted: (s: Started) => void; onReplay: () => void; onClose: () => void }) {\n const [url, setUrl] = useState('');\n const [busy, setBusy] = useState(false);\n const [err, setErr] = useState<string | null>(null);\n const [status, setStatus] = useState<PopupStatus | null>(null);\n useEffect(() => {\n const key = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n window.addEventListener('keydown', key);\n return () => window.removeEventListener('keydown', key);\n }, [onClose]);\n const clean = url.trim();\n const ok = LINK.test(clean);\n const go = async () => {\n if (!ok || busy) return;\n setBusy(true);\n setErr(null);\n try {\n const s = await startFromEmbed(options.appUrl, /^https?:\\/\\//i.test(clean) ? clean : `https://${clean}`, setStatus);\n if (s) onStarted(s);\n } catch (e) {\n setErr(e instanceof Error ? e.message : 'Something went wrong. Please try again.');\n } finally {\n setBusy(false);\n setStatus(null);\n }\n };\n return (\n <div className=\"vsp-end vsp-end--v2\" role=\"dialog\" aria-label=\"Transcribe another video\" onPointerDown={(e) => e.stopPropagation()} onClick={(e) => { e.stopPropagation(); if (e.target === e.currentTarget) onClose(); }}>\n <button type=\"button\" className=\"gfull__btn vsp-end2__close\" aria-label=\"Close\" title=\"Close\" onClick={onClose}><Icon d={D.close} size={17} sw={1.8} /></button>\n <div className=\"vsp-end2\">\n <span className=\"vsp-end2__mark\"><Mark dark size={26} /></span>\n <div className=\"vsp-end2__title\">{options.title ?? 'Watch another video in your language'}</div>\n <form className=\"vsp-end2__field\" onSubmit={(e) => { e.preventDefault(); void go(); }}>\n <Icon d={D.link} size={16} sw={1.8} style={{ flex: 'none', color: 'rgba(238,240,248,.55)' }} />\n <input className=\"vsp-end2__input\" type=\"url\" inputMode=\"url\" autoComplete=\"off\" spellCheck={false} placeholder=\"Paste a video link\" value={url} onChange={(e) => { setUrl(e.target.value); setErr(null); }} aria-label=\"Video link\" />\n <button type=\"submit\" className=\"vsp-end2__go\" disabled={!ok || busy} aria-label=\"Transcribe\" title=\"Transcribe\">{busy ? <Spinner size={15} color=\"#06101c\" track=\"rgba(6,16,28,.25)\" /> : <Icon d={D.arrowRight} size={17} sw={2} />}</button>\n </form>\n <div className=\"vsp-end2__note\" role={busy ? 'status' : undefined}>{busy ? STATUS[status ?? 'checking'] : (options.note ?? 'YouTube, Vimeo, TikTok and more, with subtitles and spoken translations.')}</div>\n {err && <div className=\"vsp-end__err\" role=\"alert\">{err}</div>}\n <button type=\"button\" className=\"vsp-end2__replay\" onClick={onReplay}><Icon d={D.uturn} size={14} sw={1.8} />Replay</button>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\n\nexport function useDesk(forced?: boolean): boolean {\n const [desk, setDesk] = useState(() => (typeof window === 'undefined' ? true : window.innerWidth >= 880));\n useEffect(() => {\n if (forced != null) return;\n const on = () => setDesk(window.innerWidth >= 880);\n window.addEventListener('resize', on);\n return () => window.removeEventListener('resize', on);\n }, [forced]);\n return forced ?? desk;\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { GrowBox, Sheet, Switch, Toggle } from '../ds/Controls';\nimport { D, Icon } from '../ds/Icons';\nimport { useLanguageList } from '../ds/LanguagePicker';\nimport { useLanguages } from '../data/transcript';\nimport { pickerLanguages, useRecentLangs } from '../data/prefs';\nimport { REMOVE_BG_LABEL } from '../core/background';\nimport { langMeta } from './shared';\n\nexport interface IdlePrefs {\n lang: string | null;\n subtitles: boolean;\n speakerLabels: boolean;\n wordHighlight: boolean;\n translateAudio: boolean;\n voices: 'cloned' | 'synthetic';\n removeBackground: boolean;\n muted: boolean;\n}\n\nconst HINT_CODES = ['es', 'fr', 'ro', 'ja', 'pt'];\n\nexport const IDLE_DEFAULTS: IdlePrefs = { lang: null, subtitles: true, speakerLabels: false, wordHighlight: true, translateAudio: true, voices: 'cloned', removeBackground: false, muted: false };\n\ntype Page = 'main' | 'lang' | 'subs' | 'audio';\n\nexport function useIdleControls(prefs: IdlePrefs, set: (p: Partial<IdlePrefs>) => void) {\n const langs = useLanguages();\n const [recent, pushRecent] = useRecentLangs();\n const [sheet, setSheet] = useState<'settings' | 'lang' | null>(null);\n const [page, setPage] = useState<Page>('main');\n const meta = langMeta(langs, prefs.lang);\n const languages = useMemo(() => pickerLanguages(langs, 'translation'), [langs]);\n const pick = (c: string | null) => { set({ lang: c }); pushRecent(c); };\n const list = useLanguageList({ open: sheet === 'lang' || (sheet === 'settings' && page === 'lang'), onClose: () => (sheet === 'lang' ? setSheet(null) : setPage('main')), value: prefs.lang, onSelect: pick, languages, none: 'As spoken', pinned: prefs.lang ? [prefs.lang] : [], recent, keepOpen: true });\n const close = () => { setSheet(null); setPage('main'); };\n const flag = prefs.lang ? <span style={{ fontSize: 19, lineHeight: 1 }}>{meta.flag}</span> : <Icon d={D.langAuto} size={19} sw={1.7} />;\n const [hint, setHint] = useState(() => { try { return sessionStorage.getItem('vsp.langHint') !== 'false'; } catch { return true; } });\n const dropHint = () => { setHint(false); try { sessionStorage.setItem('vsp.langHint', 'false'); } catch { } };\n const hintLangs = useMemo(() => HINT_CODES.map((c) => languages.find((l) => l.code === c)).filter((l): l is (typeof languages)[number] => !!l), [languages]);\n const tipRef = useRef<HTMLSpanElement>(null);\n const [roomy, setRoomy] = useState(false);\n useEffect(() => {\n const root = tipRef.current?.closest('.gfull') ?? tipRef.current?.closest('.vsp');\n if (!root) return;\n const ro = new ResizeObserver(() => setRoomy(root.clientWidth >= 520 && root.clientHeight >= 300));\n ro.observe(root);\n return () => ro.disconnect();\n }, []);\n const hintOn = roomy && hint && !prefs.lang && sheet == null && hintLangs.length > 0;\n const [hintIdx, setHintIdx] = useState(0);\n useEffect(() => {\n if (!hintOn) return;\n const id = setInterval(() => setHintIdx((i) => i + 1), 1700);\n return () => clearInterval(id);\n }, [hintOn]);\n const hintAt = hintLangs[hintIdx % Math.max(1, hintLangs.length)];\n const openLang = () => { dropHint(); setPage('main'); setSheet('lang'); };\n const bubble = hintOn && hintAt ? (\n <div className=\"vsp-langhint\" onClick={(e) => e.stopPropagation()}>\n <button type=\"button\" className=\"vsp-langhint__pick\" onClick={openLang} aria-label=\"Choose a language\">\n <Icon d={D.language} size={16} sw={1.5} style={{ color: 'rgba(255,255,255,.85)', flex: 'none' }} />\n <span key={hintIdx} className=\"vsp-langhint__lang\" style={{ animation: `vs-swap-${hintIdx % 2 ? 'a' : 'b'} .4s cubic-bezier(.2,.8,.2,1) both` }}>\n <span className=\"vsp-langhint__flag\">{hintAt.flag}</span>\n <span className=\"vsp-langhint__name\">{hintAt.native}</span>\n </span>\n <span className=\"vsp-langhint__dots\">{hintLangs.map((o, i) => <span key={o.code} className={i === hintIdx % hintLangs.length ? 'is-on' : undefined} />)}</span>\n <span className=\"vsp-langhint__count\">100+</span>\n </button>\n <button type=\"button\" className=\"vsp-langhint__close\" aria-label=\"Dismiss\" onClick={dropHint}><Icon d={D.close} size={14} sw={1.6} /></button>\n <span className=\"vsp-langhint__arrow\" />\n </div>\n ) : null;\n const chip = (\n <span ref={tipRef} className=\"vsp-btip\" data-hint={bubble ? '' : undefined} data-tip={`Language: ${prefs.lang ? meta.label : 'As spoken'}`} data-open={sheet === 'lang' ? '' : undefined}>\n <button type=\"button\" className=\"gfull__btn\" aria-label={`Language: ${prefs.lang ? meta.label : 'As spoken'}`} onClick={(e) => { e.stopPropagation(); dropHint(); setPage('main'); setSheet((s) => (s === 'lang' ? null : 'lang')); }}>{flag}</button>\n {bubble}\n </span>\n );\n const chev = <Icon d={D.chevronRight} size={17} sw={1.6} style={{ flex: 'none', color: 'var(--ink-45)' }} />;\n const back = (\n <span className=\"vs-sheet__title\" style={{ position: 'relative' }}>\n {' '}\n <button type=\"button\" onClick={() => setPage('main')} aria-label=\"Back\" className=\"vsp-idlesheet__back\"><Icon d={D.chevronLeft} size={18} sw={1.8} />Back</button>\n </span>\n );\n const body = { display: 'flex', flexDirection: 'column' as const, gap: 2, paddingBottom: 14 };\n const row = (title: string, sub: string, ctl: React.ReactNode) => (\n <div className=\"srow\"><div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">{title}</div><div className=\"srow__s\">{sub}</div></div>{ctl}</div>\n );\n const langList = (\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <div style={{ position: 'sticky', top: 0, zIndex: 1, padding: '4px 14px 10px', background: 'var(--vs-surface-raised)' }}>{list.search}</div>\n {list.list}\n </div>\n );\n const settingsBody = page === 'lang' ? langList : page === 'subs' ? (\n <div style={body}>\n {row('Show subtitles', 'Captions over the video', <Toggle checked={prefs.subtitles} onChange={(v) => set({ subtitles: v })} label=\"Show subtitles\" />)}\n {row('Show speaker labels', 'Who is speaking, before each line', <Toggle checked={prefs.speakerLabels} onChange={(v) => set({ speakerLabels: v })} label=\"Show speaker labels\" />)}\n {row('Highlight words', 'Follow each word as it is spoken', <Toggle checked={prefs.wordHighlight} onChange={(v) => set({ wordHighlight: v })} label=\"Highlight words\" />)}\n </div>\n ) : page === 'audio' ? (\n <div style={body}>\n {row('Translate audio', prefs.lang ? 'Hear the translation read aloud instead of the original speech' : 'Pick a language to hear the translation read aloud', <Toggle checked={prefs.translateAudio && !!prefs.lang} onChange={(v) => set({ translateAudio: v })} label=\"Translate audio\" disabled={!prefs.lang} />)}\n {row('Voices', prefs.voices === 'cloned' ? 'Each speaker in their own cloned voice, where they agreed to it' : 'Synthetic voices matched to each speaker', <Switch<'synthetic' | 'cloned'> value={prefs.voices} onChange={(v) => set({ voices: v })} size=\"sm\" options={[{ value: 'synthetic', label: 'Synthetic' }, { value: 'cloned', label: 'Cloned' }]} />)}\n {row(REMOVE_BG_LABEL, \"Takes out everything that isn't speech: music, ambience and noise.\", <Toggle checked={prefs.removeBackground} onChange={(v) => set({ removeBackground: v })} label={REMOVE_BG_LABEL} />)}\n </div>\n ) : (\n <div style={body}>\n <div className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('lang')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Language</div><div className=\"srow__s\">{prefs.lang ? `Translated to ${meta.label}` : 'Original language'}</div></div>\n <span style={{ fontSize: 18, lineHeight: 1 }}>{prefs.lang ? meta.flag : null}</span>{chev}\n </div>\n <div className=\"sdiv\" />\n <div className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('subs')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Subtitles</div><div className=\"srow__s\">{prefs.subtitles ? 'On · speaker labels and word highlighting' : 'Off'}</div></div>{chev}\n </div>\n <div className=\"sdiv\" />\n <div className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('audio')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Audio</div><div className=\"srow__s\">{prefs.lang && prefs.translateAudio ? `Translated, ${prefs.voices === 'cloned' ? 'cloned voices' : 'synthetic voices'}` : prefs.removeBackground ? 'Original speech, background removed' : 'Original sound'}</div></div>{chev}\n </div>\n </div>\n );\n const sheets = (\n <>\n <Sheet open={sheet === 'lang'} onClose={close} title=\"LANGUAGE\" kind=\"picker\" header={list.search} sticky>\n <GrowBox>{list.list}</GrowBox>\n </Sheet>\n <Sheet open={sheet === 'settings'} onClose={close} title={{ main: 'SETTINGS', lang: 'LANGUAGE', subs: 'SUBTITLES', audio: 'AUDIO' }[page]} titleNode={page === 'main' ? undefined : back} kind={page === 'main' ? 'settings' : 'settings vs-sheet--page'} sticky>\n <GrowBox>{settingsBody}</GrowBox>\n </Sheet>\n </>\n );\n return {\n chip,\n sheets,\n sheetOpen: sheet != null,\n openSettings: () => { setPage('main'); setSheet((s) => (s === 'settings' ? null : 'settings')); },\n };\n}\n","export function shareCodeOf(raw: string): string | null {\n const v = raw.trim();\n if (!v) return null;\n try {\n const u = new URL(/^[a-z][a-z0-9+.-]*:\\/\\//i.test(v) ? v : `https://${v}`);\n const m = /^\\/(?:t|v)\\/([a-z0-9]{6,24})(?:\\/.*)?$/i.exec(u.pathname);\n return m ? m[1].toLowerCase() : null;\n } catch {\n return null;\n }\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react';\n\ntype Tile = { name: string; glyph: ReactNode; tint: string };\n\nconst fill = (d: string, rule: 'evenodd' | 'nonzero' = 'nonzero') => <path d={d} fill=\"currentColor\" fillRule={rule} />;\n\nconst file = (ext: string): ReactNode => (\n <>\n <path d=\"M6.5 2.75h7.25l4.75 4.75v12.25a1.5 1.5 0 0 1-1.5 1.5H6.5a1.5 1.5 0 0 1-1.5-1.5V4.25a1.5 1.5 0 0 1 1.5-1.5Z\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinejoin=\"round\" />\n <path d=\"M13.75 2.75V7.5h4.75\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinejoin=\"round\" />\n <text x=\"11.75\" y=\"17.4\" textAnchor=\"middle\" fontSize={ext.length > 3 ? 4.4 : 5.2} fontWeight=\"800\" fill=\"currentColor\" fontFamily=\"inherit\" letterSpacing=\".2\">{ext}</text>\n </>\n);\n\nconst TILES: Tile[] = [\n { name: 'YouTube', tint: '#ff3b30', glyph: fill('M21.6 7.2a2.7 2.7 0 0 0-1.9-1.9C18 4.8 12 4.8 12 4.8s-6 0-7.7.5a2.7 2.7 0 0 0-1.9 1.9C2 8.9 2 12 2 12s0 3.1.4 4.8a2.7 2.7 0 0 0 1.9 1.9c1.7.5 7.7.5 7.7.5s6 0 7.7-.5a2.7 2.7 0 0 0 1.9-1.9c.4-1.7.4-4.8.4-4.8s0-3.1-.4-4.8ZM10 15.1V8.9l5.3 3.1L10 15.1Z', 'evenodd') },\n { name: 'MP3', tint: '#f78472', glyph: file('MP3') },\n { name: 'Vimeo', tint: '#1ab7ea', glyph: fill('M22 7.4c-.1 2-1.5 4.7-4.2 8.1-2.8 3.6-5.1 5.4-7 5.4-1.2 0-2.2-1.1-3-3.3L6.2 11.6C5.6 9.4 5 8.3 4.3 8.3c-.1 0-.6.3-1.4.9L2 8l2.7-2.4C5.9 4.6 6.8 4 7.4 4c1.4-.1 2.3.9 2.6 2.9.4 2.2.6 3.6.8 4.1.4 1.8.9 2.7 1.4 2.7.4 0 1-.6 1.8-1.9.8-1.2 1.2-2.2 1.3-2.8.1-1.1-.3-1.6-1.3-1.6-.5 0-.9.1-1.4.3.9-3 2.7-4.5 5.3-4.4 1.9.1 2.8 1.3 2.7 3.7Z') },\n { name: 'Video', tint: '#55abe5', glyph: <><rect x=\"3\" y=\"5.5\" width=\"13\" height=\"13\" rx=\"2.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />{fill('M16 10.2 21 7v10l-5-3.2v-3.6Z')}</> },\n { name: 'Twitch', tint: '#a970ff', glyph: fill('M5 2.5 3 6.5v13h4.5V22H10l2.5-2.5h3.8L21 14.8V2.5H5Zm14 11.4-2.9 2.9h-4.3L9.4 19.2v-2.4H6V4.5h13v9.4ZM15.2 7.4h1.9v5.2h-1.9V7.4Zm-5 0h1.9v5.2h-1.9V7.4Z', 'evenodd') },\n { name: 'WAV', tint: '#7ee0b4', glyph: file('WAV') },\n { name: 'SoundCloud', tint: '#ff7a1a', glyph: <>{fill('M11 8.6a5 5 0 0 1 7.8 3.1 3 3 0 0 1-.3 6H11V8.6Z')}<rect x=\"8.6\" y=\"9.4\" width=\"1.3\" height=\"8.3\" rx=\".65\" fill=\"currentColor\" /><rect x=\"6.2\" y=\"10.6\" width=\"1.3\" height=\"7.1\" rx=\".65\" fill=\"currentColor\" /><rect x=\"3.8\" y=\"12.2\" width=\"1.3\" height=\"5.5\" rx=\".65\" fill=\"currentColor\" /><rect x=\"1.4\" y=\"13.8\" width=\"1.3\" height=\"3.9\" rx=\".65\" fill=\"currentColor\" /></> },\n { name: 'MP4', tint: '#5b63d7', glyph: file('MP4') },\n { name: 'TikTok', tint: '#25f4ee', glyph: fill('M16.6 2.5c.3 2.3 1.7 3.8 3.9 4v2.7a6.8 6.8 0 0 1-3.9-1.3v6.5a5.7 5.7 0 1 1-5.7-5.7l.9.1v2.8a2.9 2.9 0 1 0 2 2.8V2.5h2.8Z') },\n { name: 'Audio', tint: '#f7c948', glyph: <g fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\"><path d=\"M3 10.5v3M6.5 7.5v9M10 4.5v15M13.5 8v8M17 6v12M20.5 10v4\" /></g> },\n { name: 'X', tint: '#e8eaf2', glyph: fill('M17.8 3h3.1l-6.7 7.7L22 21h-6.2l-4.8-6.3L5.5 21H2.4l7.2-8.2L2.1 3h6.3l4.4 5.8L17.8 3Zm-1.1 16.2h1.7L7.4 4.7H5.6l11.1 14.5Z') },\n { name: 'MOV', tint: '#55abe5', glyph: file('MOV') },\n { name: 'Facebook', tint: '#3b82f6', glyph: fill('M13.9 21.5v-8h2.7l.4-3.1h-3.1V8.4c0-.9.3-1.5 1.6-1.5H17V4.1c-.3 0-1.3-.1-2.4-.1-2.4 0-4 1.4-4 4.1v2.3H7.9v3.1h2.7v8h3.3Z') },\n { name: 'Podcast', tint: '#c46bff', glyph: <g fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"><rect x=\"9\" y=\"3\" width=\"6\" height=\"10.5\" rx=\"3\" /><path d=\"M5.5 11a6.5 6.5 0 0 0 13 0M12 17.5V21M8.5 21h7\" /></g> },\n { name: 'Instagram', tint: '#f56aa0', glyph: <g fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\"><rect x=\"3.5\" y=\"3.5\" width=\"17\" height=\"17\" rx=\"5\" /><circle cx=\"12\" cy=\"12\" r=\"4\" /><circle cx=\"17.2\" cy=\"6.8\" r=\".9\" fill=\"currentColor\" stroke=\"none\" /></g> },\n { name: 'M4A', tint: '#f78472', glyph: file('M4A') },\n { name: 'Dailymotion', tint: '#4aa3ff', glyph: fill('M14.6 3.5h3.2V20h-3v-1.2a5.4 5.4 0 0 1-3.6 1.4c-3.3 0-5.9-2.7-5.9-6.1S7.9 8 11.2 8c1.3 0 2.5.4 3.4 1.2V3.5Zm-3.1 7.4a3.2 3.2 0 1 0 0 6.4 3.2 3.2 0 0 0 0-6.4Z', 'evenodd') },\n { name: 'Radio', tint: '#7ee0b4', glyph: <g fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"1.8\" fill=\"currentColor\" stroke=\"none\" /><path d=\"M8.5 15.5a5 5 0 0 1 0-7M15.5 8.5a5 5 0 0 1 0 7M5.6 18.4a9 9 0 0 1 0-12.8M18.4 5.6a9 9 0 0 1 0 12.8\" /></g> },\n { name: 'WEBM', tint: '#5b63d7', glyph: file('WEBM') },\n { name: 'Loom', tint: '#8f7bff', glyph: fill('M21 11h-5.2l4.5-2.6-1-1.7-4.5 2.6 2.6-4.5-1.7-1-2.6 4.5V3h-2v5.3L8.5 3.8l-1.7 1 2.6 4.5-4.5-2.6-1 1.7L8.2 11H3v2h5.2l-4.5 2.6 1 1.7 4.5-2.6-2.6 4.5 1.7 1 2.6-4.5V21h2v-5.2l2.6 4.5 1.7-1-2.6-4.5 4.5 2.6 1-1.7-4.5-2.6H21v-2Zm-9 3.4a2.4 2.4 0 1 1 0-4.8 2.4 2.4 0 0 1 0 4.8Z', 'evenodd') },\n { name: 'FLAC', tint: '#f7c948', glyph: file('FLAC') },\n { name: 'Live', tint: '#ff5a5a', glyph: <g fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"><rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"3\" /><circle cx=\"8\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" stroke=\"none\" /><path d=\"M11.5 10h6M11.5 14h4\" /></g> },\n];\n\nconst ROWS = 14;\nconst COPIES = 4;\n\nfunction row(i: number): Tile[] {\n const n = TILES.length;\n const out: Tile[] = [];\n for (let k = 0; k < 11; k++) out.push(TILES[(k + i * 7) % n]);\n return out;\n}\n\nfunction Cell({ t }: { t: Tile }) {\n return (\n <span className=\"vsp-prov__tile\" style={{ ['--tint' as string]: t.tint }}>\n <svg viewBox=\"0 0 24 24\" width=\"100%\" height=\"100%\" aria-hidden=\"true\">{t.glyph}</svg>\n <span className=\"vsp-prov__name\">{t.name}</span>\n </span>\n );\n}\n\nexport function ProviderGrid() {\n const ref = useRef<HTMLDivElement>(null);\n const [seen, setSeen] = useState(true);\n const [shown, setShown] = useState(() => typeof document === 'undefined' || !document.hidden);\n useEffect(() => {\n const vis = () => setShown(!document.hidden);\n document.addEventListener('visibilitychange', vis);\n const el = ref.current;\n let io: IntersectionObserver | null = null;\n if (el && typeof IntersectionObserver !== 'undefined') {\n io = new IntersectionObserver(([e]) => setSeen(e.isIntersecting));\n io.observe(el);\n }\n return () => { document.removeEventListener('visibilitychange', vis); io?.disconnect(); };\n }, []);\n return (\n <div ref={ref} className={`vsp-prov${seen && shown ? '' : ' vsp-prov--still'}`} aria-hidden=\"true\">\n <div className=\"vsp-prov__plane\">\n {Array.from({ length: ROWS }, (_, i) => {\n const cells = row(i);\n return (\n <div key={i} className={`vsp-prov__row${i % 2 ? ' vsp-prov__row--rev' : ''}`} style={{ animationDuration: `${80 + i * 11}s`, animationDelay: `-${i * 17}s` }}>\n {Array.from({ length: COPIES }, (_, c) => cells.map((t, k) => <Cell key={`${c}-${k}`} t={t} />))}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useCallback, useLayoutEffect, useRef, useState, type ReactNode } from 'react';\nimport { D, Icon, Spinner } from '../ds/Icons';\nimport { ytIdOf } from '../core/youtube';\nimport { siteOf } from '../core/sites';\nimport { openPopup, rememberConnected, wasConnected, type PopupStatus, type Started } from '../data/connect';\nimport { FullVideo, type PlayerPos, type PlayerTransport } from './full';\nimport { useDesk } from './useDesk';\nimport { useIdleControls, type IdlePrefs } from './IdleSettings';\nimport { shareLink } from './shared';\nimport { shareCodeOf } from '../core/share';\nimport { ProviderGrid } from './Providers';\n\nexport interface IdleState { prefs: IdlePrefs; set: (p: Partial<IdlePrefs>) => void; shareUrl?: string }\n\nconst STATUS: Record<PopupStatus, string> = {\n 'signing-in': 'Sign in to VocalStack in the window that opened…',\n consent: 'Confirm in the VocalStack window…',\n looking: 'Looking for your transcription of this video…',\n confirm: 'Confirm in the VocalStack window…',\n checking: 'Checking the link…',\n starting: 'Starting the transcription…',\n};\n\nconst LINK = /^(https?:\\/\\/)?([\\w-]+\\.)+[a-z]{2,}(\\/\\S*)?$/i;\n\nexport function hostOf(src: string): string {\n try { return new URL(src).hostname.replace(/^www\\./, ''); } catch { return src; }\n}\n\nexport interface Connect {\n busy: boolean;\n status: PopupStatus | null;\n err: string | null;\n connected: boolean;\n connect: () => void;\n start: (url: string, ask: boolean) => void;\n}\n\nexport function useConnect(appUrl: string | undefined, onReady: (s: Started) => void): Connect {\n const [busy, setBusy] = useState(false);\n const [status, setStatus] = useState<PopupStatus | null>(null);\n const [err, setErr] = useState<string | null>(null);\n const [connected, setConnected] = useState(() => wasConnected(appUrl));\n const run = useCallback((ask: Parameters<typeof openPopup>[1]) => {\n if (busy) return;\n setBusy(true);\n setErr(null);\n let p: ReturnType<typeof openPopup>;\n try { p = openPopup(appUrl, ask, setStatus); } catch (e) { p = Promise.reject(e); }\n p.then((s) => {\n if (!s) return;\n rememberConnected(appUrl);\n setConnected(true);\n if (s !== 'connected') onReady(s);\n })\n .catch((e) => setErr(e instanceof Error ? e.message : 'Something went wrong. Please try again.'))\n .finally(() => { setBusy(false); setStatus(null); });\n }, [appUrl, busy, onReady]);\n const connect = useCallback(() => run({ connect: true }), [run]);\n const start = useCallback((url: string, ask: boolean) => run({ url, ask }), [run]);\n return { busy, status, err, connected, connect, start };\n}\n\nfunction isMedia(src: string): boolean {\n return /\\.(mp4|webm|mov|m4v|ogv|mkv)(\\?|#|$)/i.test(src);\n}\n\nfunction Backdrop({ poster, src }: { poster: string | null; src: string | null }) {\n const yt = src && siteOf(src)?.id === 'youtube' ? ytIdOf(src) : null;\n const img = poster ?? (yt ? `https://i.ytimg.com/vi/${yt}/hqdefault.jpg` : null);\n if (img) return <div className=\"vsp-idle__pic\" style={{ backgroundImage: `url(${img})` }} />;\n if (src && isMedia(src)) return <video className=\"vsp-idle__pic vsp-idle__frame\" src={`${src}#t=1`} muted playsInline preload=\"metadata\" aria-hidden=\"true\" />;\n return <><div className=\"vsp-idle__pic vsp-idle__pic--brand\" /><ProviderGrid /></>;\n}\n\nconst NOW: PlayerPos = { live: false, atEdge: false, edgeFrac: null, pct: 0, atLabel: '0:00', labelAt: () => '0:00', endLabel: '0:00', onSeek: () => {} };\n\nfunction IdlePlayer({ idle, poster, src, title, page, onAct, children }: { idle: IdleState; poster: string | null; src: string | null; title: string; page: boolean; onAct: () => void; children: ReactNode }) {\n const ctl = useIdleControls(idle.prefs, idle.set);\n const desk = useDesk();\n const box = useRef<HTMLDivElement>(null);\n const [small, setSmall] = useState(false);\n useLayoutEffect(() => {\n const el = box.current?.parentElement;\n if (!el) return;\n const measure = () => setSmall(el.getBoundingClientRect().width < 560);\n measure();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(measure);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n const transport: PlayerTransport = { prevOn: false, nextOn: false, onPrev: () => {}, onNext: () => {}, playing: false, playable: true, playTitle: 'Connect to play', onPlay: onAct };\n return (\n <div ref={box} className={`vsp-idleroot${small ? ' vsp-idleroot--small' : ''}`}>\n <FullVideo page={page} picture={<Backdrop poster={poster} src={src} />} title={title} desk={desk} pos={NOW} sub={null} mute={{ muted: idle.prefs.muted, onToggle: () => idle.set({ muted: !idle.prefs.muted }) }} cc={{ on: idle.prefs.subtitles, onToggle: () => idle.set({ subtitles: !idle.prefs.subtitles }) }} chip={ctl.chip} transport={transport} picker={ctl.sheets} sheet={null} voices={null} voicesBtn={null} sheetOpen={ctl.sheetOpen} onSettings={ctl.openSettings} onShare={() => shareLink(idle.shareUrl ?? window.location.href, title)} copied={null} onTouch={() => {}} />\n {!ctl.sheetOpen && <div className=\"vsp-idle\" data-theme=\"dark\"><div className=\"vsp-idle__box\">{children}</div></div>}\n </div>\n );\n}\n\nfunction ConnectButton({ connect, onClick, label }: { connect: Connect; onClick: () => void; label: string }) {\n return (\n <>\n <button type=\"button\" className=\"vsp-idle__connect\" onClick={onClick} disabled={connect.busy}>\n {connect.busy ? <Spinner size={18} color=\"#050507\" track=\"rgba(5,5,7,.2)\" /> : <Icon d={D.link} size={18} sw={1.8} />}\n <span>{connect.busy ? 'Waiting for VocalStack…' : label}</span>\n </button>\n {connect.busy && <div className=\"vsp-idle__note\" role=\"status\">{STATUS[connect.status ?? 'checking']}</div>}\n {connect.err && <div className=\"vsp-end__err\" role=\"alert\">{connect.err}</div>}\n </>\n );\n}\n\nexport function SourceGate({ idle, src, ask, connect, page, poster = null, onClear }: { idle: IdleState; src: string; ask: boolean; connect: Connect; page: boolean; poster?: string | null; onClear?: () => void }) {\n const go = () => connect.start(src, ask);\n return (\n <IdlePlayer idle={idle} poster={poster} src={src} title={hostOf(src)} page={page} onAct={go}>\n <ConnectButton connect={connect} onClick={go} label={connect.connected ? 'Play with VocalStack' : 'Connect to VocalStack'} />\n {!connect.busy && <div className=\"vsp-idle__note\">{connect.connected ? `Plays ${hostOf(src)} with subtitles and spoken translations.` : `Connect to play ${hostOf(src)} with subtitles and spoken translations.`}</div>}\n {onClear && !connect.busy && <button type=\"button\" className=\"vsp-idle__other\" onClick={onClear}>Choose another video</button>}\n </IdlePlayer>\n );\n}\n\nexport function StartCard({ idle, connect, page, poster = null, onPick, onShare }: { idle: IdleState; connect: Connect; page: boolean; poster?: string | null; onPick: (url: string) => void; onShare?: (code: string) => Promise<boolean> }) {\n const [url, setUrl] = useState('');\n const [opening, setOpening] = useState(false);\n const [shareErr, setShareErr] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const lastAuto = useRef<string | null>(null);\n const clean = url.trim();\n const isLink = (v: string) => LINK.test(v) || !!shareCodeOf(v);\n const ok = isLink(clean);\n const busy = connect.busy || opening;\n const launch = async (raw: string) => {\n const full = /^https?:\\/\\//i.test(raw) ? raw : `https://${raw}`;\n setShareErr(null);\n const code = shareCodeOf(full);\n if (code && onShare) {\n setOpening(true);\n const found = await onShare(code).catch(() => false);\n setOpening(false);\n if (found) return;\n if (!connect.connected) { setShareErr('That share link does not open. It may have been revoked.'); return; }\n }\n onPick(full);\n connect.start(full, false);\n };\n const submit = () => { if (ok && !busy) void launch(clean); };\n const go = () => { if (ok) submit(); else if (!connect.connected) connect.connect(); else inputRef.current?.focus(); };\n const auto = (v: string) => {\n const c = v.trim();\n if (!isLink(c) || busy || c === lastAuto.current) return;\n lastAuto.current = c;\n void launch(c);\n };\n const note = connect.busy ? <div className=\"vsp-idle__note\" role=\"status\">{STATUS[connect.status ?? 'checking']}</div>\n : opening ? <div className=\"vsp-idle__note\" role=\"status\">Opening the shared transcript…</div>\n : <div className=\"vsp-idle__note\">{connect.connected ? 'Paste a VocalStack share link, or a YouTube, Vimeo, mp3 or any video link to play it here with subtitles and spoken translations.' : 'Paste a VocalStack share link to watch it here, or connect to transcribe any video link.'}</div>;\n return (\n <IdlePlayer idle={idle} poster={poster} src={null} title=\"VocalStack\" page={page} onAct={go}>\n <form className=\"vsp-idle__form\" onSubmit={(e) => { e.preventDefault(); submit(); }}>\n <span className=\"vsp-idle__field\">\n <Icon d={D.link} size={16} sw={1.8} />\n <input ref={inputRef} className=\"vsp-idle__input\" type=\"url\" inputMode=\"url\" enterKeyHint=\"go\" autoComplete=\"off\" spellCheck={false} placeholder={connect.connected ? 'Paste a video link' : 'Paste a share link'} value={url} onChange={(e) => setUrl(e.target.value)} onPaste={(e) => { const v = e.clipboardData.getData('text'); if (v) { setUrl(v.trim()); auto(v); e.preventDefault(); } }} aria-label=\"Video link\" autoFocus={connect.connected} />\n {busy && <Spinner size={15} color=\"#eef0f8\" track=\"rgba(255,255,255,.2)\" />}\n </span>\n </form>\n {note}\n {!connect.connected && !busy && <ConnectButton connect={connect} onClick={connect.connect} label=\"Connect to VocalStack\" />}\n {(shareErr || connect.err) && <div className=\"vsp-end__err\" role=\"alert\">{shareErr ?? connect.err}</div>}\n </IdlePlayer>\n );\n}\n\nexport function ErrorGate({ idle, message, onRetry, page }: { idle: IdleState; message: string; onRetry: () => void; page: boolean }) {\n return (\n <IdlePlayer idle={idle} poster={null} src={null} title=\"VocalStack\" page={page} onAct={onRetry}>\n <div className=\"vsp-idle__err\" role=\"alert\"><Icon d={D.warn} size={16} sw={1.8} />{message}</div>\n <button type=\"button\" className=\"vsp-idle__connect\" onClick={onRetry}><Icon d={D.uturn} size={18} sw={1.8} /><span>Try again</span></button>\n </IdlePlayer>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { VocalStack } from '@vocalstack/js-sdk';\nimport { DEFAULT_API, type TokenSource } from './context';\n\nexport function useLookup(src: string | null, token: TokenSource | null, baseUrl: string | null): { id: string } | null | undefined {\n const [found, setFound] = useState<{ id: string } | null | undefined>(src ? (token ? undefined : null) : null);\n useEffect(() => {\n if (!src) { setFound(null); return; }\n if (!token) { setFound(null); return; }\n let alive = true;\n setFound(undefined);\n const client = new VocalStack({ baseUrl: (baseUrl ?? DEFAULT_API).replace(/\\/$/, ''), token: async () => { const v = typeof token === 'function' ? await token() : token; return v || undefined; } });\n const look = (client.transcriptions as unknown as { lookup?: (u: string) => Promise<{ id: string } | null> }).lookup;\n if (!look) { setFound(null); return; }\n look.call(client.transcriptions, src).then((t) => { if (alive) setFound(t ? { id: t.id } : null); }).catch(() => { if (alive) setFound(null); });\n return () => { alive = false; };\n }, [src, token, baseUrl]);\n return found;\n}\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, type ReactNode, type Ref } from 'react';\nimport { Card, GrowBox, LanguageChip, Sheet, Switch, Toggle } from '../ds/Controls';\nimport { D, Icon, Logo, PlayGlyph, Spinner } from '../ds/Icons';\nimport { mediaKind } from '../core/voiceplayer';\nimport { useLanguageList } from '../ds/LanguagePicker';\nimport { audioDownloadUrl, audioSealed, backgroundAudioUrl, deliveryAudioUrl } from '../core/audio';\nimport { FileFollow } from './FileFollow';\nimport { EmbedFollow } from './EmbedFollow';\nimport { FacebookFollow } from './FacebookFollow';\nimport { WistiaFollow } from './WistiaFollow';\nimport { VidyardFollow } from './VidyardFollow';\nimport { hasEmbed, loomId, sourceVideoUrl, vidyardId, wistiaId } from '../core/embeds';\nimport { siteOf } from '../core/sites';\nimport { loomSetup } from '../core/loomStream';\nimport { displayName, useYtTitle } from '../data/title';\nimport { bedNote, REMOVE_BG_LABEL, removeBgFromQuery, trackPlan, useBackgroundBed, useSeparatedTrack, withRemoveBg } from '../core/background';\nimport { useVoiceFollow } from '../core/voiceFollow';\nimport { useMediaKeys } from '../core/mediaKeys';\nimport { clock, durationLabel } from '../core/format';\nimport { describe, useLanguages, useTranscript, type ErrorLike } from '../data/transcript';\nimport { strings } from '../data/i18n';\nimport { rows as toRows, showLabels, speakerLabel, speakerLook } from '../core/transcript';\nimport { downloadVoiceTrack, exportTranscript, jobLengthS, progressOf, rowStatusOf, saveUrl, saveWhenReady, segsLabel, TX_FORMATS, type TxProgress } from '../data/tx';\nimport { ytIdOf } from '../core/youtube';\nimport { subtitleShown } from '../core/readalong';\nimport { PlayerApiProvider, useApi, useMediaToken, useSource, withMedia, type Listen, type PlayerApi, type PlayerSource as LoadedSource, type TokenSource } from '../data/context';\nimport { SideFrame, SidePanels, useSideTabs } from './SideColumn';\nimport { ExportPanel, LiveVideo, ReplayScrub, SummaryPanel, shareLink, summaryOf, TabBar, Toast, useSummaryIn, useViewportTranslation, type TabSpec } from './shared';\nimport { MuteButton, NO_SEEK, PAUSE_D, PLAY_D, PUB_SIDE, TxFind, TxLines, YtFollow, lineEnd, lineWords, pictureT, spokenWordOf, useDuck, useFindPull, useFlash, useTxPlayer, useTxVoice, useYtLead } from './core';\nimport { FullVideo, ListenerHeader, MiniPlayer, browserFull, modeOptions, setFullTarget, type PlayerPos, type PlayerTransport } from './full';\nimport { PlayerWait, playerWaitOf, useHeld } from './wait';\nimport { EndCard, type EndCardOptions } from './EndCard';\nimport type { Started } from '../data/connect';\nimport { useDesk } from './useDesk';\nimport { ErrorGate, SourceGate, StartCard, useConnect, type IdleState } from './SourceGate';\nimport { IDLE_DEFAULTS, type IdlePrefs } from './IdleSettings';\nimport { useLookup } from '../data/lookup';\n\nexport interface PlayerSettings {\n lang?: string | null;\n subtitles?: boolean;\n speakerLabels?: boolean;\n wordHighlight?: boolean;\n translateAudio?: boolean;\n voices?: 'cloned' | 'synthetic';\n removeBackground?: boolean;\n}\n\nexport interface PlayerControls {\n language?: boolean;\n subtitles?: boolean;\n audio?: boolean;\n export?: boolean;\n share?: boolean;\n fullscreen?: boolean;\n settings?: boolean;\n}\n\nexport interface PlaybackState {\n t: number;\n dur: number;\n playing: boolean;\n idx: number;\n seekN: number;\n lang: string | null;\n muted: boolean;\n}\n\nexport interface PlayerHandle {\n seek: (t: number) => void;\n play: () => void;\n pause: () => void;\n toggle: () => void;\n toggleMute: () => void;\n}\n\nconst PLAYBACK_MS = 100;\n\nexport interface VocalStackPlayerProps {\n id?: string;\n src?: string;\n token?: TokenSource | null;\n baseUrl?: string | null;\n mode?: 'video' | 'transcript';\n layout?: 'embed' | 'page';\n dark?: boolean;\n desk?: boolean;\n settings?: PlayerSettings;\n initial?: PlayerSettings;\n onSettingsChange?: (s: Required<PlayerSettings>) => void;\n controls?: PlayerControls;\n autoplay?: boolean;\n startAt?: number | null;\n syncUrl?: boolean;\n endCard?: EndCardOptions | false;\n appUrl?: string;\n poster?: string | null;\n voice?: string | null;\n settingsExtra?: ReactNode;\n shareUrl?: (t: number | null) => string;\n onShare?: () => void;\n onSource?: (s: LoadedSource) => void;\n onProgress?: (pct: number | null) => void;\n onError?: (e: ErrorLike) => void;\n onPlayback?: (s: PlaybackState) => void;\n compact?: boolean;\n className?: string;\n}\n\ninterface Init { lang: string | null; labels: 'on' | 'off' | null; words: 'on' | 'off' | null; cc: boolean; translateAudio: boolean; clonedVoices: boolean; removeBackground: boolean; startAt: number | null }\n\nconst onOffOf = (v: boolean | undefined) => (v == null ? null : v ? 'on' : 'off');\n\nfunction initialOf(p: VocalStackPlayerProps): Init {\n const q = p.syncUrl && typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : null;\n const i = { ...(p.initial ?? {}), ...(p.settings ?? {}) };\n const onOff = (v: string | null | undefined) => (v === 'on' || v === 'off' ? v : null);\n const t = Number(q?.get('t'));\n return {\n lang: q?.get('lang') || i.lang || null,\n labels: onOff(q?.get('labels')) ?? onOffOf(i.speakerLabels),\n words: onOff(q?.get('words')) ?? onOffOf(i.wordHighlight),\n cc: q?.get('cc') ? q.get('cc') !== 'off' : i.subtitles ?? true,\n translateAudio: q?.get('audio') ? q.get('audio') !== 'original' : i.translateAudio ?? true,\n clonedVoices: q?.get('voices') ? q.get('voices') !== 'stock' : (i.voices ?? 'cloned') === 'cloned',\n removeBackground: q && q.get('bg') ? removeBgFromQuery(q) : i.removeBackground ?? false,\n startAt: Number.isFinite(t) && t > 0 ? t : p.startAt ?? null,\n };\n}\n\nexport const VocalStackPlayer = forwardRef(function VocalStackPlayer(props: VocalStackPlayerProps, ref: Ref<PlayerHandle>) {\n const handle = useRef<PlayerHandle | null>(null);\n useImperativeHandle(ref, () => ({\n seek: (t) => handle.current?.seek(t),\n play: () => handle.current?.play(),\n toggleMute: () => handle.current?.toggleMute(),\n pause: () => handle.current?.pause(),\n toggle: () => handle.current?.toggle(),\n }), []);\n const [cur, setCur] = useState<{ id: string; token: TokenSource | null | undefined; listen?: Listen | null }>({ id: props.id ?? '', token: props.token });\n useEffect(() => { setCur({ id: props.id ?? '', token: props.token }); }, [props.id, props.token, props.src]);\n const found = useLookup(props.src ?? null, props.token ?? null, props.baseUrl ?? null);\n useEffect(() => { if (found?.id) setCur({ id: found.id, token: props.token }); }, [found?.id]); // eslint-disable-line react-hooks/exhaustive-deps\n const [typed, setTyped] = useState<string | null>(null);\n const [idlePrefs, setIdlePrefs] = useState<IdlePrefs>(() => ({ ...IDLE_DEFAULTS, ...Object.fromEntries(Object.entries({ ...(props.initial ?? {}), ...(props.settings ?? {}) }).filter(([, v]) => v !== undefined)) } as IdlePrefs));\n const [touched, setTouched] = useState<Partial<IdlePrefs>>({});\n const idle: IdleState = { prefs: idlePrefs, set: (p) => { setIdlePrefs((x) => ({ ...x, ...p })); setTouched((x) => ({ ...x, ...p })); }, shareUrl: props.shareUrl?.(null) };\n const { muted: idleMuted, ...idleChosen } = touched;\n useEffect(() => { setTyped(null); }, [props.id, props.src]);\n const gateSrc = props.src ?? typed;\n const gate = !cur.id && !!gateSrc && (typed != null || found !== undefined);\n const empty = !cur.id && !props.src && !typed;\n const base = useApi({ id: cur.id, token: cur.token, baseUrl: props.baseUrl, listen: cur.listen });\n const { source, gone, error, reload } = useSource(base, cur.id);\n const media = useMediaToken(base, source?.recording.id ?? null);\n const api = useMemo(() => withMedia(base, media), [base, media]);\n useEffect(() => { if (source) props.onSource?.(source); }, [source]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => { if (error) props.onError?.(error); }, [error]); // eslint-disable-line react-hooks/exhaustive-deps\n const desk = useDesk(props.desk);\n const embed = (props.layout ?? 'embed') === 'embed';\n const appUrl = props.appUrl ?? (props.endCard ? props.endCard.appUrl : undefined);\n const onReady = useCallback((st: Started) => setCur({ id: st.transcriptionId, token: null, listen: { transcriptionId: st.transcriptionId, recordingId: st.recordingId, token: st.token } }), []);\n const connect = useConnect(appUrl, onReady);\n const root = useRef<HTMLDivElement>(null);\n useEffect(() => {\n setFullTarget(embed ? root.current : null);\n return () => setFullTarget(null);\n }, [embed]);\n return (\n <PlayerApiProvider value={api}>\n <div ref={root} className={`vsp${embed ? ' vsp--embed' : ''}${props.className ? ` ${props.className}` : ''}`} data-theme={(props.mode ?? 'video') === 'video' || props.dark ? 'dark' : 'light'} data-mode={(props.mode ?? 'video') === 'video' ? 'video' : 'transcript'}>\n {empty ? <StartCard idle={idle} connect={connect} page={!embed} poster={props.poster ?? null} onPick={setTyped} onShare={async (code) => { try { await base.client.shareLinks.open(code); setCur({ id: code, token: null }); return true; } catch { return false; } }} /> : gate ? <SourceGate idle={idle} src={gateSrc!} ask={!typed} connect={connect} page={!embed} poster={props.poster ?? null} onClear={typed ? () => setTyped(null) : undefined} /> : !cur.id ? <div className=\"vsp-gate\" data-theme=\"dark\"><span className=\"gfull__spin gfull__holdspin\" aria-label=\"Loading\" /></div> : error && !source ? <ErrorGate idle={idle} message={error.message} onRetry={reload} page={!embed} /> : <PlayerBody key={cur.id} {...props} initial={{ ...(props.initial ?? {}), ...idleChosen }} startMuted={idleMuted === true} handle={handle} id={cur.id} api={api} shared={source} gone={gone} loadError={error} reread={reload} desk={desk} dark={(props.mode ?? 'video') === 'video' || !!props.dark} onStarted={(st) => setCur({ id: st.transcriptionId, token: null, listen: { transcriptionId: st.transcriptionId, recordingId: st.recordingId, token: st.token } })} />}\n </div>\n </PlayerApiProvider>\n );\n});\n\n\ntype PubTab = 'summary' | 'export';\n\nfunction PlayerBody(props: VocalStackPlayerProps & { startMuted?: boolean; handle: { current: PlayerHandle | null }; api: PlayerApi; shared: LoadedSource | null; gone: boolean; loadError: ErrorLike | null; reread: () => void; desk: boolean; dark: boolean; onStarted: (s: Started) => void }) {\n const { api, shared, gone, desk, dark } = props;\n const code = props.id ?? \"\";\n const init = useMemo(() => initialOf(props), []); // eslint-disable-line react-hooks/exhaustive-deps\n const wantVideo = (props.mode ?? 'video') === 'video';\n const locked = wantVideo;\n const [error, setError] = useState<ErrorLike | null>(props.loadError);\n useEffect(() => { if (props.loadError) setError(props.loadError); }, [props.loadError]);\n const [tab, setTab] = useState<PubTab | 'none'>('none');\n const [find, setFind] = useState(false);\n const [findQ, setFindQ] = useState('');\n const [flash, doFlash] = useFlash();\n const [live, setLive] = useState<TxProgress | null>(null);\n const [mode, setMode] = useState<'read' | 'listen'>(locked ? 'listen' : 'read');\n const [settings, setSettings] = useState(false);\n const subLangRef = useRef<string | null>(null);\n const trSeen = useRef(new Map<string, string>());\n const [page, setPageRaw] = useState<'main' | 'subs' | 'lang' | 'audio' | 'export'>('main');\n const setPage = (next: 'main' | 'subs' | 'lang' | 'audio' | 'export') => {\n const el = document.querySelector<HTMLElement>('.vs-sheet--settings');\n const scrim = el?.parentElement;\n if (el && scrim && page === 'main' && next !== 'main') scrim.style.setProperty('--vs-sheet-top', `${Math.round(el.getBoundingClientRect().top - scrim.getBoundingClientRect().top)}px`);\n setPageRaw(next);\n };\n useEffect(() => { if (!settings) setPage('main'); }, [settings]);\n const [full, setFull] = useState(locked);\n const rec = shared?.recording ?? null;\n const recordingId = rec?.id ?? null;\n const [txLang, setTxLang] = useState<string | null | undefined>(init.lang);\n const askLang = typeof txLang === 'string' ? txLang : null;\n const [labelsPref, setLabelsPref] = useState<'on' | 'off' | null>(init.labels);\n const [wordsPref, setWordsPref] = useState<'on' | 'off' | null>(init.words);\n const [ccOn, setCcOn] = useState(init.cc);\n const [speakOn, setSpeakOn] = useState(init.translateAudio);\n const [cloneOn, setCloneOn] = useState(init.clonedVoices);\n const [removeBg, setRemoveBg] = useState(init.removeBackground);\n const fixed = props.settings;\n useEffect(() => { if (fixed?.lang !== undefined) setTxLang(fixed.lang); }, [fixed?.lang]);\n useEffect(() => { if (fixed?.speakerLabels !== undefined) setLabelsPref(fixed.speakerLabels ? 'on' : 'off'); }, [fixed?.speakerLabels]);\n useEffect(() => { if (fixed?.wordHighlight !== undefined) setWordsPref(fixed.wordHighlight ? 'on' : 'off'); }, [fixed?.wordHighlight]);\n useEffect(() => { if (fixed?.subtitles !== undefined) setCcOn(fixed.subtitles); }, [fixed?.subtitles]);\n useEffect(() => { if (fixed?.translateAudio !== undefined) setSpeakOn(fixed.translateAudio); }, [fixed?.translateAudio]);\n useEffect(() => { if (fixed?.voices !== undefined) setCloneOn(fixed.voices === 'cloned'); }, [fixed?.voices]);\n useEffect(() => { if (fixed?.removeBackground !== undefined) setRemoveBg(fixed.removeBackground); }, [fixed?.removeBackground]);\n const ctl = { language: true, subtitles: true, audio: true, export: true, share: true, fullscreen: true, settings: true, ...(props.controls ?? {}) };\n const hearOriginal = locked && !speakOn;\n useEffect(() => {\n if (!props.syncUrl) return;\n const u = new URL(window.location.href);\n if (askLang) u.searchParams.set('lang', askLang); else u.searchParams.delete('lang');\n if (labelsPref) u.searchParams.set('labels', labelsPref); else u.searchParams.delete('labels');\n if (wordsPref) u.searchParams.set('words', wordsPref); else u.searchParams.delete('words');\n if (ccOn) u.searchParams.delete('cc'); else u.searchParams.set('cc', 'off');\n if (speakOn) u.searchParams.delete('audio'); else u.searchParams.set('audio', 'original');\n if (cloneOn) u.searchParams.delete('voices'); else u.searchParams.set('voices', 'stock');\n withRemoveBg(u, removeBg);\n if (u.href !== window.location.href) window.history.replaceState(window.history.state, '', u);\n }, [askLang, labelsPref, wordsPref, ccOn, speakOn, cloneOn, removeBg]);\n useEffect(() => { if (shared && !shared.allowTranslate && askLang) setTxLang(null); }, [shared, askLang]);\n const { model, error: subError, clearError, setLanguage, mergeTranslations, translating, translateFailed, shownLang } = useTranscript(recordingId, {\n lang: null,\n onFrame: (f) => { if (f.type === 'job.progress') setLive({ state: f.state, processedS: f.processedS ?? 0, totalS: f.totalS ?? null, segmentsDone: f.segmentsDone ?? 0, segmentsTotal: f.segmentsTotal ?? null, pct: f.pct ?? 0, error: f.error ?? null }); },\n });\n const rows = useMemo(() => toRows(model).filter((r) => !r.suppressed), [model]);\n const known = progressOf(shared?.job ?? null);\n const settled = ['done', 'failed', 'stopped'].includes(rowStatusOf(known?.state ?? shared?.job?.state));\n const progress = settled ? known : (live ?? known);\n const liveMoving = !!live && !['done', 'failed', 'stopped'].includes(rowStatusOf(live.state));\n const reread = useRef(0);\n useEffect(() => {\n if (!settled || !liveMoving || Date.now() - reread.current < 10_000) return;\n reread.current = Date.now();\n props.reread();\n }, [settled, liveMoving, live?.state, live?.processedS, code]);\n const status = rowStatusOf(progress?.state ?? shared?.job?.state ?? (api.listen ? (rec?.state === 'finalized' ? 'done' : rec?.state ? 'transcribing' : undefined) : undefined));\n const running = !!recordingId && (status === 'transcribing' || status === 'queued');\n const holding = locked && !gone && (!shared || ((running || status === 'cropping') && rows.length === 0));\n const pct = running ? (progress?.pct ?? 0) : 100;\n const lenS = jobLengthS(shared?.job, progress) ?? rec?.mediaDurationS ?? null;\n const langCode = model.segments.values().next().value?.language ?? rec?.spokenLanguage ?? null;\n const by = shared?.sharedBy ? `Shared by ${shared.sharedBy}` : '';\n const srcName = shared?.job?.source?.name?.trim() || null;\n const pageTitle = shared ? (shared.name?.trim() || srcName) : null;\n const hasAudio = !!shared?.job?.hasAudio;\n const src = shared?.job?.source;\n const sourceAudio = !hasAudio && !!src && (src.kind !== 'url' || src.bytes != null) && (status === 'transcribing' || status === 'queued' || status === 'done');\n const deliveryUrl = recordingId && shared?.allowDownload && hasAudio ? deliveryAudioUrl(api.origin, recordingId, api.cred) : null;\n const sourceStored = !!src && (src.kind !== 'url' || src.bytes != null);\n const sealed = useSealed(deliveryUrl && sourceStored ? deliveryUrl : null);\n const audioUrl = deliveryUrl && (!sourceStored || sealed === 'yes') ? deliveryUrl\n : deliveryUrl && sealed === 'unknown' ? null\n : recordingId && shared?.allowDownload && (sourceAudio || (hasAudio && sourceStored)) ? audioDownloadUrl(api.origin, recordingId, 'source', api.cred) : null;\n const lastRow = rows[rows.length - 1];\n const doneTo = lastRow ? lastRow.words[lastRow.words.length - 1]?.end ?? lastRow.start : 0;\n const edgeS = locked && running ? Math.max(doneTo, progress?.processedS ?? 0) : null;\n const audioPlayer = useTxPlayer(audioUrl, (hasAudio || sourceAudio) && !!shared?.allowDownload, rows, lenS, sourceAudio ? shared?.job?.crop?.startS ?? 0 : 0, edgeS);\n const srcVideoUrl = sourceVideoUrl(shared?.job?.source as Parameters<typeof sourceVideoUrl>[0]);\n const ytId = srcVideoUrl && siteOf(srcVideoUrl)?.id === 'youtube' ? ytIdOf(srcVideoUrl) : null;\n const ytLed = !!ytId && !audioUrl;\n const ytTitle = useYtTitle(ytId);\n const yt = useYtLead(rows, lenS, shared?.job?.crop?.startS ?? 0, edgeS);\n const videoLed = !!ytId;\n const srcPlayer = videoLed ? yt.player : audioPlayer;\n const langs = useLanguages();\n const langBusyRef = useRef<string | null>(null);\n const voice = useTxVoice({ forcedVoice: props.voice ?? null, recordingId, model, rows, lenS, ended: !!recordingId && !running, cred: api.cred, langs, srcLang: langCode, canTranslate: !!shared?.allowTranslate, pickedLang: txLang, setPickedLang: setTxLang, side: desk && !full ? PUB_SIDE : undefined, hearOriginal, timed: !!ytId, stockVoices: locked && !cloneOn, stickyPicker: locked, pickerBusy: langBusyRef.current });\n const langSent = useRef<string | null>(null);\n useEffect(() => { if (!recordingId || langSent.current === askLang) return; langSent.current = askLang; setLanguage(askLang); }, [askLang, recordingId]); // eslint-disable-line react-hooks/exhaustive-deps\n const player = videoLed ? yt.player : voice.on ? voice.player : srcPlayer;\n useEffect(() => { if (videoLed) { voice.player.pause(); return; } (voice.on ? srcPlayer : voice.player).pause(); }, [voice.on, videoLed]); // eslint-disable-line react-hooks/exhaustive-deps\n const followLines = useMemo(() => rows.filter((r) => r.sentenceId != null).map((r, i, a) => ({ sid: r.sentenceId as number, start: r.start, end: a[i + 1]?.start ?? lineEnd(r, r.start, r.start + 4) })), [rows]);\n const follow = useVoiceFollow({ on: videoLed && voice.on, lines: followLines, clips: voice.clips, t: player.t, playing: player.playing, muted: player.muted });\n const langBusy = !!askLang && (translating || voice.relang || (voice.on && follow.missing != null));\n langBusyRef.current = langBusy ? askLang : null;\n useEffect(() => { if (videoLed && voice.on && follow.sid != null) voice.setNear(follow.sid); }, [follow.sid, videoLed, voice.on]); // eslint-disable-line react-hooks/exhaustive-deps\n useDuck([srcPlayer, voice.player], voice.sampling);\n const feedRef = useRef<HTMLDivElement>(null);\n useEffect(() => { if (running && !player.playing && feedRef.current) feedRef.current.scrollTop = feedRef.current.scrollHeight; }, [running, rows.length]); // eslint-disable-line react-hooks/exhaustive-deps\n const findHits = useFindPull(feedRef, rows, find, findQ, setFind);\n const findField = <TxFind open={find} q={findQ} onQ={setFindQ} onClose={() => setFind(false)} hits={findHits} desk={desk} inline={desk} />;\n const name = displayName({ name: shared?.name, sourceName: shared?.job?.source?.name, ytTitle, url: shared?.job?.source?.kind === 'url' ? shared.job.source.url : props.src ?? null, id: code });\n const canDownload = !!shared?.allowDownload;\n const canExport = !!shared?.allowExport;\n const dlLang = voice.readLang;\n const dlLangName = dlLang ? (langs?.languages.find((l) => l.code === dlLang)?.name ?? dlLang.toUpperCase()) : null;\n const download = async () => {\n if (!recordingId) return;\n try {\n if (dlLang && voice.canSpeak) {\n doFlash(`Preparing ${name} in ${dlLangName}${voice.readVoiceName ? `, read by ${voice.readVoiceName}` : ''} — the download starts when it is ready.`);\n await downloadVoiceTrack(api, { recordingId, lang: dlLang, voiceKey: voice.readVoiceKey, cred: api.cred, request: voice.requestTrack });\n doFlash(`Downloading ${name} in ${dlLangName}.`);\n return;\n }\n if (hasAudio) {\n doFlash(`Preparing ${name} as MP3 — the download starts when it is ready.`);\n await saveWhenReady(audioDownloadUrl(api.origin, recordingId, 'delivery', api.cred));\n doFlash(`Downloading ${name}.`);\n return;\n }\n saveUrl(audioDownloadUrl(api.origin, recordingId, 'source', api.cred));\n doFlash(`Downloading ${name} — the full audio, since the transcript is still being written.`);\n } catch (e) {\n setError(describe(e));\n throw e;\n }\n };\n const doExport = (key: typeof TX_FORMATS[number]['key']) => {\n if (!recordingId) return;\n const fmt = TX_FORMATS.find((f) => f.key === key)!.name;\n const inLang = dlLangName ? ` in ${dlLangName}` : '';\n return exportTranscript(api, recordingId, key, { lang: dlLang }).then(() => doFlash(running ? `${fmt} exported${inLang} for the first ${rows.length} segments — the rest is still transcribing.` : `${fmt} exported${inLang}.`)).catch((e) => { setError(describe(e)); throw e; });\n };\n const tail = running ? 'MORE TO COME…' : 'END OF TRANSCRIPT';\n const tailFg = running ? 'var(--brand)' : 'var(--ink-28)';\n const segs = segsLabel(progress, rows.length);\n const playable = player.has && (!voice.relang || !!ytId);\n const playerRef = useRef(player); playerRef.current = player;\n const placeKey = `${askLang ?? ''}|${voice.on ? 'voice' : 'source'}`;\n const placeRef = useRef({ key: placeKey, idx: 0, t: 0, playing: false, until: 0 });\n useEffect(() => {\n const at = placeRef.current;\n if (at.key !== placeKey) { at.key = placeKey; at.until = Date.now() + 15000; }\n if (videoLed) return;\n if (!at.until) { at.idx = player.idx; at.t = player.t; at.playing = player.playing; return; }\n if (Date.now() > at.until) { at.until = 0; return; }\n if (!player.has || voice.relang) return;\n at.until = 0;\n if (Math.abs(player.t - at.t) > 0.5) { if (player.seekFrac && player.dur > 0) player.seekFrac(at.t / player.dur); else player.seekRow(at.idx); }\n if (at.playing && !player.playing && mode === 'listen') { autoplayDone.current = true; player.toggle(); }\n });\n const autoplayed = useRef(false);\n const autoplayDone = useRef(false);\n if (locked) mediaKind.video = true;\n const [soundTip, setSoundTip] = useState(false);\n const [adOn, setAdOn] = useState(false);\n useEffect(() => {\n if (!locked || autoplayed.current || !playable || !full || holding || props.autoplay === false) return;\n autoplayed.current = true;\n const tryPlay = (n: number) => { if (playerRef.current.playing || autoplayDone.current) return; playerRef.current.toggle(); if (n > 0) setTimeout(() => tryPlay(n - 1), 1500); };\n const muted = () => { if (!playerRef.current.muted) playerRef.current.toggleMute(); setSoundTip(true); tryPlay(3); };\n const p = playerRef.current;\n if (!p.autoplay || props.startMuted) { muted(); return; }\n void p.autoplay().then((sound) => { if (sound === false) setSoundTip(true); else if (sound == null && !autoplayDone.current) muted(); });\n }, [locked, playable, full, holding]);\n const unmutedNow = useRef(false);\n const soundOn = () => { if (!soundTip) return; setSoundTip(false); unmutedNow.current = true; setTimeout(() => { unmutedNow.current = false; }, 500); if (playerRef.current.muted) playerRef.current.toggleMute(); };\n const toggleSound = () => { if (unmutedNow.current) { unmutedNow.current = false; return; } setSoundTip(false); playerRef.current.toggleMute(); };\n const tapPicture = () => { if (unmutedNow.current) { unmutedNow.current = false; return; } autoplayDone.current = true; playerRef.current.toggle(); };\n const mute = (size: number) => <MuteButton player={player} size={size} />;\n const sumOn = !!recordingId && !running;\n const [warm, setWarm] = useState(false);\n useEffect(() => {\n if (!translating) { setWarm(false); return; }\n const t = setTimeout(() => setWarm(true), 180);\n return () => clearTimeout(t);\n }, [translating]);\n const feedLang = warm ? shownLang : askLang;\n const onVisible = useViewportTranslation(recordingId, askLang, rows, mergeTranslations);\n const sharedSummary = useSummaryIn(summaryOf(rec), recordingId, voice.readLang);\n const anyExport = canDownload || canExport;\n const ytAt = (shared?.job?.crop?.startS ?? 0) + pictureT(player, rows);\n const listening = mode === 'listen';\n const watching = listening && (!!ytId || locked);\n const pickMode = (m: 'read' | 'listen') => { srcPlayer.pause(); voice.player.pause(); setMode(m); if (m === 'read' && full) { browserFull(false); setFull(false); } };\n useEffect(() => { if (listening) return; if (srcPlayer.playing) srcPlayer.pause(); if (voice.player.playing) voice.player.pause(); }, [listening, srcPlayer.playing, voice.player.playing]); // eslint-disable-line react-hooks/exhaustive-deps\n const meta = voice.barChip;\n const t = strings(meta.label);\n const modeSwitch = <Switch<'read' | 'listen'> value={mode} onChange={pickMode} bordered={false} options={modeOptions(t, !!ytId)} />;\n const tabs: TabSpec<PubTab>[] = [...(sumOn ? [{ key: 'summary' as const, label: 'Summary' }] : []), ...(anyExport ? [{ key: 'export' as const, label: 'Export' }] : [])];\n const pubPanel = (k: PubTab) => (\n <>\n {k === 'summary' && sumOn && <SummaryPanel s={sharedSummary} />}\n {k === 'export' && <ExportPanel audio={canDownload ? { name, meta: (dlLang && voice.canSpeak) || hasAudio ? `MP3${lenS ? ` · ${clock(lenS)}` : ''}` : 'ORIGINAL AUDIO', onClick: download } : null} formats={canExport} onExport={doExport} />}\n </>\n );\n const scrub = (deskStep: boolean) => (\n <ReplayScrub index={player.idx} total={Math.max(1, rows.length)} frac={player.dur > 0 ? Math.min(1, player.t / player.dur) : 0} glideMs={player.wordSync ? 0 : 220} atLabel={clock(player.t)} durLabel={clock(player.dur)} stepLabel={deskStep ? `${player.idx + 1} / ${rows.length}` : ''} onSeek={voice.relang ? NO_SEEK : player.seekRow} onSeekFrac={voice.relang ? undefined : player.seekFrac} onScrubStart={player.hold} onScrubEnd={player.release} />\n );\n const pos: PlayerPos = {\n live: false, atEdge: false, edgeFrac: null, readyFrac: edgeS != null && player.dur > 0 ? Math.min(1, edgeS / player.dur) : null,\n pct: player.dur > 0 ? Math.min(100, Math.round((player.t / player.dur) * 1000) / 10) : 0,\n atLabel: clock(player.t), labelAt: (f) => clock(f * player.dur), endLabel: clock(player.dur),\n onSeek: (f) => { if (!voice.relang) player.seekFrac?.(f); },\n };\n const [slowLine, lineSince] = useHeld(voice.on && !!player.preparing && player.playing, 1500);\n const voiceFailed = voice.on && player.error?.code === 'voice_not_started';\n const speakAvail = voice.canSpeak && !voice.error && !voiceFailed;\n const waitLangName = askLang ? (langs?.languages.find((l) => l.code === askLang)?.name ?? meta.label) : '';\n const waitState = full ? playerWaitOf({ lang: askLang, langName: waitLangName, translating: translating && !!askLang, translateFailed, voiceFailed, relang: voice.relang, starting: voice.on ? player.starting : null, slowLine, lineSince }) : null;\n const softWait = !!ytId && !!waitState && (waitState.kind === 'translating' || (waitState.kind === 'voice' && voice.relang));\n const softNote = !softWait || !waitState ? null : waitState.kind === 'translating' ? `Translating into ${waitLangName || 'the new language'}…` : `Preparing the ${waitLangName || 'translated'} voice…`;\n const voiceHolds = !softWait && (waitState?.kind === 'voice' || waitState?.kind === 'starting');\n const langPage = useLanguageList({ ...voice.langList, keepOpen: true, open: page === 'lang', onClose: () => setPage('main') });\n const plan = trackPlan(removeBg, voice.on);\n const bedUrl = locked && plan.bed && canDownload && !!recordingId && (!running || !!audioUrl) ? backgroundAudioUrl(api.origin, recordingId, api.cred) : null;\n const bed = useBackgroundBed(bedUrl, { t: pictureT(player, rows), playing: player.playing && !voiceHolds && !(player.timed && !!player.preparing), muted: player.muted });\n const speechUrl = locked && plan.speech && canDownload && !!recordingId && (!running || !!audioUrl) ? backgroundAudioUrl(api.origin, recordingId, api.cred, 'speech') : null;\n const speechTrack = useSeparatedTrack(speechUrl, { t: pictureT(player, rows), playing: !voice.on && player.playing, muted: player.muted });\n const speechOver = !voice.on && speechTrack.on;\n useEffect(() => { yt.setVideoSound(!(videoLed && (voice.on || speechOver))); audioPlayer.silence?.(!videoLed && speechOver); }, [videoLed, voice.on, speechOver, audioUrl]); // eslint-disable-line react-hooks/exhaustive-deps\n const bgState = !canDownload ? 'unavailable' : voice.on ? bed : speechTrack.state;\n const speaking = speakOn && speakAvail && !!askLang;\n const audioSummary = !speaking ? (removeBg && bgState !== 'unavailable' ? 'Original speech, background removed' : 'Original sound') : [`Translated${voice.hasClone ? (cloneOn ? ', cloned voices' : ', synthetic voices') : ''}`, !removeBg && canDownload && bed !== 'unavailable' ? 'with background sound' : null].filter(Boolean).join(' ');\n const waitRetry = () => { if (waitState?.kind === 'translateFailed') { setLanguage(askLang); return; } autoplayDone.current = true; player.toggle(); };\n const waitOriginal = () => { const at = player.idx; player.pause(); setTxLang(null); autoplayDone.current = true; srcPlayer.playRow(at); };\n const transport: PlayerTransport = { prevOn: player.idx > 0, nextOn: player.idx < rows.length - 1, onPrev: player.prev, onNext: player.next, playing: player.playing, playable, playTitle: voice.playTitle ?? (player.playing ? 'Pause' : 'Play'), onPlay: () => { autoplayDone.current = true; player.toggle(); }, busy: (voice.relang && !ytId) || voiceHolds };\n useMediaKeys(playable && listening ? { playing: player.playing, toggle: () => { autoplayDone.current = true; player.toggle(); }, next: player.next, prev: player.prev } : null, pageTitle);\n const glassChip: React.CSSProperties = { background: 'transparent', color: '#eef0f8', width: 74, justifyContent: 'center', boxSizing: 'border-box' };\n const chipFor = (style: React.CSSProperties, size?: 'sm') => !meta.can || !ctl.language ? null : locked\n ? <button type=\"button\" className=\"gfull__btn\" title={langBusy ? `${meta.label ?? meta.code}: still being prepared` : meta.label ?? meta.code} aria-label={`Language: ${meta.label ?? meta.code}`} aria-busy={langBusy || undefined} onClick={() => { setSettings(false); meta.onClick(); }} style={{ position: 'relative' }}><span style={{ fontSize: size === 'sm' ? 17 : 21, lineHeight: 1 }}>{meta.flag}</span>{langBusy && <span style={{ position: 'absolute', right: 2, bottom: 2, display: 'flex', borderRadius: 999, background: 'rgba(5,6,21,.7)', padding: 1 }}><Spinner size={11} color=\"#eef0f8\" track=\"rgba(255,255,255,.25)\" /></span>}</button>\n : <LanguageChip flag={meta.flag} code={meta.code} label={meta.label} bordered={false} size={size} onClick={meta.onClick} style={style} />;\n const voicesBtn = { on: false, title: 'Voices', onClick: () => {}, busy: voice.voiceWaiting || voiceHolds };\n const [posterGone, setPosterGone] = useState(false);\n useEffect(() => { if (player.t > 0.3) setPosterGone(true); }, [player.t]);\n const fileVideo = !ytId && locked && recordingId && shared?.allowDownload && !running && shared?.job?.hasVideo !== false && shared?.job?.source?.kind !== 'url' ? <FileFollow key={recordingId} src={audioDownloadUrl(api.origin, recordingId, 'video', api.cred)} t={pictureT(player, rows)} playing={player.playing && !voiceHolds} seekN={player.seekN} onToggle={player.has ? tapPicture : undefined} /> : null;\n const embedSrc = !ytId && locked && srcVideoUrl && hasEmbed(srcVideoUrl) ? srcVideoUrl : null;\n const loomVid = embedSrc ? loomId(embedSrc) : null;\n const loomFollow = useMemo(() => (loomVid ? loomSetup(loomVid) : undefined), [loomVid]);\n const fbSrc = embedSrc && siteOf(embedSrc)?.id === 'facebook' ? embedSrc : null;\n const wistia = embedSrc && siteOf(embedSrc)?.id === 'wistia' ? wistiaId(embedSrc) : null;\n const vidyard = embedSrc && siteOf(embedSrc)?.id === 'vidyard' ? vidyardId(embedSrc) : null;\n const embedPic = vidyard ? <VidyardFollow key={vidyard} uuid={vidyard} t={pictureT(player, rows) + (shared?.job?.crop?.startS ?? 0)} playing={player.playing && !voiceHolds} seekN={player.seekN} onToggle={player.has ? tapPicture : undefined} />\n : wistia ? <WistiaFollow key={wistia} id={wistia} t={pictureT(player, rows) + (shared?.job?.crop?.startS ?? 0)} playing={player.playing && !voiceHolds} seekN={player.seekN} onToggle={player.has ? tapPicture : undefined} />\n : fbSrc ? <FacebookFollow key={fbSrc} url={fbSrc} t={pictureT(player, rows) + (shared?.job?.crop?.startS ?? 0)} playing={player.playing && !voiceHolds} seekN={player.seekN} onToggle={player.has ? tapPicture : undefined} />\n : loomFollow ? <FileFollow key={loomVid} setup={loomFollow} seekOver={1} t={pictureT(player, rows) + (shared?.job?.crop?.startS ?? 0)} playing={player.playing && !voiceHolds} seekN={player.seekN} onToggle={player.has ? tapPicture : undefined} />\n : embedSrc ? <EmbedFollow url={embedSrc} t={pictureT(player, rows) + (shared?.job?.crop?.startS ?? 0)} playing={player.playing && !voiceHolds} seekN={player.seekN} title={name} onToggle={player.has ? tapPicture : undefined} /> : null;\n const baseTap = player.has ? <div className=\"txyt vsp-follow\"><div aria-hidden=\"true\" className=\"txyt__tap\" onClick={tapPicture} style={{ cursor: 'pointer' }} /><div className={`txyt__paused${!player.playing ? ' txyt__paused--on' : ''}`} aria-hidden=\"true\"><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div></div> : null;\n const thumbUrl = (shared?.job?.source as { thumbnailUrl?: string | null } | undefined)?.thumbnailUrl ?? null;\n const thumbPic = thumbUrl && /^https:\\/\\//.test(thumbUrl) ? <div className=\"vsp-thumbpic\" aria-hidden=\"true\" style={{ backgroundImage: `url(${JSON.stringify(thumbUrl)})` }} /> : null;\n const picture = !ytId ? (locked ? <><div className=\"vsp-idle__pic vsp-idle__pic--brand\" />{thumbPic}{baseTap}{embedPic}{fileVideo}</> : null) : <>{<YtFollow ytId={ytId} title={name} t={ytAt} playing={player.playing && !voiceHolds} waiting={voice.on && !!player.timed && !!player.preparing} seekN={player.seekN} onTime={(y) => player.videoAt?.(y - (shared?.job?.crop?.startS ?? 0))} onToggle={player.has ? tapPicture : undefined} onAd={setAdOn} lead={videoLed ? yt.lead : undefined} />}<div className=\"vsp-poster\" aria-hidden=\"true\" style={{ opacity: posterGone ? 0 : 1 }}><div className=\"vsp-poster__img\" style={{ backgroundImage: `url(https://i.ytimg.com/vi/${ytId}/hqdefault.jpg)` }} /><span className=\"txyt__pausedplay\"><PlayGlyph size={44} /></span></div></>;\n const video = watching && ytId && !full ? (\n <LiveVideo ytId={ytId} title={name} radius={14} large style={desk ? undefined : { margin: '8px 20px 2px' }} picture={picture}>\n <MiniPlayer pos={pos} transport={transport} chip={chipFor({ ...glassChip, width: 64, height: 28, minHeight: 28, padding: '0 8px' }, 'sm')} voices={voicesBtn} onFull={() => { browserFull(true); setFull(true); }} copied={null} />\n </LiveVideo>\n ) : null;\n const subRow = player.wordSync ? (subtitleShown(rows, player.idx, player.t) ? rows[player.idx] : undefined) : rows[player.idx];\n for (const r of rows) for (const [l, tx] of Object.entries(r.translations)) if (tx) trSeen.current.set(`${r.sentenceId ?? r.start}|${l}`, tx);\n const seenIn = (r: NonNullable<typeof subRow>, l: string) => r.translations[l] || trSeen.current.get(`${r.sentenceId ?? r.start}|${l}`) || null;\n const hasLang = (r: typeof subRow, l: string | null) => !r || !l || r.language === l || !!seenIn(r, l);\n const subLang = hasLang(subRow, askLang) ? askLang : hasLang(subRow, subLangRef.current) ? subLangRef.current : askLang;\n if (subRow && hasLang(subRow, subLang)) subLangRef.current = subLang;\n const subText = subRow && subLang && subRow.language !== subLang ? seenIn(subRow, subLang) : null;\n const subRows = subRow && subText && subLang && !subRow.translations[subLang] ? Object.assign([...rows], { [player.idx]: { ...subRow, translations: { ...subRow.translations, [subLang]: subText } } }) : rows;\n const subLine = subRow ? lineWords(subRows, player.idx, subLang) : [];\n const wordsOn = wordsPref ? wordsPref === 'on' : !locked || voice.on || !feedLang || feedLang === langCode;\n const subAt = wordsOn ? spokenWordOf(player, player.idx, subLine) : null;\n const subWords = subLine.map((w, j) => ({ t: w.text, sp: j < subLine.length - 1 ? ' ' : '', dim: subAt != null && j > subAt }));\n const labelsOn = labelsPref ? labelsPref === 'on' : locked ? false : showLabels(model, rows, rec?.settings);\n const settingsOut = { lang: askLang, subtitles: ccOn, speakerLabels: labelsOn, wordHighlight: wordsOn, translateAudio: speakOn, voices: cloneOn ? 'cloned' as const : 'synthetic' as const, removeBackground: removeBg };\n const settingsKey = JSON.stringify(settingsOut);\n const onSettings = useRef(props.onSettingsChange);\n onSettings.current = props.onSettingsChange;\n useEffect(() => { onSettings.current?.(settingsOut); }, [settingsKey]); // eslint-disable-line react-hooks/exhaustive-deps\n const subLook = subRow && subRow.speaker >= 0 && labelsOn ? speakerLook(model, subRow.speaker) : null;\n const [linkCopied, setLinkCopied] = useState(false);\n const [expBusy, setExpBusy] = useState<'srt' | 'pdf' | null>(null);\n const [expDone, setExpDone] = useState<'srt' | 'pdf' | null>(null);\n const expT = useRef<number | undefined>(undefined);\n useEffect(() => () => window.clearTimeout(expT.current), []);\n const copiedT = useRef<number | undefined>(undefined);\n useEffect(() => () => window.clearTimeout(copiedT.current), []);\n const shareAtUrl = (t: number | null) => { if (props.shareUrl) return props.shareUrl(t); const u = new URL(window.location.href); if (t != null && t > 0) u.searchParams.set('t', String(t)); else u.searchParams.delete('t'); return u.href; };\n const startAt = useRef<number | null>(init.startAt);\n const startSeek = (t0: number) => {\n if (player.seekFrac && player.dur > 0) { player.seekFrac(Math.min(1, t0 / player.dur)); return; }\n let i = 0;\n for (let k = 0; k < rows.length; k++) if (rows[k].start <= t0) i = k;\n player.seekRow(i);\n };\n const startEarly = useRef(false);\n useEffect(() => {\n const t0 = startAt.current;\n if (t0 == null || startEarly.current || !player.has || rows.length === 0) return;\n startEarly.current = true;\n startSeek(t0);\n }, [player.has, rows.length]); // eslint-disable-line react-hooks/exhaustive-deps\n useEffect(() => {\n const t0 = startAt.current;\n if (t0 == null || !player.playing) return;\n startAt.current = null;\n if (Math.abs(player.t - t0) > 2) startSeek(t0);\n }, [player.playing]); // eslint-disable-line react-hooks/exhaustive-deps\n const seekTo = (t0: number) => { autoplayDone.current = true; startAt.current = null; startSeek(Math.max(0, t0)); };\n props.handle.current = {\n seek: (t0) => seekTo(t0),\n play: () => { autoplayDone.current = true; if (listening && !playerRef.current.playing) playerRef.current.toggle(); },\n pause: () => { autoplayDone.current = true; playerRef.current.pause(); },\n toggle: () => { autoplayDone.current = true; if (listening || playerRef.current.playing) playerRef.current.toggle(); },\n toggleMute: () => { setSoundTip(false); playerRef.current.toggleMute(); },\n };\n useEffect(() => () => { props.handle.current = null; }, []); // eslint-disable-line react-hooks/exhaustive-deps\n const onPlayback = useRef(props.onPlayback);\n onPlayback.current = props.onPlayback;\n const playbackLang = useRef(askLang);\n playbackLang.current = askLang;\n useEffect(() => {\n let last = '';\n const tick = () => {\n const cb = onPlayback.current;\n if (!cb) return;\n const p = playerRef.current;\n const s: PlaybackState = { t: p.t, dur: p.dur, playing: p.playing, idx: p.idx, seekN: p.seekN, lang: playbackLang.current, muted: p.muted };\n const key = `${s.t.toFixed(2)}|${s.dur}|${s.playing}|${s.idx}|${s.seekN}|${s.lang}|${s.muted}`;\n if (key === last) return;\n last = key;\n cb(s);\n };\n tick();\n const id = window.setInterval(tick, PLAYBACK_MS);\n return () => window.clearInterval(id);\n }, []);\n const shareHere = () => props.onShare ? props.onShare() : shareLink(shareAtUrl(null), name, () => { window.clearTimeout(copiedT.current); setLinkCopied(true); copiedT.current = window.setTimeout(() => setLinkCopied(false), 2200); });\n const exportRow = (key: 'srt' | 'pdf', title: string, sub: string) => {\n const f = TX_FORMATS.find((x) => x.key === key)!;\n const busy = expBusy === key, done = expDone === key;\n return (\n <div className=\"srow srow--tap\" role=\"button\" aria-busy={busy || undefined} style={expBusy && !busy ? { opacity: 0.45, pointerEvents: 'none' } : undefined} onClick={() => {\n if (expBusy) return;\n setExpBusy(key);\n Promise.resolve().then(() => doExport(key)).then(() => { setExpDone(key); window.clearTimeout(expT.current); expT.current = window.setTimeout(() => setExpDone(null), 1600); }).catch(() => {}).finally(() => setExpBusy(null));\n }}>\n {busy ? <Spinner size={17} color=\"var(--brand)\" track=\"var(--fill-12)\" /> : <Icon d={f.icon} size={17} sw={1.5} style={{ flex: 'none', color: 'var(--ink-70)' }} />}\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">{title}</div><div className=\"srow__s\">{sub}</div></div>\n <Icon d={done ? D.check : D.downloaded} size={17} sw={1.6} style={{ flex: 'none', color: done ? 'var(--brand)' : 'var(--ink-62)' }} />\n </div>\n );\n };\n const eyebrow: React.CSSProperties = { padding: '10px 14px 4px', fontSize: 11, fontWeight: 600, letterSpacing: '.12em', color: 'var(--ink-35)' };\n const subsBack = (\n <span className=\"vs-sheet__title\" style={{ position: 'relative' }}>\n {'\\u00a0'}\n <button type=\"button\" onClick={() => setPage('main')} aria-label=\"Back\" style={{ position: 'absolute', left: -6, top: '50%', transform: 'translateY(-50%)', display: 'inline-flex', alignItems: 'center', gap: 2, padding: '4px 6px 4px 0', border: 0, background: 'none', color: 'var(--ink-96)', fontFamily: 'var(--vs-font-sans)', fontSize: 15, fontWeight: 600, letterSpacing: 0, lineHeight: 1, whiteSpace: 'nowrap', cursor: 'pointer' }}>\n <Icon d={D.chevronLeft} size={18} sw={1.8} />Back\n </button>\n </span>\n );\n const chev = <Icon d={D.chevronRight} size={17} sw={1.6} style={{ flex: 'none', color: 'var(--ink-45)' }} />;\n const sheetTitle = { main: 'SETTINGS', lang: 'LANGUAGE', subs: 'SUBTITLES', audio: 'AUDIO', export: 'EXPORT' }[page];\n const pageBody: React.CSSProperties = { display: 'flex', flexDirection: 'column', gap: 2, paddingBottom: 14 };\n const settingsSheet = locked ? (\n <Sheet open={settings} onClose={() => setSettings(false)} title={sheetTitle} titleNode={page === 'main' ? undefined : subsBack} doneLabel={t.done} kind={page === 'main' ? 'settings' : 'settings vs-sheet--page'} sticky>\n <GrowBox>\n {page === 'lang' ? (\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <div style={{ position: 'sticky', top: 0, zIndex: 1, padding: '4px 14px 10px', background: 'var(--vs-surface-raised)' }}>{langPage.search}</div>\n {langPage.list}\n </div>\n ) : page === 'subs' ? (\n <div style={pageBody}>\n <div className=\"srow\">\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Show subtitles</div><div className=\"srow__s\">Captions over the video</div></div>\n <Toggle checked={ccOn} onChange={setCcOn} label=\"Show subtitles\" />\n </div>\n <div className=\"srow\">\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Show speaker labels</div><div className=\"srow__s\">Who is speaking, before each line</div></div>\n <Toggle checked={labelsOn} onChange={(v) => setLabelsPref(v ? 'on' : 'off')} label=\"Show speaker labels\" />\n </div>\n <div className=\"srow\">\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Highlight words</div><div className=\"srow__s\">Follow each word as it is spoken</div></div>\n <Toggle checked={wordsOn} onChange={(v) => setWordsPref(v ? 'on' : 'off')} label=\"Highlight words\" />\n </div>\n </div>\n ) : page === 'audio' ? (\n <div style={pageBody}>\n <div className=\"srow\">\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Translate audio</div><div className=\"srow__s\">{!askLang ? 'Pick a language to hear the translation read aloud' : speakAvail ? 'Hear the translation read aloud instead of the original speech' : voice.canSpeak ? 'Not available right now' : 'Not available in this language'}</div></div>\n <Toggle checked={speaking} onChange={setSpeakOn} label=\"Translate audio\" disabled={!speakAvail || !askLang} />\n </div>\n {speaking && voice.hasClone && (\n <div className=\"srow\">\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Voices</div><div className=\"srow__s\">{cloneOn ? 'Each speaker in their own cloned voice' : 'Synthetic voices matched to each speaker'}</div></div>\n <Switch<'stock' | 'clone'> value={cloneOn ? 'clone' : 'stock'} onChange={(v) => setCloneOn(v === 'clone')} size=\"sm\" options={[{ value: 'stock', label: 'Synthetic' }, { value: 'clone', label: 'Cloned' }]} />\n </div>\n )}\n <div className=\"srow\">\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">{REMOVE_BG_LABEL}</div><div className=\"srow__s\">{bedNote(removeBg, bgState, 'video', voice.on ? 0 : speechTrack.untilS)}</div></div>\n <Toggle checked={removeBg && canDownload} onChange={setRemoveBg} label={REMOVE_BG_LABEL} disabled={!canDownload || (bgState === 'unavailable' && !removeBg)} />\n </div>\n </div>\n ) : page === 'export' ? (\n <div style={pageBody}>\n {exportRow('srt', 'Subtitles', 'SRT / VTT caption cues, ready for a video editor or a player')}\n {exportRow('pdf', 'PDF', 'Formatted transcript in paragraphs, with timestamps and speaker labels')}\n </div>\n ) : (\n <div style={pageBody}>\n {[\n meta.can && ctl.language && (\n <div key=\"lang\" className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('lang')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Language</div><div className=\"srow__s\">{askLang ? `Translated to ${meta.label ?? askLang.toUpperCase()}` : 'Original language'}</div></div>\n <span style={{ fontSize: 18, lineHeight: 1 }}>{meta.flag}</span>\n {chev}\n </div>\n ),\n ctl.subtitles && (\n <div key=\"subs\" className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('subs')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Subtitles</div><div className=\"srow__s\">{ccOn ? 'On · speaker labels and word highlighting' : 'Off'}</div></div>\n {chev}\n </div>\n ),\n ctl.audio && (\n <div key=\"audio\" className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('audio')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Audio</div><div className=\"srow__s\">{audioSummary}</div></div>\n {chev}\n </div>\n ),\n ctl.export && canExport && !!recordingId && (\n <div key=\"export\" className=\"srow srow--tap\" role=\"button\" onClick={() => setPage('export')}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">Export{dlLangName ? ` in ${dlLangName}` : ''}</div><div className=\"srow__s\">Subtitles (SRT / VTT) or a PDF of the transcript</div></div>\n {chev}\n </div>\n ),\n ].filter(Boolean).flatMap((el, i) => (i ? [<div key={`d${i}`} className=\"sdiv\" />, el] : [el]))}\n </div>\n )}\n </GrowBox>\n </Sheet>\n ) : (\n <Sheet open={settings} onClose={() => setSettings(false)} title={t.settings} doneLabel={t.done} drawer={desk}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {meta.can && (\n <>\n <div className=\"srow srow--tap\" onClick={() => { setSettings(false); meta.onClick(); }}>\n <div style={{ flex: 1, minWidth: 0 }}><div className=\"srow__t\">{t.langLabel}</div><div className=\"srow__s\">{t.langCount}</div></div>\n <span style={{ fontSize: 18, lineHeight: 1 }}>{meta.flag}</span>{voice.original ? null : <span style={{ fontSize: 14, fontWeight: 600, color: 'var(--ink-96)' }}>{meta.label}</span>}<Icon d={D.chevronRight} size={15} style={{ color: 'var(--ink-45)' }} />\n </div>\n <div className=\"sdiv\" />\n </>\n )}\n {props.settingsExtra}\n </div>\n </Sheet>\n );\n\n const fullEl = full && watching && (!!ytId || locked) && (\n <FullVideo page={(props.layout ?? 'embed') === 'page'} picture={picture} title={name} desk={desk} pos={pos} mute={{ muted: player.muted, onToggle: toggleSound }} cc={ctl.subtitles ? { on: ccOn, onToggle: () => setCcOn((v) => !v) } : undefined} noFull={!ctl.fullscreen} ad={adOn} wait={waitState && !softWait ? <PlayerWait state={waitState} line={voiceHolds ? subWords.map((w) => w.t + w.sp).join('') : null} onRetry={waitRetry} onOriginal={waitOriginal} /> : player.edgeWait ? `Transcribing ${Math.round(pct)}% — it plays on as more is written` : null} pct={running ? Math.round(pct) : null}\n sub={ccOn && subRow ? { who: subLook ? speakerLabel(model, subRow.speaker) : null, color: subLook ? subLook.fg ?? `var(--lane-${subLook.lane})` : '#fff', words: subWords, cursor: spokenWordOf(player, player.idx, subLine) } : null}\n chip={chipFor(desk ? glassChip : { ...glassChip, width: 64, padding: '0 6px' }, desk ? undefined : 'sm')} transport={transport}\n picker={voice.sheets} sheet={locked ? settingsSheet : null} voices={null} voicesBtn={locked ? null : voicesBtn} sheetOpen={voice.sheetsOpen || settings} onShare={locked && ctl.share ? shareHere : undefined} onSettings={locked && ctl.settings ? () => { voice.closePicker(); setSettings((v) => !v); } : undefined} compact={!!props.compact} paused={{ title: name, summary: sharedSummary.state === 'ready' ? sharedSummary.summary ?? null : null, share: ctl.share && (props.shareUrl || !props.onShare) ? { url: shareAtUrl, at: player.t } : null }}\n copied={linkCopied ? <div className=\"gfull__toast\" aria-live=\"polite\"><Icon d={D.check} size={13} sw={2} />Link copied</div> : soundTip ? <div className=\"gfull__toast gfull__soundtip\" aria-live=\"polite\"><Icon d={D.volumeOff} size={14} sw={1.8} />Tap for sound</div> : softNote ? <div className=\"gfull__toast\" role=\"status\" aria-live=\"polite\"><Spinner size={13} color=\"#eef0f8\" track=\"rgba(255,255,255,.25)\" />{softNote}</div> : voice.on && (videoLed ? follow.missing != null : player.silent) ? <div className=\"gfull__toast\" role=\"status\" aria-live=\"polite\"><Spinner size={13} color=\"#eef0f8\" track=\"rgba(255,255,255,.25)\" />{`${waitLangName || 'Translated'} voice is still being prepared · playing with subtitles`}</div> : null} onTouch={() => { browserFull(true); soundOn(); }} onClose={locked ? undefined : () => { browserFull(false); setFull(false); }} />\n );\n useEffect(() => { if (!locked && full && !watching) { browserFull(false); setFull(false); } }, [locked, full, watching]);\n const progressBox = running && (\n <div className={`pubprog${desk ? ' pubprog--desk' : ''}${find ? ' pubprog--find' : ''}`}>\n <div className=\"pubprog__row\"><span className=\"l\">{`TRANSCRIBING ${pct}%`}</span>{!desk && <div style={{ flex: 1 }} />}{desk && <div className=\"pubprog__bar\" style={{ flex: 1 }}><div style={{ width: `${pct}%` }} /></div>}<span className=\"s\">{segs}</span></div>\n {!desk && <div className=\"pubprog__bar\" style={{ marginTop: 8 }}><div style={{ width: `${pct}%` }} /></div>}\n </div>\n );\n const gonePanel = gone && <div className=\"hint\" style={{ padding: '30px 20px', textAlign: 'center', fontSize: 13 }}>This link is no longer shared. Ask the person who sent it for a new one.</div>;\n const lines = <TxLines model={model} rows={rows} player={listening ? player : { ...player, playRow: player.seekRow }} tail={tail} tailFg={tailFg} running={running} desk={desk} feedRef={feedRef} listener showLabels={labelsOn} find={findQ} findOpen={!desk && find} lang={feedLang} warm={warm} onVisible={onVisible} wordHl={wordsOn} />;\n const toast = <Toast error={error ?? subError ?? (voiceFailed && full ? null : player.error) ?? voice.error} onClose={() => { setError(null); clearError(); player.clearError(); voice.clearError(); }} />;\n const subline = [lenS ? clock(lenS) : null, langCode ? langCode.toUpperCase() : null, by || 'Read-only copy'].filter(Boolean).join(' · ');\n const pubTransport = (deskScrub: boolean) => (\n <div className=\"ctrans\">\n {voice.noVoice ? voice.noVoiceNote : (\n <>\n <div className=\"ctrans__row\">\n <span className=\"ctrans__sp\" aria-hidden=\"true\" />\n <div className=\"ctrans__mid\">\n <button type=\"button\" className=\"ctrans__step\" aria-label=\"Previous segment\" title=\"Previous segment\" style={{ opacity: player.idx <= 0 ? 0.3 : 1 }} onClick={player.prev}><Icon d={D.chevronLeft} size={16} sw={1.8} /></button>\n <button type=\"button\" className=\"ctrans__play\" aria-label={voice.relang ? 'Preparing audio' : player.playing ? 'Pause' : 'Play'} title={voice.relang ? 'Preparing audio…' : voice.playTitle ?? (player.playing ? 'Pause' : 'Play')} disabled={!playable} onClick={player.toggle}>\n {voice.relang\n ? <span className=\"ctrans__spin\" />\n : <svg viewBox=\"0 0 24 24\" width={16} height={16} fill=\"currentColor\" aria-hidden=\"true\" style={player.playing ? undefined : { marginLeft: 2 }}>{player.playing ? PAUSE_D : PLAY_D}</svg>}\n </button>\n <button type=\"button\" className=\"ctrans__step\" aria-label=\"Next segment\" title=\"Next segment\" style={{ opacity: player.idx >= rows.length - 1 ? 0.3 : 1 }} onClick={player.next}><Icon d={D.chevronRight} size={16} sw={1.8} /></button>\n </div>\n <span className=\"ctrans__mute\">{mute(36)}</span>\n </div>\n <div className=\"ctrans__scrub\">{scrub(deskScrub)}</div>\n </>\n )}\n </div>\n );\n const dp = useSideTabs<PubTab>('ga', { tabs, cur: tab, pref: tabs[0]?.key, onPick: setTab });\n const holdPct = Math.max(0, Math.min(100, Math.round(pct)));\n const hold = holding && (\n <div className=\"gfull gfull--hold\" data-theme=\"dark\" role=\"status\" aria-live=\"polite\">\n {ytId && <div className=\"gfull__holdbg\" style={{ backgroundImage: `url(https://i.ytimg.com/vi/${ytId}/hqdefault.jpg)` }} />}\n <div className=\"gfull__hold\">\n {!shared ? <span className=\"gfull__spin gfull__holdspin\" aria-label=\"Loading\" /> : (\n <>\n {name && <div className=\"gfull__holdt\">{name}</div>}\n <div className=\"gfull__holdpct\">{status === 'transcribing' ? `${holdPct}%` : <span className=\"gfull__spin gfull__holdspin\" />}</div>\n <div className=\"gfull__holdbar\"><div style={{ width: `${status === 'transcribing' ? holdPct : 0}%` }} /></div>\n <div className=\"gfull__holds\">{status === 'transcribing' ? 'Transcribing' : status === 'cropping' ? 'Preparing the video' : 'Waiting to start'}{status === 'transcribing' && progress?.segmentsDone ? ` · ${segs.toLowerCase()}` : ''}</div>\n <div className=\"gfull__holdn\">The video starts as soon as the first lines are transcribed.</div>\n </>\n )}\n </div>\n </div>\n );\n const tabPct = locked && shared && (running || status === 'cropping') ? Math.max(0, Math.min(100, Math.round(pct))) : null;\n const onProgress = useRef(props.onProgress);\n onProgress.current = props.onProgress;\n useEffect(() => { onProgress.current?.(tabPct); }, [tabPct]);\n const [endDismissed, setEndDismissed] = useState(false);\n const atEnd = !!fullEl && !holding && (videoLed ? !!player.ended : !player.playing && player.dur > 0 && player.t >= player.dur - 0.5);\n useEffect(() => { if (!atEnd) setEndDismissed(false); }, [atEnd]);\n const endCard = props.endCard !== false && atEnd && !endDismissed && (\n <EndCard options={{ appUrl: props.appUrl, ...(props.endCard || {}) }} onStarted={props.onStarted} onClose={() => setEndDismissed(true)} onReplay={() => { setEndDismissed(true); autoplayDone.current = true; if (player.seekFrac) player.seekFrac(0); else player.seekRow(0); if (!player.playing) player.toggle(); }} />\n );\n const endPill = props.endCard !== false && atEnd && endDismissed && (\n <button type=\"button\" className=\"vsp-endpill\" onClick={(e) => { e.stopPropagation(); setEndDismissed(false); }}><Icon d={D.link} size={15} sw={1.8} />Transcribe a video</button>\n );\n if (locked) return <>{gone ? <div className=\"gfull\" data-theme=\"dark\">{gonePanel}</div> : hold || fullEl || <div className=\"gfull\" data-theme=\"dark\" />}{endCard}{endPill}{toast}</>;\n if (desk) {\n const deskAudio = listening && !watching && !gone && <div className=\"pubdeskctl\">{pubTransport(true)}</div>;\n const sideOn = !gone && (tabs.length > 0 || watching || !!voice.sidePanel || !!deskAudio);\n return (\n <>\n <div className=\"dhead dhead--listener dhead--cols\">\n <div className=\"gcolhead\">\n <div className=\"gcolhead__main\">\n <div className=\"gcolhead__col\">\n <div style={{ flex: 'none' }}><Logo dark={dark} height={20.38} /></div>\n {!gone && (\n <div className=\"dhead__session\">\n <span className=\"t\">{shared ? name : ''}</span>\n <span className=\"s\">{shared ? subline : ''}</span>\n </div>\n )}\n </div>\n </div>\n {sideOn && <div className=\"gcolhead__side\" />}\n </div>\n </div>\n <div className=\"listenerlive listenerlive--cols listenerlive--pub\">\n <div className=\"listenerlive__main\">\n {gonePanel}\n {!gone && findField}\n {progressBox}\n {flash && <div className=\"pubflash\">{flash}</div>}\n {!gone && <div className=\"listenerlive__inner\" style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column', marginTop: 6 }}>{lines}</div>}\n {!gone && (\n <div className=\"listenerlive__inner gdeskbar\" data-transport=\"1\">\n {meta.can && <span className=\"barchip\" style={meta.active ? { background: 'var(--brand-tint)', boxShadow: '0 0 0 1.5px var(--brand)', borderRadius: 12 } : undefined}><LanguageChip flag={meta.flag} code={meta.code} label={meta.label} bordered={false} onClick={meta.onClick} /></span>}\n {modeSwitch}\n </div>\n )}\n </div>\n {sideOn && (\n <SideFrame id=\"ga\" className=\"listenerside\" gap={20} plain>\n {!voice.sidePanel && deskAudio}\n {!voice.sidePanel && video}\n {!voice.sidePanel && tabs.length > 0 && (\n <div data-panel-grid=\"\" className=\"listenerside__panels\">\n <SidePanels col={dp} order={['summary', 'export']} onPick={setTab} grip={{ summary: 40, export: 28 }} render={(k) => <Card panel>{pubPanel(k)}</Card>} />\n </div>\n )}\n {voice.sidePanel}\n </SideFrame>\n )}\n </div>\n {!fullEl && voice.sheets}{!(locked && fullEl) && settingsSheet}{fullEl}{toast}\n </>\n );\n }\n const widgetOn = tabs.length > 0 && !find;\n const widget = widgetOn && (\n <div className=\"txwidget\">\n <Card panel>\n <TabBar tabs={tabs} current={tab} onPick={setTab} gap={tab !== 'none'} />\n {tab !== 'none' && pubPanel(tab)}\n </Card>\n </div>\n );\n return (\n <>\n <ListenerHeader dark={dark} title={shared ? name : ''} subline={shared ? subline : ''} onOptions={() => setSettings(true)} optionsActive={settings} />\n {gonePanel}\n {progressBox}\n {!gone && widget}\n {!gone && video}\n {!gone && (\n <div style={{ position: 'relative', flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>\n {findField}\n {lines}\n {flash && <div className=\"txflash\">{flash}</div>}\n </div>\n )}\n {!gone && (\n <div className=\"gbottom\" data-transport=\"1\">\n {listening && !watching && <div className=\"pubctl\">{pubTransport(false)}</div>}\n <div className=\"gbottom__bar\">\n {meta.can && <div style={{ flex: 'none' }}>{chipFor({ width: 87 }, undefined)}</div>}\n <div style={{ flex: 1, minWidth: 0 }}>{modeSwitch}</div>\n </div>\n </div>\n )}\n {!fullEl && voice.sheets}{!(locked && fullEl) && settingsSheet}{fullEl}{toast}\n </>\n );\n}\n\nfunction useSealed(url: string | null): 'yes' | 'no' | 'unknown' {\n const [st, setSt] = useState<{ url: string; ok: boolean } | null>(null);\n useEffect(() => {\n if (!url || (st?.url === url && st.ok)) return;\n let live = true;\n let h: ReturnType<typeof setTimeout> | undefined;\n const check = () => { void audioSealed(url).then((y) => { if (!live) return; setSt({ url, ok: y }); if (!y) h = setTimeout(check, 3000); }); };\n check();\n return () => { live = false; if (h) clearTimeout(h); };\n }, [url, st?.url === url && st?.ok]); // eslint-disable-line react-hooks/exhaustive-deps\n return !url || st?.url !== url ? 'unknown' : st.ok ? 'yes' : 'no';\n}\n","import type { CSSProperties } from 'react';\nimport type { Site } from '../core/sites';\n\nexport function SiteIcon({ site, size = 16, tinted = false, style, className }: { site: Site; size?: number; tinted?: boolean; style?: CSSProperties; className?: string }) {\n return (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} aria-hidden=\"true\" className={className} style={{ flex: 'none', display: 'block', color: tinted ? site.color : undefined, ...style }}>\n <path d={site.glyph} fill=\"currentColor\" fillRule=\"evenodd\" />\n </svg>\n );\n}\n"],"names":["SITE","LOGO_DARK","LOGO_LIGHT","MARK_DARK","MARK_LIGHT","I","size","sw","children","style","rest","jsx","D","Icon","d","p","StopGlyph","PlayGlyph","Spinner","color","track","PauseGlyph","jsxs","Logo","dark","height","link","img","Mark","Card","panel","inset","className","Toggle","checked","onChange","label","disabled","Switch","value","options","bordered","fill","ref","useRef","thumb","setThumb","useState","idx","o","useLayoutEffect","el","opt","useEffect","ro","IconButton","onClick","variant","active","title","LanguageChip","flag","code","block","flagOnly","named","CopyButton","onCopied","copied","setCopied","copy","e","useVisualViewportInset","open","vv","focusTimer","apply","r","top","bottom","a","GrowBox","ms","anim","_a","GrowAnim","outer","inner","h","setH","box","settle","room","sheet","max","measure","scrim","full","Sheet","onClose","titleNode","note","doneLabel","drawer","header","kind","sticky","scrimRef","onKey","createContext","Eyebrow","reporter","setErrorReporter","fn","reportError","deliveryFormat","credParams","cred","q","explainAudioError","url","res","body","message","audioSealed","deliveryAudioUrl","apiOrigin","recordingId","backgroundAudioUrl","audioDownloadUrl","voiceTrackDownloadUrl","lang","voiceKey","voiceTrackUrlAs","format","mediaErrorText","report","what","reportMediaError","STARTING_DEFAULT_MS","startingRetryMs","status","retryAfter","ra","b","ClipPrefetch","__publicField","src","signal","u","srcs","keepSet","s","n","ready","recent","order","over","i","busy","ctl","done","cur","mediaKind","newMediaElement","v","VoiceNotStarted","_ClipQueue","ids","id","afterId","clip","c","line","held","w","exp","prev","rested","gap","span","floor","part","beforeFirst","patience","first","sentenceId","at","going","t","m","sec","base","frac","lens","_","total","x","y","target","k","len","from","withFrom","out","secs","enough","again","afterMs","since","tries","known","piece","tagged","next","dropped","ClipQueue","rowForVoice","rows","voiceId","archiveClips","row","sentenceIds","cp","tk","vk","rev","parts","_b","readCursor","tokens","pos","tokenAt","dur","acc","want","RECENT","subs","read","key","fallback","raw","write","useStored","setV","on","forgetRecentLang","list","useRecentLangs","set","safe","pickerLanguages","langs","allowed","l","useSidePins","pins","setPins","COL_W","useColW","useLanguageList","onSelect","languages","searchPlaceholder","none","pinned","requireVoice","keepOpen","setQ","showAll","setShowAll","refused","setRefused","filtered","useMemo","needle","pa","pb","recents","cut","shown","more","inRecent","extra","off","search","Fragment","LanguagePicker","FileFollow","setup","playing","seekN","onToggle","seekOver","setReady","gone","setGone","tRef","SITES","BY_ID","siteById","hostOfUrl","siteOf","host","loomId","vimeoIds","dailymotionId","twitchTarget","hms","embedUrl","site","play","tg","_c","name","_d","_e","_f","_g","path","_h","_i","_j","FOLLOWS","hasEmbed","urlFromEmbed","sourceVideoUrl","wistiaId","vidyardId","SIGNALS","embedSignal","EmbedFollow","failed","setFailed","heard","sig","onMsg","sdk","loadSdk","resolve","seq","FacebookFollow","player","live","fb","onReady","f","script","loadScript","WistiaFollow","video","playRef","loadApi","started","wait","VidyardFollow","uuid","api","loomStreamUrl","j","signedLoader","master","query","xhr","loomSetup","fail","destroy","mod","Hls","hls","cache","useYtTitle","ytId","setTitle","HASH","ID","displayName","clean","BED_DRIFT_S","followBed","REMOVE_BG_LABEL","REMOVE_BG_NOTE","clockOf","bedNote","state","untilS","trackPlan","removeBg","voiceOn","removeBgFromQuery","withRemoveBg","bedRetryS","SEAM_S","partsOf","partAt","lo","hi","mid","slotsFor","load","other","probe","release","useSeparatedTrack","setState","setParts","setOn","els","stop","timer","check","old","pauseParts","plan","slot","useBackgroundBed","FOLLOW_DRIFT_S","FOLLOW_AHEAD","lineAt","lines","followTarget","clips","elapsed","mayRunOn","playingSid","upcomingSrcs","useVoiceFollow","bySid","stopCurrent","missing","sid","keep","MEDIA_KEYS","onMediaKey","bindMediaKeys","get","useMediaKeys","clock","mm","ss","empty","mediaToWall","media","end","last","toWords","fromSnapshot","snap","sp","foldTr","undoesAutoFix","words","tail","changed","marked","applyFrame","seg","kept","norm","fixes","g","sentences","segs","sentenceConfidence","mergeSegTranslations","sum","CONF_MID","CONF_LOW","confClass","LANES","lane","speaker","speakerNumbers","see","was","speakerNumber","GENERIC_NAME","given","speakerName","speakerLabel","speakerInitial","speakerColor","voiceColor","speakerLook","showLabels","own","said","mode","seen","THEIRS","OURS","GENERIC","OFFLINE","BROWSER","describe","any","details","rid","VocalStackError","DEFAULT_API","Ctx","usePlayerApi","useContext","PlayerApiProvider","props","OwnApi","useApi","UUID","isTranscriptionId","listen","listenerToken","owner","origin","tokRef","hasToken","bearer","ownerTok","setOwnerTok","client","VocalStack","shareCode","withMedia","loadSource","recording","tx","job","useSource","source","setSource","error","setError","setN","alive","useMediaToken","tok","setTok","left","apiFetch","init","headers","qs","langCache","useLanguages","setL","useAsync","deps","data","setData","sleep","PENDING_REFETCH_MS","PENDING_REFETCHES","useTranscript","opts","apiRef","model","setModel","modelRef","subRef","langRef","connected","setConnected","notFound","setNotFound","bump","useCallback","optsRef","attempt","announced","announceState","sub","asked","ev","pe","pd","st","translating","setTranslating","translateFailed","setTranslateFailed","langTurn","shownLang","setShownLang","setLanguage","turn","fetchOnce","mergeTranslations","made","touched","text","clearError","I18N","strings","answerError","rowStatusOf","progressOf","segsLabel","fallbackDone","jobLengthS","progress","TX_FORMATS","saveUrl","saveWhenReady","exportTranscript","blob","cd","star","plain","href","downloadVoiceTrack","mine","until","ytIdOf","liveEmbedUrl","SUB_LEAD_S","SUB_LINGER_S","lineSpeechEnd","subtitleShown","spreadWords","to","weight","start","feedInset","cs","cap","useFeedBar","thumbRef","paintRef","glassBar","geom","bar","covered","vis","hide","dragging","clearGlass","atBottom","show","barRO","watched","paint","reveal","gutter","onScroll","down","move","FeedBar","Toast","closeRef","hover","setHover","copiedT","credit","VoiceIdGlyph","Transport","chip","scrub","mute","voice","ReplayScrub","index","atLabel","durLabel","stepLabel","onSeek","onSeekFrac","onScrubStart","onScrubEnd","glideMs","drag","setHeld","pct","glide","emit","up","rowFixes","corrections","slots","seqs","rewritten","FixBadges","desk","onOpen","one","FixPen","alone","setOver","useViewportTranslation","merge","visible","setVisible","tick","setTick","byId","onVisible","voiceDetail","groupOf","voiceGroups","counts","head","headOn","speakerRoster","unknownLabel","unknown","look","castKey","map","parseCast","spk","autoCast","roster","voices","clones","pool","used","free","pick","SpeakerCast","selected","noClone","building","short","warn","sexOf","sel","alert","dot","few","VoiceSheetBody","cast","currentId","armedId","sampleId","dlId","onPick","onAdd","onUse","usedBy","foldKey","foldFor","problem","fold","setFold","gendered","useOn","headCount","rule","detail","dling","shares","Equaliser","width","ORIGINAL_FLAG","langMeta","useVoiceCatalogue","version","rec","recId","recToken","recShare","namedCount","useArchiveVoice","ended","pickedVoice","listed","reload","got","renderVoiceId","asking","setAsking","renderError","setRenderError","renderKey","requestRender","fromKey","use","castObj","k2","forget","prefix","rendering","sentenceKey","near","setNear","kicked","castMap","missingNow","lastCount","coming","TAB_ICON","TabBar","tabs","current","side","anyOn","tip","setTip","tipRef","tipW","setTipW","showTip","tab","strip","hideTip","tipEl","createPortal","labelled","flex","icon","DL_D","MUSIC_D","ExportPanel","audio","formats","onExport","setDone","setBusy","flash","exportAs","save","dl","shareLink","useSummaryIn","setGot","summaryOf","SummaryPanel","action","COPY_D","LiveVideo","timeLabel","radius","large","picture","useDragScroll","enabled","external","startY","startTop","dy","useSideTabs","stored","setStored","keys","tabbed","pinnable","forced","tabKeys","after","pin","unpin","avail","SidePanels","col","render","grip","wrapClass","usePanelGrip","hot","tabsEl","begin","ground","bg","pg","frame","canPin","tr","zone","rs","commit","myCol","onMove","surf","onDown","onUp","onCancel","onLeave","SideFrame","hidden","setW","grid","useMasonry","onGrip","MIN","CONTENT","x0","w0","nw","GAP","raf","layout","mark","watch","mo","isNotCaptured","SAMPLE_RETRY_MS","SAMPLE_GIVE_UP_MS","useVoicePreview","armId","setArmId","setSampleId","setDlId","run","reset","arm","ask","token","EPS","indexAt","snapPosition","placePosition","atEnd","voiceWait","VOICE_WAIT_TITLE","playerWaitOf","useHeld","setSince","PlayerWait","onRetry","onOriginal","now","setNow","lineWords","ws","spokenWordOf","pictureT","lineEnd","YtFollow","wantPlay","onAd","endT","onGone","onKnown","lead","onTime","waiting","adRef","ad","setAd","cmd","func","args","contentDur","liveVideo","adByDur","adByStall","toggleRef","leadRef","adCb","resumeAfterAd","adCheck","playingRef","timeCb","ytT","ytState","ytPaused","setYtPaused","noCaptions","capT","noCaptionsSoon","onLoad","win","endRef","probed","goneRef","knownRef","goneSaid","outside","seek","ps","all","_k","_l","_m","_n","_o","_p","still","PAUSE_D","PLAY_D","MuteButton","useFlash","msg","setMsg","DUCK","DUCK_MS","UNDUCK_MS","useDuck","players","ducked","fade","t0","step","useYtLead","lenS","offsetS","edgeS","cmdRef","readyRef","pending","muted","setMuted","mutedRef","soundOff","setT","offset","edgeRef","edgeWait","setEdgeWait","edgeWaitRef","setWait","send","stateRef","ytMuted","lastEnd","setSeekN","s0","playRetry","nudgePlay","chosen","soundUp","pause","toggle","seekRow","applyMute","setMute","setVideoSound","ok","useTxPlayer","available","setPlaying","silenced","carry","setAttempt","err","why","windowed","durRef","windowedRef","playFailed","seekFrac","resumeAt","seekWord","playRow","lastNudge","hold","vt","useTxVoicePlayer","wordTimes","timed","comingRef","setPos","quiet","setQuiet","quietRef","setWaiting","starting","setStarting","aim","setAim","aimRef","clipPos","setClipPos","restS","setRestS","restBase","setRestBase","silent","setSilent","rowsRef","timedRef","lineIdsRef","videoRef","timesRef","wire","queue","aimed","fromS","keyRef","snapRef","pendingRef","resuming","setResuming","applyRef","park","posRef","drop","lineIds","hasPos","voiced","dir","goRow","spanOf","speech","tNow","before","share","wt","clipEnd","into","joinRow","NO_SEEK","TX_PICKER_NOTE","PUB_SIDE","useTxVoice","srcLang","canTranslate","pickedLang","setPickedLang","hearOriginal","stockVoices","stickyPicker","pickerBusy","voiceSheet","forcedVoice","onAddVoice","onPickVoice","onSelectSpeaker","noCloneFor","castNoClone","castShort","castBuilding","castWarn","badge","voiceTitleNode","hooked","pendingClones","pushRecent","picked","setPicked","picker","setPicker","setSheet","fromVoices","setFromVoices","setWant","original","vLang","preview","cloneOn","catVer","setCatVer","cloneSeen","catalogue","gvList","gVoicePick","meta","trLangs","spkSel","setSpkSel","spkMute","castByLang","setCastByLang","spkRoster","spkCastOn","spkSelected","castChosen","stockCast","castKeyStr","sentCast","hasClone","canSpeak","speakHere","arch","gvPicked","gvId","clipKey","vp","noVoice","speaks","relang","openPicker","closePicker","selectLang","openVoices","closeVoices","pickerMine","voicesMine","toggleChip","toggleVoices","pickVoice","chipMeta","glyph","glyphFg","waitKind","lineHeld","voiceWaiting","voiceTitle","pickerEl","savedClones","savedFor","people","p2","sheetList","stock","auto","selSp","soleSp","noteSp","genderOf","selSex","shownList","autoOf","ctx","toClone","warns","voiceBtn","voiceSheetEl","also","sheets","sidePanel","playTitle","noVoiceNote","TxLines","fixed","applied","onFixOpen","onWord","onFix","fixMode","fixingId","marks","fixBadges","tailFg","running","feedRef","listener","find","findOpen","warm","wordHl","engaged","wordSync","hovId","setHovId","setOff","glideUntil","lastIdx","rowEl","visKey","centre","ins","visH","rowOffscreen","bot","smoothRow","offRef","moved","followJump","follow","fixing","dim","tapRow","fx","fxAny","pen","who","ln","spokenWord","tracks","ahead","dash","half","fg","TxFind","onQ","hits","inline","useFindPull","setOpen","openRef","qRef","setHits","userUntil","touch","ECC_M","rawDataModules","ver","dataCodewords","gfMul","z","rsDivisor","degree","root","rsRemainder","divisor","factor","alignmentPositions","qrMatrix","bytes","capacity","bits","push","pad","numBlocks","eccLen","rawCodewords","numShort","shortLen","blocks","div","dat","ecc","codewords","finder","dx","xx","yy","ap","formatBits","mask","rem","bit","right","vert","maskAt","penalty","score","count","core","add","finish","best","min","qrSvgUrl","svg","ICON_FULL","ICON_EXIT","fullNow","fullTarget","setFullTarget","canFull","noBrowserFull","browserFull","realFull","useMedia","SeekRow","interactive","axis","setDrag","fracOf","PanelSeek","GlassTransport","mini","GlassBrand","VoicesButton","MiniPlayer","transport","onShare","onFull","DIM_WORD","FullVideo","compact","noFull","page","cc","voicesBtn","sheetOpen","onSettings","paused","onTouch","isFull","setIsFull","close","calm","setCalm","touchN","setTouchN","swallow","tint","swipeFull","barsUp","setBarsUp","sheetUp","typing","keyUp","sideways","rootRef","boxW","setBoxW","small","big","calmRef","movedAt","land","subBox","subKey","reading","rowOf","shareAt","setShareAt","shareCopied","setShareCopied","shareT","shareUrl","shareQr","copyShare","shareCard","glass","lbl","grow","acts","ListenerHeader","onBack","home","subline","onOptions","optionsActive","VIDEO_D","modeOptions","DEFAULT_APP","PATH","nonce","openPopup","appUrl","onStatus","app","pop","reject","startFromEmbed","CONNECTED","wasConnected","rememberConnected","STATUS","LINK","EndCard","onStarted","onReplay","setUrl","setErr","setStatus","go","useDesk","setDesk","HINT_CODES","IDLE_DEFAULTS","useIdleControls","prefs","setPage","hint","setHint","dropHint","hintLangs","roomy","setRoomy","hintOn","hintIdx","setHintIdx","hintAt","bubble","chev","back","langList","settingsBody","shareCodeOf","file","ext","TILES","ROWS","COPIES","Cell","ProviderGrid","setSeen","setShown","io","cells","hostOf","useConnect","connect","isMedia","Backdrop","poster","yt","NOW","IdlePlayer","idle","onAct","setSmall","ConnectButton","SourceGate","onClear","StartCard","opening","setOpening","shareErr","setShareErr","inputRef","lastAuto","isLink","launch","found","submit","ErrorGate","useLookup","baseUrl","setFound","PLAYBACK_MS","onOffOf","initialOf","onOff","VocalStackPlayer","forwardRef","handle","useImperativeHandle","setCur","typed","setTyped","idlePrefs","setIdlePrefs","setTouched","idleMuted","idleChosen","gateSrc","gate","embed","PlayerBody","shared","locked","setTab","setFind","findQ","setFindQ","doFlash","setLive","setMode","settings","setSettings","subLangRef","trSeen","setPageRaw","setFull","txLang","setTxLang","askLang","labelsPref","setLabelsPref","wordsPref","setWordsPref","ccOn","setCcOn","speakOn","setSpeakOn","setCloneOn","setRemoveBg","subError","toRows","settled","liveMoving","reread","holding","langCode","by","srcName","pageTitle","hasAudio","sourceAudio","deliveryUrl","sourceStored","sealed","useSealed","audioUrl","lastRow","doneTo","audioPlayer","srcVideoUrl","ytTitle","videoLed","srcPlayer","langBusyRef","langSent","followLines","langBusy","findHits","findField","_r","_q","_t","_s","canDownload","canExport","dlLang","dlLangName","_u","download","doExport","fmt","inLang","playable","playerRef","placeKey","placeRef","autoplayDone","autoplayed","soundTip","setSoundTip","adOn","setAdOn","tryPlay","sound","unmutedNow","soundOn","toggleSound","tapPicture","sumOn","setWarm","feedLang","sharedSummary","anyExport","ytAt","_w","_v","listening","watching","pickMode","modeSwitch","pubPanel","deskStep","slowLine","lineSince","voiceFailed","_x","speakAvail","waitLangName","_y","waitState","softWait","softNote","voiceHolds","langPage","bedUrl","bed","speechUrl","speechTrack","speechOver","bgState","speaking","audioSummary","waitRetry","waitOriginal","glassChip","chipFor","posterGone","setPosterGone","fileVideo","_z","_B","_A","embedSrc","loomVid","loomFollow","fbSrc","_C","wistia","_D","vidyard","_E","embedPic","_G","_F","_I","_H","_K","_J","_M","_L","_O","_N","baseTap","thumbUrl","_Q","_P","thumbPic","subRow","seenIn","hasLang","subLang","subText","subRows","subLine","wordsOn","subAt","subWords","labelsOn","settingsOut","settingsKey","subLook","linkCopied","setLinkCopied","expBusy","setExpBusy","expDone","setExpDone","expT","shareAtUrl","startAt","startSeek","startEarly","seekTo","onPlayback","playbackLang","cb","shareHere","exportRow","subsBack","sheetTitle","pageBody","settingsSheet","fullEl","progressBox","gonePanel","toast","pubTransport","deskScrub","dp","_R","holdPct","tabPct","onProgress","endDismissed","setEndDismissed","endCard","endPill","deskAudio","sideOn","widget","setSt","SiteIcon","tinted"],"mappings":"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"}