HomePilot Deploy Bot commited on
Commit
cf4acb3
·
unverified ·
1 Parent(s): c0a78c2

test(hf): mobile-first responsive login (static mobile / premium desktop)

Browse files
.gitattributes CHANGED
@@ -1,9 +1,9 @@
1
- *.svg filter=lfs diff=lfs merge=lfs -text
2
  *.woff2 filter=lfs diff=lfs merge=lfs -text
3
- *.ico filter=lfs diff=lfs merge=lfs -text
4
- *.hpersona filter=lfs diff=lfs merge=lfs -text
5
  *.jpg filter=lfs diff=lfs merge=lfs -text
6
  *.jpeg filter=lfs diff=lfs merge=lfs -text
7
  *.webp filter=lfs diff=lfs merge=lfs -text
 
8
  *.woff filter=lfs diff=lfs merge=lfs -text
9
- *.png filter=lfs diff=lfs merge=lfs -text
 
 
 
1
  *.woff2 filter=lfs diff=lfs merge=lfs -text
2
+ *.png filter=lfs diff=lfs merge=lfs -text
 
3
  *.jpg filter=lfs diff=lfs merge=lfs -text
4
  *.jpeg filter=lfs diff=lfs merge=lfs -text
5
  *.webp filter=lfs diff=lfs merge=lfs -text
6
+ *.svg filter=lfs diff=lfs merge=lfs -text
7
  *.woff filter=lfs diff=lfs merge=lfs -text
8
+ *.ico filter=lfs diff=lfs merge=lfs -text
9
+ *.hpersona filter=lfs diff=lfs merge=lfs -text
frontend/.cache-bust CHANGED
@@ -1 +1 @@
1
- 1783184667
 
