Skip to content

chore(release): version packages - #61

Merged
ivanbanov merged 1 commit into
mainfrom
changeset-release/main
Aug 22, 2026
Merged

chore(release): version packages#61
ivanbanov merged 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actions github-actions Bot commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@dunky.dev/state-machine-dom@0.1.0

Minor Changes

  • #32 e6caca8 Thanks @ivanbanov! - Add @dunky.dev/state-machine-dom — the DOM half of the bindings translation,
    shared by every DOM target. The aria-* attribute projection and the payload
    adapters (onValueChange/onWheel/onScroll/onScrollEnd → neutral
    payloads, with preventDefault bound to its event) were byte-identical in the
    React and Solid normalizers; they now live once, in this package, and each
    target keeps only what genuinely differs: its handler prop names
    (onChange/onDoubleClick vs onInput/onDblClick), the focusable
    tabindex casing (tabIndex vs tabindex), and its value serialization
    (React passes ARIA booleans through; Solid stringifies them).

    No API change for consumers of the React or Solid packages — normalize
    behaves exactly as before; the shared package becomes a dependency of both.
    The motivation is drift-proofing: a payload-adapter fix previously had to be
    applied to each DOM target by hand, and had already diverged once.

Patch Changes

  • Updated dependencies [c8e94e4]:
    • @dunky.dev/state-machine-bindings@0.4.1

@dunky.dev/native-state-machine@0.4.0

Minor Changes

  • #62 caafda4 Thanks @ivanbanov! - The modal binding now reaches React Native instead of being dropped:
    normalize() maps it to aria-modal, the web-aligned alias RN routes to
    accessibilityViewIsModal.

    normalize({ modal: true }); // { 'aria-modal': true }

    It was dropped on the assumption RN had no element-attr analog. It does —
    aria-modal sits in the same alias block as aria-hidden, which this
    normalizer already targets. The effect is iOS-only (VoiceOver stops reading
    siblings of the modal surface); Android has no sibling-inerting equivalent, so
    it degrades to a no-op there, the same per-platform fan-out aria-hidden
    already relies on.

    Without it, a dialog authored once in core announced as modal on the web and as
    an ordinary view on native — the substrate-agnostic contract leaking a hole
    exactly where a screen reader user would notice it.

Patch Changes

  • #60 c8e94e4 Thanks @ivanbanov! - Rolls back 0.4.0's translation-contract surface — it shipped by mistake.
    DROPPED_HANDLERS/DROPPED_ATTRS are removed, and HandlerTargets/
    AttrTargets are now the partial rename maps
    (Partial<Record<HandlerKey, string>>) instead of exhaustive
    null-accounting records.

    What stays is the part that mattered: maps and drop sets are typed by the
    real vocabulary keys (HandlerKey/AttrKey), so a typo'd or unknown entry
    is a compile error instead of a silent leak.

  • Updated dependencies [e6caca8, 6deab75, 6deab75, b70bedc, c8e94e4, e6caca8]:

    • @dunky.dev/react-state-machine@0.3.4
    • @dunky.dev/state-machine-utils@0.4.0
    • @dunky.dev/state-machine@0.3.3
    • @dunky.dev/state-machine-bindings@0.4.1

@dunky.dev/state-machine-utils@0.4.0

