kingkont 0.7.91 → 0.7.92

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kingkont",
3
- "version": "0.7.91",
3
+ "version": "0.7.92",
4
4
  "description": "KingKont · Chatium — нод-редактор сцен с AI-генерацией (картинки/видео/голос/SFX/музыка/текст)",
5
5
  "main": "main.js",
6
6
  "bin": {
@@ -210,7 +210,7 @@ async function addLabelAt(pos) {
210
210
  const node = {
211
211
  id: crypto.randomUUID(),
212
212
  type: 'label',
213
- text: '',
213
+ text: 'Подпись', // дефолтный текст — сразу видно ноду
214
214
  textStyle: { fontSize: 32, italic: false, fontFamily: 'pencil' },
215
215
  x, y,
216
216
  // width/height не задаём — label всегда auto-размер по тексту
@@ -220,19 +220,19 @@ async function addLabelAt(pos) {
220
220
  const el = await createNodeEl(node);
221
221
  canvas.appendChild(el);
222
222
  scheduleSave();
223
- // Авто-фокус в редактируемый текст, чтобы юзер сразу начал печатать.
223
+ // Сразу входим в режим редактирования и выделяем весь текст
224
+ // юзер начинает печатать, и «Подпись» заменяется на введённое.
224
225
  setTimeout(() => {
225
226
  const ed = el.querySelector('.label-text');
226
- if (ed) {
227
- ed.focus();
228
- // Курсор в конец (если контент пустой — это всё равно начало).
229
- const sel = window.getSelection();
230
- const r = document.createRange();
231
- r.selectNodeContents(ed);
232
- r.collapse(false);
233
- sel?.removeAllRanges();
234
- sel?.addRange(r);
235
- }
227
+ if (!ed) return;
228
+ ed.contentEditable = 'plaintext-only';
229
+ ed.focus();
230
+ // Select all — type-to-replace UX (как на iOS notes / новой подписи).
231
+ const sel = window.getSelection();
232
+ const r = document.createRange();
233
+ r.selectNodeContents(ed);
234
+ sel?.removeAllRanges();
235
+ sel?.addRange(r);
236
236
  }, 30);
237
237
  }
238
238
 
@@ -1084,7 +1084,10 @@ async function deleteSelectedNodes() {
1084
1084
  document.addEventListener('keydown', async e => {
1085
1085
  const mod = e.metaKey || e.ctrlKey;
1086
1086
  const tag = (e.target?.tagName || '').toLowerCase();
1087
- const inText = tag === 'textarea' || tag === 'input';
1087
+ // contentEditable label-text тоже текстовое поле: Backspace там должен
1088
+ // удалять символ, а не ноду. e.target.isContentEditable отлавливает любой
1089
+ // contenteditable-элемент (наша label-нода в edit-режиме).
1090
+ const inText = tag === 'textarea' || tag === 'input' || !!e.target?.isContentEditable;
1088
1091
 
1089
1092
  // Zoom shortcuts (работают даже в инпутах — это естественно)
1090
1093
  if (mod && (e.key === '=' || e.key === '+')) { e.preventDefault(); applyZoom(state.zoom * 1.25); return; }