kingkont 0.7.25 → 0.7.27

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.
Files changed (2) hide show
  1. package/index.html +54 -15
  2. package/package.json +1 -1
package/index.html CHANGED
@@ -834,10 +834,17 @@
834
834
  .node.picked { border-color: #f0a040; box-shadow: 0 0 0 2px rgba(240,160,64,0.55), 0 4px 12px rgba(0,0,0,0.4); }
835
835
  .node-header {
836
836
  padding: 4px 8px; border-bottom: 1px solid #383838;
837
- display: flex; justify-content: flex-end; align-items: center;
837
+ display: flex; justify-content: space-between; align-items: center; gap: 6px;
838
838
  min-height: 22px; cursor: move;
839
839
  }
840
- .node-header .delete { cursor: pointer; color: #888; font-size: 16px; line-height: 1; padding: 0 4px; }
840
+ .node-header .name {
841
+ flex: 1; min-width: 0;
842
+ color: #ccc; font-size: 12px; line-height: 1.2;
843
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
844
+ user-select: none;
845
+ }
846
+ .node-header .name.empty { color: #555; font-style: italic; }
847
+ .node-header .delete { cursor: pointer; color: #888; font-size: 16px; line-height: 1; padding: 0 4px; flex-shrink: 0; }
841
848
  .node-header .delete:hover { color: #f88; }
842
849
 
843
850
  /* Имя ноды убрано из header — переименование через ПКМ → ✏ Переименовать.
@@ -3180,10 +3187,20 @@ async function createNodeEl(node) {
3180
3187
 
3181
3188
  const header = document.createElement('div');
3182
3189
  header.className = 'node-header';
3183
- header.title = 'Тяни, чтобы переместить. Переименовать ПКМ → Переименовать.';
3190
+ header.title = 'Тяни, чтобы переместить. Двойной клик по имени или ПКМ → Переименовать.';
3191
+
3192
+ // Имя ноды (если задано). Узкий header — обрезаем ellipsis'ом.
3193
+ const nameEl = document.createElement('span');
3194
+ nameEl.className = 'name';
3195
+ if (node.name) nameEl.textContent = node.name;
3196
+ else { nameEl.textContent = '—'; nameEl.classList.add('empty'); }
3197
+ // Дабл-клик по имени → переименовать. Не блокируем drag-mousedown.
3198
+ nameEl.addEventListener('dblclick', e => {
3199
+ e.stopPropagation();
3200
+ renameNode(node);
3201
+ });
3202
+ header.appendChild(nameEl);
3184
3203
 
3185
- // Имя ноды НЕ показываем в header — было слишком тесно (overflow-проблемы),
3186
- // переименование вынесено в контекстное меню (ПКМ → ✏ Переименовать).
3187
3204
  const del = document.createElement('span');
3188
3205
  del.className = 'delete'; del.textContent = '×'; del.title = 'Удалить ноду';
3189
3206
  header.appendChild(del);
@@ -3265,6 +3282,18 @@ async function renameNode(node) {
3265
3282
  }
3266
3283
  node.name = trimmed;
3267
3284
  scheduleSave();
3285
+ // Обновим header — имя ноды показывается в .node-header .name.
3286
+ const nodeEl = canvas.querySelector(`.node[data-id="${node.id}"]`);
3287
+ const nameEl = nodeEl?.querySelector('.node-header .name');
3288
+ if (nameEl) {
3289
+ if (trimmed) {
3290
+ nameEl.textContent = trimmed;
3291
+ nameEl.classList.remove('empty');
3292
+ } else {
3293
+ nameEl.textContent = '—';
3294
+ nameEl.classList.add('empty');
3295
+ }
3296
+ }
3268
3297
  }
3269
3298
 
3270
3299
  function showNodeContextMenu(node, clientX, clientY) {
@@ -6935,11 +6964,12 @@ const ELEVENLABS_V3_VOICES = [
6935
6964
  'Priyanka', 'Alexandra', 'Monika', 'Mark', 'Grimblewood',
6936
6965
  ];
6937
6966
 
6938
- function populateVoicesSelect(voices) {
6967
+ function populateVoicesSelect(voices, useEnum) {
6939
6968
  const select = $('genVoice');
6940
6969
  select.innerHTML = '';
6941
- // Если активна ElevenLabs v3 (через KingKont) показываем только enum.
6942
- if (state.ttsModel === 'elevenlabs/v3') {
6970
+ // Через KingKont elevenlabs/v3 принимает только hardcoded enum 26 имён.
6971
+ // Через прямой ElevenLabs — полный список из его API.
6972
+ if (useEnum) {
6943
6973
  for (const name of ELEVENLABS_V3_VOICES) {
6944
6974
  const opt = document.createElement('option');
6945
6975
  opt.value = name; // value = name (для KingKont)
@@ -6951,7 +6981,6 @@ function populateVoicesSelect(voices) {
6951
6981
  if (last && ELEVENLABS_V3_VOICES.includes(last)) select.value = last;
6952
6982
  return;
6953
6983
  }
6954
- // Иначе — список из ElevenLabs API (для прямого ElevenLabs, не KingKont).
6955
6984
  voices.sort((a, b) => a.name.localeCompare(b.name));
6956
6985
  for (const v of voices) {
6957
6986
  const opt = document.createElement('option');
@@ -6975,7 +7004,7 @@ async function loadVoices() {
6975
7004
  if (raw) cached = JSON.parse(raw);
6976
7005
  } catch {}
6977
7006
  if (cached?.voices?.length) {
6978
- populateVoicesSelect(cached.voices);
7007
+ populateVoicesSelect(cached.voices, !!state._ttsUseEnum);
6979
7008
  voicesLoaded = true;
6980
7009
  }
6981
7010
  // 2) Если кэш свежий — выходим
@@ -6987,7 +7016,7 @@ async function loadVoices() {
6987
7016
  const { voices } = await r.json();
6988
7017
  if (!voices?.length) return;
6989
7018
  localStorage.setItem(VOICES_CACHE_KEY, JSON.stringify({ ts: Date.now(), voices }));
6990
- populateVoicesSelect(voices);
7019
+ populateVoicesSelect(voices, !!state._ttsUseEnum);
6991
7020
  voicesLoaded = true;
6992
7021
  } catch (e) { console.error('voices load failed', e); }
6993
7022
  }
@@ -7033,12 +7062,22 @@ document.querySelectorAll('#genModal [data-tts-model]').forEach(b => {
7033
7062
  syncTtsVoiceList();
7034
7063
  });
7035
7064
  });
7036
- function syncTtsVoiceList() {
7065
+ async function syncTtsVoiceList() {
7037
7066
  const showVoice = state.ttsModel === 'elevenlabs/v3';
7038
7067
  $('voiceRow').style.display = showVoice ? '' : 'none';
7039
- if (showVoice) {
7040
- // Перерисовываем select под elevenlabs/v3 enum (hardcoded 26 имён).
7041
- populateVoicesSelect([]);
7068
+ if (!showVoice) return;
7069
+ // Через KingKont hardcoded enum (validation требует одно из 26 имён).
7070
+ // Через прямой ElevenLabs — полный список из ElevenLabs API.
7071
+ const provider = await plannedProvider('tts');
7072
+ const useEnum = provider === 'kingkont';
7073
+ state._ttsUseEnum = useEnum;
7074
+ if (useEnum) {
7075
+ populateVoicesSelect([], true);
7076
+ } else {
7077
+ // Сбрасываем кэш-флаг и подгружаем свежий список (loadVoices
7078
+ // переиспользует populateVoicesSelect внутри).
7079
+ voicesLoaded = false;
7080
+ await loadVoices();
7042
7081
  }
7043
7082
  }
7044
7083
  function syncTtsModelActive() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kingkont",
3
- "version": "0.7.25",
3
+ "version": "0.7.27",
4
4
  "description": "KingKont \u00b7 Chatium \u2014 \u043d\u043e\u0434-\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441\u0446\u0435\u043d \u0441 AI-\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 (\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438/\u0432\u0438\u0434\u0435\u043e/\u0433\u043e\u043b\u043e\u0441/SFX/\u043c\u0443\u0437\u044b\u043a\u0430/\u0442\u0435\u043a\u0441\u0442)",
5
5
  "main": "main.js",
6
6
  "bin": {