HomePilot Deploy Bot commited on
test(hf): mobile-first responsive login (static mobile / premium desktop)
Browse files- .gitattributes +4 -4
- frontend/.cache-bust +1 -1
- frontend/src/ui/components/AuthScreen.tsx +56 -22
- frontend/tsconfig.tsbuildinfo +1 -0
.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 |
-
*.
|
| 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 |
-
*.
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 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
|
| 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 {
|
| 972 |
-
.hp-auth .right {
|
| 973 |
-
.hp-auth .left {
|
| 974 |
-
|
| 975 |
-
|
| 976 |
-
|
| 977 |
-
.hp-auth .
|
| 978 |
-
.hp-auth .
|
| 979 |
-
.hp-auth .
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 980 |
}
|
| 981 |
@media (max-width:520px) {
|
| 982 |
-
.hp-auth h1 { font-size:
|
| 983 |
-
.hp-auth .sub { font-size:
|
| 984 |
-
.hp-auth .
|
| 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"}
|