Minor Changes

  • #66 6deab75 Thanks @ivanbanov! - Remove the dead exports: the positioning module (Placement, Side,
    PositioningOptions, placementToSide, pickSide), memo, and
    composeHandlers. Nothing in the repo ever consumed them — mergeProps
    composes handlers through its own private helper, and positioning was
    speculative vocabulary for floating components that don't exist yet.
    mergeProps is now the package's whole surface. Minor (not patch) because
    the symbols were publicly exported: any external import of them breaks.
    Positioning will come back designed against a real floating component when
    one lands.

  • #66 6deab75 Thanks @ivanbanov! - Export composeHandlers — the handler-pair composition mergeProps has
    always applied to overlapping on* props, now public: the consumer handler
    runs first, and the library handler is skipped when the consumer prevented
    default (the first argument's defaultPrevented, per Radix/Ark conventions).
    No behavior change anywhere — mergeProps calls the same function; it was
    just private before.

    import { composeHandlers } from "@dunky.dev/state-machine-utils";
    
    const onClick = composeHandlers(consumerOnClick, libraryOnClick);

@dunky.dev/solid-state-machine@0.3.0

Minor Changes

  • #32 e6caca8 Thanks @ivanbanov! - Add @dunky.dev/solid-state-machine — the Solid bindings target.

    A first-class Solid bridge (not a React re-export): useMachine mirrors the
    connector's snapshot into a Solid createStore (via reconcile) so reading a
    field in JSX is fine-grained, runs the lifecycle through onSettled/onCleanup,
    keeps props fresh with a tracked setProps effect, and runs each
    ComponentEffect as its own dep-tracked createEffect(compute, apply).
    useSelector returns a Solid accessor. normalize maps the agnostic bindings
    to Solid DOM props (onInput, onDblClick, tabindex) and mergeProps
    applies Solid's class concat + single-object style merge. The same connect
    and machine config run unchanged across React, Solid, React Native, and OpenTUI.

    Targets Solid 2.0 as a first-class citizen: the peer range is solid-js
    ^2.0.0-rc.1. Solid 1.x is not supported — 2.0 removed the surface a 1.x
    bridge would stand on (solid-js/store, single-argument createEffect,
    onMount) and 1.x lacks the root exports this package imports, so, like the
    rest of the Solid ecosystem (router, TanStack, solid-primitives), the majors
    are version-split. Two consumer-facing 2.0 behaviors: writes commit on the
    microtask queue (call flush() in tests before asserting), and JSX comes from
    the renderer package ("jsxImportSource": "@solidjs/web", render from
    @solidjs/web).

Patch Changes

  • #32 e6caca8 Thanks @ivanbanov! - Add @dunky.dev/state-machine-dom — the DOM half of the bindings translation,
    shared by every DOM target. The aria-* attribute projection and the payload
    adapters (onValueChange/onWheel/onScroll/onScrollEnd → neutral
    payloads, with preventDefault bound to its event) were byte-identical in the
    React and Solid normalizers; they now live once, in this package, and each
    target keeps only what genuinely differs: its handler prop names
    (onChange/onDoubleClick vs onInput/onDblClick), the focusable
    tabindex casing (tabIndex vs tabindex), and its value serialization
    (React passes ARIA booleans through; Solid stringifies them).

    No API change for consumers of the React or Solid packages — normalize
    behaves exactly as before; the shared package becomes a dependency of both.
    The motivation is drift-proofing: a payload-adapter fix previously had to be
    applied to each DOM target by hand, and had already diverged once.

  • #32 e6caca8 Thanks @ivanbanov! - preventDefault on the adapted payloads (ChangePayload, WheelPayload) now
    actually works. normalize() used to copy the native event's preventDefault
    onto the payload detached from its event, so the first connect() to call
    payload.preventDefault() would throw TypeError: Illegal invocation — native
    DOM methods require this to be a real Event. The payload now carries a
    closure bound to the originating event:

    // connect() side — this used to throw, now suppresses the default as promised
    onValueChange: (payload) => {
      payload.preventDefault?.();
    };

    Latent until now (no in-repo connect() calls it yet), but it is the behavior
    the bindings contract promises, so it's fixed in both DOM targets before a
    component relies on it.

  • #32 e6caca8 Thanks @ivanbanov! - A ComponentEffect body now runs untracked, so its authored deps list is the
    whole re-run contract — identical to the React target's dep array. Previously
    the body executed inside the tracking scope, so any prop the effect merely read
    became a hidden dependency and re-ran it (cleanup + re-subscribe) on changes to
    props it never declared.

    const escape: ComponentEffect<M, Props> = [
      (machine, props) => {
        void props.onEscapeKeyDown; // read, but NOT a dep — no longer re-runs on change
      },
      ["closeOnEscape"], // ONLY this prop re-runs the effect, on every target
    ];
  • Updated dependencies [e6caca8, 6deab75, 6deab75, b70bedc]:

    • @dunky.dev/state-machine-dom@0.1.0
    • @dunky.dev/state-machine-utils@0.4.0
    • @dunky.dev/state-machine@0.3.3

@dunky.dev/state-machine@0.3.3

Patch Changes

  • #65 b70bedc Thanks @ivanbanov! - Harden the notify and teardown paths across the core, and cut hot-path
    allocations:

    • A listener removed during a notify pass no longer fires again when a nested
      notify (a send from inside a subscriber) rebuilds the iteration snapshot
      mid-pass — unsubscribing is now final even under re-entrancy. The same
      guarantee now holds for connector and store subscribers, and the mechanism
      lives in one shared primitive instead of three near-copies.
    • A state cleanup that throws no longer skips the remaining cleanups or leaves
      the pass populated: every cleanup runs (timers and subscriptions all
      release), the first error is rethrown after the pass, and the next stop
      cannot double-run them.
    • A sync() rule or combine().subscribe() disposed by hand now detaches from
      the composition's registry — long-lived groups with subscribe/unsubscribe
      churn no longer grow it without bound, and stop() no longer re-runs
      hand-run disposers.
    • Computed recompute is allocation-free: dep keys/values live in reused
      buffers and are captured at read time, so the old post-pass that re-read
      every dep is gone. In the benchmark suite this lands recompute ~1.5× and
      4-deep computed chains ~1.6× faster.
    • machine.select is built once and reused instead of allocating a fresh
      facade object on every property access, so its identity is stable (safe for
      dependency arrays).
    • Dropped the internal write-only version counter — bumped on every notify,
      read by nothing.

@dunky.dev/opentui-state-machine@0.3.4

Patch Changes

  • #60 c8e94e4 Thanks @ivanbanov! - Rolls back 0.4.0's translation-contract surface — it shipped by mistake.
    DROPPED_HANDLERS/DROPPED_ATTRS are removed, and HandlerTargets/
    AttrTargets are now the partial rename maps
    (Partial<Record<HandlerKey, string>>) instead of exhaustive
    null-accounting records.

    What stays is the part that mattered: maps and drop sets are typed by the
    real vocabulary keys (HandlerKey/AttrKey), so a typo'd or unknown entry
    is a compile error instead of a silent leak.

  • Updated dependencies [6deab75, 6deab75, c8e94e4]:

    • @dunky.dev/state-machine-utils@0.4.0
    • @dunky.dev/state-machine-bindings@0.4.1

@dunky.dev/react-state-machine@0.3.4

Patch Changes

  • #32 e6caca8 Thanks @ivanbanov! - Add @dunky.dev/state-machine-dom — the DOM half of the bindings translation,
    shared by every DOM target. The aria-* attribute projection and the payload
    adapters (onValueChange/onWheel/onScroll/onScrollEnd → neutral
    payloads, with preventDefault bound to its event) were byte-identical in the
    React and Solid normalizers; they now live once, in this package, and each
    target keeps only what genuinely differs: its handler prop names
    (onChange/onDoubleClick vs onInput/onDblClick), the focusable
    tabindex casing (tabIndex vs tabindex), and its value serialization
    (React passes ARIA booleans through; Solid stringifies them).

    No API change for consumers of the React or Solid packages — normalize
    behaves exactly as before; the shared package becomes a dependency of both.
    The motivation is drift-proofing: a payload-adapter fix previously had to be
    applied to each DOM target by hand, and had already diverged once.

  • #60 c8e94e4 Thanks @ivanbanov! - Rolls back 0.4.0's translation-contract surface — it shipped by mistake.
    DROPPED_HANDLERS/DROPPED_ATTRS are removed, and HandlerTargets/
    AttrTargets are now the partial rename maps
    (Partial<Record<HandlerKey, string>>) instead of exhaustive
    null-accounting records.

    What stays is the part that mattered: maps and drop sets are typed by the
    real vocabulary keys (HandlerKey/AttrKey), so a typo'd or unknown entry
    is a compile error instead of a silent leak.

  • #32 e6caca8 Thanks @ivanbanov! - preventDefault on the adapted payloads (ChangePayload, WheelPayload) now
    actually works. normalize() used to copy the native event's preventDefault
    onto the payload detached from its event, so the first connect() to call
    payload.preventDefault() would throw TypeError: Illegal invocation — native
    DOM methods require this to be a real Event. The payload now carries a
    closure bound to the originating event:

    // connect() side — this used to throw, now suppresses the default as promised
    onValueChange: (payload) => {
      payload.preventDefault?.();
    };

    Latent until now (no in-repo connect() calls it yet), but it is the behavior
    the bindings contract promises, so it's fixed in both DOM targets before a
    component relies on it.

  • Updated dependencies [e6caca8, 6deab75, 6deab75, b70bedc]:

    • @dunky.dev/state-machine-dom@0.1.0
    • @dunky.dev/state-machine-utils@0.4.0
    • @dunky.dev/state-machine@0.3.3

@dunky.dev/state-machine-bindings@0.4.1

Patch Changes

  • #60 c8e94e4 Thanks @ivanbanov! - Rolls back 0.4.0's translation-contract surface — it shipped by mistake.
    DROPPED_HANDLERS/DROPPED_ATTRS are removed, and HandlerTargets/
    AttrTargets are now the partial rename maps
    (Partial<Record<HandlerKey, string>>) instead of exhaustive
    null-accounting records.

    What stays is the part that mattered: maps and drop sets are typed by the
    real vocabulary keys (HandlerKey/AttrKey), so a typo'd or unknown entry
    is a compile error instead of a silent leak.

@vercel

vercel Bot commented Aug 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
dunky-state-machine Ready Ready Preview Aug 22, 2026 1:51pm

@github-actions
github-actions Bot force-pushed the changeset-release/main branch from d990f58 to ae89cb5 Compare August 22, 2026 13:50
@ivanbanov
ivanbanov merged commit ac3274e into main Aug 22, 2026
8 checks passed
@ivanbanov
ivanbanov deleted the changeset-release/main branch August 22, 2026 14:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant