{#if actions.length === 0}

This component's morfo declares no semantic events. That is only valid once the component README justifies why it is perceptually passive (see the Morfo/Sema audit).

{:else}
{#each actions as action} {@const sem = action.semantic} {@const intent = effectiveIntent(sem)} {@const sig = signatureFor(sem.family as string, intent)}
{action.name} {sem.family} {#if sem.verb}{sem.verb}{/if} {(sem.sequence as string) ?? 'pre'} {#if intent}{intent}{/if}
channels: {sig.activeChannels.length ? sig.activeChannels.join(' · ') : 'none'} {#if sig.hold !== undefined}hold: {sig.hold}ms{/if}
sound {#if sig.sound}
pitch {Math.round(sig.sound.pitch)}Hz gain contour {CONTOUR_GLYPH[sig.sound.contour] ?? sig.sound.contour} {sig.sound.contour} centroid {Math.round(sig.sound.centroid)} roughness {sig.sound.roughness} env {sig.sound.attack}/{sig.sound.decay}/{sig.sound.duration}ms
{:else} silent {/if}
haptic {#if sig.haptic}
kind {sig.haptic.kind} intensity {#if sig.haptic.pattern} {#each sig.haptic.pattern as ms, i} {/each} {:else if sig.haptic.duration} duration {sig.haptic.duration}ms {/if}
{:else} none {/if}
{/each}
{/if}