release: 1.22.1 - #139
Merged
Merged
Conversation
- ProjectionHost: beforeunload com diálogo nativo (evita fechamento acidental) - mediaStore: watcher da projeção chama close() — janela fechada = áudio para (não toca mais em segundo plano)
…teste - desktop-bridge: RemoteApi, RemoteBridgeMessage, RemotePairingInfo, media.probeDuration; remote? no LouvorJaBridge - liturgy-bridge: tipa router/channel/payload/msg; valida player.setMode contra MediaPlaybackMode; remoteSetVolume normaliza retorno p/ boolean - RemotePairingView: usa RemotePairingInfo (clientAddress opcional) - useLiturgyStore: expõe setItemDurationMs no return (uso no composable) - sections: 'remote' em SettingsSectionId - @types/qrcode (P2pPairingView) - timer-store-integration: mocka isDesktopApp + useProjectionWindow (node não tem localStorage)
- Add StageSettings model matching APK schema - Add useStageSettingsStore with scope inheritance - Add stage-settings-preferences persistence layer - Add stage-settings-runtime service for projection popups - Add useStageSettings composable - Add StageCustomizationCard.vue UI - Add StagePreview.vue (16:9 preview) - Integrate into BibleProjectionView, MediaProjectionView, RandomProjectionView - Add 12 official background images - Add storage keys for stage settings - Add i18n translations (pt-BR, en, es) - Add unit tests - Fix locale parity by adding keys to module locales (not root) Base: staging Implements web-to-desktop replication of feat/stage-customization
Timer agora responde às personalizações de palco (bg, imagem, alinhamento) igual aos demais módulos, via subscribeStageSettings/readEffectiveStageSettings (scope timer). Remove o bgColor hardcoded do surfaceStyle.
Relógio e contagem regressiva agora herdam/respondem às personalizações de palco (bg, imagem de fundo, alinhamento) igual aos demais módulos, via subscribeStageSettings/readEffectiveStageSettings. Remove o bgColor hardcoded do surfaceStyle.
…Countdown - ClockPreview/TimerPreview/CountdownPreview: background transparente sempre (quem pinta o fundo é o StageSettings; bgColor legado não cobre mais o stage) - ClockView/TimerView/CountdownView: preview do widget aplica stageBg (cor + imagem oficial, cover/center) reativo via subscribeStageSettings - CountdownView redesign: widget aspect-ratio 21/9 (padrão do grupo de tempo), CountdownDurationInput compacto como overlay no topo do preview - CountdownDurationInput: prop compact (HH:MM:SS inline sem cabeçalho)
…do escopo Atalho contextual (decisão UX duas camadas): o botão de paleta de Clock/Timer/Countdown agora abre o mesmo StageCustomizationCard de /config, já selecionado na tab daquele módulo. Dialogs legados de bgColor/textColor saem do fluxo (deprecados). - StageCustomizationCard: prop initialScope - StageCustomizationDialog: novo dialog genérico (backdrop, ESC, scroll)
A paleta de Clock/Timer/Countdown não lista mais global + todos os módulos — personaliza apenas o módulo de origem. /config mantém todas as tabs (fluxo completo de padrões).
StageSettings ganha sub-objetos opcionais por módulo — ADICIONAM sem
subscrever a base herdada do global:
- clock: { style (digital/analógico), showSeconds, format24h }
- timer: { timeFormat }
- countdown: { timeFormat }
- Card: seção 'Características deste módulo' quando o escopo ativo é
clock/timer/countdown (mesmos controles dos dialogs legados)
- Views (main + projeção): effectiveConfig = config legado + sub-objeto
do stage (fonte única aos poucos; configs legados mantidos como
fallback para o que ainda não migrou)
- parse/serialize simétricos (chaves clock/timer/countdown no JSON)
- Locale pt-BR/en/es (desktop); pt-BR (web, padrão do repo)
Validado CDP: format24h=false → relógio reage com AM em tempo real
Cada módulo com projeção tem seu botão de paleta (StagePaletteButton) que abre o StageCustomizationDialog apenas no escopo daquele módulo — o padrão global fica só em /config (mesmo modelo do APK): - Bible, Liturgy, Media (hymns), Random: FAB novo no canto superior - Random: características próprias migradas pro StageSettings (fontSizePc, textTransform, animationSpeed) — seção no card + effectiveConfig nas views (dialog legado deprecado) Validado CDP: FAB presente nas 4 telas; dialog do Sorteio com seção 'Características deste módulo' + 'Velocidade da animação'
…ica nos módulos ProjectionView usa only-scope=global (tabs somem com 1 opção só). Paridade APK: settings = padrão; cada módulo personaliza a si.
…mbutido + bridge hinos + remote namespace palco
- electron/palco-server.mjs: paridade com PalcoSender APK (protocolo v2,
broadcast + replay de estado + scan /status + serve de mídia)
- electron/palco/: receiver oficial servido em :7080 (TV browser fallback)
- PalcoCard: toggle/status/URL em /settings/projection
- palco-session: traduz StageSettings efetivo (escopo) → projection v2
- palco-bridge: espelha media runtime (hinos) na TV
- remote: namespace palco.{on,off,project,idle} (web/APK comandam o desktop)
E2E validado: HTTP 200 /status, WS receiver recebe youare/idle/projection,
receiver renderiza verso com rodapé (screenshot verificado).
- palco-server: /bg/:id.png serve dist/assets/bg-XX-<hash>.png; /proxy?url= implementado (receiver roda em origem local e faz proxy de TODO http — antes só existia no comentário) - palco-session: class + resolveBgUrl → URL absoluta http://ip:7080/bg/; método audio() (url/title/cover/positionMs/action) - palco-bridge: sincroniza áudio (URL nova → play+position; mesmo URL → pos throttled 3s; pause) E2E: /bg/bg-01.png 200 (1.9MB), /proxy 200, receiver renderizou verso com bg de partitura + rodapé (screenshot validado).
- palco-server: IPC palco:serve-path — lê arquivo local (file://, path,
local://media/<tipo>/<arquivo> do workspace) e publica em /media/
(paridade serveMedia do APK)
- preload: expõe servePath
- palco-session.audio(): resolve url/cover locais → /media/; http segue direto
- palco-bridge: watch de seek (>2s salto → action:seek) e fechamento do
player (action:stop); play/pause/posição já sincronizados (throttle 3s)
E2E: servePath('/tmp/test-tone.mp3') → http://ip:7080/media/local_...mp3;
receiver <audio> paused:false, currentTime avançando — tocando.
… manual) Regra: receiver.html sempre sincronizado com palco-receiver (3 pontos: repo oficial, desktop embutido, dirs tizen/androidtv).
palco-bridge reescrita — paridade StageSession APK: - Owner-based: último módulo ativo é o dono do palco; ao fechar, anterior assume ou idle - media (hinos c/ bg+cover), bible (texto+ref), random (display), timer (chrono), countdown (remaing), clock (15s tick) — todos os canais/storage das views de projeção espelhados - palcoClockOn/Off export pro módulo clock wirear Rota de áudio (routesToTv APK): - useMediaStore.audioOnTv + setAudioOnTv: liga → local silencia/pausa, TV assume da posição; desliga → local retoma - palco-bridge: rota TV = comanda só a TV; rota local = espelho sync 3s - MediaPlayerPill: botão alto-falante (som na TV ↔ computador) - locales pt-BR/en/es
- palco-server: PalcoManager + slots independentes (7080/81, 7082/83...) com HTTP/WS/mídia/replay/status próprios - preload/session: slots CRUD, seleção de slot e projectRouted - palco-routing: mirror ou slot individual persistido por módulo - PalcoSlotsCard: cadastra TVs, liga/desliga, seleciona TV ativa - PalcoRouteSelect integrado em Bíblia, Liturgia, Random, Clock, Timer, Countdown: Espelhar todas ou TV individual - áudio mantém alvo único (igual APK); conteúdo visual pode divergir Validação: type-check 0, 260/260 testes, build OK, E2E multi-slot PASS (TV principal recebeu TV PRINCIPAL; slot 7082 recebeu TV 2 INDIVIDUAL).
…icionado - locales: tvs/route/mirror/selected/etc entraram dentro de settings.general por anchor errado — movidas p/ settings.palco nos 3 idiomas (causa das chaves cruas tipo settings.palco.tvs) - StagePaletteButton: FAB topo-direita → inferior-direita acima do dock (não compete com toolbars nem com o seletor de destino do palco) Validado ao vivo (CDP+screenshot): textos traduzidos, FAB sem overlap.
…jetar StagePaletteButton ganha prop rightOffset; Bíblia usa 76px (botão Projetar 64px + gap). Validado via CDP+screenshot: sem overlap.
palco-server injeta window.__PALCO_APPV__ ao servir o receiver — a linha de versão mostra a versão real do app desktop (1.17.5), nunca fixa. Splash JPG já sincronizada.
…emovido O replace do splash comeu o </div>: todo o body (idle incluído) virava filho do splash e era removido junto após 2.5s → tela preta sem idle nem versão. Fechado + cascade __PALCO_APPV__ re-aplicada nos 5 arquivos. E2E: splash some (opacity 0), idle visível com logo/wordmark/barras, versão v1.17.5 dinâmica — screenshot validado.
…em visitar Configurações A palco-bridge só iniciava quando o PalcoCard montava (Configurações → Projeção). Operador na Home/player = nada ia pra TV mesmo com sender on. Agora sobe no onMounted do App.vue (janela principal, não projeção). E2E: liga palco → receiver fake WS → post hino no canal → TV recebe projection com texto + bg oficial + estilos (PASS).
1. serve-path: import './workspace.mjs' (basic-ftp/net) falhava no
dynamic import dentro do slot → local://media/... nunca resolvia.
Trocado por './paths.mjs' (só resolveMediaDirectory).
2. resolveBgUrl: agora resolve local:// (capas/slides do hino) via
servePath → /media/, igual áudio/cover.
3. resolveBgUrl: bg não-resolúvel (arquivo inexistente) manda SEM
background — a TV usa bg-fallback dela; antes mandava
${base}/local://... que dava 404.
E2E: hino com capa local://generico_116.jpg → TV recebe /media/... com
HTTP 200 (PASS).
… ao .ipk)
Removida a injeção de __PALCO_APPV__ com a versão do desktop — o
receiver embutido resolve via fetch('appinfo.json'), mesma fonte de
verdade do pacote webOS. Browser e TV sempre mostram a versão do
receiver instalado.
E2E: idleVer 'receiver v0.1.20', sem injeção (PASS).
PalcoRouteSelect consultava só slots — visível sempre no desktop. Agora checa status do sender (poll 4s): desligado = escondido; ligado = aparece com TVs conectadas. E2E: OFF→0 seletor, ON→1 seletor (PASS).
Receiver (4 pontos):
- audio com MESMA url não recarrega src (era o loop: sync 3s recarregava
do positionMs a cada ciclo)
- play em áudio já tocando = no-op; seek só corrige desvio >0.3s;
seek com target>0.2 em pausado retoma (autoplay-fallen play)
Bridge: sync periódico agora manda action:'seek' (não play+url).
Sender: palco:send aceita objeto OU string JSON (spread de string
virava {0:'{',1:'"'...} — lixo ia pro replay dos receivers).
E2E: broadcast chega (src setado, seek aplica posição); mp3 real do
hino visível no replay com capa /media/ (bg fix confirmado).
…onfigurações → Palco: PC / TV / Ambos; persistido em localStorage\n e sem impacto na projeção via cabo\n- PC: não envia áudio ao Palco; TV: só TV; Ambos: PC+TV sync\n- Hinos: asset/capa próprio continua padrão; toggle contextual permite\n sobrescrever com o fundo configurado somente para hymns\n- Protocolo já suporta caixinha atrás do texto (textBox/opacity/border);\n mantém personalização por módulo.\n- locales pt-BR/en/es completos.
fix(ci): SHA256SUMS step fails on linux-unpacked directory
chore: versão 1.22.0
…uperior direito) — mantém o da Central
…ection Oculta o conteúdo (letra, texto, versículos) ao encerrar projeção via toggle mantendo a janela secundária aberta com o background/palco. O fechamento total das janelas segue disponível pelo botão fechar todas as telas.
… status do store reflete o operador
feat(hymns): FAB de personalização em cada coletânea/hinário
feat(projection): manter background e ocultar conteúdo ao encerrar projeção
chore: versão 1.22.1
pianolouvorja
approved these changes
Aug 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Test plan