@danhachuel/thunderbolt 0.2.20 → 0.2.21

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Este manual descreve a instalação local da UI Thunderbolt, baseada no MoneyPrinterTurbo, utilizando o pacote npm `@danhachuel/thunderbolt`. O fluxo recomendado instala automaticamente o ambiente Python, as dependências da aplicação, as dependências do MoneyPrinterTurbo, o Streamlit e o suporte FFmpeg através de `imageio-ffmpeg`.
4
4
 
5
- > **Versão deste manual:** 0.2.20
5
+ > **Versão deste manual:** 0.2.21
6
6
  > **Pacote npm:** `@danhachuel/thunderbolt`
7
7
  > **Porta padrão da UI:** `localhost:3030`
8
8
  > **Repositório:** [github.com/DanHachuel/thunderbolt](https://github.com/DanHachuel/thunderbolt)
@@ -100,13 +100,13 @@ Execute:
100
100
  Windows PowerShell ou MobaXterm:
101
101
 
102
102
  ```powershell
103
- npx.cmd --yes @danhachuel/thunderbolt@0.2.20 install
103
+ npx.cmd --yes @danhachuel/thunderbolt@0.2.21 install
104
104
  ```
105
105
 
106
106
  Linux/macOS:
107
107
 
108
108
  ```bash
109
- npx --yes @danhachuel/thunderbolt@0.2.20 install
109
+ npx --yes @danhachuel/thunderbolt@0.2.21 install
110
110
  ```
111
111
 
112
112
  A instalação normal é **segura para actualizações**: preserva `storage`, Blueprints, Brandings, configurações e artefactos do utilizador. Remove apenas `.venv`, o clone técnico do MoneyPrinterTurbo e dependências que serão recriadas. Uma pasta antiga sem dados do utilizador, como `C:\Users\<utilizador>\AppData\Local\hermes` da tentativa incompleta, pode ser removida; uma pasta antiga que contenha Blueprints, Brandings ou storage é preservada e apenas avisada no terminal. Feche processos Python, Node, Streamlit e MobaXterm que estejam a usar as pastas antes de executar.
package/README.md CHANGED
@@ -104,9 +104,9 @@ thunderbolt
104
104
  No Windows PowerShell, se `npx` for bloqueado por `npx.ps1`, use directamente `npx.cmd`:
105
105
 
106
106
  ```powershell
107
- npx.cmd --yes @danhachuel/thunderbolt@0.2.20 install
108
- npx.cmd --yes @danhachuel/thunderbolt@0.2.20 doctor
109
- npx.cmd --yes @danhachuel/thunderbolt@0.2.20
107
+ npx.cmd --yes @danhachuel/thunderbolt@0.2.21 install
108
+ npx.cmd --yes @danhachuel/thunderbolt@0.2.21 doctor
109
+ npx.cmd --yes @danhachuel/thunderbolt@0.2.21
110
110
  ```
111
111
 
112
112
  Como alternativa, pode permitir scripts para o seu utilizador:
package/app/main.py CHANGED
@@ -129,11 +129,11 @@ st.markdown("""
129
129
  .content-value { color:#f4f8fb; font-size:1.8rem; font-weight:700; margin-top:.3rem; }
130
130
  .stage { border-left:3px solid #35a7ff; padding:.65rem .8rem; margin:.4rem 0; background:#101d2a; border-radius:8px; }
131
131
  .small-muted { color:#8ba6bb; font-size:.85rem; }
132
- /* Identidade visual dos destinos de upload: YouTube vermelho, TikTok preto. */
133
- [data-testid="stMultiSelect"] [data-baseweb="tag"] { color:#ffffff !important; border:0 !important; font-weight:700 !important; }
134
- [data-testid="stMultiSelect"] [data-baseweb="tag"] svg { color:#ffffff !important; fill:#ffffff !important; }
135
- [data-testid="stMultiSelect"] [data-baseweb="tag"]:nth-child(1) { background:#ff4b4b !important; }
136
- [data-testid="stMultiSelect"] [data-baseweb="tag"]:nth-child(2) { background:#000000 !important; }
132
+ /* Identidade visual dos destinos: os tags BaseWeb são instáveis por ordem; usamos badges próprios por plataforma. */
133
+ [data-testid="stVerticalBlock"]:has(.tb-dest-marker) [data-testid="stMultiSelect"] [data-baseweb="tag"] { display:none !important; }
134
+ [data-testid="stVerticalBlock"]:has(.tb-dest-marker) [data-testid="stMultiSelect"] [data-baseweb="tag"] svg { display:none !important; }
135
+ .tb-destination-chips { display:flex; flex-wrap:wrap; gap:.28rem; margin:.25rem 0 .55rem; }
136
+ .tb-destination-chip { display:inline-block; color:#fff; padding:.22rem .65rem; border-radius:999px; font-weight:700; font-size:.82rem; line-height:1.1; }
137
137
  </style>
138
138
  """, unsafe_allow_html=True)
139
139
 
@@ -710,11 +710,13 @@ def render_upload_conventional():
710
710
  settings = read_json("settings.json", {})
711
711
  youtube = YouTubeAdapter(settings=settings)
712
712
  tasks = [t for t in read_json("tasks.json", []) if t.get("state") == "done" or t.get("artifacts", {}).get("video")]
713
- destination = st.multiselect("Destinos", ["YouTube", "TikTok", "Instagram", "Facebook Pages"], default=["YouTube"])
714
713
  chip_colors = {"YouTube": "#ff4b4b", "TikTok": "#000000", "Instagram": "#e1306c", "Facebook Pages": "#1877f2"}
715
- chips = " ".join(f'<span style="display:inline-block;background:{chip_colors[item]};color:#fff;padding:0.22rem 0.65rem;border-radius:999px;margin:0.18rem 0.25rem 0.35rem 0;font-weight:700;font-size:0.82rem">{item}</span>' for item in destination)
716
- if chips:
717
- st.markdown(chips, unsafe_allow_html=True)
714
+ with st.container():
715
+ st.markdown('<div class="tb-dest-marker"></div>', unsafe_allow_html=True)
716
+ destination = st.multiselect("Destinos", ["YouTube", "TikTok", "Instagram", "Facebook Pages"], default=["YouTube"], key="upload_destinations")
717
+ if destination:
718
+ chips = "".join(f'<span class="tb-destination-chip" style="background:{chip_colors[item]}">{item}</span>' for item in destination)
719
+ st.markdown(f'<div class="tb-destination-chips">{chips}</div>', unsafe_allow_html=True)
718
720
 
719
721
  if "Instagram" in destination:
720
722
  st.info("Instagram está disponível no front end. A publicação real será ligada numa etapa de credenciais/API própria.")
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danhachuel/thunderbolt",
3
- "version": "0.2.20",
3
+ "version": "0.2.21",
4
4
  "description": "Thunderbolt — interface local para operação de canais faceless e motor MoneyPrinterTurbo",
5
5
  "main": "scripts/cli.mjs",
6
6
  "type": "module",