chore(release): version packages#5
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
changeset-release/main
branch
2 times, most recently
from
July 19, 2026 00:17
599b89d to
8ec6558
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
4 times, most recently
from
July 19, 2026 00:55
e0bcf47 to
5e5b245
Compare
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
July 19, 2026 13:20
5e5b245 to
f0b4c2f
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.1.0
Minor Changes
#4
3d6981cThanks @ivanbanov! - Add the Dialog primitive — a modal dialog following the WAI-ARIA APG pattern,shipped as an agnostic core (
@dunky.dev/dialog) plus a React binding(
@dunky.dev/react-dialog).Patch Changes
#25
a009501Thanks @ivanbanov! - The dialog's Close part is now always the focus cycle's last stop, whereverit renders — a visually-first close button no longer interrupts the
content's tab order.
Mechanism:
trapFocusgains alastoption resolving the cycle's finalstop, and now steps focus through the cycle itself on every Tab instead of
only guarding the edges — a logical order can diverge from DOM order, so
native tabbing can't be trusted mid-cycle. The dialog's core stays
substrate-agnostic: Close joins the derived part ids (
ids.close), and eachsubstrate's containment resolves the element by that id.
#17
f339cd5Thanks @ivanbanov! - Make controlledopentruly controlled. A dialog with theopenprop setnever opens or closes on its own — it follows the prop alone.
onOpenChangenow means exactly what it says: it fires on every actual open ⇄ close change,
whatever drove it (including a prop flip), and never for a dismissal that
changed nothing. Dismissal decisions happen at their source:
preventDefault()in
onEscapeKeyDown/onInteractOutside, and your own handlers onDialog.Trigger/Dialog.Close.Controlled-ness is live, not fixed at mount: set
openback toundefinedand the dialog takes over uncontrolled, right where it stands; supply the
prop again to retake control.
Previously an internal dismissal closed a controlled dialog immediately and
left it out of sync with the prop until the next flip.
@dunky.dev/react-dialogalso now declaresreact-domas a peer dependency(it renders through a portal — strict installs previously couldn't resolve
it), and an explicit
id={undefined}no longer discards the generatedSSR-safe id.
#24
44ca139Thanks @ivanbanov! - Internal dependencies on sibling workspace packages are now pinned to anexact version instead of a caret range.
Every package here versions independently — nothing is forced to share a
version number with anything else. A caret range between two packages that
both sit above a shared dependency lets a consumer's install resolve to two
different physical copies of it once those packages' required ranges drift
apart, silently breaking anything identity-sensitive in that shared
dependency (a singleton, a
WeakMap, module-level state). Pinning exactcollapses that to one resolvable version: a mismatch now fails at publish
time instead of surfacing as a runtime bug in a consumer's app.
Updated dependencies [
ee163cb]:@dunky.dev/controllable@0.1.0
Minor Changes
#17
ee163cbThanks @ivanbanov! - New package: controlled/uncontrolled machinery for@dunky.dev/state-machinemachines. It encodes one contract every consumer-ownable value shares: a
controlled machine never moves on its own — only the substrate's
controlled.syncecho of the prop transitions it, so a change callback boundto the state fires exactly when the value changes and never for an intent
that changed nothing. Controlled-ness follows the prop live: an
undefinedecho hands the value back to the machine where it stands. Uncontrolled, the
same intent event also takes the transition, so both modes share one
transition table and one set of guards.
Each declared intent is also recorded in the context slice's
intentslot —a fresh token per write — ready for machines that expose a request channel.
Extracted as a shared core util (rather than dialog-private machinery) so
every dismissible primitive — popover, tooltip, disclosure — composes the
same contract instead of hand-rolling it.
@dunky.dev/dom-focus-trap@0.1.0
Minor Changes
#25
a009501Thanks @ivanbanov! - The dialog's Close part is now always the focus cycle's last stop, whereverit renders — a visually-first close button no longer interrupts the
content's tab order.
Mechanism:
trapFocusgains alastoption resolving the cycle's finalstop, and now steps focus through the cycle itself on every Tab instead of
only guarding the edges — a logical order can diverge from DOM order, so
native tabbing can't be trusted mid-cycle. The dialog's core stays
substrate-agnostic: Close joins the derived part ids (
ids.close), and eachsubstrate's containment resolves the element by that id.
#4
599ff3eThanks @ivanbanov! - Add focus-trap — Tab / Shift+Tab containment for a subtree: focus wraps at bothends and never tabs out; Tab is a no-op with no focusables. Ships as the
framework-free
@dunky.dev/dom-focus-trap(trapFocus(container, { enabled }))and its React binding
@dunky.dev/react-use-focus-trap(
useFocusTrap(ref, { enabled })), which traps while the component is mounted.@dunky.dev/dom-scroll-lock@0.1.0
Minor Changes
#4
599ff3eThanks @ivanbanov! - Add scroll-lock — a reference-counted scroll lock for any container (the pagebody by default), so overlapping holders release in any order, compensating
both vanished scrollbars with logical padding. Ships as the framework-free
@dunky.dev/dom-scroll-lock(lockScroll(target?)) and its React binding@dunky.dev/react-use-scroll-lock(useScrollLock(locked, target?)), whichlocks while the component is mounted; pass a
targetto scope the lock to acontainer instead of the page.
@dunky.dev/react-dialog@0.1.0
Minor Changes
#4
3d6981cThanks @ivanbanov! - Add the Dialog primitive — a modal dialog following the WAI-ARIA APG pattern,shipped as an agnostic core (
@dunky.dev/dialog) plus a React binding(
@dunky.dev/react-dialog).Patch Changes
#25
a009501Thanks @ivanbanov! - The dialog's Close part is now always the focus cycle's last stop, whereverit renders — a visually-first close button no longer interrupts the
content's tab order.
Mechanism:
trapFocusgains alastoption resolving the cycle's finalstop, and now steps focus through the cycle itself on every Tab instead of
only guarding the edges — a logical order can diverge from DOM order, so
native tabbing can't be trusted mid-cycle. The dialog's core stays
substrate-agnostic: Close joins the derived part ids (
ids.close), and eachsubstrate's containment resolves the element by that id.
#17
f339cd5Thanks @ivanbanov! - Make controlledopentruly controlled. A dialog with theopenprop setnever opens or closes on its own — it follows the prop alone.
onOpenChangenow means exactly what it says: it fires on every actual open ⇄ close change,
whatever drove it (including a prop flip), and never for a dismissal that
changed nothing. Dismissal decisions happen at their source:
preventDefault()in
onEscapeKeyDown/onInteractOutside, and your own handlers onDialog.Trigger/Dialog.Close.Controlled-ness is live, not fixed at mount: set
openback toundefinedand the dialog takes over uncontrolled, right where it stands; supply the
prop again to retake control.
Previously an internal dismissal closed a controlled dialog immediately and
left it out of sync with the prop until the next flip.
@dunky.dev/react-dialogalso now declaresreact-domas a peer dependency(it renders through a portal — strict installs previously couldn't resolve
it), and an explicit
id={undefined}no longer discards the generatedSSR-safe id.
#24
44ca139Thanks @ivanbanov! - Internal dependencies on sibling workspace packages are now pinned to anexact version instead of a caret range.
Every package here versions independently — nothing is forced to share a
version number with anything else. A caret range between two packages that
both sit above a shared dependency lets a consumer's install resolve to two
different physical copies of it once those packages' required ranges drift
apart, silently breaking anything identity-sensitive in that shared
dependency (a singleton, a
WeakMap, module-level state). Pinning exactcollapses that to one resolvable version: a mismatch now fails at publish
time instead of surfacing as a runtime bug in a consumer's app.
Updated dependencies [
a009501,f339cd5,3d6981c,599ff3e,44ca139,599ff3e]:@dunky.dev/react-use-focus-trap@0.1.0
Minor Changes
#4
599ff3eThanks @ivanbanov! - Add focus-trap — Tab / Shift+Tab containment for a subtree: focus wraps at bothends and never tabs out; Tab is a no-op with no focusables. Ships as the
framework-free
@dunky.dev/dom-focus-trap(trapFocus(container, { enabled }))and its React binding
@dunky.dev/react-use-focus-trap(
useFocusTrap(ref, { enabled })), which traps while the component is mounted.Patch Changes
#24
44ca139Thanks @ivanbanov! - Internal dependencies on sibling workspace packages are now pinned to anexact version instead of a caret range.
Every package here versions independently — nothing is forced to share a
version number with anything else. A caret range between two packages that
both sit above a shared dependency lets a consumer's install resolve to two
different physical copies of it once those packages' required ranges drift
apart, silently breaking anything identity-sensitive in that shared
dependency (a singleton, a
WeakMap, module-level state). Pinning exactcollapses that to one resolvable version: a mismatch now fails at publish
time instead of surfacing as a runtime bug in a consumer's app.
Updated dependencies [
a009501,599ff3e]:@dunky.dev/react-use-scroll-lock@0.1.0
Minor Changes
#4
599ff3eThanks @ivanbanov! - Add scroll-lock — a reference-counted scroll lock for any container (the pagebody by default), so overlapping holders release in any order, compensating
both vanished scrollbars with logical padding. Ships as the framework-free
@dunky.dev/dom-scroll-lock(lockScroll(target?)) and its React binding@dunky.dev/react-use-scroll-lock(useScrollLock(locked, target?)), whichlocks while the component is mounted; pass a
targetto scope the lock to acontainer instead of the page.
Patch Changes
#24
44ca139Thanks @ivanbanov! - Internal dependencies on sibling workspace packages are now pinned to anexact version instead of a caret range.
Every package here versions independently — nothing is forced to share a
version number with anything else. A caret range between two packages that
both sit above a shared dependency lets a consumer's install resolve to two
different physical copies of it once those packages' required ranges drift
apart, silently breaking anything identity-sensitive in that shared
dependency (a singleton, a
WeakMap, module-level state). Pinning exactcollapses that to one resolvable version: a mismatch now fails at publish
time instead of surfacing as a runtime bug in a consumer's app.
Updated dependencies [
599ff3e]: