Skip to content

chore(release): version packages - #28

Merged
ivanbanov merged 1 commit into
mainfrom
changeset-release/main
Jul 19, 2026
Merged

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

Conversation

@github-actions

@github-actions github-actions Bot commented Jul 19, 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/dialog@0.2.0

Minor Changes

  • #27 f0d5ca4 Thanks @ivanbanov! - Add closeOnBack — the host's Back navigation closes the open dialog instead
    of leaving the page, the pattern mobile users expect from a full-screen
    overlay. Off by default.

    <Dialog closeOnBack onBackNavigation={event => /* preventDefault() vetoes */ {}}></Dialog>

    It follows the shared dismissal contract: onBackNavigation fires first and
    preventDefault() vetoes, a controlled dialog only records the intent (close
    it from your own state as usual), a nested stack unwinds one layer per Back
    press, and it composes with animated (Back plays the exit animation). The
    decision — gate, veto, controlled — lives once in the core's backNavigate;
    substrates only wire their host's mechanics to it.

    The web mechanics ship as their own framework-free util,
    @dunky.dev/dom-navigation (interceptBackNavigation) — a session
    history guard any overlaid layer can use, not just the dialog: opening
    plants a guard entry in the session history and Back consumes it. A dialog
    closed any other way consumes its own entry too, so no leftover ever swallows
    a later Back press — including across reopen races (React StrictMode's
    double-invoked effects adopt the entry in place rather than queueing a
    history traversal, which browsers don't reliably deliver once another entry
    is pushed).

  • #26 f4628e7 Thanks @ivanbanov! - Add exit-animation support via a new animated option. An animated dialog
    closes through a closing state — every part carries it as
    data-state="closing", the styling hook for the exit — and unmounts when its
    transition or animation on Content ends (with a fallback ceiling, and skipped
    entirely under prefers-reduced-motion).

    <Dialog animated></Dialog>
    [data-state='closing'] {
      opacity: 0;
      transition: opacity 150ms;
    }

    The exit window lives in the core machine, not in per-substrate unmount
    deferral, so reopening mid-exit is a named transition instead of a timing
    race, and every substrate inherits identical behavior. The exit is cosmetic
    by design: the close is reported, focus returns, and the page becomes
    interactive the moment closing starts — the still-painting layer is made
    inert until it leaves. Enter animations need no option: parts mount
    straight into data-state="open", so CSS animations (or transitions via
    @starting-style) play from mount. Default (animated: false) behavior is
    unchanged.

@dunky.dev/overlay@0.1.0

Minor Changes

  • #29 89ed3f7 Thanks @ivanbanov! - Add @dunky.dev/overlay and @dunky.dev/dom-overlay — the shared overlay
    coordination the whole overlay family (dialog, drawer, alert-dialog, popover,
    menu, combobox) builds on, so the behavior is implemented once instead of
    forked per primitive.

    • @dunky.dev/overlay is the agnostic half: a stack of open layers and the
      rule for which is topmost (deepest nesting, open order breaking ties). No
      DOM, no framework — a future native substrate reuses it.
    • @dunky.dev/dom-overlay is the DOM realization on top of it: the layer
      stack wired to assistive-tech containment (aria-hidden + inert), the
      exit window (hideExitingLayer / watchExitAnimation), and initial focus
      (getInitialFocus).
    import { createLayerStack, type OverlayLayer } from '@dunky.dev/overlay'
    import { registerLayer, isTopmostLayer } from '@dunky.dev/dom-overlay'

    This replaces @dunky.dev/dom-dialog, which is removed — its behavior was
    never dialog-specific, only its name was. @dunky.dev/react-dialog now
    consumes @dunky.dev/dom-overlay; its public API and behavior are unchanged
    (registerDialog / isTopmostDialog become registerLayer /
    isTopmostLayer internally).

@dunky.dev/dom-navigation@0.1.0

Minor Changes

  • #27 f0d5ca4 Thanks @ivanbanov! - Add closeOnBack — the host's Back navigation closes the open dialog instead
    of leaving the page, the pattern mobile users expect from a full-screen
    overlay. Off by default.

    <Dialog closeOnBack onBackNavigation={event => /* preventDefault() vetoes */ {}}></Dialog>

    It follows the shared dismissal contract: onBackNavigation fires first and
    preventDefault() vetoes, a controlled dialog only records the intent (close
    it from your own state as usual), a nested stack unwinds one layer per Back
    press, and it composes with animated (Back plays the exit animation). The
    decision — gate, veto, controlled — lives once in the core's backNavigate;
    substrates only wire their host's mechanics to it.

    The web mechanics ship as their own framework-free util,
    @dunky.dev/dom-navigation (interceptBackNavigation) — a session
    history guard any overlaid layer can use, not just the dialog: opening
    plants a guard entry in the session history and Back consumes it. A dialog
    closed any other way consumes its own entry too, so no leftover ever swallows
    a later Back press — including across reopen races (React StrictMode's
    double-invoked effects adopt the entry in place rather than queueing a
    history traversal, which browsers don't reliably deliver once another entry
    is pushed).

@dunky.dev/dom-overlay@0.1.0

Minor Changes

  • #26 f4628e7 Thanks @ivanbanov! - Add exit-animation support via a new animated option. An animated dialog
    closes through a closing state — every part carries it as
    data-state="closing", the styling hook for the exit — and unmounts when its
    transition or animation on Content ends (with a fallback ceiling, and skipped
    entirely under prefers-reduced-motion).

    <Dialog animated></Dialog>
    [data-state='closing'] {
      opacity: 0;
      transition: opacity 150ms;
    }

    The exit window lives in the core machine, not in per-substrate unmount
    deferral, so reopening mid-exit is a named transition instead of a timing
    race, and every substrate inherits identical behavior. The exit is cosmetic
    by design: the close is reported, focus returns, and the page becomes
    interactive the moment closing starts — the still-painting layer is made
    inert until it leaves. Enter animations need no option: parts mount
    straight into data-state="open", so CSS animations (or transitions via
    @starting-style) play from mount. Default (animated: false) behavior is
    unchanged.

  • #29 89ed3f7 Thanks @ivanbanov! - Add @dunky.dev/overlay and @dunky.dev/dom-overlay — the shared overlay
    coordination the whole overlay family (dialog, drawer, alert-dialog, popover,
    menu, combobox) builds on, so the behavior is implemented once instead of
    forked per primitive.

    • @dunky.dev/overlay is the agnostic half: a stack of open layers and the
      rule for which is topmost (deepest nesting, open order breaking ties). No
      DOM, no framework — a future native substrate reuses it.
    • @dunky.dev/dom-overlay is the DOM realization on top of it: the layer
      stack wired to assistive-tech containment (aria-hidden + inert), the
      exit window (hideExitingLayer / watchExitAnimation), and initial focus
      (getInitialFocus).
    import { createLayerStack, type OverlayLayer } from '@dunky.dev/overlay'
    import { registerLayer, isTopmostLayer } from '@dunky.dev/dom-overlay'

    This replaces @dunky.dev/dom-dialog, which is removed — its behavior was
    never dialog-specific, only its name was. @dunky.dev/react-dialog now
    consumes @dunky.dev/dom-overlay; its public API and behavior are unchanged
    (registerDialog / isTopmostDialog become registerLayer /
    isTopmostLayer internally).

Patch Changes

  • Updated dependencies [89ed3f7]:
    • @dunky.dev/overlay@0.1.0

@dunky.dev/react-dialog@0.2.0

Minor Changes

  • #27 f0d5ca4 Thanks @ivanbanov! - Add closeOnBack — the host's Back navigation closes the open dialog instead
    of leaving the page, the pattern mobile users expect from a full-screen
    overlay. Off by default.

    <Dialog closeOnBack onBackNavigation={event => /* preventDefault() vetoes */ {}}></Dialog>

    It follows the shared dismissal contract: onBackNavigation fires first and
    preventDefault() vetoes, a controlled dialog only records the intent (close
    it from your own state as usual), a nested stack unwinds one layer per Back
    press, and it composes with animated (Back plays the exit animation). The
    decision — gate, veto, controlled — lives once in the core's backNavigate;
    substrates only wire their host's mechanics to it.

    The web mechanics ship as their own framework-free util,
    @dunky.dev/dom-navigation (interceptBackNavigation) — a session
    history guard any overlaid layer can use, not just the dialog: opening
    plants a guard entry in the session history and Back consumes it. A dialog
    closed any other way consumes its own entry too, so no leftover ever swallows
    a later Back press — including across reopen races (React StrictMode's
    double-invoked effects adopt the entry in place rather than queueing a
    history traversal, which browsers don't reliably deliver once another entry
    is pushed).

  • #26 f4628e7 Thanks @ivanbanov! - Add exit-animation support via a new animated option. An animated dialog
    closes through a closing state — every part carries it as
    data-state="closing", the styling hook for the exit — and unmounts when its
    transition or animation on Content ends (with a fallback ceiling, and skipped
    entirely under prefers-reduced-motion).

    <Dialog animated></Dialog>
    [data-state='closing'] {
      opacity: 0;
      transition: opacity 150ms;
    }

    The exit window lives in the core machine, not in per-substrate unmount
    deferral, so reopening mid-exit is a named transition instead of a timing
    race, and every substrate inherits identical behavior. The exit is cosmetic
    by design: the close is reported, focus returns, and the page becomes
    interactive the moment closing starts — the still-painting layer is made
    inert until it leaves. Enter animations need no option: parts mount
    straight into data-state="open", so CSS animations (or transitions via
    @starting-style) play from mount. Default (animated: false) behavior is
    unchanged.

Patch Changes

  • #26 0e259c6 Thanks @ivanbanov! - A modal dialog no longer marks its own backdrop aria-hidden + inert. The
    assistive-tech containment walks up from the dialog window and hides every
    sibling along the way — and the backdrop is portalled alongside the viewport,
    outside the window's subtree yet part of the same layer, so the topmost
    dialog was hiding its own backdrop. inert blocks pointer hit-testing, so
    pressing the backdrop to dismiss silently did nothing in a real browser
    (test-runner .click() bypasses hit-testing, which is why suites never
    caught it). A dialog's layer now excepts its own backdrop from the
    containment; everything beneath the topmost layer — lower dialogs' backdrops
    included — stays hidden and inert as before.

  • #29 89ed3f7 Thanks @ivanbanov! - Add @dunky.dev/overlay and @dunky.dev/dom-overlay — the shared overlay
    coordination the whole overlay family (dialog, drawer, alert-dialog, popover,
    menu, combobox) builds on, so the behavior is implemented once instead of
    forked per primitive.

    • @dunky.dev/overlay is the agnostic half: a stack of open layers and the
      rule for which is topmost (deepest nesting, open order breaking ties). No
      DOM, no framework — a future native substrate reuses it.
    • @dunky.dev/dom-overlay is the DOM realization on top of it: the layer
      stack wired to assistive-tech containment (aria-hidden + inert), the
      exit window (hideExitingLayer / watchExitAnimation), and initial focus
      (getInitialFocus).
    import { createLayerStack, type OverlayLayer } from '@dunky.dev/overlay'
    import { registerLayer, isTopmostLayer } from '@dunky.dev/dom-overlay'

    This replaces @dunky.dev/dom-dialog, which is removed — its behavior was
    never dialog-specific, only its name was. @dunky.dev/react-dialog now
    consumes @dunky.dev/dom-overlay; its public API and behavior are unchanged
    (registerDialog / isTopmostDialog become registerLayer /
    isTopmostLayer internally).

  • Updated dependencies [f0d5ca4, f4628e7, 89ed3f7]:

    • @dunky.dev/dialog@0.2.0
    • @dunky.dev/dom-navigation@0.1.0
    • @dunky.dev/dom-overlay@0.1.0

@github-actions
github-actions Bot force-pushed the changeset-release/main branch from 8a18147 to c2c6505 Compare July 19, 2026 17:01
@ivanbanov
ivanbanov merged commit aa6df88 into main Jul 19, 2026
6 checks passed
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