fix:修导出时钟与切页卡顿

导出与播放共用模拟时钟;换循环、重排播放头、<grok-bot> 重挂和构建产物对齐。
自定义/动画面板留下不重画,角色高度对齐,表情走弹簧。
This commit is contained in:
Edom
2026-08-19 02:01:29 +08:00
parent 1ba126c92b
commit 851f2b8c6c
17 changed files with 179 additions and 84 deletions
+4 -5
View File
@@ -4,6 +4,7 @@ import BlockPicker from '@/components/BlockPicker.vue'
import BotTile from '@/components/BotTile.vue'
import {
clampDuration,
followMove,
moveBlock,
offsetOf,
STEP,
@@ -11,8 +12,8 @@ import {
type Block,
type StateId
} from '@/editor/cycles'
import { BASE_SCALE, clampZoom, ticksFor } from '@/ui/timeline'
import { secondes, secondesCourtes, stateName, t } from '@/i18n'
import { BASE_SCALE, clampZoom, ticksFor } from '@/ui/timeline'
/**
* La piste : une regle graduee, les cartes du montage, et les gestes qui vont
@@ -240,10 +241,8 @@ function onBlockUp(index: number) {
return
}
if (d.to === d.from) return
// le curseur suit la carte qu'on deplace, sinon la lecture sauterait ailleurs
const suivi = block.value === d.from ? d.to : block.value
emit('update:blocks', moveBlock(props.blocks, d.from, d.to))
block.value = suivi
block.value = followMove(block.value, d.from, d.to)
}
function onResizeDown(index: number, e: PointerEvent) {
@@ -298,7 +297,7 @@ async function onCardKey(index: number, e: KeyboardEvent) {
const cible = index + sens
if (cible < 0 || cible >= props.blocks.length) return
emit('update:blocks', moveBlock(props.blocks, index, cible))
block.value = cible
block.value = followMove(block.value, index, cible)
await nextTick()
const liste = track.value?.querySelectorAll<HTMLButtonElement>('[data-carte]')
liste?.[cible]?.focus()