Skip to content

release: 1.22.1 - #139

Merged
pianolouvorja merged 312 commits into
mainfrom
staging
Aug 28, 2026
Merged

release: 1.22.1#139
pianolouvorja merged 312 commits into
mainfrom
staging

Conversation

@ezequiasfonseca

Copy link
Copy Markdown
Collaborator

Summary

Test plan

  • CI verde
  • Validação da branch de origem (origem = staging)
  • Publicação da GitHub Release v1.22.1~

rafaumeu and others added 30 commits August 24, 2026 18:37
- 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.
ezequiasfonseca and others added 14 commits August 28, 2026 12:00
fix(ci): SHA256SUMS step fails on linux-unpacked directory
…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.
feat(hymns): FAB de personalização em cada coletânea/hinário
feat(projection): manter background e ocultar conteúdo ao encerrar projeção
@github-actions github-actions Bot added modulo:biblia Recursos relacionados à Bíblia: pesquisa, leitura, exibição de versículos e referências. modulo:liturgia Funcionalidades da liturgia, ordem de culto e gerenciamento da programação. modulo:cronometro Recursos do cronômetro, contadores regressivos e controle de tempo. modulo:relogio Funcionalidades do relógio, hora atual e exibição em tela. modulo:sorteio Recursos de sorteio, seleção aleatória e distribuição de participantes ou itens. modulo:configuracoes Configurações gerais da aplicação, preferências do usuário e parâmetros do sistema. modulo:shared Componentes, utilitários, serviços, tipos e funcionalidades compartilhadas entre os módulos. modulo:electron Código específico do Electron (Main Process, Preload, IPC e integração com o sistema operacional). modulo:ui Componentes visuais reutilizáveis, layout, temas, estilos e biblioteca de interface. modulo:router Rotas, navegação e gerenciamento de páginas. modulo:pinia Stores, gerenciamento de estado global e lógica compartilhada. modulo:i18n Internacionalização, traduções e arquivos de idioma. modulo:infra Infraestrutura do projeto, configuração do Vite, build, scripts e ambiente. modulo:docs Documentação técnica, PRD, README e demais documentos do projeto. labels Aug 28, 2026
@pianolouvorja
pianolouvorja merged commit 539947e into main Aug 28, 2026
30 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

modulo:biblia Recursos relacionados à Bíblia: pesquisa, leitura, exibição de versículos e referências. modulo:configuracoes Configurações gerais da aplicação, preferências do usuário e parâmetros do sistema. modulo:cronometro Recursos do cronômetro, contadores regressivos e controle de tempo. modulo:docs Documentação técnica, PRD, README e demais documentos do projeto. modulo:electron Código específico do Electron (Main Process, Preload, IPC e integração com o sistema operacional). modulo:i18n Internacionalização, traduções e arquivos de idioma. modulo:infra Infraestrutura do projeto, configuração do Vite, build, scripts e ambiente. modulo:liturgia Funcionalidades da liturgia, ordem de culto e gerenciamento da programação. modulo:pinia Stores, gerenciamento de estado global e lógica compartilhada. modulo:relogio Funcionalidades do relógio, hora atual e exibição em tela. modulo:router Rotas, navegação e gerenciamento de páginas. modulo:shared Componentes, utilitários, serviços, tipos e funcionalidades compartilhadas entre os módulos. modulo:sorteio Recursos de sorteio, seleção aleatória e distribuição de participantes ou itens. modulo:ui Componentes visuais reutilizáveis, layout, temas, estilos e biblioteca de interface.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants