Skip to content

fix(radio): emit form-friendly onChange on RadioGroup for RHF#5821

Closed
ariansj01 wants to merge 4 commits into
heroui-inc:canaryfrom
ariansj01:fix/radio-rhf-onchange-event
Closed

fix(radio): emit form-friendly onChange on RadioGroup for RHF#5821
ariansj01 wants to merge 4 commits into
heroui-inc:canaryfrom
ariansj01:fix/radio-rhf-onchange-event

Conversation

@ariansj01
Copy link
Copy Markdown

@ariansj01 ariansj01 commented Oct 17, 2025

Description

  • Problem: Using register("type") on RadioGroup (wrapper) could set value to null when toggling with React Hook Form.
  • Solution: When onChange is present on the group, also fire a form-like event { target: { name, value } } alongside onValueChange(value).
  • Compatibility: No breaking changes; controlled API (value/onValueChange) remains unchanged.
  • Test plan: With RHF, spread register("type") on RadioGroup and toggle between options; watch() should reflect correct values and never be null.
  • Affected: @heroui/radio

Closes #4918

Summary by CodeRabbit

  • Bug Fixes

    • Fixed DateRangePicker onFocusChange to properly handle both start and end date focus changes
  • New Features

    • Toast notifications now support optional animation control when closing
  • Documentation

    • Added DateRangePicker troubleshooting section with common issues and solutions

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Oct 17, 2025

⚠️ No Changeset found

Latest commit: 2c5bb9b

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@vercel
Copy link
Copy Markdown

vercel Bot commented Oct 17, 2025

@ariansj01 is attempting to deploy a commit to the HeroUI Inc Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Oct 17, 2025

Walkthrough

This PR addresses compatibility and documentation issues across three components: DateRangePicker now correctly handles both start and end focus changes with improved troubleshooting documentation; RadioGroup adds onChange handler support for React Hook Form integration; Toast provider adds optional disableAnimation parameter to closeToast and closeAll methods.

Changes

Cohort / File(s) Summary
DateRangePicker Documentation
apps/docs/content/components/date-range-picker/presets.raw.jsx, apps/docs/content/docs/components/date-range-picker.mdx
Enhanced onFocusChange handler to properly update both start and end date values. Added Troubleshooting section documenting common issues and solutions, including handling of both focus types. Updated API documentation with explicit guidance on preventing end date loss.
RadioGroup Handler
packages/components/radio/src/use-radio-group.ts
Introduced internal handleValueChange function that invokes onValueChange first, then emits synthetic onChange event with target.name and target.value. Enables React Hook Form compatibility while preserving existing onValueChange semantics.
Toast Animation Control
packages/components/toast/src/toast-provider.tsx
Added optional disableAnimation parameter to closeToast and closeAll methods. Implemented internal globalDisableAnimation flag to skip 300ms timeout when animations disabled, enabling immediate toast closure.

Sequence Diagram(s)

sequenceDiagram
    participant RHF as React Hook Form
    participant RG as RadioGroup
    participant Consumer as Consumer Handler

    RHF->>RG: Register field (expects onChange)
    Note over RG: User selects radio option
    RG->>RG: handleValueChange invoked
    RG->>Consumer: Call onValueChange(value)
    RG->>RHF: Emit synthetic onChange event<br/>(target.name, target.value)
    RHF->>RHF: Update form state
Loading
sequenceDiagram
    participant App as Application
    participant TP as Toast Provider
    participant Toast as Toast Component

    App->>TP: closeToast(key, disableAnimation?)
    alt disableAnimation = true or globalDisableAnimation set
        TP->>Toast: Close immediately
    else disableAnimation = false
        TP->>TP: Wait 300ms timeout
        TP->>Toast: Close after timeout
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

The PR introduces focused feature additions across distinct components with moderate logic complexity. RadioGroup's onChange synthesis and Toast's animation control branching require careful validation against their respective use cases (React Hook Form compatibility and animation semantics). Documentation changes are straightforward but comprehensive verification of examples is needed.

Possibly related PRs

Suggested reviewers

  • jrgarciadev
  • wingkwong

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Out of Scope Changes Check ⚠️ Warning The pull request includes significant out-of-scope changes unrelated to issue #4918 (RadioGroup with RHF). Specifically, changes to apps/docs/content/components/date-range-picker/presets.raw.jsx and apps/docs/content/docs/components/date-range-picker.mdx modify the DateRangePicker component and documentation, and changes to packages/components/toast/src/toast-provider.tsx update the Toast component's closeToast and closeAll methods. These changes are not mentioned in the PR objectives or linked issues and appear to be unrelated to the RadioGroup fix that is the stated purpose of this PR. Remove the DateRangePicker changes (both presets.raw.jsx and date-range-picker.mdx) and the Toast component changes (toast-provider.tsx) from this PR, as they are not related to fixing RadioGroup with React Hook Form. These changes should be submitted in separate pull requests focused on their respective components to maintain clear scope and commit history.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed The pull request title "fix(radio): emit form-friendly onChange on RadioGroup for RHF" accurately describes the primary objective of the PR. It clearly indicates that the main change is to the RadioGroup component to emit a form-friendly onChange event for React Hook Form compatibility. This title directly relates to the core fix implemented in packages/components/radio/src/use-radio-group.ts where the handleValueChange function is introduced to emit form-like events alongside onValueChange.
Linked Issues Check ✅ Passed The coding changes in packages/components/radio/src/use-radio-group.ts directly address the requirement from issue #4918. The new handleValueChange function emits a form-friendly onChange event with { target: { name, value } } structure alongside the existing onValueChange callback, which enables React Hook Form's register() to properly capture RadioGroup value changes. This solves the reported bug where toggling radio options was setting form values to null by providing the form event listener with the expected event structure. The solution preserves existing onValueChange semantics and introduces no breaking changes to the controlled API.
Description Check ✅ Passed The pull request description provides sufficient information about the fix, including the problem statement, solution approach, compatibility notes, and test plan. While it does not strictly follow all sections of the template (such as explicit "Current behavior" and "New behavior" headings), it effectively communicates the essential details: the issue being closed (#4918), the problem (RadioGroup setting values to null with RHF), the solution (emitting form-like events), confirmation of no breaking changes, and guidance for testing. The content covers the critical information needed to understand the PR's purpose and scope.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b38a2cf and 2c5bb9b.

⛔ Files ignored due to path filters (2)
  • package-lock.json is excluded by !**/package-lock.json
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (4)
  • apps/docs/content/components/date-range-picker/presets.raw.jsx (1 hunks)
  • apps/docs/content/docs/components/date-range-picker.mdx (2 hunks)
  • packages/components/radio/src/use-radio-group.ts (3 hunks)
  • packages/components/toast/src/toast-provider.tsx (5 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
packages/components/toast/src/toast-provider.tsx (1)
packages/components/toast/src/index.ts (2)
  • closeToast (9-9)
  • closeAll (9-9)
🪛 LanguageTool
apps/docs/content/docs/components/date-range-picker.mdx

[grammar] ~369-~369: There might be a mistake here.
Context: ... Common Issues #### onFocusChange only updates start date When using onFocusChange i...

(QB_NEW_EN)

🔇 Additional comments (2)
packages/components/radio/src/use-radio-group.ts (1)

101-118: Implementation correctly supports React Hook Form integration.

The handleValueChange function properly:

  1. Invokes onValueChange first for controlled usage
  2. Creates a synthetic form-like event for onChange compatibility with libraries like RHF
  3. Maintains backward compatibility by only creating the synthetic event when onChange is present

This aligns with the PR objective of fixing RadioGroup integration with React Hook Form.

Minor consideration: The name field (line 110) may be undefined if not provided to RadioGroup. While most form libraries handle this gracefully, consider whether to provide a fallback or document that name is required when using onChange with form libraries.

packages/components/toast/src/toast-provider.tsx (1)

77-94: Animation control logic is implemented correctly.

The updated closeToast and closeAll functions properly:

  • Accept optional disableAnimation parameters for explicit control
  • Fall back to the global setting when not specified
  • Immediately close toasts when animations are disabled
  • Maintain backward compatibility with optional parameters

However, this implementation depends on the global state approach. Once the architectural concern with globalDisableAnimation is addressed, verify that the fallback mechanism still works correctly with the new approach.

Also applies to: 104-113

Comment on lines +99 to +105
onFocusChange: (val) => {
if (val === "start") {
setValue({...value, start: val});
} else if (val === "end") {
setValue({...value, end: val});
}
},
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Critical: onFocusChange incorrectly overwrites date values with strings.

The val parameter in onFocusChange represents the focus state ("start" or "end"), not a date value. Lines 101 and 103 incorrectly set start: val and end: val, which overwrites the date objects with strings.

Apply this fix to preserve the actual date values:

-onFocusChange: (val) => {
-  if (val === "start") {
-    setValue({...value, start: val});
-  } else if (val === "end") {
-    setValue({...value, end: val});
-  }
-},
+onFocusChange: (focusedValue) => {
+  // onFocusChange receives the new focused date value, not a string
+  // Update the corresponding date in the range
+  setValue((prev) => ({
+    ...prev,
+    // The focusedValue is the actual date being focused
+    ...(value.start.compare(focusedValue) === 0 ? {} : { start: focusedValue }),
+    ...(value.end.compare(focusedValue) === 0 ? {} : { end: focusedValue }),
+  }));
+},

Or, if the intent is only to track which field has focus (not update dates), remove the handler entirely or use a different callback.

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In apps/docs/content/components/date-range-picker/presets.raw.jsx around lines
99-105, the onFocusChange handler is incorrectly assigning the focus string to
the start/end date fields (overwriting date objects). Fix by preserving the
existing date values and storing the focus state instead (e.g., update a
dedicated focus property or state) or remove the handler if only focus tracking
is needed; ensure setValue spreads the existing value and only updates a
non-date focus key rather than assigning val to start/end.

Comment on lines +372 to +384
```jsx
// ❌ Wrong - only updates start date
onFocusChange: (val) => setValue({...value, start: val}),

// ✅ Correct - handles both start and end focus
onFocusChange: (val) => {
if (val === "start") {
setValue({...value, start: val});
} else if (val === "end") {
setValue({...value, end: val});
}
},
```
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Critical: Documentation example has the same bug as the code.

The "correct" example still contains the critical error identified in presets.raw.jsx. Lines 379 and 381 set start: val and end: val, where val is the focus state string ("start" or "end"), not a date value. This overwrites date objects with strings.

The documentation needs to be corrected to show the proper usage. Based on the actual onFocusChange API, this callback receives the focused date value (not a string identifier). The example should be:

-// ✅ Correct - handles both start and end focus
-onFocusChange: (val) => {
-  if (val === "start") {
-    setValue({...value, start: val});
-  } else if (val === "end") {
-    setValue({...value, end: val});
-  }
-},
+// ✅ Correct - onFocusChange receives the focused date value
+onFocusChange: (focusedValue) => {
+  // focusedValue is the date that now has focus
+  // Typically you only need this for advanced use cases
+  // For basic range selection, this handler is often not needed
+},

Alternatively, if the Troubleshooting section is addressing a different issue, please clarify what onFocusChange is supposed to do in this context.

🤖 Prompt for AI Agents
In apps/docs/content/docs/components/date-range-picker.mdx around lines 372 to
384, the "correct" example mistakenly assigns start/end to val (a focus
identifier) and thus overwrites date objects with strings; update the snippet so
the focus identifier and the focused date value are treated separately — rename
the date param (e.g., focusedDate) and use the focus flag to decide which field
to update, calling setValue({...value, start: focusedDate}) when focus is start
and setValue({...value, end: focusedDate}) when focus is end, ensuring you do
not assign the focus string to the date fields.

attribute: "onFocusChange",
type: "(isFocused: boolean) => void",
description: "Handler that is called when the element's focus status changes.",
description: "Handler that is called when the element's focus status changes. **Important**: When using this with DateRangePicker, make sure to handle both start and end date focus changes properly to avoid losing the end date selection.",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

Verify the onFocusChange API behavior and update documentation accordingly.

The updated description suggests handling "both start and end date focus changes" but may be based on incorrect assumptions about the onFocusChange API.

Please verify the actual signature and behavior of onFocusChange in the DateRangePicker component:

Once verified, update the description to accurately reflect the API's actual behavior.


🏁 Script executed:

#!/bin/bash
# Search for onFocusChange implementation in DateRangePicker
ast-grep --pattern $'onFocusChange: ($$$) => {
  $$$
}'

# Find the type definition for onFocusChange
rg -nP --type=ts -C5 'onFocusChange.*:.*\(' 

Length of output: 2161


🏁 Script executed:

#!/bin/bash
# Find DateRangePicker component
fd -e ts -e tsx 'date-range-picker' --type f | grep -E '(src|component)' | head -20

# Search for onFocusChange in date-picker package
rg -n 'onFocusChange' packages/components/date-picker/src/ -A2 -B2 --type ts --type tsx

Length of output: 296



🏁 Script executed:

#!/bin/bash
# Inspect DateRangePicker component
cat git/packages/components/date-picker/src/date-range-picker.tsx | head -150

# Look for Calendar props interface
rg -n 'calendarProps' git/packages/components/date-picker/src/ -A5 -B2

Length of output: 174


🏁 Script executed:

#!/bin/bash
# Search for onFocusChange definition
rg -n 'onFocusChange' git/packages/components/date-picker/src/ -B3 -A3

Length of output: 80



🏁 Script executed:

#!/bin/bash
# Inspect DateRangePicker component with correct path
cat packages/components/date-picker/src/date-range-picker.tsx | head -200

# Search for onFocusChange in date-picker component files
rg -n 'onFocusChange' packages/components/date-picker/src/ -B3 -A3

Length of output: 4003



🏁 Script executed:

#!/bin/bash
# Search use-date-range-picker for onFocusChange
cat packages/components/date-picker/src/use-date-range-picker.ts | grep -n 'onFocusChange' -B5 -A5

# Check RangeCalendar component
fd -e tsx -e ts 'range-calendar' packages/components/ 

# Search all onFocusChange references in date-picker
rg 'onFocusChange' packages/components/date-picker/

Length of output: 2406



🏁 Script executed:

#!/bin/bash
# Inspect RangeCalendar component
cat packages/components/calendar/src/range-calendar.tsx | head -200

# Search use-range-calendar for onFocusChange type definition
rg -n 'onFocusChange' packages/components/calendar/src/use-range-calendar.ts -B3 -A3

Length of output: 1089



🏁 Script executed:

#!/bin/bash
# Get full use-range-calendar.ts file to find interface definition
cat packages/components/calendar/src/use-range-calendar.ts | head -300

# Also search for UseRangeCalendarProps interface
rg -n 'interface UseRangeCalendarProps|export.*UseRangeCalendarProps' packages/components/calendar/src/use-range-calendar.ts -A20

Length of output: 4479



🌐 Web query:

React Aria RangeCalendar onFocusChange callback signature

💡 Result:

The RangeCalendar onFocusChange signature is:
(date: CalendarDate) => void. [1][2]

Sources: React Aria RangeCalendar docs. [1][2]


Update onFocusChange description to reflect accurate API behavior.

The documented description is incorrect. React Aria's RangeCalendar onFocusChange receives a single CalendarDate parameter, not separate start/end parameters. The current description suggesting developers must "handle both start and end date focus changes" is misleading and inconsistent with the actual API.

The callback simply tracks which date is focused in the calendar—the developer controls how to apply that focused date to their state (e.g., assign to start date if empty, otherwise to end date).

Replace the description with:

Handler that is called when the focused date in the calendar changes. Receives the newly focused date as a parameter.
🤖 Prompt for AI Agents
In apps/docs/content/docs/components/date-range-picker.mdx around line 729, the
onFocusChange description incorrectly states it handles start/end focus changes;
update the string to accurately describe the API by replacing the current
sentence with: "Handler that is called when the focused date in the calendar
changes. Receives the newly focused date as a parameter." Ensure the new text
replaces the existing description exactly and preserves surrounding punctuation
and formatting.

const loadFeatures = () => import("framer-motion").then((res) => res.domMax);

let globalToastQueue: ToastQueue<ToastProps> | null = null;
let globalDisableAnimation: boolean = false;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Reconsider using global mutable state for disableAnimation.

Storing disableAnimation in a module-level mutable variable has several issues:

  • Multiple ToastProvider instances would overwrite each other's settings
  • Not compatible with React's concurrent rendering model
  • Could cause race conditions in SSR or test environments
  • Violates React best practices

Consider these alternatives:

  1. Store the setting in the ToastQueue - Pass disableAnimation when adding toasts, or store it in the queue instance
  2. Accept disableAnimation in closeToast - Require callers to explicitly pass the animation preference (already partially done with the optional parameter)
  3. Use a WeakMap - Map toast keys to their animation settings if persistence is needed

Example of option 1:

// Extend ToastQueue to store disableAnimation
const toastQueue = new ToastQueue({
  maxVisibleToasts: Infinity,
  disableAnimation: disableAnimation,
});

// Access it in closeToast
export const closeToast = (key: string, disableAnimation?: boolean) => {
  const shouldDisableAnimation = disableAnimation ?? toastQueue.disableAnimation;
  // ...
};

Also applies to: 47-48

🤖 Prompt for AI Agents
packages/components/toast/src/toast-provider.tsx lines ~14 and ~47-48: remove
the module-level mutable globalDisableAnimation and instead make
disableAnimation an instance property on the ToastQueue (or otherwise stored
per-provider); update the ToastQueue constructor/type to accept and persist a
disableAnimation boolean, set that value when each ToastProvider creates its
queue from the provider prop, and change closeToast to compute
shouldDisableAnimation = disableAnimationParam ?? toastQueue.disableAnimation so
callers can still override. Also remove/replace any reads/writes to the old
global variable, update types and creation sites, and adjust tests to construct
queues with the desired disableAnimation rather than relying on global state.

Copy link
Copy Markdown
Member

@wingkwong wingkwong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. please add changeset
  2. please add tests
  3. please don't include those unrelated files in this PR.

@pkg-pr-new
Copy link
Copy Markdown

pkg-pr-new Bot commented Oct 17, 2025

Open in StackBlitz

@heroui/accordion

npm i https://pkg.pr.new/@heroui/accordion@5821

@heroui/alert

npm i https://pkg.pr.new/@heroui/alert@5821

@heroui/autocomplete

npm i https://pkg.pr.new/@heroui/autocomplete@5821

@heroui/avatar

npm i https://pkg.pr.new/@heroui/avatar@5821

@heroui/badge

npm i https://pkg.pr.new/@heroui/badge@5821

@heroui/breadcrumbs

npm i https://pkg.pr.new/@heroui/breadcrumbs@5821

@heroui/button

npm i https://pkg.pr.new/@heroui/button@5821

@heroui/calendar

npm i https://pkg.pr.new/@heroui/calendar@5821

@heroui/card

npm i https://pkg.pr.new/@heroui/card@5821

@heroui/checkbox

npm i https://pkg.pr.new/@heroui/checkbox@5821

@heroui/chip

npm i https://pkg.pr.new/@heroui/chip@5821

@heroui/code

npm i https://pkg.pr.new/@heroui/code@5821

@heroui/date-input

npm i https://pkg.pr.new/@heroui/date-input@5821

@heroui/date-picker

npm i https://pkg.pr.new/@heroui/date-picker@5821

@heroui/divider

npm i https://pkg.pr.new/@heroui/divider@5821

@heroui/drawer

npm i https://pkg.pr.new/@heroui/drawer@5821

@heroui/dropdown

npm i https://pkg.pr.new/@heroui/dropdown@5821

@heroui/form

npm i https://pkg.pr.new/@heroui/form@5821

@heroui/image

npm i https://pkg.pr.new/@heroui/image@5821

@heroui/input

npm i https://pkg.pr.new/@heroui/input@5821

@heroui/input-otp

npm i https://pkg.pr.new/@heroui/input-otp@5821

@heroui/kbd

npm i https://pkg.pr.new/@heroui/kbd@5821

@heroui/link

npm i https://pkg.pr.new/@heroui/link@5821

@heroui/listbox

npm i https://pkg.pr.new/@heroui/listbox@5821

@heroui/menu

npm i https://pkg.pr.new/@heroui/menu@5821

@heroui/modal

npm i https://pkg.pr.new/@heroui/modal@5821

@heroui/navbar

npm i https://pkg.pr.new/@heroui/navbar@5821

@heroui/number-input

npm i https://pkg.pr.new/@heroui/number-input@5821

@heroui/pagination

npm i https://pkg.pr.new/@heroui/pagination@5821

@heroui/popover

npm i https://pkg.pr.new/@heroui/popover@5821

@heroui/progress

npm i https://pkg.pr.new/@heroui/progress@5821

@heroui/radio

npm i https://pkg.pr.new/@heroui/radio@5821

@heroui/ripple

npm i https://pkg.pr.new/@heroui/ripple@5821

@heroui/scroll-shadow

npm i https://pkg.pr.new/@heroui/scroll-shadow@5821

@heroui/select

npm i https://pkg.pr.new/@heroui/select@5821

@heroui/skeleton

npm i https://pkg.pr.new/@heroui/skeleton@5821

@heroui/slider

npm i https://pkg.pr.new/@heroui/slider@5821

@heroui/snippet

npm i https://pkg.pr.new/@heroui/snippet@5821

@heroui/spacer

npm i https://pkg.pr.new/@heroui/spacer@5821

@heroui/spinner

npm i https://pkg.pr.new/@heroui/spinner@5821

@heroui/switch

npm i https://pkg.pr.new/@heroui/switch@5821

@heroui/table

npm i https://pkg.pr.new/@heroui/table@5821

@heroui/tabs

npm i https://pkg.pr.new/@heroui/tabs@5821

@heroui/toast

npm i https://pkg.pr.new/@heroui/toast@5821

@heroui/tooltip

npm i https://pkg.pr.new/@heroui/tooltip@5821

@heroui/user

npm i https://pkg.pr.new/@heroui/user@5821

@heroui/react

npm i https://pkg.pr.new/@heroui/react@5821

@heroui/system

npm i https://pkg.pr.new/@heroui/system@5821

@heroui/system-rsc

npm i https://pkg.pr.new/@heroui/system-rsc@5821

@heroui/theme

npm i https://pkg.pr.new/@heroui/theme@5821

@heroui/use-aria-accordion

npm i https://pkg.pr.new/@heroui/use-aria-accordion@5821

@heroui/use-aria-accordion-item

npm i https://pkg.pr.new/@heroui/use-aria-accordion-item@5821

@heroui/use-aria-button

npm i https://pkg.pr.new/@heroui/use-aria-button@5821

@heroui/use-aria-link

npm i https://pkg.pr.new/@heroui/use-aria-link@5821

@heroui/use-aria-modal-overlay

npm i https://pkg.pr.new/@heroui/use-aria-modal-overlay@5821

@heroui/use-aria-multiselect

npm i https://pkg.pr.new/@heroui/use-aria-multiselect@5821

@heroui/use-aria-overlay

npm i https://pkg.pr.new/@heroui/use-aria-overlay@5821

@heroui/use-callback-ref

npm i https://pkg.pr.new/@heroui/use-callback-ref@5821

@heroui/use-clipboard

npm i https://pkg.pr.new/@heroui/use-clipboard@5821

@heroui/use-data-scroll-overflow

npm i https://pkg.pr.new/@heroui/use-data-scroll-overflow@5821

@heroui/use-disclosure

npm i https://pkg.pr.new/@heroui/use-disclosure@5821

@heroui/use-draggable

npm i https://pkg.pr.new/@heroui/use-draggable@5821

@heroui/use-form-reset

npm i https://pkg.pr.new/@heroui/use-form-reset@5821

@heroui/use-image

npm i https://pkg.pr.new/@heroui/use-image@5821

@heroui/use-infinite-scroll

npm i https://pkg.pr.new/@heroui/use-infinite-scroll@5821

@heroui/use-intersection-observer

npm i https://pkg.pr.new/@heroui/use-intersection-observer@5821

@heroui/use-is-mobile

npm i https://pkg.pr.new/@heroui/use-is-mobile@5821

@heroui/use-is-mounted

npm i https://pkg.pr.new/@heroui/use-is-mounted@5821

@heroui/use-measure

npm i https://pkg.pr.new/@heroui/use-measure@5821

@heroui/use-pagination

npm i https://pkg.pr.new/@heroui/use-pagination@5821

@heroui/use-real-shape

npm i https://pkg.pr.new/@heroui/use-real-shape@5821

@heroui/use-ref-state

npm i https://pkg.pr.new/@heroui/use-ref-state@5821

@heroui/use-resize

npm i https://pkg.pr.new/@heroui/use-resize@5821

@heroui/use-safe-layout-effect

npm i https://pkg.pr.new/@heroui/use-safe-layout-effect@5821

@heroui/use-scroll-position

npm i https://pkg.pr.new/@heroui/use-scroll-position@5821

@heroui/use-ssr

npm i https://pkg.pr.new/@heroui/use-ssr@5821

@heroui/use-theme

npm i https://pkg.pr.new/@heroui/use-theme@5821

@heroui/use-update-effect

npm i https://pkg.pr.new/@heroui/use-update-effect@5821

@heroui/use-viewport-size

npm i https://pkg.pr.new/@heroui/use-viewport-size@5821

@heroui/aria-utils

npm i https://pkg.pr.new/@heroui/aria-utils@5821

@heroui/dom-animation

npm i https://pkg.pr.new/@heroui/dom-animation@5821

@heroui/framer-utils

npm i https://pkg.pr.new/@heroui/framer-utils@5821

@heroui/react-rsc-utils

npm i https://pkg.pr.new/@heroui/react-rsc-utils@5821

@heroui/react-utils

npm i https://pkg.pr.new/@heroui/react-utils@5821

@heroui/shared-icons

npm i https://pkg.pr.new/@heroui/shared-icons@5821

@heroui/shared-utils

npm i https://pkg.pr.new/@heroui/shared-utils@5821

@heroui/stories-utils

npm i https://pkg.pr.new/@heroui/stories-utils@5821

@heroui/test-utils

npm i https://pkg.pr.new/@heroui/test-utils@5821

commit: 2c5bb9b

@wingkwong
Copy link
Copy Markdown
Member

Closing - inactivity

@wingkwong wingkwong closed this Oct 27, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] - RadioGroup doesn't work with RHF

2 participants