primocode 8.11.2 → 8.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/studio.js +26 -2
- package/package.json +2 -2
- package/studio/__pycache__/voz.cpython-311.pyc +0 -0
- package/studio/ferramentas/corte.md +45 -2
- package/studio/server.py +126 -19
- package/studio/voz.py +307 -0
- package/studio/web/core.css +133 -2
- package/studio/web/js/editor.js +614 -99
- package/studio/web/js/ferramentas.js +4 -1
- package/studio/web/js/narracao.js +18 -2
- package/studio/web/js/render.js +114 -4
- package/studio/web/js/voz-neural.js +88 -178
package/studio/web/core.css
CHANGED
|
@@ -381,9 +381,18 @@ input.titulo-arq:focus { outline: none; border-color: var(--primo); background:
|
|
|
381
381
|
}
|
|
382
382
|
.grupo { border-bottom: 1px solid var(--linha); padding: 14px; }
|
|
383
383
|
.grupo > .rotulo { display: block; margin-bottom: 11px; }
|
|
384
|
-
|
|
384
|
+
/* Rótulo em cima, controle embaixo.
|
|
385
|
+
|
|
386
|
+
A coluna do rótulo tinha 62px fixos. "Acabamento" não cabia e saía
|
|
387
|
+
cortado; "Cor do fundo" e "Tema da cena" quebravam em duas linhas e
|
|
388
|
+
desalinhavam a altura de tudo. Era metade da sensação de "estranho" no
|
|
389
|
+
painel. Empilhado, o nome cabe inteiro e o controle usa a largura toda. */
|
|
390
|
+
.linha-campo { display: grid; gap: 4px; margin-bottom: 11px; }
|
|
385
391
|
.linha-campo:last-child { margin-bottom: 0; }
|
|
386
|
-
.linha-campo > span {
|
|
392
|
+
.linha-campo > span {
|
|
393
|
+
font-size: 10.5px; color: var(--fraco2);
|
|
394
|
+
letter-spacing: .04em; text-transform: uppercase;
|
|
395
|
+
}
|
|
387
396
|
.dois { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
|
|
388
397
|
.tres { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
|
|
389
398
|
.opcoes { display: flex; gap: 4px; }
|
|
@@ -721,3 +730,125 @@ body:has(.transporte) .aviso { bottom: 80px; }
|
|
|
721
730
|
.topo { gap: 6px; padding: 0 8px; }
|
|
722
731
|
.marca em { display: none; }
|
|
723
732
|
}
|
|
733
|
+
|
|
734
|
+
/* ══════════════════════════════════════════════════════════════════════════
|
|
735
|
+
Reordenar, modelos e ações de camada
|
|
736
|
+
|
|
737
|
+
Três coisas que faltavam e faziam o editor parecer travado: arrastar não
|
|
738
|
+
dava retorno nenhum, camada não tinha ação à mão, e "nova cena" abria uma
|
|
739
|
+
tela em branco. O visual aqui é de propósito discreto — a peça que a
|
|
740
|
+
pessoa está fazendo é que tem de chamar atenção, não a ferramenta.
|
|
741
|
+
═════════════════════════════════════════════════════════════════════════ */
|
|
742
|
+
|
|
743
|
+
/* enquanto arrasta: o item sai de cena, o alvo se anuncia */
|
|
744
|
+
.arrastando { opacity: .35; }
|
|
745
|
+
.camada.alvo-solta, .miniatura.alvo-solta, .clipe.alvo-solta {
|
|
746
|
+
outline: 2px solid var(--primo);
|
|
747
|
+
outline-offset: 1px;
|
|
748
|
+
}
|
|
749
|
+
.camada, .miniatura, .clipe { -webkit-user-drag: element; }
|
|
750
|
+
.camada:active { cursor: grabbing; }
|
|
751
|
+
|
|
752
|
+
/* ações que aparecem ao passar o mouse na camada */
|
|
753
|
+
.camada { position: relative; }
|
|
754
|
+
.camada-acoes {
|
|
755
|
+
display: none; gap: 1px; margin-left: auto; flex: 0 0 auto;
|
|
756
|
+
}
|
|
757
|
+
.camada:hover .camada-acoes, .camada.ativa .camada-acoes { display: flex; }
|
|
758
|
+
.camada-acoes button {
|
|
759
|
+
background: none; border: 0; padding: 3px;
|
|
760
|
+
border-radius: 5px; cursor: pointer; color: var(--fraco2);
|
|
761
|
+
display: grid; place-items: center;
|
|
762
|
+
}
|
|
763
|
+
.camada-acoes button:hover { background: var(--sup3, rgba(255,255,255,.08)); color: var(--texto); }
|
|
764
|
+
.camada-acoes button:disabled { opacity: .25; cursor: default; }
|
|
765
|
+
.camada-acoes button:disabled:hover { background: none; color: var(--fraco2); }
|
|
766
|
+
.camada-acoes svg { width: 12px; height: 12px; opacity: 1; }
|
|
767
|
+
|
|
768
|
+
/* a transição marcada no próprio clipe da linha do tempo */
|
|
769
|
+
.clipe .tr-marca {
|
|
770
|
+
position: absolute; left: 4px; top: 4px;
|
|
771
|
+
background: rgba(6, 6, 8, .72);
|
|
772
|
+
color: #cbd5e1;
|
|
773
|
+
font-size: 9.5px; letter-spacing: .02em;
|
|
774
|
+
padding: 2px 5px; border-radius: 4px;
|
|
775
|
+
pointer-events: none;
|
|
776
|
+
max-width: calc(100% - 8px);
|
|
777
|
+
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
/* o "+" no fim da tira */
|
|
781
|
+
.clipe-mais {
|
|
782
|
+
flex: 0 0 auto;
|
|
783
|
+
width: 40px; height: 62px;
|
|
784
|
+
border: 1px dashed var(--linha2);
|
|
785
|
+
border-radius: 8px;
|
|
786
|
+
background: none; color: var(--fraco2);
|
|
787
|
+
cursor: pointer;
|
|
788
|
+
display: grid; place-items: center;
|
|
789
|
+
}
|
|
790
|
+
.clipe-mais:hover { border-color: var(--primo); color: var(--primo); }
|
|
791
|
+
.clipe-mais svg { width: 15px; height: 15px; }
|
|
792
|
+
|
|
793
|
+
/* galeria de modelos */
|
|
794
|
+
.folha .caixa.larga { width: min(1040px, 100%); }
|
|
795
|
+
.folha .sub { color: var(--fraco); font-size: 12.5px; margin: -8px 0 18px; }
|
|
796
|
+
.modelos {
|
|
797
|
+
display: grid;
|
|
798
|
+
grid-template-columns: repeat(auto-fill, minmax(210px, 1fr));
|
|
799
|
+
gap: 14px;
|
|
800
|
+
}
|
|
801
|
+
.modelo {
|
|
802
|
+
background: none; border: 0; padding: 0;
|
|
803
|
+
cursor: pointer; text-align: left;
|
|
804
|
+
display: grid; gap: 7px;
|
|
805
|
+
}
|
|
806
|
+
.modelo .caixa-mini {
|
|
807
|
+
position: relative; width: 100%; aspect-ratio: 16/9;
|
|
808
|
+
overflow: hidden; border-radius: 9px;
|
|
809
|
+
border: 1px solid var(--linha);
|
|
810
|
+
background: var(--sup2);
|
|
811
|
+
transition: border-color .12s, transform .12s;
|
|
812
|
+
}
|
|
813
|
+
.modelo .caixa-mini .cena { position: absolute; top: 0; left: 0; transform-origin: top left; }
|
|
814
|
+
.modelo .caixa-mini.vazia { display: grid; place-items: center; border-style: dashed; }
|
|
815
|
+
.modelo .caixa-mini.vazia svg { width: 22px; height: 22px; color: var(--fraco2); }
|
|
816
|
+
.modelo:hover .caixa-mini { border-color: var(--primo); transform: translateY(-2px); }
|
|
817
|
+
.modelo span { font-size: 12.5px; color: var(--fraco); }
|
|
818
|
+
.modelo:hover span { color: var(--texto); }
|
|
819
|
+
|
|
820
|
+
/* seletor de cor compacto: amostras numa faixa, hex ao lado */
|
|
821
|
+
.cor-faixa { display: grid; grid-template-columns: 1fr 62px; gap: 6px; align-items: center; }
|
|
822
|
+
.cor-faixa .cores { flex-wrap: nowrap; overflow-x: auto; padding-bottom: 2px; }
|
|
823
|
+
.cor-faixa .cores::-webkit-scrollbar { height: 0; }
|
|
824
|
+
.cor-faixa .cores button { width: 19px; height: 19px; flex: 0 0 auto; }
|
|
825
|
+
.cor-faixa .cores button.ativa { outline: 2px solid var(--texto); outline-offset: 1px; }
|
|
826
|
+
.cor-faixa .sem-cor {
|
|
827
|
+
background: repeating-linear-gradient(45deg, var(--sup2) 0 4px, var(--linha2) 4px 8px);
|
|
828
|
+
}
|
|
829
|
+
.campo.hex { font-size: 11px; padding-left: 6px; padding-right: 6px; }
|
|
830
|
+
|
|
831
|
+
/* chaves de animação: a régua mostra QUANDO cada uma acontece */
|
|
832
|
+
.regua-chaves { position: relative; height: 26px; margin: 2px 0 2px; }
|
|
833
|
+
.trilho-chaves {
|
|
834
|
+
position: absolute; left: 5px; right: 5px; top: 11px; height: 3px;
|
|
835
|
+
background: var(--sup3); border-radius: 2px;
|
|
836
|
+
}
|
|
837
|
+
.trilho-chaves .pino {
|
|
838
|
+
position: absolute; top: 50%; width: 11px; height: 11px;
|
|
839
|
+
margin: -5.5px 0 0 -5.5px; padding: 0;
|
|
840
|
+
border-radius: 50%; border: 2px solid var(--fundo);
|
|
841
|
+
background: var(--fraco); cursor: pointer;
|
|
842
|
+
}
|
|
843
|
+
.trilho-chaves .pino:hover { background: var(--texto); }
|
|
844
|
+
.trilho-chaves .pino.ativo { background: var(--primo); transform: scale(1.25); }
|
|
845
|
+
.sub-regua { font-size: 10.5px; color: var(--fraco2); margin-bottom: 10px; }
|
|
846
|
+
.opcoes button.ativo { border-color: var(--primo); color: var(--primo); background: var(--primo-suave); }
|
|
847
|
+
.presets { display: grid; gap: 5px; margin-top: 9px; }
|
|
848
|
+
.presets button {
|
|
849
|
+
height: 30px; padding: 0 10px; text-align: left;
|
|
850
|
+
border: 1px solid var(--linha); border-radius: 8px;
|
|
851
|
+
background: var(--sup2); color: var(--fraco);
|
|
852
|
+
font: 500 12px/1 var(--sans); cursor: pointer;
|
|
853
|
+
}
|
|
854
|
+
.presets button:hover { background: var(--sup3); color: var(--texto); border-color: var(--primo); }
|