From 1cf940c7dd3e0558b77bc930f9cb417f94f6aed0 Mon Sep 17 00:00:00 2001 From: ReaperOfVeriod Date: Sun, 25 Oct 2026 05:50:08 +0100 Subject: [PATCH] Add dedicated collaboration dashboard --- src/App.svelte | 22 +++++++++++++++++++++- src/styles.css | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/App.svelte b/src/App.svelte index ce3595a..ac126b8 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -1106,7 +1106,7 @@
◇TRIXIE
@@ -1190,6 +1190,26 @@
{commandFormId ? 'EDIT COMMAND' : 'NEW COMMAND'}
BOT COMMANDS
PUBLIC COMMAND CATALOG
{#if botCommandError}
{botCommandError}
{:else if botCommands.length}
{#each botCommands as command}
!{command.name}{command.description}{#if command.tags.length}
{command.tags.join(' · ')}
{/if}
{command.permission_level.toUpperCase()}{#if command.cooldown_seconds}{command.cooldown_seconds}s / {command.cooldown_scope}{/if}
{/each}
{:else}
No enabled commandsCreate commands on the server to make them available here.
{/if}
SECRETS MANAGEMENT
Values are encrypted and cannot be read after saving.
{#if botSecrets.length}
{#each botSecrets as secret}
{secret.name}{secret.description || 'No description'}{#if secret.used_by.length}
USED BY: {secret.used_by.join(', ')}
{/if}
{/each}
{:else}
There are no secrets yet.
{/if}{#if secretError}
{secretError}
{/if}
COMMAND MANAGEMENT
{#each botCommands as command}
!{command.name}{command.enabled ? 'ENABLED' : 'DISABLED'} · {command.permission_level.toUpperCase()}
{/each}{#if !botCommands.length}
No commands are configured yet.
{/if}
+ {:else if activeView === 'Collaboration'} + {#if collaborationSession} +
+
ACTIVE COLLABORATION{collaborationSession.guests.length} GUESTS
+
+
GUEST STAR CALL
The call is controlled by Twitch

Twitch does not expose the call media as an embeddable Trixie API. Use Twitch for the live call controls while Trixie keeps the session, slots, invites, and shared-chat state synchronized.

+
PARTICIPANTS
{#each collaborationSession.guests as guest}
{guest.user_display_name || guest.user_id}{guest.is_live ? 'LIVE' : 'WAITING'}{guest.slot_id ? ` · SLOT ${guest.slot_id}` : ''}
{:else}
No participants have joined.
{/each}
SHARED CHAT
{#if sharedChatSession}
ACTIVE · {sharedChatSession.participants.length} CHANNELS
{:else}
Shared Chat is not active.
{/if}
+
+ {#if collaborationError}
{collaborationError}
{/if} +
+ {:else} +
+
COLLABORATIONSEARCH OR REVIEW INCOMING
+
+
FIND A COLLABORATOR
searchCollaborators(event.currentTarget.value)} autocomplete="off" placeholder="Search Twitch" />
{#if collaboratorSearchBusy}
SEARCHING TWITCH…
{/if}{#if collaboratorSearchError}
{collaboratorSearchError}
{/if}{#if collaboratorResults.length}
{#each collaboratorResults as result}
{result.display_name} @{result.login}
{/each}
{:else if collaboratorSearch && !collaboratorSearchBusy && !collaboratorSearchError}
No exact Twitch user found.
{/if}
FAVORITES & RECENT
{#if collaborators.length}
{#each collaborators as collaborator}
{collaborator.display_name}{collaborator.favorite ? 'FAVORITE' : 'RECENT'}
{/each}
{:else}
No saved collaborators yet.
{/if}
+
INCOMING INVITATIONS
⌁
Waiting for a collaboration inviteAccept or decline invitations in Twitch. Trixie will reflect the authoritative status here when Twitch reports it.
+
+ {#if collaborationError}
{collaborationError}
{/if} +
+ {/if} {:else if activeView === 'Overlays'}
OVERLAYS
{#if selectedOverlayId || overlayName}
LIVE PREVIEW
{#if overlayError}
{overlayError}
{/if}{:else}
Select or create an overlayDrafts autosave when explicitly saved; publishing controls the browser source.
{/if}
{:else if activeView === 'Settings'} diff --git a/src/styles.css b/src/styles.css index 5d1e6d1..bb42a5c 100644 --- a/src/styles.css +++ b/src/styles.css @@ -961,3 +961,49 @@ label { font-family: var(--font-mono); font-size: 0.8rem; } + +.collaboration-page { + min-height: 0; +} +.collaboration-idle-grid, +.collaboration-active-grid { + display: grid; + grid-template-columns: minmax(0, 1.35fr) minmax(280px, 0.65fr); + gap: 1px; + background: var(--ui-divider); +} +.collaboration-search-panel, +.collaboration-incoming-panel, +.collaboration-call-placeholder, +.collaboration-state-panel { + min-height: 360px; + padding: 18px; + background: var(--ui-surface); +} +.collaboration-call-placeholder { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; +} +.collaboration-call-placeholder .settings-note { + max-width: 560px; +} +.collaboration-state-panel { + display: flex; + flex-direction: column; + gap: 8px; +} +.collaboration-subheading { + margin-top: 18px; +} +.collaboration-state-panel .danger { + margin-top: auto; +} +@media (max-width: 900px) { + .collaboration-idle-grid, + .collaboration-active-grid { + grid-template-columns: 1fr; + } +}