1
+ 1783198747
frontend/src/ui/components/AuthScreen.tsx CHANGED
@@ -255,8 +255,17 @@ export default function AuthScreen({
255
  useEffect(() => {
256
  const canvas = canvasRef.current
257
  if (!canvas) return
258
- const cv: HTMLCanvasElement = canvas
 
 
 
 
259
  const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches
 
 
 
 
 
260
 
261
  function fit(c: HTMLCanvasElement) {
262
  const rect = c.getBoundingClientRect()
@@ -280,6 +289,7 @@ export default function AuthScreen({
280
  }))
281
  let frame = 0
282
  let raf = 0
 
283
 
284
  function draw() {
285
  const { ctx, width, height } = state
@@ -321,15 +331,22 @@ export default function AuthScreen({
321
  ctx.fill()
322
  ctx.shadowBlur = 0
323
  }
324
- if (!reduceMotion) raf = requestAnimationFrame(draw)
325
  }
326
 
327
  function onResize() { state = fit(cv) }
 
 
 
 
 
328
  window.addEventListener('resize', onResize)
 
329
  draw()
330
 
331
  return () => {
332
  window.removeEventListener('resize', onResize)
 
333
  if (raf) cancelAnimationFrame(raf)
334
  }
335
  }, [])
@@ -471,8 +488,8 @@ export default function AuthScreen({
471
  </div>
472
 
473
  <div className="signup-link-row">
474
- New to HomePilot?
475
- <button type="button" id="openSignup" onClick={openSignup}>Create account</button>
476
  </div>
477
  </form>
478
  </div>
@@ -548,8 +565,8 @@ export default function AuthScreen({
548
  <section className="account-dialog" role="dialog" aria-modal="true" aria-labelledby="signupTitle">
549
  <header className="account-header">
550
  <div className="account-title">
551
- <h2 id="signupTitle">Create Account</h2>
552
- <p>Create a local HomePilot account. You can add a password now or keep it passwordless for a local-only setup.</p>
553
  </div>
554
  <button className="modal-close" type="button" aria-label="Close create account dialog" onClick={closeSignup}>
555
  <svg viewBox="0 0 24 24" width="20" height="20" fill="none" aria-hidden="true">
@@ -595,7 +612,7 @@ export default function AuthScreen({
595
 
596
  <div className="modal-actions">
597
  <button className="create-button" type="submit" disabled={suLoading}>
598
- {suLoading ? 'Creating account…' : 'Create Account'}
599
  </button>
600
  <p className="modal-footnote">
601
  Local accounts stay on this HomePilot instance. For team identity and sync, use <strong>Continue with OllaBridge</strong>.
@@ -967,24 +984,41 @@ const CSS = `
967
  .hp-auth .info-body a { color:#a78bfa; text-decoration:none; font-weight:650; }
968
  .hp-auth .info-body a:hover { text-decoration:underline; }
969
 
 
 
 
 
970
  @media (max-width:980px) {
971
- .hp-auth .page { grid-template-columns:1fr; }
972
- .hp-auth .right { min-height:390px; order:-1; border-bottom:1px solid rgba(255,255,255,.06); }
973
- .hp-auth .left { min-height:auto; border-right:0; padding:24px; }
974
- .hp-auth .brand { width:205px; height:62px; }
975
- .hp-auth .form { margin:46px auto 76px; transform:none; }
976
- .hp-auth .pill { margin-bottom:34px; }
977
- .hp-auth .stage { width:min(82vw,500px); height:min(82vw,500px); }
978
- .hp-auth .build-wave { width:min(96vw,640px); height:260px; }
979
- .hp-auth .chip { display:none; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
980
  }
981
  @media (max-width:520px) {
982
- .hp-auth h1 { font-size:38px; }
983
- .hp-auth .sub { font-size:18px; }
984
- .hp-auth .primary { min-height:58px; font-size:16px; }
985
- .hp-auth .field input { height:58px; }
986
- .hp-auth .links { align-items:flex-start; flex-direction:column; }
987
- .hp-auth .pill { font-size:13px; }
988
  }
989
  @media (prefers-reduced-motion: reduce) {
990
  .hp-auth *, .hp-auth *::before, .hp-auth *::after {
 
255
  useEffect(() => {
256
  const canvas = canvasRef.current
257
  if (!canvas) return
258
+ // Only run the starfield where it belongs: large screens, motion allowed,
259
+ // and not in data-saver mode. On phones/tablets the animated right panel is
260
+ // hidden (CSS) AND the canvas is never initialized here — no GPU/battery
261
+ // cost, faster first paint. Matches the < 980px layout collapse below.
262
+ const bigScreen = window.matchMedia('(min-width: 980px)').matches
263
  const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches
264
+ const saveData = Boolean(
265
+ (navigator as unknown as { connection?: { saveData?: boolean } }).connection?.saveData,
266
+ )
267
+ if (!bigScreen || reduceMotion || saveData) return
268
+ const cv: HTMLCanvasElement = canvas
269
 
270
  function fit(c: HTMLCanvasElement) {
271
  const rect = c.getBoundingClientRect()
 
289
  }))
290
  let frame = 0
291
  let raf = 0
292
+ let running = true
293
 
294
  function draw() {
295
  const { ctx, width, height } = state
 
331
  ctx.fill()
332
  ctx.shadowBlur = 0
333
  }
334
+ raf = running ? requestAnimationFrame(draw) : 0
335
  }
336
 
337
  function onResize() { state = fit(cv) }
338
+ // Stop drawing while the tab is backgrounded; resume on return.
339
+ function onVisibility() {
340
+ running = !document.hidden
341
+ if (running && !raf) raf = requestAnimationFrame(draw)
342
+ }
343
  window.addEventListener('resize', onResize)
344
+ document.addEventListener('visibilitychange', onVisibility)
345
  draw()
346
 
347
  return () => {
348
  window.removeEventListener('resize', onResize)
349
+ document.removeEventListener('visibilitychange', onVisibility)
350
  if (raf) cancelAnimationFrame(raf)
351
  }
352
  }, [])
 
488
  </div>
489
 
490
  <div className="signup-link-row">
491
+ New to this device?
492
+ <button type="button" id="openSignup" onClick={openSignup}>Create local account</button>
493
  </div>
494
  </form>
495
  </div>
 
565
  <section className="account-dialog" role="dialog" aria-modal="true" aria-labelledby="signupTitle">
566
  <header className="account-header">
567
  <div className="account-title">
568
+ <h2 id="signupTitle">Create Local Account</h2>
569
+ <p>Create a local HomePilot account on this device. You can add a password now or keep it passwordless for a local-only setup.</p>
570
  </div>
571
  <button className="modal-close" type="button" aria-label="Close create account dialog" onClick={closeSignup}>
572
  <svg viewBox="0 0 24 24" width="20" height="20" fill="none" aria-hidden="true">
 
612
 
613
  <div className="modal-actions">
614
  <button className="create-button" type="submit" disabled={suLoading}>
615
+ {suLoading ? 'Creating account…' : 'Create Local Account'}
616
  </button>
617
  <p className="modal-footnote">
618
  Local accounts stay on this HomePilot instance. For team identity and sync, use <strong>Continue with OllaBridge</strong>.
 
984
  .hp-auth .info-body a { color:#a78bfa; text-decoration:none; font-weight:650; }
985
  .hp-auth .info-body a:hover { text-decoration:underline; }
986
 
987
+ /* Tablet + mobile (< 980px): fast, static, single-column login. The animated
988
+ right panel is hidden and the starfield canvas is never initialized (same
989
+ 980px threshold as the canvas effect guard) — login-first, low battery, big
990
+ thumb targets. 100dvh (not 100vh) so mobile browser chrome can't clip it. */
991
  @media (max-width:980px) {
992
+ .hp-auth .page { display:block; min-height:100dvh; }
993
+ .hp-auth .right { display:none; }
994
+ .hp-auth .left {
995
+ min-height:100dvh; border-right:0;
996
+ padding:max(24px, env(safe-area-inset-top)) 22px max(28px, env(safe-area-inset-bottom));
997
+ }
998
+ .hp-auth .brand { width:200px; height:60px; }
999
+ .hp-auth .form { margin:30px auto 34px; transform:none; }
1000
+ .hp-auth .pill { margin-bottom:28px; font-size:13px; }
1001
+ .hp-auth h1 { font-size:clamp(34px, 9vw, 44px); }
1002
+ .hp-auth .sub { margin:14px auto 30px; font-size:17px; }
1003
+ /* WCAG 2.2 target sizing — 56px controls, >=44px tap links. */
1004
+ .hp-auth .primary, .hp-auth .local { min-height:56px; }
1005
+ .hp-auth .field input { height:56px; }
1006
+ .hp-auth .linkbtn { min-height:44px; }
1007
+
1008
+ /* Create-account modal becomes a bottom sheet on phones/tablets. */
1009
+ .hp-auth .account-modal { align-items:end; padding:0; }
1010
+ .hp-auth .account-dialog {
1011
+ width:100%; max-width:100%; max-height:92dvh;
1012
+ border-radius:24px 24px 0 0; transform:translateY(100%);
1013
+ }
1014
+ .hp-auth .account-modal.is-open .account-dialog { transform:translateY(0); }
1015
+ .hp-auth .account-form { padding-bottom:max(24px, env(safe-area-inset-bottom)); }
1016
+ .hp-auth .create-button { min-height:56px; }
1017
  }
1018
  @media (max-width:520px) {
1019
+ .hp-auth h1 { font-size:34px; }
1020
+ .hp-auth .sub { font-size:16px; }
1021
+ .hp-auth .links { align-items:flex-start; flex-direction:column; gap:12px; }
 
 
 
1022
  }
1023
  @media (prefers-reduced-motion: reduce) {
1024
  .hp-auth *, .hp-auth *::before, .hp-auth *::after {
frontend/tsconfig.tsbuildinfo ADDED
@@ -0,0 +1 @@
 
 
1
+ {"root":["./vite.config.ts","./app/page.tsx","./app/chat/page.tsx","./app/sessions/page.tsx","./app/settings/page.tsx","./app/uploads/page.tsx","./components/ChatWindow.tsx","./components/Composer.tsx","./components/FileUpload.tsx","./components/MessageList.tsx","./components/SourcePanel.tsx","./components/ToolTracePanel.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/agentic/ConnectionsPanel.tsx","./src/agentic/types.ts","./src/agentic/useAgenticCatalog.ts","./src/shared/types.ts","./src/test/setup.ts","./src/ui/AboutDialog.tsx","./src/ui/Animate.tsx","./src/ui/App.tsx","./src/ui/CallOverlay.tsx","./src/ui/CommunityGallery.tsx","./src/ui/CreatorStudioEditor.tsx","./src/ui/CreatorStudioHost.tsx","./src/ui/CreatorStudioSettings.tsx","./src/ui/ImageViewer.tsx","./src/ui/Imagine.tsx","./src/ui/Interactive.tsx","./src/ui/InteractiveEditor.tsx","./src/ui/InteractiveHost.tsx","./src/ui/InteractivePlayer.tsx","./src/ui/Models.tsx","./src/ui/OllamaHealthBanner.tsx","./src/ui/PersonaImportExport.tsx","./src/ui/PersonaWizard.tsx","./src/ui/ProfileSettingsModal.tsx","./src/ui/ProjectsView.tsx","./src/ui/SettingsPanel.tsx","./src/ui/Studio.tsx","./src/ui/SystemResourcesCard.tsx","./src/ui/SystemStatusDialog.tsx","./src/ui/Typewriter.tsx","./src/ui/VoiceMode.tsx","./src/ui/VoiceModeGrok.tsx","./src/ui/VoiceModeLegacy.tsx","./src/ui/VoicePanel.tsx","./src/ui/VoicePanelLegacy.tsx","./src/ui/api.ts","./src/ui/communityApi.ts","./src/ui/inventoryApi.ts","./src/ui/localeData.ts","./src/ui/modelPresets.ts","./src/ui/personaApi.ts","./src/ui/personaPortability.ts","./src/ui/personaTypes.ts","./src/ui/profileApi.ts","./src/ui/resolveFileUrl.ts","./src/ui/systemApi.ts","./src/ui/systemResourcesApi.ts","./src/ui/types.ts","./src/ui/useAvatarCapabilities.ts","./src/ui/agentic/intent.ts","./src/ui/avatar/AvatarGallery.tsx","./src/ui/avatar/AvatarGeneratingLoader.tsx","./src/ui/avatar/AvatarLandingPage.tsx","./src/ui/avatar/AvatarOrbitViewer.tsx","./src/ui/avatar/AvatarSettingsPanel.tsx","./src/ui/avatar/AvatarStageQuickTools.tsx","./src/ui/avatar/AvatarStudio.tsx","./src/ui/avatar/AvatarViewPackPanel.tsx","./src/ui/avatar/AvatarViewer.tsx","./src/ui/avatar/OutfitPanel.tsx","./src/ui/avatar/SaveAsPersonaModal.tsx","./src/ui/avatar/avatarApi.ts","./src/ui/avatar/avatarPrompt.ts","./src/ui/avatar/galleryTypes.ts","./src/ui/avatar/index.ts","./src/ui/avatar/personaBridge.ts","./src/ui/avatar/types.ts","./src/ui/avatar/useAvatarCapabilities.ts","./src/ui/avatar/useAvatarGallery.ts","./src/ui/avatar/useAvatarPacks.ts","./src/ui/avatar/useGenerateAvatars.ts","./src/ui/avatar/useGenerateHybridBody.ts","./src/ui/avatar/useOutfitGeneration.ts","./src/ui/avatar/useViewPackGeneration.ts","./src/ui/avatar/vibeTabPersistence.ts","./src/ui/avatar/viewPack.ts","./src/ui/avatar/creator/CharacterCreatorStudio.tsx","./src/ui/avatar/creator/CharacterStage.tsx","./src/ui/avatar/creator/FaceFilmstrip.tsx","./src/ui/avatar/creator/IdentityLibrary.tsx","./src/ui/avatar/creator/OutfitLibrary.tsx","./src/ui/avatar/creator/index.ts","./src/ui/avatar/creator/presets/workflows.ts","./src/ui/avatar/wizard/CharacterWizard.tsx","./src/ui/avatar/wizard/index.ts","./src/ui/avatar/wizard/professionRegistry.ts","./src/ui/avatar/wizard/wizardTypes.ts","./src/ui/call/bargeIn.ts","./src/ui/call/callApi.ts","./src/ui/call/callSocket.ts","./src/ui/call/log.ts","./src/ui/call/streamTts.ts","./src/ui/call/useCallSession.ts","./src/ui/components/AccountMenu.tsx","./src/ui/components/AgentIntentTiles.tsx","./src/ui/components/AgentSettingsPanel.tsx","./src/ui/components/AuthGate.tsx","./src/ui/components/AuthScreen.tsx","./src/ui/components/AvatarUploader.tsx","./src/ui/components/ChatEmptyState.tsx","./src/ui/components/ChatSettingsPopover.tsx","./src/ui/components/ConfirmForgetDialog.tsx","./src/ui/components/CreatorExportWizard.tsx","./src/ui/components/InventoryView.tsx","./src/ui/components/MessageMarkdown.tsx","./src/ui/components/OnboardingWizard.tsx","./src/ui/components/PersonaDocumentsPanel.tsx","./src/ui/components/PersonaSettingsPanel.tsx","./src/ui/components/SecurityTab.tsx","./src/ui/components/TtsEngineSection.tsx","./src/ui/components/UserAvatar.tsx","./src/ui/components/ViewPackViewer.tsx","./src/ui/edit/ActionFeedback.tsx","./src/ui/edit/BackgroundTools.tsx","./src/ui/edit/EditDropzone.tsx","./src/ui/edit/EditHistoryStrip.tsx","./src/ui/edit/EditResultGrid.tsx","./src/ui/edit/EditTab.tsx","./src/ui/edit/FaceSwapRefInput.tsx","./src/ui/edit/IdentityTools.tsx","./src/ui/edit/LoraManager.tsx","./src/ui/edit/MaskCanvas.tsx","./src/ui/edit/OutpaintTools.tsx","./src/ui/edit/QuickActions.tsx","./src/ui/edit/editApi.ts","./src/ui/edit/index.ts","./src/ui/edit/types.ts","./src/ui/enhance/backgroundApi.ts","./src/ui/enhance/capabilitiesApi.ts","./src/ui/enhance/enhanceApi.ts","./src/ui/enhance/identityApi.ts","./src/ui/enhance/outpaintApi.ts","./src/ui/enhance/upscaleApi.ts","./src/ui/interactive/AnalyticsPanel.tsx","./src/ui/interactive/BottomSheet.tsx","./src/ui/interactive/CatalogPanel.tsx","./src/ui/interactive/ExpertLogPanel.tsx","./src/ui/interactive/GeneratingPanel.tsx","./src/ui/interactive/GraphPanel.tsx","./src/ui/interactive/LiveActionSheet.tsx","./src/ui/interactive/PublishPanel.tsx","./src/ui/interactive/QAPanel.tsx","./src/ui/interactive/RulesPanel.tsx","./src/ui/interactive/StandardPlayer.tsx","./src/ui/interactive/Wizard.tsx","./src/ui/interactive/WizardAuto.tsx","./src/ui/interactive/WizardAutoPreview.tsx","./src/ui/interactive/WizardProgressOverlay.tsx","./src/ui/interactive/WizardShell.tsx","./src/ui/interactive/XPRewardsSheet.tsx","./src/ui/interactive/api.ts","./src/ui/interactive/scenePreload.ts","./src/ui/interactive/types.ts","./src/ui/interactive/ui.tsx","./src/ui/interactive/wizardProgressStore.ts","./src/ui/interactive/wizardState.ts","./src/ui/interactive/personaLiveRuntime/LiveChatPolish.tsx","./src/ui/interactive/personaLiveRuntime/RuntimeShell.tsx","./src/ui/interactive/personaLiveRuntime/index.ts","./src/ui/interactive/personaLiveRuntime/usePersonaSpeech.ts","./src/ui/interactive/wizardSteps/Step0Prompt.tsx","./src/ui/interactive/wizardSteps/Step1Audience.tsx","./src/ui/interactive/wizardSteps/Step2Branches.tsx","./src/ui/interactive/wizardSteps/Step3Policy.tsx","./src/ui/interactive/wizardSteps/Step4Review.tsx","./src/ui/lib/backendUrl.ts","./src/ui/lib/userScopedStorage.ts","./src/ui/mcp/AddServerDrawer.tsx","./src/ui/mcp/AvailableServersPanel.tsx","./src/ui/mcp/ExternalUninstallDialog.tsx","./src/ui/mcp/InstalledServerCard.tsx","./src/ui/mcp/MarketplaceSearch.tsx","./src/ui/mcp/MatrixHubCatalogPanel.tsx","./src/ui/mcp/McpServerDetailsDrawer.tsx","./src/ui/mcp/McpServersEmptyState.tsx","./src/ui/mcp/McpServersTab.tsx","./src/ui/mcp/McpSetupWizard.tsx","./src/ui/mcp/McpUninstallDialog.tsx","./src/ui/mcp/RegistryDiscoverPanel.tsx","./src/ui/mcp/ServerConfigDrawer.tsx","./src/ui/mcp/ServerDetailDrawer.tsx","./src/ui/mcp/builtinSetupGuides.ts","./src/ui/mcp/index.ts","./src/ui/mcp/setupInstructions.ts","./src/ui/mcp/useAvailableServers.ts","./src/ui/mcp/useForgeRegistry.ts","./src/ui/mcp/useInstalledServers.ts","./src/ui/mcp/useMatrixHub.ts","./src/ui/persona/voice/PersonaVoiceChip.tsx","./src/ui/persona/voice/PersonaVoiceStep.tsx","./src/ui/phone/CallEventRow.tsx","./src/ui/phone/PostCallCard.tsx","./src/ui/phone/icons.tsx","./src/ui/phone/tokens.ts","./src/ui/phone/primitives/AmbientAura.tsx","./src/ui/phone/primitives/Aura.tsx","./src/ui/phone/primitives/ControlBtn.tsx","./src/ui/phone/primitives/PhoneCallDivider.tsx","./src/ui/phone/primitives/Waveform.tsx","./src/ui/phone/primitives/index.ts","./src/ui/phone/primitives/useFocusTrap.ts","./src/ui/phone/primitives/useReducedMotion.ts","./src/ui/sessions/PersonaHubDrawer.tsx","./src/ui/sessions/SessionPanel.tsx","./src/ui/sessions/index.ts","./src/ui/sessions/sessionsApi.ts","./src/ui/studio/index.ts","./src/ui/studio/components/AgeVerificationModal.tsx","./src/ui/studio/components/ContentRatingBadge.tsx","./src/ui/studio/components/ContentRatingToggle.tsx","./src/ui/studio/components/ImageGenerator.tsx","./src/ui/studio/components/MatureStoryWizard.tsx","./src/ui/studio/components/ModelSelector.tsx","./src/ui/studio/components/PlatformBadge.tsx","./src/ui/studio/components/PolicyBadge.tsx","./src/ui/studio/components/PolicyBanner.tsx","./src/ui/studio/components/PresetCard.tsx","./src/ui/studio/components/RegenerationOptions.tsx","./src/ui/studio/components/SceneChips.tsx","./src/ui/studio/components/StatusBadge.tsx","./src/ui/studio/components/StudioActions.tsx","./src/ui/studio/components/StudioEmptyState.tsx","./src/ui/studio/components/StudioPreviewPanel.tsx","./src/ui/studio/components/index.ts","./src/ui/studio/components/TVMode/TVModeChapterTransition.tsx","./src/ui/studio/components/TVMode/TVModeContainer.tsx","./src/ui/studio/components/TVMode/TVModeControls.tsx","./src/ui/studio/components/TVMode/TVModeEndScreen.tsx","./src/ui/studio/components/TVMode/TVModePlayer.tsx","./src/ui/studio/components/TVMode/TVModeSettings.tsx","./src/ui/studio/components/TVMode/index.ts","./src/ui/studio/components/TVMode/types.ts","./src/ui/studio/hooks/useTTSPlayback.ts","./src/ui/studio/stores/studioStore.ts","./src/ui/studio/stores/tvModeStore.ts","./src/ui/studio/styles/index.ts","./src/ui/studio/styles/themes.ts","./src/ui/teams/BridgeStatusPanel.tsx","./src/ui/teams/CreateSessionWizard.tsx","./src/ui/teams/DocumentsPanel.tsx","./src/ui/teams/JoinMeetingWizard.tsx","./src/ui/teams/MeetingLeftRail.tsx","./src/ui/teams/MeetingOverflowStrip.tsx","./src/ui/teams/MeetingPlayMode.tsx","./src/ui/teams/MeetingRightRail.tsx","./src/ui/teams/MeetingRoom.tsx","./src/ui/teams/MeetingRoomV2.tsx","./src/ui/teams/MeetingVoiceSettings.tsx","./src/ui/teams/PersonaProfilePanel.tsx","./src/ui/teams/PersonaSelectorEnterprise.tsx","./src/ui/teams/PersonaVoicePicker.tsx","./src/ui/teams/TeamsLandingPage.tsx","./src/ui/teams/TeamsSettingsDrawer.tsx","./src/ui/teams/TeamsView.tsx","./src/ui/teams/index.ts","./src/ui/teams/teamBundles.ts","./src/ui/teams/types.ts","./src/ui/teams/useBridge.ts","./src/ui/teams/useMeetingTts.ts","./src/ui/teams/usePersonaVoices.ts","./src/ui/teams/useTeamsDocuments.ts","./src/ui/teams/useTeamsRooms.ts","./src/ui/tools/ToolCard.tsx","./src/ui/tools/ToolDetailDrawer.tsx","./src/ui/tools/ToolStatusBadge.tsx","./src/ui/tools/ToolsEmptyState.tsx","./src/ui/tools/ToolsGrid.tsx","./src/ui/tools/ToolsTab.tsx","./src/ui/tools/index.ts","./src/ui/tools/toolBadges.ts","./src/ui/tools/useToolsInventory.ts","./src/ui/tts/index.ts","./src/ui/tts/piperTts.ts","./src/ui/tts/piperVoices.ts","./src/ui/tts/shimSpeechService.ts","./src/ui/tts/core/context.tsx","./src/ui/tts/core/registry.ts","./src/ui/tts/core/types.ts","./src/ui/tts/providers/piper/mirror.ts","./src/ui/tts/providers/piper/provider.ts","./src/ui/tts/providers/webSpeech/provider.ts","./src/ui/voice/PersonalityList.tsx","./src/ui/voice/SettingsModal.tsx","./src/ui/voice/SpeedSlider.tsx","./src/ui/voice/Starfield.tsx","./src/ui/voice/VoiceGrid.tsx","./src/ui/voice/VoiceSettingsPanel.tsx","./src/ui/voice/conversationStrategy.ts","./src/ui/voice/index.ts","./src/ui/voice/personalities.ts","./src/ui/voice/personalityCaps.ts","./src/ui/voice/personalityGating.ts","./src/ui/voice/textNormalize.tsx","./src/ui/voice/useVoiceController.ts","./src/ui/voice/vad.ts","./src/ui/voice/voices.ts"],"version":"5.9.3"}