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.
- package/index.html +54 -15
- 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:
|
|
837
|
+
display: flex; justify-content: space-between; align-items: center; gap: 6px;
|
|
838
838
|
min-height: 22px; cursor: move;
|
|
839
839
|
}
|
|
840
|
-
.node-header .
|
|
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
|
-
//
|
|
6942
|
-
|
|
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
|
-
|
|
7041
|
-
|
|
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.
|
|
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": {
|