@ignix-social/editor 0.1.25 → 0.1.26

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": "@ignix-social/editor",
3
- "version": "0.1.25",
3
+ "version": "0.1.26",
4
4
  "description": "Ignix Editor: render HTML video compositions (reels, edits, clips) on your own computer. Based on HyperFrames.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -324,7 +324,12 @@ export function describe(s, n) {
324
324
  const lead = n > 1 ? `Measured on ${n} videos.` : 'Measured on 1 video (2–3 give a steadier style).';
325
325
  out.push(lead);
326
326
  if (s.format.aspect) out.push(`Format ${s.format.aspect}${s.durationSec ? `, about ${Math.round(s.durationSec)} s long` : ''}.`);
327
- if (s.shots.medianSec != null)
327
+ // Sin cortes secos pero con el texto cambiando sin parar: la escena se transforma desde
328
+ // dentro, y «un corte cada 31 s» describía lo contrario de lo que se ve (2026-10-09).
329
+ const morph = s.shots.cutsPerMinute != null && s.shots.cutsPerMinute < 3 && (s.captions.changesPerMinute ?? 0) >= 10;
330
+ if (morph)
331
+ out.push(`Hardly any hard cuts (${s.shots.cutsPerMinute} per minute): the scene changes from within, the text on screen changes every ${Math.round(600 / s.captions.changesPerMinute) / 10} s. Keep it one continuous scene that builds and morphs, not a cut every few seconds.`);
332
+ else if (s.shots.medianSec != null)
328
333
  out.push(`A cut every ${s.shots.medianSec} s (${s.shots.cutsPerMinute} per minute)${s.shots.firstCutSec != null ? `; the first cut at ${s.shots.firstCutSec} s` : ''}.`);
329
334
  if (s.captions.coverage != null)
330
335
  out.push(
@@ -350,7 +355,9 @@ export function describe(s, n) {
350
355
  const types = s.audio.sfxTypes?.length ? s.audio.sfxTypes.join(', ') : null;
351
356
  out.push(
352
357
  !types
353
- ? 'No sound effects heard (one mixed far under a continuous voice cannot be told apart).'
358
+ ? s.audio.wordsPerMinute != null || (s.audio.musicShare ?? 0) >= 0.2
359
+ ? 'Sound effects: not measurable here — one mixed under a continuous voice and music cannot be told apart. Ask the person whether they use them before assuming none.'
360
+ : 'No sound effects heard.'
354
361
  : s.audio.sfxPerMinute > 0
355
362
  ? `Sound effects heard: ${types} — about ${s.audio.sfxPerMinute} a minute${s.audio.sfxOnCutsShare ? `, on ${Math.round(s.audio.sfxOnCutsShare * 100)} % of the cuts` : ''}.`
356
363
  : `Sound effects in only ${s.audio.sfxVideos} of ${n} videos (${types}); mostly without.`,
@@ -81,9 +81,9 @@
81
81
  Object.assign(box.style, { position: box.style.position || 'absolute', display: 'grid', placeItems: 'center', pointerEvents: 'none' });
82
82
  const els = groups.map((g, gi) => {
83
83
  const row = document.createElement('div');
84
- // Hueco amplio entre palabras: con contorno grueso, 0,3 em las pega («VÍDEOYOUTUBE»).
84
+ // Hueco amplio entre palabras: con contorno grueso, 0,3 em las pega («VÍDEOYOUTUBE»); 0,55 em deja sitio al crecer la palabra activa.
85
85
  Object.assign(row.style, {
86
- display: 'none', flexWrap: 'wrap', justifyContent: 'center', alignItems: 'baseline', columnGap: '0.42em', rowGap: '0.06em',
86
+ display: 'none', flexWrap: 'wrap', justifyContent: 'center', alignItems: 'baseline', columnGap: '0.55em', rowGap: '0.06em',
87
87
  gridArea: '1 / 1', maxWidth: '100%', textAlign: 'center', fontFamily: font, fontWeight: String(st.weight), fontSize: `${fontSize}px`, lineHeight: '1.08', transformOrigin: '50% 60%',
88
88
  });
89
89
  if (style === 'box') Object.assign(row.style, { background: 'rgba(14,14,16,.78)', padding: '0.22em 0.5em', borderRadius: '0.32em' });
@@ -127,7 +127,9 @@
127
127
  el.style.color = now ? accent : base;
128
128
  }
129
129
  const kw = clamp01((t - w.s) / 0.09);
130
- el.style.transform = now && style === 'bold_pop' ? `scale(${(1 + 0.1 * kw).toFixed(4)})` : 'scale(1)';
130
+ // Crece desde su centro y se come el hueco con la vecina («NOMACHINES»): poco, y menos
131
+ // cuanto más larga es la palabra.
132
+ el.style.transform = now && style === 'bold_pop' ? `scale(${(1 + Math.min(0.07, 0.35 / Math.max(5, w.t.length)) * kw).toFixed(4)})` : 'scale(1)';
131
133
  }
132
134
  }
133
135
  },