kingkont 0.7.92 → 0.7.93

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.92",
3
+ "version": "0.7.93",
4
4
  "description": "KingKont · Chatium — нод-редактор сцен с AI-генерацией (картинки/видео/голос/SFX/музыка/текст)",
5
5
  "main": "main.js",
6
6
  "bin": {
@@ -179,11 +179,21 @@ function renderLabelNodeBody(node, body) {
179
179
  ed.addEventListener('mousedown', e => {
180
180
  // В edit-режиме: не пускаем drag-обработчик (нужно поставить курсор/выделить текст).
181
181
  if (ed.isContentEditable) e.stopPropagation();
182
- // В read-режиме: пузырится — attachDrag-handler (повешен и на label-text)
183
- // обработает single-click как «выбрать ноду» и подхватит drag.
182
+ // В read-режиме: drag-handler (привязан ниже) обработает single-click
183
+ // как «выбрать ноду» и подхватит drag.
184
184
  });
185
185
 
186
186
  body.appendChild(ed);
187
+
188
+ // Привязываем drag-handler ИМЕННО ЗДЕСЬ — потому что refreshNodeDOM
189
+ // (вызывается при смене шрифта/размера/курсива через ПКМ) пересоздаёт
190
+ // .label-text. Если drag вешать в attachDrag (вызывается один раз в
191
+ // createNodeEl), то после refreshNodeDOM новый элемент окажется без
192
+ // обработчика — и ноду нельзя будет двигать.
193
+ const nodeEl = body.closest('.node');
194
+ if (nodeEl) {
195
+ ed.addEventListener('mousedown', makeDragHandler(nodeEl, node));
196
+ }
187
197
  }
188
198
 
189
199
  async function renderNodeBody(node, body) {
@@ -739,15 +749,18 @@ function attachResize(el, node, handle) {
739
749
 
740
750
  function attachDrag(el, node) {
741
751
  const header = el.querySelector('.node-header');
742
- // Для label-нод вешаем drag и на сам текст: header скрыт до hover, а
743
- // юзер хочет цеплять ноду с любого места видимого текста. В handler'е
744
- // пропускаем срабатывание, если label в edit-режиме (см. условие ниже).
745
- const sources = [header];
746
- if (node.type === 'label') {
747
- const lt = el.querySelector('.label-text');
748
- if (lt) sources.push(lt);
749
- }
750
- const handler = e => {
752
+ // Header-source: drag вешается один раз при создании ноды. .label-text
753
+ // отдельно привязывается из renderLabelNodeBody потому что при смене
754
+ // шрифта/размера через ПКМ refreshNodeDOM пересоздаёт DOM-элемент
755
+ // .label-text, и старый listener умирает вместе со старым элементом.
756
+ if (header) header.addEventListener('mousedown', makeDragHandler(el, node));
757
+ }
758
+
759
+ // Создаёт drag-handler для конкретной (el, node) пары. Вынесено отдельно
760
+ // чтобы можно было вешать на новый .label-text после refreshNodeDOM
761
+ // (renderLabelNodeBody делает это при каждом рендере).
762
+ function makeDragHandler(el, node) {
763
+ return e => {
751
764
  // Edit-режим label — не таскаем (контекст редактирования текста).
752
765
  if (e.currentTarget?.classList?.contains('label-text') && e.currentTarget.isContentEditable) return;
753
766
  if (e.target.closest('.delete')) return;
@@ -907,7 +920,6 @@ function attachDrag(el, node) {
907
920
  document.addEventListener('mousemove', onMove);
908
921
  document.addEventListener('mouseup', onUp);
909
922
  };
910
- for (const src of sources) if (src) src.addEventListener('mousedown', handler);
911
923
  }
912
924
 
913
925
  // Добавить ноду как клип в указанную дорожку с ripple-вставкой по времени