* fix(styles): center table sortable column indicator icon (#6705)
* docs(web): polish component docs (#6690)
* docs(web): polish english component docs
* docs(web): polish custom style demos
* docs(web): polish chinese component docs
* docs(web): update release demos
* docs(web): polish tabs component docs
* docs(web): polish chinese component docs
* docs(web): polish chinese component docs
* docs(web): prevent href scroll jumps in card and link demos
* docs(web): sync status icons
* fix(docs): preserve locale in showcase and component doc links
* docs(web): align showcase terminology of chinese version
* fix(styles): prevent InputOTP slots from overflowing narrow containers (#6706)
* fix(docs): use theme tokens in styling examples
* fix(spinner): move accessible name from hidden svg to root status role (#6721)
The inner svg carried aria-hidden, aria-label, and role="presentation"
together: the label was dead code on a hidden element (and
aria-prohibited-attr per axe), and the spinner as a whole was absent
from the accessibility tree. Name the root span as a status live region
instead, keeping both attributes overridable via props.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(styles): restore focus outline gap for accent buttons (#6724)
* fix(styles): adopt logical CSS properties for RTL support (#6699)
* fix(styles): adopt logical CSS properties for RTL support
* fix(docs): adopt logical CSS properties for RTL support
* fix(react): adopt logical CSS properties for RTL support
* fix(storybook): adopt logical CSS properties for RTL support
* fix(docs): handle rtl for icons
* fix(storybook): handle rtl for icons
* fix(styles): handle rtl for icons
* fix(pagination): add dir="auto"
* fix(scroll-shadow): handle RTL
* fix(tabs): handle RTL
* fix(styles): handle RTL
* fix(styles): handle search icon in RTL
* chore(styles): avoid mirroring search icon
* fix(styles): handle year picker trigger indicator in RTL
* refactor(scroll-shadow): avoid getComputedStyle on every scroll
* feat(combo-box): support multiple selection (#6714)
* feat(combo-box): support multiple selection
* feat(combo-box): export ComboBoxValueRenderProps and thread selection mode generic
* chore(docs): update combo-box anatomy
* chore(docs): mark new in combo-box docs
* chore(react): move calendar and range calendar to completed
* chore(deps): update node to >= 22.x
* Merge branch 'v3' into v3.2.3
* chore(deps): bump tailwind-variants to v3.3.0 (#6733)
* fix(scroll-shadow): tolerate fractional scroll position in end detection (#6710)
* fix: react scan (#6727)
* fix: tabs list collection compatibility
* fix(react): ts expect error
* fix(tag-group): rac collection builder compatibility
* fix(select): rac collection builder compatibility
* fix(text): rac collection builder compatibility
* fix(combo-box): rac collection builder compatibility
* fix(autocomplete): rac collection builder compatibility
* fix(autocomplete): tab sequence
* feat(storybook): support react-scan in preview canvas
* chore(root): remove base-url from ts config
* fix(root): typecheck
* fix(storybook): react scan in production
* fix(autocomplete): indicator focus state
* fix(storybook): react scan in preview canvas
* chore: clean up lockfile
* docs(release): v3.2.3 release note (#6739)
* fix(icons): remove aria-label from aria-hidden decorative icons (#6741)
Every icon in the shared set carries `aria-hidden="true"` and
`role="presentation"` together with an `aria-label="... icon"`.
Because `aria-hidden="true"` removes the element from the accessibility
tree, that `aria-label` can never be announced. It is dead weight that
trips accessibility linters and audits.
Drop the `aria-label` from all 15 decorative icons and keep them hidden.
Consumers that need a name still get one from the wrapping control (e.g.
`<Button isIconOnly aria-label="...">`), and `{...props}` is still spread
last so an explicit label can be supplied per usage.
Refs #6718
* chore(docs): update release note
* fix(react): move react-aria packages to peerDependencies (#6744)
* chore(docs): update release note
---------
Co-authored-by: Stybo <84643947+Stybo@users.noreply.github.com>
Co-authored-by: Tianen Pang <32772271+tianenpang@users.noreply.github.com>
Co-authored-by: daveycodez <daveycodez@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Ted Kim <k_2684@naver.com>
Co-authored-by: Saidheerajgollu <158853598+Saidheerajgollu@users.noreply.github.com>
* fix(docs): canonicalize pages to the URLs that are actually served
Every docs page declared `https://www.heroui.com/docs/<slug>` as its
canonical, but that URL answers with two permanent redirects: `www` ->
apex, then `/docs/...` -> `/<lang>/docs/...`. Google therefore dropped
the crawled page in favour of a redirect, and both `/en` and `/cn`
variants pointed at the same English URL.
The root layout also declared the home page as canonical, which every
page without its own `alternates` inherited, self-excluding `/cn`,
`/<lang>/themes` and `/<lang>/showcase` from the index.
Canonicals now use the served locale-prefixed URL on the apex domain and
carry an hreflang cluster (en / zh-Hans / x-default). Untranslated blog
posts point at the default locale instead of self-canonicalizing a
duplicate.
* fix(docs): build the sitemap from the docs source instead of the prerender manifest
`next-sitemap` derives its URL list from Next's prerender manifest, and
every docs, blog and themes route is server-rendered on demand. The
published sitemap therefore listed 19 URLs — no documentation pages at
all — while advertising `llms-*.txt`, `manifest.webmanifest` and
`rss.xml` as indexable pages.
The App Router `sitemap.ts` enumerates the Fumadocs loader, the blog
collection and the showcase registry instead, producing 501 canonical
URLs with hreflang alternates, all of which answer 200 without a
redirect.
* fix(docs): serve robots.txt from the app and keep non-production hosts out of the index
The committed `public/robots.txt` was the artefact of an earlier
`next-sitemap` run, so its `Sitemap` and `Host` lines were pinned to
whichever host generated them — canary still advertised
`www.heroui.com`. Serving it from the app derives the sitemap URL from
the deployed host and keeps the Content Signals directive that
`MetadataRoute.Robots` cannot express.
Every route stays allowed for every crawler; nothing indexable is
blocked. Preview and development deployments opt out through
`X-Robots-Tag` instead, which is host-scoped and cannot de-index
production the way a stray `Disallow` would.
* fix(docs): exclude untranslated blog fallbacks from sitemap
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
Uncovered while porting the Accordion component:
- `bgsurface` → `bg-surface` (invalid class, renders as a no-op): the
accordion custom-styles demo trigger (en + cn) and the text-field
"custom styles" docs example (en + cn).
- "Connect you browser" → "Connect your browser" in the accordion
custom-styles subtitle (en demo + en/cn docs).
- Trailing space before the closing quote in the first accordion
custom-styles `content` string (en demo + en/cn docs).
Docs/content only — no runtime or API changes.
* refactor(deps): remove unused posthog-js
* refactor(docs): add heavy packages to optimizePackageImports
* refactor(docs): wrap in React cache() so the same pagePath is read once per request
* refactor(docs): lazy-load demos in registry
* fix(docs): preserve SSR of demo previews by using async loader
* refactor(docs): cut build pages ~88%
* refactor(docs): optimize build time, bundle size, and demo SSR
* fix(docs): migrate autocomplete-virtualization demo to loader registry
* fix(toast): hide close button on mobile
* fix(styles): unify mobile close button position with desktop
---------
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
* fix: preserve Select/Autocomplete variant background when isInvalid is set
* fix: nest secondary invalid state and preserve focus background
Refactor select/autocomplete secondary invalid styles to the nested
&[data-invalid] pattern (matching input.css), switch the invalid
background to var(--*-trigger-bg-focus), and drop the redundant
@apply status-invalid-field. Apply the same fix to input-otp slots,
which had the identical secondary-variant cascade bug.
* refactor(select,autocomplete): nest primary invalid override to match input/textarea
Move the primary-variant invalid background from a top-level
.--primary[data-invalid] .__trigger selector into a nested
&[data-invalid],&[aria-invalid] block inside .--primary .__trigger,
matching input.css/textarea.css and the secondary override in the
same files. Per @wingkwong review feedback.
* refactor(select,autocomplete,input-otp): scope invalid bg to wrapper per review
- Scope the secondary trigger's invalid background to the wrapper
(.select[data-invalid] &) since data-invalid/aria-invalid sit on the
container, not the trigger; the standalone .--primary .__trigger invalid
block never matched and is removed
- Restore background-color: var(--field-focus) on the base trigger invalid
state for both select and autocomplete
- Revert input-otp; the issue does not affect input otp
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(toggles): explicit composition for radio, checkbox & switch
Migrate Radio, Checkbox and Switch from child-partitioning to an explicit,
React Server Components-safe compound composition.
- Add `<X.Button>` (React Aria *Button) as the clickable label wrapping the
control + `Label`; remove the child-type inspection that broke under RSC.
- Drop `<X.Content>`; `Description`/`FieldError` become siblings of `X.Button`
and are exposed via `aria-describedby` for a cleaner accessible name.
- Keep a context-based control-only fallback for Checkbox/Switch so label-less
usages (e.g. table selection) are unchanged.
- Fix Label context bleed inside toggle buttons; retire
partition-toggle-field-children.
- Update styles, stories, EN/CN demos, component docs and migration guides.
BREAKING CHANGE: Radio, Checkbox and Switch no longer expose `*.Content`.
Wrap the control and `Label` in `*.Button`, and place `Description`/`FieldError`
as siblings of `*.Button`. Control-only checkboxes and switches are unaffected.
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs(releases): add v3.2.0 release notes
Calendar week/day views + multiple selection demos, React Aria 1.18 notes,
rolled-in v3.1.1 patch fixes, and the Radio/Checkbox/Switch *.Content -> *.Button
breaking-change migration guide (EN + CN). Updates releases index, meta, home
release badge, and dictionaries.
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(docs): rotating release badges on home hero
Replace the single hardcoded release badge with a curated, per-locale
releaseBadges list rendered by a Motion-powered carousel: popLayout spring
swap, auto-advancing accent progress segments (transform-only scaleX with a
soft gradient fade), pause on hover/focus, reduced-motion fallback, and a
plain-badge fallback for a single entry.
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs(releases): point v3.2.0 contributors to PR #6616
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs(releases): fix v3.2.0 release PR link to #6616
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(docs): remove release badge progress indicators
Drop the carousel segment bars under the home hero release badge.
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs(releases): add tooltip delay CSS vars to v3.2.0 notes
Co-authored-by: Cursor <cursoragent@cursor.com>
* refactor(toggles): rename Button to Content and simplify label composition (#6618)
Rename Checkbox/Radio/Switch.Button to .Content, remove toggle-specific
Label auto-wiring, and update docs, demos, styles, and v3.2.0 release notes.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Junior <jrgarciadev@gmail.com>
Align controlled and booking demos with Calendar generic inference so
docs typecheck passes after building @heroui/react.
Co-authored-by: Cursor <cursoragent@cursor.com>
Remove the 3-day day-view option, restore horizontal scroll with centered
months, and type Calendar for multiple selectionMode to fix docs typecheck.
Co-authored-by: Cursor <cursoragent@cursor.com>
Match MultipleMonths, DayView, and WeekView stories to the docs demos
using Select controls, correct header order, and shared defaults.
Co-authored-by: Cursor <cursoragent@cursor.com>
Fix compact day view stacking while keeping full calendar width.
Use custom week-aligned grids for 7+ day ranges.
Add week/day view Storybook and RangeCalendar docs demos.
Co-authored-by: Cursor <cursoragent@cursor.com>
Apply calendar--day-view with dynamic grid columns when visibleDuration.days
is set, and add a docs demo with a visible-days control (1, 3, 5, or 7).
Co-authored-by: Cursor <cursoragent@cursor.com>
Apply calendar--week-view when visibleDuration.weeks is set so day cells
stay usable at 1–4 week ranges, and add a docs demo with a week count control.
Co-authored-by: Cursor <cursoragent@cursor.com>
Read calendar state from RAC context directly, drop the unused
YearPickerStateContext bridge, and document format/offset/visibleYears
on year picker parts in EN and CN docs.
Co-authored-by: Cursor <cursoragent@cursor.com>
Delegate heading and year list formatting to useCalendarHeading and
useCalendarYearPicker so non-Gregorian calendars stay correct, and fix
focus stealing when selecting a year while the overlay is open.
Co-authored-by: Cursor <cursoragent@cursor.com>
Wrap react-aria CalendarHeading in Calendar and RangeCalendar heading
slots so multi-month layouts use offset instead of custom formatters.
Co-authored-by: Cursor <cursoragent@cursor.com>
Document and demonstrate weeksInMonth, multi-select, and anchor-based
unavailable dates now that react-aria-components 1.18 is in use.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(table): change physical property right-0 to logical end-0 for RTL support
* fix(table): migration to logical properties for column separator and resizer in RTL
* fix(toast): defer success/error toast after promise to avoid ViewTransition collision
When `toast.promise()` resolves, it calls `queue.close(loadingId)` then
`toastFn.success(message)` synchronously. Both operations trigger
`document.startViewTransition()` via the queue's `wrapUpdate`. The View
Transitions API only allows one active transition — starting a second
aborts the first with a DOMException.
Defer the success/error toast to the next task via `setTimeout(fn, 0)`
so the close transition completes before the new toast transition starts.
Fixes#6507
* fix(toast): chain ViewTransitions at the queue level to avoid back-to-back collisions
Replaces the call-site setTimeout(0) workaround with a queue-level fix:
defaultWrapUpdate now tracks the in-flight ViewTransition and awaits its
.finished promise before starting the next. This serializes ALL successive
mutations through the queue (not just toast.promise()), making the close+add
pattern collision-free in every browser that supports startViewTransition
(Chrome 111+, Edge 111+, Firefox 142+).
Reverts the setTimeout deferral inside createToastFunction's promise handler
since the queue now handles serialization.
* Merge branch 'v3' into pr/6511
* fix(toast): serialize ViewTransitions via tail-extending promise chain
The previous active-transition reference attached every stacked
wrapUpdate call to a single ViewTransition.finished promise. When
three or more mutations land synchronously (e.g. the loading toast's
own add is still in-flight when promise resolution triggers close +
add of the success toast), all stacked callbacks fire as soon as that
first transition finishes, and the later ones unconditionally call
startViewTransition again — colliding with each other.
Switch to a chain whose tail extends per call so each new transition
always awaits the latest one. Caught .finished rejections keep
subsequent chain steps running even when a transition is superseded.
Verified in Chromium (Playwright against the toast PromiseToast story)
that the demo and rapid stacked promise calls produce zero
"Transition was skipped" / AbortError console events, where the prior
implementation emitted 16 across the same flow.
---------
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
* fix(pickers,menu): use logical inline-end/start for chevrons, value text and indicators
Replaces physical pr-/pl-/right-/left-/text-left with their logical
equivalents (pe-/ps-/end-/start-/text-start) in:
- packages/styles/components/select.css
- packages/styles/components/list-box-item.css
- packages/styles/components/autocomplete.css
- packages/styles/components/combo-box.css
- packages/styles/components/menu-item.css
so the chevron, value text alignment, item checkmark, combo-box trigger,
and menu-item indicator (default and submenu) follow dir automatically.
LTR rendering is unchanged.
Same root cause as #6568 (table corners) and #6445 — physical CSS
properties where logical ones auto-handle direction.
* refactor(style): mr to me
---------
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
* fix(hooks): resolve useTheme SSR crash and circular dependency (fix#6559, fix#6560)
* refactor(hooks): derive resolvedTheme and use useSyncExternalStore in useTheme
---------
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
* fix(toast): clean up stale toastHeights entries when toasts are dismissed
The `toastHeights` state in `ToastProvider` tracks measured heights by
toast key but never removes entries when toasts are dismissed. Over
long-running sessions with many toasts, this object grows unbounded.
Add a `useEffect` that prunes stale keys from `toastHeights` whenever
`visibleToasts` changes.
Fixes#6508
* fix(toast): prune stale heights inside handleToastHeightChange instead of an effect
Replaces the setState-in-effect cleanup (which both broke under strict
noUncheckedIndexedAccess and tripped the react-hooks/set-state-in-effect
rule) with opportunistic pruning inside handleToastHeightChange. Every
mounted toast measures its height on appear, giving a natural point to
drop entries for toasts that are no longer visible. Bounds toastHeights
to the set of currently visible toasts.
Also includes ESLint sort-keys auto-fix on pre-existing keys in the same
file (no behavioural change).
* Merge branch 'v3' into pr/6512
* refactor(toast): prune toastHeights via effect cleanup on unmount
---------
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
* fix(toast): move tabindex from style object to HTML attribute
`tabindex` is an HTML attribute, not a CSS property. Setting it inside
the `style` object has no effect on the DOM. Non-frontmost toasts
remained keyboard-tabbable when they should have been removed from the
tab order.
Move `tabIndex` to a proper React prop on `<ToastPrimitive>` and remove
the invalid entry from the style useMemo.
Fixes#6506
* fix(toast): set tabIndex imperatively via ref to satisfy ToastProps types
* refactor(react): switch to useLayoutEffect
---------
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
* fix(styles): use overflow-clip on modal dialog to prevent focus scroll jump
* fix(styles): use overflow-clip to prevent focus scroll jump
---------
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
Update the CollapsibleCode block in theming.mdx to match the actual
theme.css: use var() references instead of inline color-mix formulas,
add default-soft tokens, and update soft-foreground to reference the
new accessible soft-foreground variables.
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(docs): wire HeroUI Native Universal Links and download fallback (#6540)
* feat(styles): add soft foreground tokens and migrate components to use them
Introduce `--default-soft`, `--default-soft-foreground`, and `--default-soft-hover`
theme variables. Update all `*-soft-foreground` formulas in both light and dark themes
to use `color-mix` for better contrast and accessibility. Migrate avatar, badge, chip,
alert, toast, and range-calendar components from raw color tokens to soft foreground
tokens. Update documentation demos accordingly.
Co-authored-by: Cursor <cursoragent@cursor.com>
* refactor(docs): stop computing derived color variables in theme builder
Replace hardcoded OKLCH color-mix computations with static var()-based
formulas matching variables.css. Theme presets now only output primitive
variables, letting the stylesheet handle all derived values (hover, soft,
soft-foreground). Add adaptive dark accent for Uber theme (near-white in
dark mode). Hook build-theme-presets into predev/prebuild scripts.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(docs): use default color for alert dialog demo avatar
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(styles): add vibrant palette opt-in and Uber adaptive dark accent
Add data-vibrant-palette="true" attribute for users who prefer more
saturated soft foreground colors (92%/8% mix vs accessible defaults).
Include vibrant palette toggle in both theme builder and docs theme
selector. Add adaptive dark accent for Uber theme in preset generator.
Regenerate theme-presets.css with primitives-only output. Document
vibrant palette in theming docs.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Volodymyr Serbulenko <115154506+vvv-sss@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs: add 12 copy-edited blog posts for SEO and AI discoverability
De-templated repetitive boilerplate across all posts, rewrote tutorial
openings with pain-point hooks, and made "Why HeroUI" closing sections
contextually unique per article. Removed 4 duplicate/unpolished posts
(two dashboard duplicates, e-commerce, landing page, SaaS app tutorials)
to keep the initial launch set focused and high-quality.
Made-with: Cursor
* feat(docs): add SEO, blog, JSON-LD, and AI discoverability improvements
Adds blog pages, JSON-LD structured data, enhanced metadata, sitemap
normalization, component/example counts, why-heroui page, AI prompts,
and SEO-optimized README.
Made-with: Cursor
* feat(docs): blog content rebalancing, SEO improvements, and blog UI polish
- Rebalance all 7 comparison/listicle blog posts: remove self-undermining
trade-offs, star count comparisons, and competitor endorsements; replace
with HeroUI-forward conclusions and brief "when X might work" sections
- Optimize blog post descriptions using Ahrefs keyword data
- Add BreadcrumbList JSON-LD to blog post pages
- Add OG images to Chakra and Mantine comparison posts
- Extract PostCard into shared component with image support and onError fallback
- Redesign blog post header: Linear-inspired layout with title, hero image,
author name + date below image, avatar on hover
- Add DocsImage support to blog posts with light/dark mode switching
- Add darkImage frontmatter field to blog data layer
- Fix mobile overflow on blog post pages
- Add hero images to "Why Choose HeroUI" and "12 Best" posts
- Enhance "Why Choose HeroUI" post: add YC backing, community metrics,
"Ready in Two Steps" section, AGENTS.md docs, theme builder link
- Remove "Updated April 2026" from all posts
- Sort related posts by newest first
- Truncate card titles to 2 lines
- Fix Draft badge visibility on light backgrounds
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(docs): wrap BlogContent in Suspense boundary for useSearchParams
Next.js requires useSearchParams (used by nuqs) to be wrapped in a
Suspense boundary during static generation.
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs(blog): publish 12 best react UI component libraries post
Remove draft state so the post is publicly visible.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
* refactor(styles): move calculated color tokens to variables
Co-authored-by: Cursor <cursoragent@cursor.com>
* refactor(styles): use unprefixed source tokens in components and theme builder
Components now reference source tokens directly (e.g. var(--default)
instead of var(--color-default)). Theme builder helpers consolidated
into getDerivedColorVariables() emitting unprefixed derived vars.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(styles): use accent soft foreground for default hover
* fix(styles): disable twMerge for textVariants
* refactor(text): rename Text to Typography (#6505)
* fix(text): rename Text BEM classes to avoid tailwind-merge collision
The Text component shipped BEM class names sharing the `text-` prefix
with Tailwind's text-* utility family (font-size, text-color, font-weight).
tailwind-merge — invoked internally by tailwind-variants — treated
`text--body`, `text--color-muted`, `text--weight-normal`, etc. as
conflicting members of that family and deduped them down to the last one.
The result was that `color` and `weight` props on <Text> silently did
nothing, and `type` was stripped whenever it appeared alongside `weight`.
The user-visible failure: <Text color="muted"> renders with foreground
color; <Text weight="bold"> drops the body-size rule.
Rename the BEM modifier family from `text--*` to `typography--*` (and
`.text-prose` to `.typography-prose`). The base `.text` class stays.
Variant config in text.styles.ts and the CSS-class reference in the docs
mdx updated to match.
Verified with:
twMerge('text--body', 'text--color-muted') // 'text--color-muted'
twMerge('typography--body', 'typography--color-muted')
// 'typography--body typography--color-muted'
* refactor(text): rename to Typography
---------
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
* chore(deps): bump next version + action version (#6529)
* chore(deps): bump next version
* fix(docs): type issue
* chore(.github): bump action versions
* fix(.github): incorrect version for actions/cache
* fix(deps): extend pnpm.overrides
* chore(deps): sync versions
* fix(styles): use field-border for radio default border color (#6522)
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* fix(styles): add field border width to checkbox control (#6521)
Add border, border-field-border, and [border-width:var(--border-width-field)]
to .checkbox__control base styles. Add border-color to transition list.
This aligns checkbox with the existing radio control pattern, ensuring
both primary and secondary variants inherit the same base field border
unless state overrides (selected/indeterminate/invalid) apply.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* docs(releases): add v3.0.5 release notes (#6531)
* docs(releases): add v3.0.5 release notes
Document the v3.0.5 patch: Text → Typography rename (breaking),
unprefixed source color tokens, Checkbox/Radio field-border fixes,
Calendar hover refinement, CLI docs page, and the deps bump.
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs(home): update hero badge to v3.0.5 release
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs(releases): show before/after for v3.0.5 token refactor
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Diego Gonzalez <diego.ags04@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
Co-authored-by: Alec McLeod <36314633+aosmcleod@users.noreply.github.com>
Add border, border-field-border, and [border-width:var(--border-width-field)]
to .checkbox__control base styles. Add border-color to transition list.
This aligns checkbox with the existing radio control pattern, ensuring
both primary and secondary variants inherit the same base field border
unless state overrides (selected/indeterminate/invalid) apply.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* fix(text): rename Text BEM classes to avoid tailwind-merge collision
The Text component shipped BEM class names sharing the `text-` prefix
with Tailwind's text-* utility family (font-size, text-color, font-weight).
tailwind-merge — invoked internally by tailwind-variants — treated
`text--body`, `text--color-muted`, `text--weight-normal`, etc. as
conflicting members of that family and deduped them down to the last one.
The result was that `color` and `weight` props on <Text> silently did
nothing, and `type` was stripped whenever it appeared alongside `weight`.
The user-visible failure: <Text color="muted"> renders with foreground
color; <Text weight="bold"> drops the body-size rule.
Rename the BEM modifier family from `text--*` to `typography--*` (and
`.text-prose` to `.typography-prose`). The base `.text` class stays.
Variant config in text.styles.ts and the CSS-class reference in the docs
mdx updated to match.
Verified with:
twMerge('text--body', 'text--color-muted') // 'text--color-muted'
twMerge('typography--body', 'typography--color-muted')
// 'typography--body typography--color-muted'
* refactor(text): rename to Typography
---------
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
- Move Text entry in meta.json to alphabetical position after Tag Group and before Text Field
- Replace text-default usage demo with text-typography-scale in text.mdx
- Reuse existing text-typography-scale demo registration (no duplication)
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
- Add Spotify, Coinbase, Airbnb, Discord, Rabbit to docs theme selector
and regenerate theme-presets.css (10 presets, was 5)
- Add theme selector to landing page nav (next to search)
- Update landing page banner to use accent-soft-foreground tokens
- Remove stale icon:new from 11 components, add to Text only
- Remove stale icon:updated from 9 components, add to components
actually changed in v3.0.4 (checkbox, tooltip, table, chip, badge, button)
- Add video player to release notes theme selector section
- Fix video-player default from invalid object-fit to object-cover
Co-authored-by: Cursor <cursoragent@cursor.com>
Derive a darker accent-soft-foreground for light accents (lightness > 0.65)
in the theme builder's generate-theme-colors utility, matching the fix
already applied to the docs theme presets build script.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Add v3-0-4.mdx release notes with Text component, theme selector,
border-radius tokens, table focus ring, and bug fix sections
- Add typography-scale demo for Text component in release notes
- Update landing page banner to reference v3.0.4
- Update releases index.mdx and meta.json sidebar nav
- Fix soft color contrast for light accent themes (Sky, Lavender, Mint):
shared theme now reads --accent-soft-foreground with fallback to --accent
- Darken accent-soft-foreground in build-theme-presets for light accents
- Fix chip and badge using raw --color-accent instead of --color-accent-soft-foreground
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(docs): redesign colors page to match Figma with light/dark sections
Restructure the colors documentation page into semantic sections (Accent,
Default, Success, Warning, Danger, Foreground, Background, Surface, Form
field, Separator, Other) with side-by-side light/dark theme previews,
descriptions from Figma, and auto-contrast text via background-clip.
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(docs): display CSS variable names below color labels
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(docs): add background and padding to mobile demo showcase
Co-authored-by: Cursor <cursoragent@cursor.com>
* chore(docs): reduce gaps in color section components for compact layout
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(docs): show color token details in tooltips
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(docs): add mobile token labels and copyable color values
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace raw rounded-* utilities and calc() radius values with
min(32px, var(--radius-*)) across overlay and container components
so content is never clipped by excessively large corner radii.
Co-authored-by: Cursor <cursoragent@cursor.com>
Replace minimal stories with comprehensive demos: heading scale, body sizes,
inline code, alignment, weight scale, muted color, truncation, a full article
composition, and a prose block with headings/paragraphs/lists/blockquote/code/
links. Also auto-fix formatting (prettier) in text.tsx.
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
text.css was never imported in the styles component barrel, so Text CSS
classes were missing from the bundled stylesheet. Also replaced invalid
Tailwind v4 utilities (rounded-medium, rounded-large, default-100/200/500/600)
with valid theme tokens (rounded-md, rounded-xl, default, muted, border, link,
separator).
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
Replace `rounded-full` (9999px) with size-appropriate radius tokens that
achieve the same visual effect while respecting the --radius variable.
Also replace hardcoded `border-radius: 4px` values with `rounded-sm` and
fix a calc expression in tabs that didn't resolve to 0 when --radius is 0.
Made-with: Cursor
Fetch Pro component results from heroui.pro search API on every
keystroke (debounced 150ms) and display them at the top of search
results with a PRO chip badge. Clicking opens the Pro docs in a
new tab. Supports both web and native Pro components.
Made-with: Cursor
HeroUI Pro has launched, so the banner and floating popup now say
"launch discount" instead of "pre-sale". UTM campaign params updated
accordingly.
Made-with: Cursor
* chore(deps): React Aria Upgrade (v1.17.0) (#6433)
* chore(deps): bump react-aria versions
* fix(toast): align ToastRegion queue with stately ToastQueue types
* refactor(react): apply subpaths to RAC
* feat(table): introduce Expandable Rows
* fix(tabs): scope secondary variant CSS to prevent leaking into nested Tabs (#6384)
* fix(tabs): scope secondary variant CSS to prevent leaking into nested Tabs
The secondary variant styles used descendant selectors (e.g.
.tabs--secondary .tabs__tab) which leaked into nested Tabs
components with a different variant, because inner elements are
still descendants of the outer .tabs--secondary.
Fixed by scoping all secondary variant selectors through the direct
child > .tabs__list-container, which correctly stops at the Tabs
component boundary. Nested Tabs have their own .tabs__list-container
that is NOT a direct child of the outer .tabs--secondary.
Closesheroui-inc/heroui#6381
* chore(styles): remove comment
---------
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
* feat(hooks): add use-theme hook (#6426)
* feat(hooks): add use-theme hook
* feat(hooks): revise use-theme logic
* chore(docs): add dark mode section and include use-theme example
* fix(hooks): check custom theme before removing
* refactor(hooks): simplify useTheme to accept any theme name string
Remove ThemeProps constant and allow passing plain strings ("light",
"dark", "brutalism-light", etc.) directly to useTheme.
Made-with: Cursor
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* feat: dom polymorphic utility and render-prop element customization (#6403)
* feat(utils): add dom polymorphic utility
* feat(card): enable render-prop element customization for card
* feat(card): enable render-prop element customization for card
* chore(react): export dom utility
* feat(alert): enable render-prop element customization
* feat(badge): enable render-prop element customization
* feat(chip): enable render-prop element customization
* feat(empty-state): enable render-prop element customization
* feat(fieldset): enable render-prop element customization
* feat(kbd): enable render-prop element customization
* feat(pagination): enable render-prop element customization
* feat(skeleton): enable render-prop element customization
* feat(spinner): enable render-prop element customization
* feat(switch-group): enable render-prop element customization
* feat(table): enable render-prop element customization
* feat(react): enable render-prop element customization
* chore(utils): add use client
* fix(calendar-year-picker): type issue
* chore(docs): add heroui's render prop in composition
* docs(native): add v1.0.2 release notes and update component API references (#6429)
* docs(native): update radio-group doc file with radio api ref
* docs(native): update portal ref with unstable_accessibilityContainerViewIsModal
* docs(native): update overlay portal api ref
* docs(native): add 1.0.2 release note
* fix(docs): broken link in migration guide (#6440)
* fix(utils): remove unexpected DOM element warning from render prop
Made-with: Cursor
* Revert "Merge remote-tracking branch 'origin/v3' into feat/HHTA-580"
This reverts commit 8f68adbae37e90c02d1db4e5662c3b4f4a87a253, reversing
changes made to 226d179fa0cb8ad8019885ebc9d15b6ca5079230.
---------
Co-authored-by: Volodymyr Serbulenko <115154506+vvv-sss@users.noreply.github.com>
Co-authored-by: Stybo <84643947+Stybo@users.noreply.github.com>
Co-authored-by: Junior <jrgarciadev@gmail.com>
* feat(docs): v3.0.3 release note (#6435)
* feat(docs): add v3.0.3 meta
* feat(docs): add v3.0.3 synopsis
* feat(docs): add v3.0.3 release note (draft)
* docs(releases): remove NumberField PR #6417 from v3.0.3 release notes
Made-with: Cursor
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* fix: restore files reverted by squash merge from feat/HHTA-580
The squash merge in #6403 included an accidental revert of the v3
merge, which undid the Apache License, Codex MCP examples, and other
docs changes. This restores all affected files to match v3.
Made-with: Cursor
* docs(releases): update useTheme example to use plain strings
Made-with: Cursor
* docs(releases): use Button component in useTheme example
Made-with: Cursor
* chore(docs): update pull id (#6442)
* docs(releases): mention Apache 2.0 license change in v3.0.3 notes
Made-with: Cursor
* docs(home): update hero badge to v3.0.3 release
Made-with: Cursor
* docs(releases): revise v3.0.3 notes and hero badge
- Highlight RAC 1.17 with 90% fewer deps in badge and intro
- Split expandable rows into its own section with demo
- Link RAC release notes in dependencies
- Remove stale NumberField references
Made-with: Cursor
* docs(home): fix spacing in hero badge title
Made-with: Cursor
* docs(home): capitalize Table in hero badge title
Made-with: Cursor
---------
Co-authored-by: WK <wingkwong.code@gmail.com>
Co-authored-by: Dhanush <122294583+Gdhanush-13@users.noreply.github.com>
Co-authored-by: Volodymyr Serbulenko <115154506+vvv-sss@users.noreply.github.com>
Co-authored-by: Stybo <84643947+Stybo@users.noreply.github.com>
* fix(docs): update z-index values in VideoPlayer component for improved layering
* feat(docs): enhance DemoShowcase with loading spinner and iframe loading state management
- Introduced a new function to generate Pro URLs with UTM parameters for better tracking.
- Updated the layout of ThemeBuilderContent for improved responsiveness and visual appeal.
- Added a link to access Pro templates, conditionally displayed based on the selected tab.
Consolidate into NEXT_PUBLIC_PRO_URL which is already used by all Pro
links and banners. Migrate themes/constants.ts to use the new var.
Made-with: Cursor
- Add NEXT_PUBLIC_PRO_URL for the Pro frontend URL (separate from API URL)
- Fix "Get Pro deal" button to open in new tab with UTM params
- Fix ProChip on homepage to open in new tab with UTM params
- Export PRO_URL from pro-banner for reuse across components
Made-with: Cursor
- Add HeaderBanner component to /docs layout with clickable link to heroui.pro (UTM params)
- Fetch discount data (percent, endsAt) from Pro API instead of hardcoded date
- Use calligraph for animated countdown digits in both banners
- Animate ProBanner entrance/exit with motion (spring in, fade out)
- Add NEXT_PUBLIC_SHOW_PRE_SALE_BANNER env toggle and NEXT_PUBLIC_PRO_API_URL
- Render placeholder "--" values while loading to prevent CLS
- Responsive: condense banner text on mobile screens
Made-with: Cursor
- Add configurable HEROUI_PRO_URL env variable instead of hardcoded URLs
- Refactor preview tab state from React context to nuqs query params (?template=)
- Pass selected color and template to theme builder via URL from homepage demo
- Add UTM tracking to Pro template links and make them clickable
- Add CloseButton to Pro banner and fix dark mode CTA styling
- Post font metadata to template iframes for consistent typography
- Fix iframe layout with absolute positioning for proper flex sizing
- Fix SVG ID collisions in VerifiedBadgeIcon using useId()
- Add AppleIcon and GoogleIcon SVG components
- Add dark mode variant for shine animation effect
- Refine homepage hero spacing and make GitHub stars link clickable
Made-with: Cursor
- Added FloatingStars and ProBadge components.
- Introduced ProChip and ProBanner to promote Pro.
- Updated global CSS with new animations shine effects.
- Adjusted iframes for dynamic content in the theme builder.
* fix(styles): input group focusing styles (#6274)
* feat(toggle-button): add ToggleButton component with docs, demos, and styles (#6276)
* feat: add ToggleButton component with demos and update documentation
* refactor(toggle-button): replace Iconify icons with Gravity UI icons in demo components
* feat(meter): add Meter component with documentation, demos, and styles (#6284)
* feat(toggle-button-group): introduce ToggleButtonGroup (#6278)
* feat(toggle-button-group): introduce ToggleButtonGroup component with documentation and demos
* refactor(select, toggle-button-group): update Key import to use @heroui/react and enhance type safety in state management
* refactor(toggle-button-group): rename isAttached to isDetached and update related documentation and styles
* feat(toggle-button-group): add ToggleButtonGroup.Separator component and update documentation and demos
* refactor(toggle-button-group): replace data attributes with modifier classes for detached mode and update related styles and documentation
* feat(button-group): add ButtonGroup.Separator and update docs/examples (#6282)
* feat(button-group): introduce ButtonGroup.Separator for improved button spacing and styling
- Added ButtonGroup.Separator component to enhance visual separation between buttons.
- Updated documentation and demos to reflect the new separator usage in ButtonGroup.
- Refactored existing button group examples to utilize the separator for consistent styling.
- Enhanced CSS styles for the separator to ensure proper display and responsiveness.
* docs(button-group): update icon in ButtonGroup documentation for clarity
* feat(progress): add ProgressBar and ProgressCircle components with do… (#6286)
* feat(progress): add ProgressBar and ProgressCircle components with documentation and demos
- Introduced ProgressBar and ProgressCircle components to provide visual feedback for operations.
- Updated components registry and documentation to include new progress components.
- Enhanced demos for both components to showcase various use cases and configurations.
- Updated styles and CSS imports to accommodate the new components.
* refactor(progress-bar): update layout and input components for improved usability
- Adjusted the layout of the ProgressBar demo for better responsiveness and alignment.
- Replaced Slider with NumberField for value input, enhancing user interaction.
- Updated styles for the Separator component to ensure proper visibility in different orientations.
* refactor(progress-circle): remove Output component and update related styles
* feat(progress-circle): enhance ProgressCircle component with new TrackCircle and FillCircle subcomponents
- Updated ProgressCircle to include TrackCircle and FillCircle for improved SVG structure.
- Modified documentation and demos to showcase the new subcomponents and their usage.
- Enhanced styling and functionality across various demos to reflect the new component architecture.
* feat(toolbar): introduce Toolbar component with documentation and demos (#6291)
* chore(react): export Virtualizer & TableLayout
* feat(table): table with virtualization
* feat(listbox): listbox with virtualization
* fix(docs): broken format
* chore(docs): include Virtualizer doc link
* feat(styles): cater virtualized table styles
* refactor(react): streamline package.json export generation (#6301)
* fix(avatar): inherit border-radius on fallback to respect className overrides (#6300)
* fix: prevent click events from propagating through portal to parent elements (#6297)
* chore(deps): bump react-aria versions (release v1.16.0) (#6289)
* chore(deps): bump react-aria versions (release v1.16.0)
* chore(deps): pnpm-lock.yaml
* feat(drawer): add Drawer component with documentation and demos (#6309)
* fix(react): add missing external deps (#6310)
* fix(table): visual bugs in Firefox (#6298)
* fix(styles): table secondary variant header rounding in Firefox
* fix(styles): table td background in firefox
* feat(releases): add v3.0.0-rc.1 release notes (#6311)
* feat(releases): add v3.0.0-rc.1 release notes with new components and improvements
* fix(docs): update link to Component Docs in v3.0.0-rc.1 release notes
* fix(docs): update VersionChip link and description for React v3.0.0-rc.1
* docs(releases): update rc-1 notes with missing PRs and switch install tags to @rc
Add Table Firefox fix (#6298) and granular component imports (#6301) to
release notes. Update all installation docs from @beta to @rc. Fix drawer
demo placement and padding.
Made-with: Cursor
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* feat: v3.0.0 rc 1 release
---------
Co-authored-by: WK <wingkwong.code@gmail.com>
Co-authored-by: Diego Gonzalez <49571987+diegonzs@users.noreply.github.com>
Hullo @jrgarciadev 👋
I ran your skills through `tessl skill review` at work and found some targeted improvements. Here's the before/after:
| Skill | Before | After | Change |
|-------|--------|-------|--------|
| heroui-native | 88% | 93% | +5% |
| heroui-react | 88% | 93% | +5% |
<details>
<summary>Changes made</summary>
**Both skills — Description (90% → 100%)**
- Added specific concrete actions (Buttons, Cards, Modals, Forms, TextFields, Dialogs) and configuration details (dark/light themes, oklch variables) to the frontmatter description
- Added "mobile components" keyword to heroui-native for broader trigger coverage
**heroui-native — Content conciseness**
- Condensed the "CRITICAL: Native Only" section — removed the redundant WRONG example since the comparison table already conveys the differences
- Combined the main install and peer dependencies into a single copy-paste command
- Consolidated the Component Patterns section into a brief reference (compound pattern already demonstrated above)
**heroui-react — Content conciseness**
- Condensed the "CRITICAL: v3 Only" section — removed the redundant WRONG example since the comparison table covers the v2→v3 differences
- Removed duplicate "No Provider Required" from Critical Setup Requirements (already stated prominently in the comparison table)
- Consolidated the Component Patterns section to avoid repeating the Card compound component example
</details>
Honest disclosure — I work at @tesslio where we build tooling around skills like these. Not a pitch - just saw room for improvement and wanted to contribute.
Want to self-improve your skills? Just point your agent (Claude Code, Codex, etc.) at [this Tessl guide](https://docs.tessl.io/evaluate/optimize-a-skill-using-best-practices) and ask it to optimize your skill. Ping me - [@popey](https://github.com/popey) - if you hit any snags.
Thanks in advance 🙏
* refactor(pagination): wrap Pagination component in a responsive container for improved layout
* fix(badge): update avatar URL and enhance Badge component demo with new placement prop
* style(range-calendar): add rounded corners to calendar cells for improved selection (#6250)
* feat(date-field): introduce DateField.InputContainer for improved input grouping (#6251)
* fix(date-picker): missing red asterisk
* fix(date-range-picker): missing red asterisk
* feat(badge): add Badge component with demos and update documentation
* refactor(badge): update Badge component styles and sizes for improved consistency
* feat(pagination): add Pagination component with demos and update documentation
* refactor(pagination): update prop names and enhance accessibility features
- Renamed `disabled` to `isDisabled` and `onClick` to `onPress` for consistency with React Aria.
- Updated documentation to reflect new prop names and added notes on accessibility improvements.
- Adjusted demo components to use the new prop names for pagination controls.
* refactor(pagination): replace custom chevron icons with standardized icons
- Adjusted icon properties to ensure proper sizing and accessibility attributes.
* feat(table): add Table component (#6256)
* feat(table): add Table component with stories
* fix(table): update table stories and styles for improved layout and functionality
- Corrected the title format in table stories for better categorization.
- Updated user IDs in the table data for consistency.
- Enhanced the table layout by adjusting the wrapper width and adding selection functionality.
- Improved hover effects and rounded corners in the table CSS for better visual appeal.
* feat(table): integrate pagination functionality and enhance table stories
- Added Pagination component to the table stories for improved navigation.
- Introduced new user entries to the table for better demonstration.
- Updated pagination styles for responsive design and improved layout.
- Refactored table footer to utilize the new Pagination component.
* style(table): enhance focus-visible styles for improved accessibility and consistency
- Updated focus-visible styles to use inset shadows for better focus indication.
- Replaced ring styles with outlines to ensure focus stays within cell boundaries.
- Applied consistent border-radius across table components for a unified look.
* feat(table): add column resizing functionality and enhance table stories
- Introduced TableColumnResizer and TableResizableContainer components for dynamic column resizing.
- Updated table stories to demonstrate column resizing with drag handles.
- Adjusted CSS styles for resizable columns and improved layout consistency.
* feat(table): introduce Load More functionality for async loading in table component
- Added TableLoadMoreItem component to support infinite scrolling and async data loading.
- Updated table stories to demonstrate the new Load More feature with simulated data fetching.
- Enhanced CSS styles for the Load More item and scrollbar customization for better user experience.
* feat(table): enhance table component with new Content and ScrollContainer features
- Introduced TableContent and TableScrollContainer components for improved table structure.
- Updated Table component to integrate new features, enhancing usability and organization.
- Modified table stories to demonstrate the new components in action.
- Adjusted CSS styles to reflect changes in component structure and improve visual consistency.
* refactor(table): streamline AsyncLoading story for better readability and structure
- Enhanced the Load More section with a flex container for better alignment of loading spinner.
* feat(table): add Table component documentation
- Added new demos for various table functionalities including sorting, selection, and pagination.
- Enhanced styles for the Load More content to improve user experience.
* feat(table): integrate TanStack Table into documentation and demos
- Included a new demo for the TanStack Table component to illustrate its usage.
* fix(style): missing invalid state in trigger (#6267)
* fix(textfield): hyphenated format & add missing variant in surface example (#6266)
* fix(textfield): hyphenated format
* fix(docs): incorrect source path
* feat(releases): add v3.0.0-beta.8 release notes and new components (#6271)
* feat(releases): add v3.0.0-beta.8 release notes and new components
* fix(docs): remove left border from sidebar drawer (#6272)
* fix(docs): update VersionChip to reflect new React beta release and components
* fix(docs): update avatar URLs in BadgeBasic demo for consistency
* fix(docs): update pagination component demo name to reflect ellipsis usage
* feat(docs): add new demos for custom cells, pagination, and empty state in table documentation
* feat(docs): add date-range-picker input container demo and update references
* feat(docs): enhance pagination demos with state management and dynamic page rendering
* fix(docs): update icon status for multiple components in documentation
* fix(docs): update VersionChip href to reflect new React beta release version
* fix(docs): adjust DateRangePicker width for improved layout
---------
Co-authored-by: Diego Gonzalez <49571987+diegonzs@users.noreply.github.com>
Co-authored-by: WK Wong <wingkwong.code@gmail.com>
Co-authored-by: Diego Gonzalez <diego.ags04@gmail.com>
- Added `overflow-x-auto` class to Calendar and RangeCalendar for horizontal scrolling.
- Adjusted classes in multiple-months demos to use `w-max` for improved width handling.
* chore: adjust listbox item hover color
* Feat/calendar [WIP] (#6187)
* refactor(stories): update component titles for better categorization in Calendar and Chip stories
* feat: calendar first styles done, stories in progress
* feat(calendar): add year picker trigger and overlay grid to calendar
* feat(docs): add Date and Time category with Calendar component documentation and demos
* refactor(docs): update ColorField and DateField components to use new Group and Input structure
- Replaced ColorInputGroup with ColorField.Group and ColorField.Input in documentation and demos.
- Updated DateInputGroup to DateField.Group and DateField.Input across relevant files.
- Ensured consistency in component usage and improved clarity in examples.
* feat(calendar): enhance year picker functionality and documentation
- Introduce Calendar.YearPickerTrigger, Calendar.YearPickerGrid and subcomponents for year selection
- Update docs with new year picker features and examples
- Make min/max date values calendar-aware for better date handling
- Revise component demos to show year picker integration
* fix(calendar): update button labels and improve date calculations in controlled calendar demo
* docs(calendar): add international calendar demo and update documentation
Co-authored-by: Cursor <cursoragent@cursor.com>
* refactor(calendar): rename year picker trigger slots for consistency
Co-authored-by: Cursor <cursoragent@cursor.com>
* docs(calendar): add year picker trigger CSS classes to documentation
Co-authored-by: Cursor <cursoragent@cursor.com>
* refactor(calendar): align year picker slot names with CSS class names
Renamed calendar year picker slots and CSS classes for consistency:
- triggerHeading: trigger-text → trigger-heading
- triggerIndicator: trigger-icon → trigger-indicator
Updated files:
- Component data-slot attributes in calendar-year-picker.tsx
- CSS class names in calendar-year-picker.css
- Slot mappings in calendar-year-picker.styles.ts
- Documentation references in calendar.mdx
Also added custom-icons demo showing NavButton customization.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Diego Gonzalez <diego.ags04@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(date-picker): add DatePicker component with docs and demos (#6226)
* feat(date-picker): introduce DatePicker component
- add a composable DatePicker with integrated Calendar support
- update the component registry and date-and-time docs category
* feat(date-picker): enhance documentation and demos
- Added format options section to DatePicker documentation.
- Introduced international calendar support in DatePicker documentation.
- Updated demo registry to include new format options and international calendar demos.
- Adjusted component styles in demos for consistent width and improved layout.
* feat(calendar): add custom styles demo and documentation
* fix(calendar): update calendar default heading layout
* fix(date-picker): adjust popover width for improved layout consistency
* chore(deps): bump RA versions (#6217)
* chore(deps): bump RA versions
* chore(deps): bump react-aria-components
* feat(range-calendar): add RangeCalendar component and documentation (#6239)
* feat(range-calendar): introduce RangeCalendar component with documentation and demos
* docs(colors): update color component documentation by removing 'icon' field for consistency
* fix(components-category): reorder components in Date and Time category for consistency
* feat(date-picker): integrate TimeField into FormatOptions for enhanced date-time selection
* fix(calendar): refine focus-visible styles in calendar and range-calendar components
* fix(extract-links): update title conversion to use kebab-case and filter empty parts
* fix(date-picker): change default granularity to minute and adjust Popover class for improved layout
* fix(range-calendar): replace boolean attributes with data attributes for improved accessibility
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* feat(switch): introduce Switch.Content (#6240)
* fix(breadcrumbs): add missing props to Link (#6233)
* feat(tabs): add Tabs.Separator component and update documentation (#6243)
- Introduced `<Tabs.Separator />` for visual separation between tabs.
- Updated documentation to include examples and props for the new separator.
- Refactored demo components to showcase the separator functionality.
- Removed the old WithoutSeparator demo in favor of the new WithSeparator demo.
* feat(date-range-picker): add DateRangePicker component (#6242)
* feat(date-range-picker): add DateRangePicker component with documentation and demos
* fix(date-range-picker): update class names for consistency in styles
* fix(date-range-picker): improve focus restoration logic
* feat(releases): add v3.0.0-beta.7 release notes (#6245)
* feat(releases): add v3.0.0-beta.7 release notes
* docs(beta-7): polish release notes and add @internationalized/date references
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(docs): custom render function (#6216)
* chore(deps): bump RA dependencies
* feat(docs): add custom render function in props section
* feat(docs): add custom render function
* feat(docs): add CustomRenderFunction in demos
* feat(docs): add CustomRenderFunction
* chore(docs): remove CustomRenderFunction
* chore(docs): incorrect prop section
* chore(docs): remove CustomRenderFunction from close button
* chore(docs): remove render prop
* chore(docs): remove disclosure-group-custom-render-function
* chore(docs): add disclosure-custom-render-function
* chore(docs): remove Custom Render Function
* feat(docs): add custom render function demos
* fix(docs): typecheck issues
* fix(docs): type issue
* fix(docs): remove unnecessary demo
* chore(docs): revise render prop doc
* fix(docs): add missing use client
* chore(docs): update icon
* chore(docs): add back Custom Indicators
* chore(docs): remove extra line
* chore(docs): remove render prop from close button
* chore(docs): remove render prop from panel & add icon
* feat(docs): add custom render function demos
* chore(deps): bump react-aria-components
* chore(docs): add missing info
* chore(docs): add use client
* chore(docs): add missing info
* chore(docs): update icon
* chore(docs): rollback icon
* chore(docs): update icon
* chore(docs): update icon
* chore(docs): update icon
* chore(docs): revise tab example
* chore(docs): disclosure render prop
* feat(docs): add custom render function to accordion
* feat(docs): add custom dom element section
* feat(docs): add render prop to date-picker
* feat(docs): add render prop to date-range-picker
* fix(docs): update release notes for v3.0.0-beta-7 with corrected dependency versions and usage examples
* docs(composition): enhance render prop section with usage example and clarify component rendering guidelines
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* chore(release): bump versions to 3.0.0-beta.7 for @heroui/react and @heroui/styles
---------
Co-authored-by: Diego Gonzalez <diego.ags04@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Diego Gonzalez <49571987+diegonzs@users.noreply.github.com>
Co-authored-by: WK <wingkwong.code@gmail.com>
* fix: keep page interactive during view transitions (#6128)
* fix(styles): align placeholder color with input (#6139)
* refactor(styles): rename CSS classes to hyphenated format (#6141)
* fix(styles): svg shifting issue in safari (#6149)
* fix(styles): align toast content vertically (#6147)
* fix(styles): Link with button variants (#6138)
* fix(styles): revise import order
* chore(styles): handle link with button variants
* chore(styles): add gap-0
* feat(separator): variant (#6142)
* feat(separator): variant
* refactor(styles): theme variables
* chore(docs): add updated icon
* refactor(styles): make calculated variables depend only on root variables (#6154)
* feat(color-swatch): add color swatch component
- Add ColorSwatch component with size and radius variants
- Add CSS styles with BEM naming convention
- Add documentation and demo examples
- Register component in docs and package exports
* docs(color-swatch): move to colors category and add accessibility demo
* refactor(color-swatch): reorder Sizes export in stories file
* fix(color-swatch): update boxShadow style in ColorSwatchCustomStyles component
* feat(color-swatch-picker): add color swatch picker component
* Refactor/tooltip width (#6159)
* fix(color-picker): handle undefined hue in oklch conversion for white colors (#6143)
* feat(docs): update skills for mcp v1 endpoints (#6134)
* feat(docs): update skills for mcp v1 endpoints
* fix(docs): update mcp docs
* chore(card): use secondary variant for input in surface (#6146)
* docs: use consistent font name (#6144)
The example looked wrong since in the docs it was mentioned:
`Note: The font names in CSS variables should match the PostScript names of your loaded fonts. Check your font package documentation or use the font names exactly as they appear in your useFonts hook.`
But actually different names were being used in `useFonts` hook and in `global.css`.
* chore(docs): adjust content names for react components
* feat(docs): mcp dropdown (#6155)
* feat(docs): add RAW_DOCS_CONTENT_PATH
* chore(docs): use RAW_DOCS_CONTENT_PATH instead
* feat(docs): add new icons
* chore(docs): remove LLMCopyButton
* feat(docs): mcp dropdwon
* chore(docs): revise icon styles
* chore(docs): revise mcp dropdown styles
* feat(docs): add vscode mcp
* feat(docs): rotate chevron when open
* chore(docs): use cursor link
* refactor(docs): replace Popover with Dropdown and improve copy button UX in page-actions
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* feat: native skill (#6156)
* feat(skills): heroui native agent skill + move skills to repo root
* feat(skills): remove commands and old heroui skill on skill install
* chore(docs): minor folder rename
* feat(docs): update react skills doc + add native skills doc
* docs(skills): update agent skills docs with versions and improve install script
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* fix(docs): remove redundant redirect route causing build error
* docs(react): update README to reflect HeroUI v3 beta status and provide v2 branch link
* docs(react): emphasize HeroUI v3 beta status with warning icon in README
* docs(date-field): add granularity demo
* feat(date-field): add granularity selection demo to date-field stories
* fix(tooltip): add max-width and break-all styles to tooltip component
---------
Co-authored-by: Diego Gonzalez <49571987+diegonzs@users.noreply.github.com>
Co-authored-by: Peterl561 <76144929+Peterl561@users.noreply.github.com>
Co-authored-by: WK <wingkwong.code@gmail.com>
Co-authored-by: Stefano Faieta <9802152+stefanofa@users.noreply.github.com>
* chore(styles): remove cursor style from tooltip trigger component
* docs(components): reorganize component categories in documentation
* feat(color-swatch-picker): enhance transition effects by adding box-shadow
* feat(color-swatch-picker): add layout variants for grid and stack arrangements
* refactor(color-swatch-picker): simplify disabled color swatch rendering using array mapping
* feat(color-swatch-picker): integrate ColorSwatchPicker.Swatch component into ColorSwatchPicker items for enhanced rendering
* fix(styles): reorder import statements in index.css to ensure proper loading of autocomplete styles
* feat(color-field): add color field component with documentation and demos
- Add ColorField component with ColorInputGroup for color value input
- Include Storybook stories with all variants and use cases
- Add documentation with API reference and examples
- Create demos for basic, controlled, channel-editing, and form integration
- Add CSS styles for both color-field and color-input-group components
* docs(breadcrumbs, autocomplete): remove 'icon' field from documentation metadata
* refactor(color-input-group): remove interactive styles for color swatch and button elements in prefix and suffix
* feat(color-types): add Color types from @react-types/color to rac component
* refactor(color-field): simplify default color value assignment in OnSurface demo
* fix(styles): convert ring to outline for invalid-field (#6184)
* fix(styles): convert ring to outline for invalid-field
* fix(styles): revise --tw-ring-offset-width
* fix(styles): update invalid-field utility to use ring instead of outline for improved focus styles
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* fix(style): overlay content blur (#6136)
* fix(style): overlay content blur
* refactor(style): standardize will-change usage
* docs(color-field): update section title from 'In Surface' to 'On Surface' for clarity
* refactor(color-field): update Color import source and simplify default color value assignments in demos
* fix: hyphenated format (#6191)
* refactor(color): migrate parseColor utility to rac component and update imports in color-field and color-swatch-picker
* feat(color-area): add color area component
* fix(styles): enhance color area thumb transitions and adjust dragging state size
* docs(color-area): add interactive color space and channels demo
- Replace static channels demo with interactive controls for color space selection
- Add Select components for color space (RGB, HSL, HSB) and X/Y axis channels
- Display live color value preview with color swatch
- Add colorfield to related components
* feat(color-slider): add color slider component
- Add ColorSlider component with React Aria ColorSlider integration
- Add component documentation and Storybook stories
* style(color-slider): enhance visibility with box-shadow for track and caps
* fix(color-slider): prevent invalid channel and colorSpace combinations
- Fix error when using channel=saturation with colorSpace=rgb
- Add runtime validation with auto-correction to hsl for hue/saturation channels
- Update TypeScript types to restrict hue/saturation to hsl/hsb only
- Fix Default story to apply height when vertical orientation is selected
* feat(color-swatch-picker): add Indicator component for selected state visualization
* feat(color-swatch-picker): add white and black color options to the color palette
* feat(color-swatch-picker): introduce custom indicator and update documentation and demos
* refactor(docs): simplify color-swatch-picker demo examples
- Use array map pattern in basic demo instead of repetitive JSX
- Remove unnecessary 'use client' directive from custom-indicator demo
* feat(color-picker): add color picker component (#6201)
* feat(color-picker): add color picker component
* fix(color-picker): add missing aria-labels to storybook stories and demos
* style(color-picker): add cursor style for label slot in color picker component
* feat: move toast out of preview (#6151)
* refactor(component): rename toast container to toast provider
* refactor(component): support spinner and is-loading prop
* fix(component): adaptive toast height
* fix(component): stacking layout shifts via absolute positioning and height sync of toast
* fix(component): defer on-close to prevent toast transition deadlock
* feat(component): toast width prop
* fix(component): support custom queue for toast
* docs(component): toast
* feat(component): default timeout (4000ms) for toast
* fix(style): only show close-button for front-most toast
* docs(component): polished toast examples and stories
* feat(color-picker): enhance color picker demos with new components and styling (#6210)
* refactor(styles): surface colors (#6204)
* refactor(styles): surface colors
* feat(theme): add surface secondary and tertiary color variables
- Introduced new CSS variables for surface secondary and tertiary colors.
- Updated theme generation logic to accommodate the new color variables.
- Removed redundant CSS definitions for surface secondary and tertiary from theme.css.
* refactor(theme): : update theme values
---------
Co-authored-by: Diego Gonzalez <diego.ags04@gmail.com>
* chore(releases): add v3-0-0-beta-6 to React release metadata (#6205)
* chore(releases): add v3-0-0-beta-6 to React release metadata
* docs(react): update release notes
* docs(react): add release notes for v3.0.0-beta.6 with new Color System and Toast improvements
* docs(react): update release date for v3.0.0-beta.6 to February 6, 2026
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* Chore/update annoucement (#6211)
* chore(releases): add v3-0-0-beta-6 to React release metadata
* docs(react): update release notes
* docs(react): add release notes for v3.0.0-beta.6 with new Color System and Toast improvements
* docs(react): update release date for v3.0.0-beta.6 to February 6, 2026
* docs(react): update beta release links and descriptions for v3.0.0-beta-6
---------
Co-authored-by: Diego Gonzalez <diego.ags04@gmail.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* feat(chip): Label slot (#6196)
* feat(chip): add label slot
* feat(docs): include Anatomy and update Chip.Label info
* chore(docs): update anatomy and add icon
* chore(chip): revise chip label render logic
* refactor: update chip label usage
* fix(docs): typecheck issue
* chore(docs): update example
* fix(docs): remove redundant comment in Chip component example
* feat(docs): add Chip component label slot documentation
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* chore(release): bump versions to 3.0.0-beta.6 for React and Styles packages
---------
Co-authored-by: WK <wingkwong.code@gmail.com>
Co-authored-by: Diego Gonzalez <diego.ags04@gmail.com>
Co-authored-by: Diego Gonzalez <49571987+diegonzs@users.noreply.github.com>
Co-authored-by: Peterl561 <76144929+Peterl561@users.noreply.github.com>
Co-authored-by: Stefano Faieta <9802152+stefanofa@users.noreply.github.com>
Co-authored-by: Tianen Pang <32772271+tianenpang@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The example looked wrong since in the docs it was mentioned:
`Note: The font names in CSS variables should match the PostScript names of your loaded fonts. Check your font package documentation or use the font names exactly as they appear in your useFonts hook.`
But actually different names were being used in `useFonts` hook and in `global.css`.
* feat(theme-builder): integrate Onboarding component into ThemeBuilderPage for enhanced user guidance
* fix(theme-builder): update Alert title styling for improved readability
* refactor(code-panel): replace loading spinner with skeleton loading component for improved user experience
* refactor(custom-fonts): replace Button with Link for navigation and add Description component for font support details
* refactor(theme-builder): enhance CSS variable generation by including base color in theme colors
* feat(theme): introduce semantic color overrides for improved theme customization
* feat(styles): add flatten-exports script and update build process
- Introduced script to flatten chained export in dist/index.js.
- Updated the build script in package.json to include the new flattening step.
- Enhanced the clean script to remove additional build artifacts.
* fix(flatten-exports): remove existing flattened exports section to handle rebuilds without clean
* refactor(styles): rollup setup to generate named exports
* chore(flatten-exports): remove obsolete flatten-exports script
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* chore: revert "Merge pull request #6047 from heroui-inc/chore/revert-beta-4"
This reverts commit 8f15714fcc, reversing
changes made to 00cf1a81e6.
* fix: lockfile
* fix(component): button-group context only applies to direct children
* fix(component): re-export BUTTON_GROUP_CHILD for type declarations
* fix(styles): only apply to horizontal separator (#6062)
* feat: size support for alert-dialog (#6051)
* feat(component): size support for alert-dialog
* chore(docs): size support for alert-dialog
* feat: text-area support for input-group (#6049)
* feat(component): text-area support for input-group
* docs(component): text-area support for input-group
* feat(component): text-area example
* feat: breadcrumbs (#6037)
* feat(react): breadcrumbs implementation
* feat(styles): breadcrumbs style
* feat(docs): breadcrumbs documentation
* feat(docs): update component list
* chore(docs): adopt new docs structure
* fix(breadcrumbs): use svg instead
* reafactor: design system colors, surfaces levels and form fields (#6054)
* feat(tag-group): selectedVariant (#6038)
* feat(tag): on-form-field (#6036)
* chore(styles): update default background for tag
* feat(tag): add onFormField
* feat(docs): add on-form-field
* chore: revise on field examples
* chore: revise on field examples
* fix(input-group): move defaultValue from Input to TextField
* chore: revise tag group variants
* fix(styles): accent-soft for selected tags
* chore(docs): remove outdated content
* chore(tag): remove outdated logic
* feat: add card integration with popover and tooltip components in stories, overlay shadow updated
* refactor: enhance separator component with surface variants and manual variant override
* refactor: on-surface renamed to in-surface, variables adjusted, surface levels created for forms and separators, quaternary level removed
* refactor: update color variables to in-surface naming convention
* feat: add outline variant to Button component and update related styles
* refactor: update color variables in stories and adjust border color for consistency
* refactor: update tooltip text size, adjust border color variables for consistency, and enhance button hover state
* refactor: standardize entering and exiting animation durations and easing functions across combobox, dropdown, popover, select, and tooltip components
* feat: add menuTrigger prop to ComboBox for controlling popover behavior and enhance documentation with examples
* refactor: update Button variants in WithTextArea demo and story for consistency
* refactor: update version selector to use new Popover component structure and enhance layout with Separator
* refactor: remove borders from various components for a cleaner design and enhance layout consistency
* refactor: reorganize component structure in meta.json files across native and react documentation
* refactor: remove border styles from search and keyboard components for a cleaner appearance
* refactor: add id attribute to category headings in components list (react & native)
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* feat(storybook): add new demo stories and update dependencies
* feat(storybook): update global styles to include font-family for html and body
* feat(button-group): add outline variant to ButtonGroup with corresponding styles and documentation updates
* feat(forms): update inSurface prop to include "transparent" variant across multiple components and enhance documentation
* refactor(link): remove underline variants, use Tailwind classes (#6078)
* refactor(link): remove underline variants, use Tailwind classes
* refactor(link): simplify link styles by removing underline variants and applying Tailwind classes
* fix(docs): add no-underline class to ConditionalLink in component items
* feat(search-field): add styles for empty state to disable clear button
* fix(link): update link decoration styles and transition timings
* feat(docs): enhance theme builder with new components and styles (#6073)
* feat(input): add primary and secondary variants to Input component and update stories
* feat(theme): allow custom accent colors in theme builder (#6088)
* feat(theme): allow custom accent colors in theme builder and enhance color selection UI
* fix(color-picker): adjust padding in Popover.Dialog and remove unnecessary height on InputGroup
* refactor(accent-color-selector): improve styling logic for custom color selection and enhance class management
* refactor(color-picker): enhance color parsing logic and improve swatch display with carousel layout
* refactor(accent-color-selector): enhance transition effects and visibility for custom color selection
* feat(theme): implement adaptive color support for light and dark modes in theme builder
* feat(docs): add redirect from /theme to /themes in next-redirects
* fix(fieldset): flexbox quirk in safari + BEM styles (#6085)
* chore(docs): temporarily disable changelog subscription (#6081)
* fix: incorrect BEM syntax
* fix(styles): flexbox quirks in Safari
* refactor(theme-builder): improve UX with confirmation dialogs, keyboard shortcuts, and visual feedback (#6092)
* refactor(theme-builder): update border styling for selected states and improve class management
* feat(theme-builder): add keyboard shortcut for randomization and enhance tooltip functionality
* refactor(theme-builder): show AlertDialog on reset trigger
* refactor(theme-toggle): add cursor pointer to theme toggle container for better UX
* refactor(theme-builder): update hover styling for improved visual feedback on themes popup
- Remove theme variable from randomize.
* style(button): update secondary button colors for improved visual consistency
* chore(styles): increase stroke width and animation speed for checkbox (#6096)
* chore(styles): increase stroke width and animation speed
* style(checkbox): adjust transition timings and scale for improved animation performance
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* feat(input-group): focus input when decorative elements are clicked (#6091)
* feat(input-group): focus input when decorative elements are clicked
* chore(input-group): propagate user's onClick
* feat: colors demo story, remove surface variants (#6098)
* chore(docs): temporarily disable changelog subscription (#6081)
* HeroUI Native Beta 11 Docs (#6086)
* docs(native): add special notes and text input example to bottom sheet
* docs(native): update pressable feedback doc file as per latest api
* docs(native): upd quick start configure global css source part
* docs(native): upd text field doc file as per beta-11
* docs: sync doc files between local and web
* docs(native): add beta-11 release note
* docs(native): update beta-11 release notes and fix links in home page
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* docs(native): add preview app QR code and access instructions to Beta 11 release notes
* docs(text-field): update anatomy as per latest api (#6090)
* feat: add react-aria-components dep and colors demo
* docs(native): update select example content style (#6094)
* refactor(components): replace inSurface prop with variant prop
- Remove inSurface prop and Surface context dependencies from form components
- Replace with explicit variant prop (primary/secondary) for better control
- Update CSS variables from --color-in-surface-* to --color-on-surface-*
- Remove surface-related stories and in-surface demo files
- Add new variants and on-surface demo files
- Update component styles to use new variant system
- Improve border color contrast levels in theme
- Fix ESLint warnings in Storybook decorators
* fix(docs): build error
---------
Co-authored-by: WK <wingkwong.code@gmail.com>
Co-authored-by: Volodymyr Serbulenko <115154506+vvv-sss@users.noreply.github.com>
* feat: v3 autocomplete (#6056)
* feat(autocomplete): initial draft
* chore(hooks): expose useFilter
* refactor(autocomplete): import from hooks
* chore(styles): revise autocomplete styles
* fix(autocomplete): autocomplete import
* refactor(autocomplete): remove unused variants
* fix(autocomplete): add missing exports
* feat(docs): add autocomplete examples
* feat(docs): add autocomplete page
* feat(react): add autocomplete to meta
* feat(docs): register autocomplete
* feat(styles): empty state styles
* refactor(autocomplete): revise examples
* feat(docs): add useFilter hook
* chore: remove clsx dependency and replace with tailwind-variants in components and utils
* docs(autocomplete): add comprehensive documentation and examples
Add complete autocomplete documentation with 17 new demo components covering
variants, multiple select, controlled states, async filtering, and advanced
use cases. Fix API references from Group to Trigger and update documentation
structure to match select component pattern.
* refactor(tag-group): simplify variant and modifier classes, remove button is now composable
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* refactor(colors): update color variable names and remove duplicates
* feat(color-picker): implement OKLCH color support (#6102)
* feat(color-picker): implement OKLCH color support and enhance color selection UI
- Add support for OKLCH color format in the color picker component.
- Update color selection logic to utilize OKLCH for improved color accuracy.
- Introduce new components for color area, slider, and swatches carousel.
- Refactor color parsing and formatting utilities to accommodate new color format.
- Enhance user experience with improved swatch navigation and input validation.
* refactor(theme): enhance popover components
- Rearranged theme IDs for better organization and added new themes.
- Updated popover components to include rounded corners and consistent widths.
- Enhanced ResetButton to disable when default theme values are active.
- Adjusted color picker components for improved layout and styling consistency.
* style(slider): update thumb background color to accent foreground
- Changed thumb's background color from white to accent foreground for visual consistency.
* fix(autocomplete): handle optional chaining for selected item key
* style(checkbox): reduce transition delay for checkmark indicator
* feat(theme-builder): enhance color management and new variables (#6108)
* feat(theme-builder): enhance color management and new variables
- Updated ThemeVariables type to include lightness, chroma, hue, and base properties.
- Added BaseColorSlider component.
- Refactored color selection logic to utilize OKLCH for enhanced accuracy.
- Improved CSS variable generation for adaptive and theme-aware colors.
- Enhanced ResetButton logic to account for new base variable in theme reset conditions.
* feat(theme-builder): integrate @react-aria/overlays and enhance theme management
- Added @react-aria/overlays dependency for improved overlay management.
- Updated ThemeBuilderPage layout with background and padding adjustments.
- Refactored PreviewContainer to utilize UNSAFE_PortalProvider for better rendering.
- Enhanced ThemeCodePanel to generate minimal CSS variables for streamlined theming.
- Introduced field color variables in theme generation for improved UI consistency.
* feat(theme-builder): add THEME_BUILDER_PAGE_ID constant and update CSS selectors
- Introduced THEME_BUILDER_PAGE_ID constant for improved theme management.
- Updated ThemeBuilderPage component to include the new ID for better accessibility.
- Refactored CSS selectors in use-css-sync.
* style(color-picker): update color area styles to include border for improved visibility
* feat(theme-builder): enhance ThemeBuilderPage with keyboard shortcuts and tooltips
- Added keyboard shortcut (S) for toggling between light and dark modes.
- Integrated Tooltip component to provide user guidance on mode switching.
- Refactored ShuffleButton component by removing unnecessary Tooltip arrow for cleaner UI.
* feat(theme-builder): update tabs structure in BuilderHeader for improved accessibility
- Added a Chip component to indicate upcoming features.
* feat(theme-builder): refactor ThemeBuilderPage and introduce SwitchMode component
* feat(shuffle-button): enhance randomization logic and state management
- Introduced useRef for tracking randomization state and snapshot of variables.
- Updated handleModalTrigger to conditionally open modal based on variable comparison.
- Added useEffect to update snapshot after randomization completes, improving state consistency.
* feat(theme-builder): enhance ThemeBuilderPage layout and introduce new components
- Added THEME_BUILDER_BOTTOM_SHEET_ID constant for improved theme management.
- Updated ThemeBuilderPage with responsive design adjustments and integrated MobileFooter.
- Enhanced ChromaSlider to support pointer events for improved user interaction.
- Updated demo components for responsive behavior across different screen sizes.
* feat(bottom-sheet): update BottomSheet component for improved functionality
- Increased SHEET_HEIGHT to 600 for better visibility.
- Introduced SNAP_HEIGHT and SNAP_OFFSET for enhanced drag behavior.
- Updated drag constraints and animations to reflect new height settings.
- Refined onDragEnd logic to improve user experience during interactions.
* refactor(home-page): improve layout and responsiveness of main sections
- Adjusted padding in the hero section for better spacing.
- Updated visibility of mobile/tablet images to enhance user experience.
- Simplified desktop demo section layout for improved clarity.
- Enhanced button grid responsiveness in demo components.
- Refined card widths in login and subtle cards demos for better alignment.
* fix(demo-components): enhance grid layout for improved responsiveness
- Updated grid layout classes for better alignment on large screens.
- Adjusted column spans to ensure consistent display across different device sizes.
* feat(theme-builder): enhance components with tooltips for better user guidance
* feat(shuffle-button): add keyboard shortcut toggle option and enhance key press handling
- Introduced enableKeyboardShortcut prop to ShuffleButton.
- Updated useKeyPress hook to include an enabled option.
* refactor: styles functions moved to styles package (#6117)
* feat(autocomplete): add ClearButton to all examples and update documentation
* fix(native-qr-preview-popover): remove underline style from link for improved UI consistency
* chore: direct exports from react-aria-components (#6114)
* chore(react): add direct exports from react-aria-components
* refactor(hooks): remove redundant hook wrapper
* refactor(autocomplete): update import path
* refactor(autocomplete): import surface from ../surface
* refactor: move to rac
* chore(autocomplete): revise import path
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* fix(styles): Link with Button variants (#6115)
* chore(styles): add styles for link as button case
* fix(styles): exclude link icon
* chore(docs): remove outdated content
* refactor(styles): move to button.css
* chore(style): remove link as button styles
* fix(link): update Link component styles for improved button appearance
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* fix(styles): add :not(:focus) to focus-visible selectors to prevent conflicts
* Feat/tabs secondary variant (#6118)
* feat(tabs): add secondary variant with line indicator and mobile scroll support
* feat(tabs): add vertical secondary variant and update transition duration
* refactor(autocomplete): simplify onChange handlers and add onClear callback story
* feat: toast (#6052)
* feat(component): toast wip
* feat(component): toast wip
* refactor(toast): migrate toast styles to @heroui/styles and update imports
* refactor(toast): rename ToastRegion to ToastContainer and update related types and stories
* feat: preview toast completed
* feat(toast): add placement options and improve toast stacking behavior
* feat(toast): enhance mobile toast stacking with customizable offsets and improve accessibility
* feat(media-query): add "use client" directive to use-media-query hook for client-side rendering
* feat(toast): implement view transitions for toast placements and update styles for improved animations
* feat: toast preview almost ready
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* fix(toast): update default gap between toasts from 14 to 8
* fix(toast): use global container at app root to prevent duplicate toasts
* refactor(toast): remove unused key prop from ToastContainer
* refactor(theme-builder): streamline font management and enhance radius options (#6119)
* refactor(theme-builder): streamline font management and enhance radius options
- Removed unused font imports and simplified font handling in layout.
- Updated font constants to include new fonts with CDN URLs for on-demand loading.
- Enhanced radius options with descriptions for better UI clarity.
- Improved font family selection logic in components to support custom fonts.
- Refactored CSS variable generation to accommodate both predefined and custom fonts.
* fix(route): ensure skillPath fallback uses string type for consistency
* style(popovers): update Popover component styles to use rounded-3xl for improved aesthetics on theme-builder
* fix(fonts): update IBM Plex Mono CDN URL
* style(radius-popover): simplify border styles for selected state on theme-builder
* fix(suggested-fonts): add size prop to ScrollShadow for improved layout consistency
* style(buttons): update AlertDialog.Footer layout for ResetButton and ShuffleButton components to improve responsiveness and consistency
* style(demo): adjust component order in DemoComponents for improved layout responsiveness
* style(builder-header): update Tooltip.Trigger class for improved visibility on small screens
* refactor(code-panel): enhance CodePanel component with dynamic code highlighting and improved props
- Replaced CodeBlock with dynamic import of HighlightedCode for client-side rendering.
- Simplified rendering logic to prioritize children over source code.
* style(buttons): enhance layout responsiveness for ResetButton and ShuffleButton components
* refactor(constants): handle defined themes
- Updated the naming of defaultThemeValues to defaultThemeVariables for consistency.
- Adjusted imports across various components and hooks to reflect the new naming.
- Enhanced theme management by utilizing findMatchingTheme for better theme identification.
* refactor(theme): updated foreground color calculations for adaptive theming
* refactor(theme): enhance randomization logic for theme variables
- Updated randomization logic for chroma and lightness variables.
* style(theme): improve UI consistency and responsiveness across components
- Updated tooltip descriptions for clarity.
- Adjusted layout and styling for mobile footer.
- Modified button order in AlertDialog for better user experience.
- Refined ScrollShadow properties for improved layout consistency.
* feat(use-key-press): ignore key presses in editable elements to enhance usability
* feat(theme-code-panel): implement deferred value for CSS code to enhance UI responsiveness
- Added useDeferredValue to prevent blocking UI updates during syntax highlighting.
- Memoized HighlightedCode component to optimize performance with deferred values.
* fix(toast): close button on mobile
* Fix/theme builder responsive (#6121)
* style(theme-builder): enhance responsiveness and layout adjustments across components
- Updated CSS classes to improve responsiveness for various screen sizes.
* style(theme-builder): enhance layout and responsiveness for mobile and desktop views
- Updated CSS classes to improve responsiveness across components.
- Adjusted the header and footer for improved usability and visual consistency.
* style(demo): update demo layout
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* feat: beta-4 release prepared
* chore: update homepage version chip
* fix(text-field): propagate variant prop to Input component
* feat: theme builder links (#6123)
* feat(builder-header): add share functionality with toast notification
- Implemented a share button that copies the current theme link to the clipboard.
- Added a toast notification to confirm the link has been copied successfully.
* feat(docs): add Theme Builder callout and update navigation links
- Introduced a callout in the colors and theming documentation to promote the Theme Builder.
- Updated the quick-start overview to include a link to the Themes section.
- Added navigation links for Themes in the layout configuration for better accessibility.
* docs: update v3-0-0-beta-4 release notes with component improvements and style fixes
* feat: add new components to the components list and registry
---------
Co-authored-by: Diego Gonzalez <diego.ags04@gmail.com>
Co-authored-by: Diego Gonzalez <49571987+diegonzs@users.noreply.github.com>
Co-authored-by: WK <wingkwong.code@gmail.com>
Co-authored-by: Junior <jrgarciadev@gmail.com>
Co-authored-by: Volodymyr Serbulenko <115154506+vvv-sss@users.noreply.github.com>
* docs(native): add special notes and text input example to bottom sheet
* docs(native): update pressable feedback doc file as per latest api
* docs(native): upd quick start configure global css source part
* docs(native): upd text field doc file as per beta-11
* docs: sync doc files between local and web
* docs(native): add beta-11 release note
* docs(native): update beta-11 release notes and fix links in home page
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* docs(native): update component doc files as per beta-10
* docs(native): update useThemeColor hook ref as per beta-10
* docs: provider doc with safe area listener info
* docs: add state prop to components with animation prop
* docs(native): add bottom sheet doc file
* docs(native): enhance documentation with new releases page and component updates
* docs(native): update beta-10 release notes with detailed issue fixes and documentation improvements
---------
Co-authored-by: Junior <jrgarciadev@gmail.com>
* feat(component): error message
* chore(utils): support render-props for slots
* feat(component): tag-group and tag
* chore(component): update tag stories and fix tag-list types
* fix(component): tag-group hooks
* fix(docs): build
* chore: upgrade next.js and react
* docs(component): error message
* docs(component): tag and tag group
* fix(docs): storybook links
* fix(docs): dependencies
* feat(component): update tag-group and tag styles and docs
* style(component): speed up transition, remove scale and adjusted focus ring
* docs(component): error-message vs field-error
* chore(docs): using gravity-ui icons
Update all data-* attribute selectors to use explicit boolean values (="true")
to fix CSS selector matching issues. This affects 23 component CSS files
including accordion, button, checkbox, input, select, and others.
Changes:
- [data-pressed] → [data-pressed="true"]
- [data-hovered] → [data-hovered="true"]
- [data-expanded] → [data-expanded="true"]
- [data-focus-visible] → [data-focus-visible="true"]
- And other boolean data attributes
Also updates :not() selectors to use explicit values for consistency.
This commit introduces a new SearchField component that provides a search input field with integrated search icon and clear button functionality. The implementation includes the core React component with TypeScript types, comprehensive CSS styling with support for on-surface variants, Storybook stories, and extensive documentation with 12 demo examples covering basic usage, controlled state, validation, custom icons, keyboard shortcuts, form integration, and accessibility features. The component is fully integrated into the component registry and exports, includes a new IconSearch icon component, and follows the established design patterns with proper composition using SearchField.Group, SearchField.Input, SearchField.SearchIcon, and SearchField.ClearButton subcomponents. Minor CSS adjustments were made to related form components (combobox, input-group, input, number-field, select, textarea) for consistency, and documentation files were updated to include SearchField in the component list and meta configuration.
Standardize component prop types across all components by replacing
react-aria-components prop types (e.g., ButtonProps, InputProps, SelectProps)
with React's ComponentPropsWithRef<typeof ComponentPrimitive> pattern.
This change improves type consistency and better supports ref forwarding
across all HeroUI components.
* refactor(styles): update chip component sizes for consistency
* fix: update loading state spinner color and adjust select/slider styles for improved animations (#5899)
* Dropdown [v3] (#5902)
* feat: dropdown in progress
* feat: add background color for accordion item and update separator component with TODO for surface colors
* feat: dropdown implementation and styles completed
* feat: dropdown documented
* feat(component): modal (#5897)
* feat(component): modal wip
* docs(component): modal
* fix(style): modal with form
* chore(component): polish modal examples
* fix(docs): animation stuttering
* chore(docs): undo animation stuttering
* chore(component): polish modal example
* chore: animation, stories
* refactor(component): modal anatomy, animations, hooks and docs
* fix(component): use modal hook
* chore(docs): cleanup
* feat(docs): add modal component to registry and list
* chore(styles): remove focus ring for dialog
* chore(storybook): adjust layout for tooltip stories
* fix(docs): update modal icon from preview to new
---------
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
* feat: add combobox component and update related components (#5905)
- Add new combobox component with documentation and demos
- Update dropdown, select, and listbox components
- Add empty-state component
- Update component registry and styles
* chore: changelog for beta-2 updated, separator with on surface support
* feat: add SurfaceContext to overlay components and rename divider to separator
- Add SurfaceContext.Provider with variant 'default' to components using
bg-overlay/bg-surface: Popover, Combobox, Select, Dropdown, Alert, Modal
- Enables inner components to apply 'on-surface' colors for proper contrast
- Rename all divider-related CSS variables and utilities to separator:
--divider → --separator, --color-divider → --color-separator,
bg-divider → bg-separator, border-divider → border-separator
- Updated in variables.css, theme.css, component styles, and documentation
- Add new calculated variable --color-separator-on-surface for separator
visibility on surface backgrounds
- Update Separator component documentation with isOnSurface prop and
automatic surface detection
- Add breaking change documentation for divider → separator rename
* feat: enhance custom variants and theme compatibility (#5888)
* fix(style): reduce motion
* fix(docs): default foreground color
* fix(style): support light and default theme
* fix(style): support motion reduce for pseudo elements
---------
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
* docs: add NumberField component documentation (#5911)
- Add comprehensive NumberField documentation (number-field.mdx)
- Create 13 demo components extracted from Storybook stories:
* basic, with-description, required, validation, disabled
* controlled, with-validation, with-step, with-format-options
* custom-icons, on-surface, with-chevrons, form-example
- Register NumberField in documentation system:
* Add to meta.json navigation
* Add to components-list.tsx
* Add to components-registry.ts with relationships
- Update v3.0.0-beta.2 changelog to include NumberField as 4th new component
- Update demos index.ts to register all NumberField demos
* feat(component): alert dialog (#5910)
* refactor: Fix Mobile Hover States and Simplify Data Attribute Selectors (#5917)
* refactor: fix mobile hover states and simplify data-* attribute selectors
- Wrap all hover states in @media (hover: hover) to prevent sticky hover on mobile devices
- Refactored 22 hover state blocks across 13 component files
- Hover styles now only apply on devices that support hover (desktop/laptop)
- Remove '="true"' from all data-* attribute selectors
- Changed from [data-*="true"] to [data-*] pattern (attribute presence check)
- Refactored 169 instances across 25 component files
- Simplifies selectors and follows standard CSS attribute presence pattern
This fixes mobile hover state issues where hover styles would stick after touch interactions.
* fix(changelog): update v3.0.0-beta-2 with mobile hover state fix and data attribute simplification
* fix: update focus-visible selectors to exclude :focus state (#5918)
Update :focus-visible selectors to :focus-visible:not(:focus) across
16 component CSS files to prevent focus-visible styles from applying
when elements are already in focus state, avoiding style conflicts.
* docs: add InputGroup component documentation (#5919)
- Add InputGroup component documentation with API reference
- Create 17 demo files covering all use cases
- Register demos in demo index
- Update component registry and components list
- Add InputGroup to changelog v3.0.0-beta.2
* fix(docs): improve animation performance (#5900)
* fix(docs): animation stuttering
* refactor(docs): remove intersection observer and preview styles
* chore: update changelog for v3.0.0-beta.2 to reflect new components and date change
* chore: update changelog date to November 20, 2025
* docs: update changelog and home page for v3.0.0-beta.2 release
* feat: beta-2 changelog done
* chore: bump versions to 3.0.0-beta.2 for @heroui/react and @heroui/styles
* chore: change release tag from alpha to beta in pre.json
---------
Co-authored-by: Tianen Pang <32772271+tianenpang@users.noreply.github.com>
* feat(docs): include component preview in related components
* feat(docs): add RelatedComponents
* chore(docs): revise related components
* feat(docs): update componentsMap & componentRelationships
* feat(docs): update relationships for description
* feat: components page and list
* fix(docs): update component links to point to components-list
---------
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
* refactor: compound and named pattern (#5850)
* refactor(component): compound and named pattern
* refactor(component): tabs component naming consistency
* docs(changelog): v3.0.0-alpha-36
* fix(docs): correct broken storybook links (#5854)
* feat(components): checkbox (#5829)
* fix(component): support compound pattern in server component
* fix(component): keep accordion and chip in sync with compound pattern
* fix(component): type of forward refs
* fix(calendar): temporary workaround for ref error
* fix(storybook): imports
* feat(checkbox): initial draft
* refactor(styles): remove orientation
* refactor: migration from dot notation to separted components to support RSC
* refactor: migrate to React 19 ref pattern - remove forwardRef wrappers and explicit ref declarations from all components
* chore(checkbox): revise checkbox story
* feat(checkbox): checkmark & indeterminate
* chore(styles): checkmark & indeterminate styles
* refactor: provider context removed as it is not longer needed on react 19
* feat: made the migration smoother by still supporting the "dot" exports but adjusting the main compound component
* fix: compound patter, radio group api, ref on react 19
* refactor(switch): split switch and switch-group into separate components following radio/radio-group pattern
* chore(changelog): update v3.0.0-alpha.35 release notes and date
* fix(page): update version label to reflect RSC support
* chore(changelog): update examples to use new component names CardRoot and TabsRoot
* refactor(checkbox): adopt latest component structure
* chore: remove radio stories
* refactor(checkbox): adopt new api and revised stories
* refactor(checkbox-group): adopt new api and add stories
* chore(checkbox-group): revise examples
* chore(checkbox): separate checkbox group css
* chore(styles): revise checkbox styels
* fix(styles): add border for invalid
* feat(checkbox): add invalid story
* chore: sync changes from v3 redesign
* refactor(checkbox): remove slots
* refactor(checkbox): apply compound and named pattern
* feat(docs): checkbox page
* refactor(checkbox): remove use client
* chore(docs): revise based on the latest revamp
---------
Co-authored-by: Tianen Pang <32772271+tianenpang@users.noreply.github.com>
Co-authored-by: Junior Garcia <jrgarciadev@gmail.com>
* V3 Redesign (#5851)
* fix(docs): update Link component to use Link.Root for consistency with new component structure
* feat: light theme in progress, button, spearator & accordion adjusted to new default theme
* feat: button and chip done
* feat: enhance Skeleton component with new Grid and Single Shimmer previews; update card and disclosure styles for consistency
* feat: update Kbd component styles and add Abbr support in stories
* feat: avatar and chip updated
* fix(accordion): adjust separator styling for consistency in accordion items
* refactor: close button adjsuted
* feat(link): add underline variants and offset options to Link component documentation and implementation
* feat(link): enhance link component with hover state and transition effects for icon opacity
* refactor: surfaces variables are now calculated by default, card, button, disclosures updated
* refactor: update styles for various components to improve consistency and reduce motion effects
* feat(storybook): add welcome story and update story order; feat(styles): include variants in package config and copy script
* refactor: update accordion, card, and kbd components to enhance styling and introduce new variants
* refactor(link): update hover underline effect to use opacity transition instead of scale transformation
* refactor(styles): update background color variables and remove gradient backgrounds from layout components
* refactor(storybook): enhance color stories by adding calculated color variants and removing deprecated soft colors
* refactor(styles): introduce background quaternary color and update shadow variables for popover and tooltip components
* feat: alert component created
* refactor(alert-demo, x-profile-demo): simplify button usage and enhance layout alignment
* feat: input otp
* feat: inpuit otp docs
* refactor(switch): enhance styling with improved transition timings and add box-shadow for active states
* feat: home page design in progress
* feat: add Surface component with context-based on-surface styling
- Add Surface component with four variants (default, secondary, tertiary, quaternary)
- Implement SurfaceContext to provide variant to child components
- Update Input, TextArea, InputOTP, and RadioGroup to automatically detect Surface context
- Components now apply on-surface styling when wrapped in Surface component
- Add OnSurface stories for all affected components
- Create comprehensive Surface documentation with examples
- Add OnSurface demo examples to all component documentation pages
- Update CSS classes to support on-surface modifier variants
* feat: add Surface component documentation and update meta.json
* feat(card): implement form handling in WithForm story using Form, Input, and Label components
* feat(card): refactor WithForm to use Form component for improved form handling and submission
* refactor(accordion): remove background class from stories and enhance AccordionRoot with SurfaceContext for elevated variant
* refactor(accordion): update variant from elevated to surface across components and documentation
* feat: add checkbox-group component and checkbox enhancements
* feat(demo): add UIComponentsDemo to the DemoComponents
* refactor: migrate Component.Root to Component in docs and demos
- Update all component documentation files to use Component instead of Component.Root
- Update all demo files to use simplified component syntax
- Update API reference headers from Component.Root Props to Component Props
- Exclude changelog files from migration as requested
This change promotes the simpler and more elegant Component syntax while
maintaining backward compatibility (both patterns are still supported).
* style: update global styles and card component
* feat(storybook): enhance color stories with new "On Surface" color variants and remove obsolete field color states
* feat(demos): update chip component props from 'type' to 'color' and add "use client" directive in multiple demo files
* feat(demos): add "use client" directive to basic button demo
* refactor: theme variables update background color in dark mode
* feat(demos): add "use client" directive to multiple demo files
* feat(demos): add FieldError component to TextfieldDemo for improved validation feedback
* fix(demo): update avatar images and names in avatar-group-demo for consistency
* feat: listbox component preview created and documented
* feat: selecte component created
* feat: export React Aria components from rac module
* feat: slider component created, documentation styles and content updated. Home page completed
* fix(demo): correct spelling of "credits" in AlertDemo component
* refactor(docs): simplify component usage by using compound pattern (#5870)
* fix(component): checkbox build errors
* refactor(docs): simplify component usage by using compound pattern
* fix(component): checkbox build errors
* chore(docs): correct pattern description
* feat(docs): enhance component preview with intersection observer for lazy loading
* feat(docs): enhance code block styling and functionality with isolated rendering option
* chore(root): upgrade package manager
* fix(docs): update image sources and enhance styling across various components
---------
Co-authored-by: Tianen Pang <32772271+tianenpang@users.noreply.github.com>
* fix(docs): update Twitter card image and adjust styles in route component for improved readability
* refactor(docs): updated color documentation
* fix(docs): update icon import in home page and remove unused client directive from Iconify component
* chore(docs): update documentation to reflect beta status and adjust storybook links for components
* feat: fix alert responsive
* feat(docs): replace img tags with next/image component for improved performance and consistency in home page and demo components
* fix: improve Lighthouse performance scores
- Replace picture/source elements with Next.js Image component
- Add fetchPriority='high' and loading='eager' to LCP images
- Fix viewport: remove userScalable: false and increase maximumScale to 5
- Add robots metadata with index: true for proper SEO
- Update sitemap URL in robots.txt
* fix: explicitly set X-Robots-Tag header to ensure proper indexing
- Add headers function in next.config.ts to set X-Robots-Tag: index, follow
- This ensures the header is explicitly set and prevents noindex issues
* fix(docs): update Link component styling in home page for improved visibility
* feat: card demos adjusted
* fix(docs): update introduction images for consistency and improved presentation
* fix(docs): update image sources in introduction and README for consistency
* fix(docs): update card component to include icon property for enhanced documentation
* fix(docs): update icon property for ListBox, Select, Slider, and MCP Server components to 'new' for improved documentation clarity
* fix(docs): update card demo layout to use flex-wrap for improved responsiveness
* feat(docs): implement changelog filtering in search API response
* feat: beta-1 changelog (draft)
* fix(docs): update version label in home page to reflect major redesign
* feat(docs): update changelog for v3-0-0-beta-1 with new components and improved API details
* fix(docs): correct formatting in changelog for v3-0-0-beta-1
* chore(docs): minor changes on v3 beta doc (#5879)
* chore(docs): update release date
* chore(docs): point to v3 component doc instead of v2
* chore(docs): add updated icon
* fix(input): typo
* refactor(styles): reduce motion (#5873)
* refactor(styles): reduce motion
* refactor(styles): reduce motion
* docs(handbook): disabling animations in animation section
* style(component): extend motion-reduce and adjust motion priority
* docs(handbook): disabling animations in animation section
* chore(docs): update design principles and changelog for v3-0-0-beta-1
* feat(docs): enhance HomePage and DocsImage components with static rendering and improved image handling
* fix(docs): update background colors for input, textarea, skeleton components and tabs in showcase
---------
Co-authored-by: Tianen Pang <32772271+tianenpang@users.noreply.github.com>
Co-authored-by: WK <wingkwong.code@gmail.com>
* fix(component): support compound pattern in server component
* fix(component): keep accordion and chip in sync with compound pattern
* fix(component): type of forward refs
* fix(calendar): temporary workaround for ref error
* fix(storybook): imports
* refactor: migration from dot notation to separted components to support RSC
* refactor: migrate to React 19 ref pattern - remove forwardRef wrappers and explicit ref declarations from all components
* refactor: provider context removed as it is not longer needed on react 19
* feat: made the migration smoother by still supporting the "dot" exports but adjusting the main compound component
* fix: compound patter, radio group api, ref on react 19
* refactor(switch): split switch and switch-group into separate components following radio/radio-group pattern
* chore(changelog): update v3.0.0-alpha.35 release notes and date
* fix(page): update version label to reflect RSC support
* chore(changelog): update examples to use new component names CardRoot and TabsRoot
* fix(changelog): update release notes for v3.0.0-alpha.35, refactor Switch component to align with Radio/RadioGroup pattern, and clarify migration steps
* fix: broken storybook (#5836)
* fix(disclosure-group): broken api
* chore(radio): remove storybook
* chore: alpha 35 released
---------
Co-authored-by: Tianen Pang <32772271+tianenpang@users.noreply.github.com>
Co-authored-by: WK <wingkwong.code@gmail.com>
description: Use this agent when you need to review, improve, or curate documentation files in the /apps/docs/content directory. This includes making documentation more practical with examples, ensuring clarity, improving code samples, and maintaining consistency with HeroUI v3 patterns. <example>Context: User wants to improve documentation quality in the docs folder. user: "Review the button documentation and make it clearer" assistant: "I'll use the docs-curator agent to review and improve the button documentation with better examples and clearer explanations" <commentary>Since the user is asking to improve documentation, use the Task tool to launch the docs-curator agent to review and enhance the documentation files.</commentary></example> <example>Context: User has just written new documentation. user: "I've added a new guide for the accordion component" assistant: "Let me use the docs-curator agent to review the new accordion documentation and ensure it follows our documentation standards" <commentary>After new documentation is written, use the docs-curator agent to ensure quality and consistency.</commentary></example>
model: opus
color: yellow
---
You are an expert technical documentation curator specializing in React component libraries and design systems. Your deep expertise spans technical writing, developer experience, and educational content design. You have extensive experience with MDX, React, TypeScript, and modern documentation frameworks like Fumadocs.
**Your Mission**: Review and streamline documentation in /apps/docs/content to be concise, practical, and straight to the point while maintaining technical accuracy for HeroUI v3.
**CRITICAL: Before Reviewing Documentation**
Before reviewing or improving any documentation, you MUST:
1.**Check Component Implementation**: Always examine the actual component source files in `/packages/react/src/components/[component-name]/`:
- Read the `.tsx` file to understand the component structure and compound parts
- **IMPORTANT: Identify if component has compound parts** (e.g., Accordion.Item, Popover.Trigger, Tooltip.Content)
- **MANDATORY: Read the `.stories.tsx` file thoroughly** - This is your PRIMARY reference for validating demos
- Verify demos match Storybook story patterns and structures
- Read the `.styles.ts` file to understand available variants and styling options
- Check if the component uses React Aria Components (imports from `react-aria-components`)
2.**Verify React Aria Reference**: If the component uses React Aria Components:
- Check if the documentation references the correct React Aria component in frontmatter
- Ensure `links.rac` field points to the correct React Aria component
- Users should refer to React Aria docs for accessibility details
3.**Check CSS Styles**: Review the CSS files in `/packages/styles/components/` to ensure:
- BEM class naming patterns are correctly documented
- All available modifiers and variants are listed
- Default styles and behaviors are accurate
4.**Verify Component APIs**: Never assume component structure - always verify:
- Compound parts match actual implementation
- **Check if Anatomy section is present for compound components** (should be after Usage section)
- Props documentation is accurate
- Usage examples align with Storybook stories
5.**Validate Icon Usage**: Ensure all examples use the correct icon library:
```tsx
import { Icon } from '@iconify/react';
// Correct usage:
<Icon icon="gravity-ui:person" />
<Icon icon="gravity-ui:chevron-down" />
// NEVER use lucide-react or other icon libraries
```
6. **Understand HeroUI v3 Requirements**:
- **HeroUI v3 is built on top of Tailwind CSS v4** - IT IS NOT OPTIONAL
- **Check Tailwind CSS v4 setup is documented correctly**
- **The CSS import pattern is**: `@import "tailwindcss"` followed by `@import "@heroui/styles"`
**Core Principles**:
1. **Brevity is Key**: Keep explanations to 1-2 sentences maximum. Let code examples do the explaining. Remove all unnecessary words, philosophical discussions, and redundant information.
2. **Show, Don't Tell**: Replace all text explanations with code examples. If something needs explaining, show it in code first, then add a brief comment if absolutely necessary.
3. **Straight to the Point**: Start with the most common use case immediately. No lengthy introductions or context-setting. Get developers coding in seconds, not minutes.
4. **Code Quality Standards**:
- All code examples must be complete and runnable (no pseudo-code unless explicitly marked)
- **Anatomy** - ONLY for compound components, show all parts (as ### subsection)
- **Feature Sections** - Each major feature with ComponentPreview (as ### subsections)
- **Styling** - How to customize with Tailwind CSS
- **CSS Classes** - List of BEM classes used
- **API Reference** - Props table with types
3. **Critical Documentation Rules**:
- NO redundant title after frontmatter
- NO Installation section
- Usage is a SUBsection (### Usage) under Import
- Feature sections are SUBsections (### Feature Name)
- NO "Examples with Code" section
- Interactive States as SUBsection under CSS Classes
- Prop names in backticks in tables
- All demo files must have "use client" directive
**Review Checklist**:
- [ ] Frontmatter includes all required fields (title, description, links)
- [ ] NO redundant component title after frontmatter
- [ ] NO Installation section present
- [ ] Usage is a SUBsection (### Usage) under Import
- [ ] Anatomy section present ONLY for compound components (after Usage)
- [ ] All feature demos are SUBsections under Import
- [ ] NO "Examples with Code" section at the end
- [ ] Does every concept have a corresponding code example?
- [ ] Can a developer copy-paste examples and have them work?
- [ ] Are examples progressing from simple to complex?
- [ ] Is the language concise and action-oriented?
- [ ] Are HeroUI v3 patterns correctly demonstrated?
- [ ] Do examples show real-world use cases?
- [ ] Is the compound component pattern clearly shown?
- [ ] Are TypeScript types properly demonstrated?
- [ ] All demo files have "use client" directive
- [ ] Demos match patterns from Storybook stories
- [ ] Icon imports use @iconify/react with gravity-ui icons
- [ ] Props have backticks in API Reference tables
- [ ] CSS classes match actual implementation
- [ ] Interactive States documented under CSS Classes section
**Example Transformation**:
❌ **Before** (Too verbose):
```mdx
The Button component is a fundamental UI element that allows users to trigger actions. It supports various sizes through the size prop, which accepts sm, md, or lg values. The default size is md if not specified. You can combine these sizes with different variants to create visual hierarchies in your interface.
```
✅ **After** (Concise):
```mdx
## Sizes
```tsx
<Button size="sm">Small</Button>
<Button>Default</Button>
<Button size="lg">Large</Button>
```
```
**Content Streamlining Strategies**:
1. **Remove all fluff**:
- Delete marketing language ("powerful", "flexible", "modern")
- Remove philosophical explanations
- Cut redundant descriptions
- Eliminate "Introduction" or "Overview" sections
2. **Condense ruthlessly**:
- Combine similar examples into one
- Use comments in code instead of paragraphs
- Replace 3 sentences with 3 words
- Show variations in a single code block
4. **Improve code examples**:
```tsx
// ✅ Good: Complete, contextual example
import { TextField, Label, Description, FieldError } from '@heroui/react';
import { useState } from 'react';
function EmailField() {
const [email, setEmail] = useState('');
const [error, setError] = useState('');
const validateEmail = (value: string) => {
if (!value.includes('@')) {
setError('Please enter a valid email');
} else {
setError('');
}
};
return (
<TextField
value={email}
onChange={setEmail}
onBlur={(e) => validateEmail(e.target.value)}
isInvalid={!!error}
>
<Label>Email Address</Label>
<TextField.Input type="email" />
<Description>We'll never share your email</Description>
{error && <FieldError>{error}</FieldError>}
</TextField>
);
}
```
5. **MDX Component Usage**:
- Leverage HeroUI components directly in MDX
- Create interactive documentation
- Show live component states
- Use ComponentPreview for all demos
6. **Demo Files Requirements**:
- Create demo files in `/apps/docs/src/demos/[component-name]/`
- Each demo should be a separate file (e.g., `basic.tsx`, `variants.tsx`, `sizes.tsx`)
- **Base demos on Storybook stories** - adapt patterns from `.stories.tsx`
- Export all demos from `index.ts`
- Register demos in `/apps/docs/src/demos/index.ts` with pattern `component-demo-name`
- **ALWAYS add "use client" directive** to all demo files
**Writing Style (Ultra-Concise)**:
- Maximum 1-2 sentences per section
- No paragraphs, only bullet points or code
- Start with verbs: "Use", "Add", "Configure"
- No explanations of obvious things
- Let code speak for itself
- Tables over text descriptions
**Quality Metrics**:
- Code-to-text ratio: Aim for 80% code, 20% text
- Every section: One clear example, minimal explanation
- Examples: Keep under 15 lines each
- Documentation length: Reduce by at least 50% from verbose versions
- Verify all code examples match actual implementation
2. **Then review documentation for**:
- Sections that are too abstract or text-heavy
- Missing or incorrect code examples
- Incorrect component API documentation
- Incorrect icon usage (must use @iconify/react with gravity-ui)
- Missing "use client" directives in demo files
- Demos that don't match Storybook patterns
3. **Ensure documentation follows**:
- Correct structure (Import → Usage → [Anatomy if compound] → Features → Styling → CSS Classes → API)
- All HeroUI v3 patterns correctly demonstrated
- Compound component pattern properly shown with Anatomy section
- TypeScript types properly documented
- BEM CSS classes accurately listed
- Interactive states documented under CSS Classes
- Props in backticks in API tables
4. **Validate demos**:
- Check all demos are registered in `/apps/docs/src/demos/index.ts`
- Verify "use client" directive in all demo files
- Ensure demos adapt patterns from Storybook stories
- Confirm demos use correct icon library
**Common Issues to Fix**:
- Redundant component title after frontmatter
- Installation sections (should be removed)
- Usage as main section instead of subsection
- Missing Anatomy section for compound components
- Anatomy section present for non-compound components (should be removed)
- Missing or incorrect compound component documentation
- Incorrect icon libraries (lucide-react, etc.)
- Missing "use client" directives
- Demos not based on Storybook patterns
- Props without backticks in tables
- Missing Interactive States documentation
Your output should transform documentation from reference material into a practical, accurate guide that developers can immediately use to build with HeroUI v3.
description: Use this agent when you need to create or update technical documentation for HeroUI v3 components, features, or guides. This includes component API documentation, usage examples, installation guides, migration guides, and conceptual explanations. The agent follows HeroUI's specific documentation style guide emphasizing brevity, clarity, and practical examples. Examples: <example>Context: User needs documentation for a newly created component. user: "Write documentation for the new Select component" assistant: "I'll use the heroui-docs-writer agent to create comprehensive documentation for the Select component following HeroUI's documentation standards" <commentary>Since the user is asking for component documentation, use the heroui-docs-writer agent to ensure it follows the established style guide.</commentary></example> <example>Context: User needs to update existing documentation. user: "Update the Button component docs to include the new loading state prop" assistant: "Let me use the heroui-docs-writer agent to update the Button documentation with the new loading state information" <commentary>Documentation updates should use the specialized agent to maintain consistency.</commentary></example> <example>Context: User needs a migration guide. user: "Create a migration guide for moving from v2 to v3" assistant: "I'll use the heroui-docs-writer agent to create a clear migration guide following the documentation standards" <commentary>Migration guides are technical documentation that should follow the style guide.</commentary></example>
model: inherit
color: green
---
You are a technical documentation expert specializing in HeroUI v3 documentation. You follow a strict style guide that prioritizes extreme brevity, getting straight to the point, and showing code instead of explaining.
**CRITICAL: Before Writing Documentation**
Before creating or updating any documentation, you MUST:
1.**Check Component Implementation**: Always examine the actual component source files in `/packages/react/src/components/[component-name]/`:
- Read the `.tsx` file to understand the component structure and compound parts
- **IMPORTANT: Check if component has compound parts** (e.g., Accordion.Item, Popover.Trigger, Tooltip.Content)
- **MANDATORY: Read the `.stories.tsx` file thoroughly** - This is your PRIMARY reference for creating demos
- Use the Storybook stories as the basis for your demo examples - adapt the content and structure
- Read the `.styles.ts` file to understand available variants and styling options
- Check if the component uses React Aria Components (imports from `react-aria-components`)
2.**Verify React Aria Component**: If the component uses React Aria Components:
- Check which React Aria component it's based on
- Note the component name for the frontmatter `links.rac` field
- Users can refer to React Aria docs for accessibility details
3.**Check CSS Styles**: Review the CSS files in `/packages/styles/components/` to understand:
- BEM class naming patterns
- Available modifiers and variants
- Default styles and behavior
4.**Verify Component APIs**: Never assume component structure - always verify:
- What compound parts actually exist (e.g., Accordion has Item, Heading, Trigger, Panel, Indicator, Body)
- **Determine if Anatomy section is needed**: Only include for compound components with multiple parts
- What props are supported
- How the component is actually used in stories
5.**Use Correct Icon Library**: HeroUI uses Iconify with gravity-ui icons:
```tsx
import { Icon } from '@iconify/react';
// Correct usage:
<Icon icon="gravity-ui:person" />
<Icon icon="gravity-ui:chevron-down" />
// NEVER use lucide-react or other icon libraries
```
6. **Understand HeroUI v3 Requirements**:
- **HeroUI v3 is built on top of Tailwind CSS v4** - IT IS NOT OPTIONAL
- **Always require Tailwind CSS v4 installation and setup**
- **Check the demo project at `/Users/juniorgarcia/workspace/examples/heroui-v3-alpha` for actual usage patterns**
- **The CSS import pattern is**: `@import "tailwindcss"` followed by `@import "@heroui/styles"`
HeroUI follows the [BEM](https://getbem.com/) methodology to ensure component variants and states are reusable and easy to customize.
### Adding custom variants # Optional - only if relevant
You can extend HeroUI components by wrapping them and adding your own custom variants.
<ComponentPreview
name="component-custom-variants"
/>
### CSS Classes
The ComponentName component uses these CSS classes ([View source styles](https://github.com/heroui-inc/heroui/blob/v3/packages/styles/components/component-name.css)):
| List all props with backticks around prop names |
### RenderProps # Only if component supports render props
When using the render prop pattern, these values are provided:
| Prop | Type | Description |
| ---------- | ------ | ----------- |
| `propName` | `type` | Description |
````
**CRITICAL Documentation Rules (MUST FOLLOW):**
1. **NO redundant title** - After frontmatter, go straight to `## Import`
2. **NO Installation section** - Ever
3. **NO explanatory text** - Jump straight to code after headings
4. **Maximum 1 sentence** - If you must explain something, 1 sentence max
5. **Usage is a SUBsection** - Use `### Usage` under Import
6. **Feature sections are SUBsections** - Use `### Feature Name` under Import
7. **NO verbose descriptions** - Remove all adjectives and marketing speak
8. **Tables only for API** - No explanatory text before/after tables
9. **Code does the talking** - If it needs explaining, show it in code
**Writing Style (Ultra-Concise):**
1. **Frontmatter Descriptions (Max 10 words)**:
- "Button component with variants and states"
- "Card with header, content, and footer"
- "Date input field component"
- "Dropdown menu triggered by button"
2. **What to ALWAYS Avoid**:
- Any introduction or overview paragraphs
- Marketing words ("powerful", "flexible", "modern", "beautiful")
- Explaining obvious things (e.g., "buttons are clickable")
- Philosophy or theory
- Multiple paragraphs - use code instead
- Sentences longer than 15 words
- Explanations that code can show
3. **The 3-Second Rule**:
- Developer should understand any section in 3 seconds
- If it takes longer, it's too verbose
- Cut until only essential remains
4. **Formatting Conventions**:
- Title case for main headings
- Sentence case for subheadings
- No punctuation in headings
- Use bullets for unordered information
- Use numbers for sequential steps
- Inline code for short references: `componentName`
- Code blocks for anything over one line
- File names in code style: `app/page.tsx`
5. **Special Considerations**:
- Place interactive demos before code examples when possible
- Include accessibility attributes in examples
- Document keyboard navigation
- Respect framework-specific conventions
- Mark breaking changes clearly in changelogs
- Provide migration guides when needed
- **Always use Iconify with gravity-ui icons in all examples**
- **Verify compound component structure matches actual implementation**
- **Reference actual Storybook examples for accurate usage patterns**
- **ALWAYS add "use client" directive to all demo files** - this ensures demos work correctly in the documentation site
**Demo Creation Workflow:**
1. **Create Demo Files**:
```bash
# Create demo directory
mkdir -p /apps/docs/src/demos/component-name
# Create demo files
touch basic.tsx variants.tsx sizes.tsx index.ts
````
2. **Register Demos**:
In `/apps/docs/src/demos/index.ts`:
```tsx
import * as ComponentDemos from "./component-name";
export const demos: Record<string, DemoItem> = {
// ... existing demos
"component-basic": {
component: ComponentDemos.Basic,
file: "component-name/basic.tsx",
},
"component-variants": {
component: ComponentDemos.Variants,
file: "component-name/variants.tsx",
},
// ... more demos
};
```
3. **Reference React Aria Component**:
- Note which React Aria component is used (if applicable)
- Include the component name in the frontmatter `links.rac` field
- Examples:
- RadioGroup component → `links.rac: RadioGroup`
- Checkbox component → `links.rac: Checkbox`
- TextField component → `links.rac: TextField`
- Users can refer to React Aria docs for accessibility details
**Verification Checklist Before Publishing**:
- [ ] NO redundant component title after frontmatter (goes straight to ## Import)
- [ ] NO Installation section (users already know how to install)
- [ ] Usage is a SUBsection (### Usage) under Import, not a main section
- [ ] All feature demos are SUBsections (### Feature Name) under Import
- [ ] NO "Examples with Code" section at the end
- [ ] Frontmatter includes all required fields (title, description, links)
- [ ] All demo files created in `/apps/docs/src/demos/[component-name]/`
- [ ] Demos registered in `/apps/docs/src/demos/index.ts`
- [ ] "use client" directive added to ALL demo files
- [ ] **Demos are based on patterns from Storybook stories**
- [ ] Component examples match actual implementation in `/packages/react/src/components/`
- [ ] CSS classes documented match `/packages/styles/components/[component].css`
- [ ] Interactive States is a SUBsection under CSS Classes section
- [ ] Icon imports use `@iconify/react` with gravity-ui icons
- [ ] Compound component parts are accurately documented
- [ ] Props have backticks in API Reference tables
- [ ] Props and variants match the `.styles.ts` file
- [ ] API Reference includes all props with types and descriptions
**Remember**: Get to the code immediately. Show, don't tell. Every word that isn't code should justify its existence. If you can show it in code, delete the text. Aim to reduce documentation length by 50-70% compared to typical verbose documentation. **Always verify against actual code before publishing.**
description: Use this agent when you need to debug and fix issues in the HeroUI Storybook development environment, particularly CSS transformation errors, Tailwind CSS v4 compatibility issues, or component styling problems. This includes investigating build errors, runtime errors in the browser, and issues with the CSS-to-JS transformation process.\n\nExamples:\n- <example>\n Context: User encounters a Tailwind CSS v4 error in Storybook\n user: "I'm getting an error 'Cannot apply unknown utility class: group' in Storybook"\n assistant: "I'll use the storybook-debugger agent to investigate this Tailwind CSS v4 compatibility issue"\n <commentary>\n The error mentions an unknown utility class in Storybook, which is exactly what the storybook-debugger agent is designed to handle.\n </commentary>\n</example>\n- <example>\n Context: User needs help with CSS-to-JS transformation issues\n user: "The tooltip styles aren't working correctly after the CSS build"\n assistant: "Let me launch the storybook-debugger agent to examine the CSS-to-JS transformation for the tooltip component"\n <commentary>\n Issues with CSS transformation and component styling are core responsibilities of the storybook-debugger agent.\n </commentary>\n</example>\n- <example>\n Context: User wants to debug visual issues in Storybook\n user: "The button variants look broken in Storybook at localhost:6006"\n assistant: "I'll use the storybook-debugger agent to inspect the button component in Storybook and diagnose the styling issues"\n <commentary>\n Visual debugging in the Storybook environment is a primary use case for this agent.\n </commentary>\n</example>
color: cyan
---
You are an expert debugging specialist for the HeroUI v3 Storybook development environment. Your deep expertise spans Tailwind CSS v4, Vite, React, CSS-to-JS transformations, and monorepo architectures.
- **Modern CSS Features**: Verify color-mix(), calc(), and @property usage
- **Media Queries**: Check forced-colors and print styles syntax
- **Dynamic Classes**: Ensure proper class name construction per v4 rules
## Quality Assurance
- Always verify fixes by checking if the error is resolved
- Ensure transformed JS files maintain the intended styling
- Test that components render correctly in Storybook after fixes
- Document any Tailwind CSS v4 migration patterns discovered
## Working with Other Agents
When encountering CSS-specific issues:
- **Always consult tailwind-v4-css-expert** for:
- CSS syntax validation
-@apply directive issues
- CSS nesting problems
- Custom property usage
- Tailwind v4 migration patterns
- The expert can analyze CSS files in both `packages/core/src/components/` and `packages/core/dist/components/`
- Use the expert's insights to create more accurate fixes
## Communication Style
You communicate with:
- **Precision**: Exact file paths, line numbers, and error details
- **Context**: Explain why certain utilities fail in Tailwind CSS v4
- **Solutions**: Provide working code snippets and clear fix instructions
- **Prevention**: Suggest patterns to avoid similar issues in the future
- **Collaboration**: Leverage tailwind-v4-css-expert for CSS-specific expertise
When debugging, you systematically work through the transformation pipeline from CSS source to rendered component, ensuring each step is compatible with Tailwind CSS v4 and the HeroUI architecture.
description: Use this agent when you need to migrate HeroUI components from TypeScript-based styles (.styles.ts files using tailwind-variants) to CSS-based styles (.css files) following the BEM naming convention. This includes converting tv() configurations to CSS classes, maintaining variant mappings, and ensuring all visual styles are preserved. Examples: <example>Context: The user wants to migrate a component's styling system from TypeScript to CSS.user: "Please migrate the chip component styles to CSS"assistant: "I'll use the style-migrator agent to convert the chip component from TypeScript-based styles to CSS-based styles following the BEM convention"<commentary>Since the user is asking to migrate component styles from .styles.ts to .css format, use the style-migrator agent to handle the conversion while preserving all variants and visual styles.</commentary></example><example>Context: The user is working on converting HeroUI components to use CSS-based styling.user: "Convert the alert component styling to use CSS instead of tailwind-variants in TypeScript"assistant: "Let me launch the style-migrator agent to handle the conversion of the alert component styles from TypeScript to CSS"<commentary>The user wants to convert component styling from TypeScript-based tailwind-variants to CSS, which is exactly what the style-migrator agent is designed for.</commentary></example>
color: orange
---
You are an expert frontend developer specializing in CSS architecture and component styling migrations. Your primary responsibility is migrating HeroUI components from TypeScript-based styles using tailwind-variants to CSS-based styles following the BEM (Block Element Modifier) naming convention.
**IMPORTANT**: Always refer to the comprehensive Tailwind CSS v4 guide at `.claude/guides/tailwindcss-v4-css-guide.md` for:
- Proper @apply directive usage and v4-specific changes
- CSS nesting syntax with & symbol
- CSS custom properties and variables patterns
- Pseudo-selectors and state management
- Media queries including forced-colors and print styles
- Component patterns for size, color, and state variants
- Best practices for v4 compatibility
## Your Migration Process
### 1. Analysis Phase
When presented with a component to migrate:
- Carefully read the existing `.styles.ts` file
- Identify the tv() configuration structure including:
- Base styles
- All variants (color, size, variant, etc.)
- Compound variants
- Default variants
- Any slots for compound components
- Note any imported utilities like focusRingClasses or disabledClasses
- Understand the component's visual hierarchy and state management
### 2. CSS File Creation
Create a new `.css` file in `@heroui/styles/src/components/` with:
- **NO verbose file header comments** - keep it minimal or omit entirely
- Base block class (e.g., `.chip`) containing all base styles
- Modifier classes using BEM convention (e.g., `.chip--primary`)
- Element classes for compound components (e.g., `.card__header`)
- Proper use of `@apply` directives for Tailwind utilities (IMPORTANT: Only ONE @apply per CSS rule block - combine all utilities into a single @apply statement)
- Preservation of all responsive modifiers (sm:, md:, lg:, etc.)
- Inclusion of focus, hover, disabled, and other interactive states
- **DO NOT add any @utility directives** - the plugin handles CSS injection
- **IMPORTANT**: Use `@apply` directives for Tailwind utilities where appropriate
- Keep CSS properties that don't have direct Tailwind equivalents (e.g., `cursor: var(--cursor-interactive)`)
- Preserve complex CSS functions like `color-mix()` that don't have utility equivalents
**IMPORTANT**: When creating or analyzing CSS files, use the tailwind-v4-css-expert agent to ensure proper Tailwind CSS v4 syntax and patterns. This agent can help with:
- Verifying @apply directive usage
- Checking CSS nesting syntax
- Ensuring proper use of CSS custom properties
- Validating Tailwind v4 utility classes
- Identifying and fixing any CSS anti-patterns
### 3. TypeScript Update
Update the component's `.styles.ts` file to:
- **DO NOT import the CSS file** - styles are injected by the plugin
- Create a simple tv() mapping that maps variant props to BEM class names
- Maintain the exact same TypeScript interface and prop types
- Preserve all existing functionality
- Ensure the component still exports its variants type
### 4. Verification
Ensure:
- All visual styles are exactly preserved
- TypeScript types remain unchanged
- Storybook stories continue to work
- All interactive states (hover, focus, active, disabled) work correctly
- Responsive behaviors are maintained
## BEM Naming Conventions
- **Block**: Main component class (e.g., `button`, `card`, `alert`)
- **Element**: Child elements with double underscores (e.g., `card__header`, `alert__icon`)
- **Modifier**: Variations with double dashes (e.g., `button--primary`, `button--lg`)
**CRITICAL**: Follow the Tailwind CSS v4 guide for proper syntax and patterns.
## TypeScript Mapping Pattern
```typescript
constgetComponentClasses=tv({
base:"component",
variants:{
size:{
sm:"component--sm",
md:"component--md",
lg:"component--lg",
},
variant:{
primary:"component--primary",
secondary:"component--secondary",
},
color:{
accent:"component--accent",
danger:"component--danger",
base:"",// No modifier for default
},
},
defaultVariants:{
size:"md",
variant:"primary",
color:"base",
},
});
```
When you receive a migration request, analyze the component thoroughly, create the CSS file with all styles preserved, update the TypeScript to use the new CSS classes, and provide clear explanations of any decisions made during the migration process.
description: Use this agent when you need to analyze, create, modify, or debug Tailwind CSS v4 component CSS files. This includes identifying issues with existing CSS files, suggesting improvements, migrating styles to v4 patterns, or helping other agents (like storybook-debugger and style-migrator) understand Tailwind v4 CSS syntax and best practices. <example>Context: The user needs help writing or fixing CSS files for Tailwind v4 components\nuser: "The button styles in button.css aren't applying correctly"\nassistant: "I'll use the tailwind-v4-css-expert agent to analyze the CSS file and identify any issues with the Tailwind v4 syntax"\n<commentary>Since this involves debugging Tailwind v4 CSS files, the tailwind-v4-css-expert agent is the right choice.</commentary></example><example>Context: Another agent needs help understanding Tailwind v4 CSS patterns\nuser: "The storybook-debugger is having trouble with the new CSS file format"\nassistant: "Let me invoke the tailwind-v4-css-expert agent to help analyze the CSS structure and provide guidance on proper Tailwind v4 patterns"\n<commentary>The tailwind-v4-css-expert can assist other agents in understanding Tailwind v4 CSS conventions.</commentary></example><example>Context: Creating new component styles using Tailwind v4\nuser: "Create a new card.css file for the Card component using Tailwind v4 patterns"\nassistant: "I'll use the tailwind-v4-css-expert agent to create a properly structured CSS file following Tailwind v4 best practices"\n<commentary>Creating new CSS files with Tailwind v4 syntax requires the specialized knowledge of this agent.</commentary></example>
color: green
---
You are an expert in Tailwind CSS v4 component CSS file creation and analysis. Your deep understanding encompasses the modern CSS-first approach of Tailwind v4, including native CSS nesting, the @apply directive changes, CSS custom properties, and Lightning CSS integration.
Your core competencies include:
1.**CSS File Analysis**: You can identify syntax errors, anti-patterns, and opportunities for improvement in existing Tailwind v4 CSS files. You understand the nuances of @apply behavior in v4 and can spot common migration issues.
2.**Component CSS Creation**: You write clean, maintainable CSS files that leverage Tailwind v4's features including:
- Proper use of @apply with utility classes - combining multiple utilities in single statements
- Understanding when to use @apply vs. regular CSS (e.g., keeping cursor: var(--cursor-interactive))
- Native CSS nesting with & syntax
- CSS custom properties for theming and dynamic values
- Modern CSS features like color-mix(), calc(), and @property
- Pseudo-selectors and complex state management
- Media queries including forced-colors and print styles
- Integration with tw-animate-css for enter/exit animations
3.**Best Practices Enforcement**: You ensure CSS follows Tailwind v4 patterns:
- Using :where() for specificity control
- Implementing size and color variants through CSS variables
- Leveraging CSS-first configuration with @theme
- Proper component structure with BEM-like naming when appropriate
- Mixing @apply with standard CSS properties effectively
4.**Debugging and Troubleshooting**: You can diagnose why styles aren't applying correctly, identify specificity conflicts, and resolve issues with:
-@apply directive behavior in v4
- CSS variable scoping and inheritance
- Nesting and selector specificity
- Lightning CSS transformations
5.**Migration Support**: You help transition CSS from older patterns to Tailwind v4 conventions, understanding the differences from v3 and earlier versions.
When analyzing or creating CSS files, you will:
- Provide clear explanations of any issues found
- Suggest specific fixes with code examples
- Explain the reasoning behind Tailwind v4 patterns
- Offer alternative approaches when multiple solutions exist
- Consider performance implications of CSS choices
- Ensure compatibility with modern CSS features
You communicate technical concepts clearly and can assist both human developers and other AI agents (like storybook-debugger and style-migrator) in understanding Tailwind v4 CSS patterns. Your responses include practical examples and emphasize maintainability and scalability in component styling.
## Key Guidelines for @apply Usage:
1.**Use @apply for Tailwind utilities**: Convert properties that have direct Tailwind equivalents
5. [Pseudo-selectors and States](#pseudo-selectors-and-states)
6. [Group and Peer Modifiers](#group-and-peer-modifiers)
7. [Media Queries and Responsive Design](#media-queries-and-responsive-design)
8. [Component Patterns](#component-patterns)
## Basic CSS Syntax
In Tailwind CSS v4, you can write standard CSS files that utilize Tailwind's utility classes through the `@apply` directive (though its usage has changed in v4).
1.**Native CSS Nesting**: v4 includes built-in CSS nesting support - no plugins needed
2.**Lightning CSS**: v4 uses Lightning CSS under the hood for vendor prefixing and modern syntax transforms
3.**@apply Changes**: The @apply directive behavior may vary in v4, especially in non-Vue projects
4.**CSS-First Configuration**: v4 emphasizes configuring design tokens directly in CSS using @theme
5.**Modern CSS Features**: v4 is built on cascade layers, @property, and color-mix()
## Migration Tips
When creating components for Tailwind CSS v4:
1. Start with the component's base styles using @apply
2. Add CSS custom properties for dynamic values
3. Use nesting for child elements and states
4. Implement size and color variants through CSS variables
5. Test thoroughly as @apply behavior may differ from v3
Remember that Tailwind CSS v4 is optimized for performance and modern CSS features, so embrace CSS custom properties and native CSS capabilities alongside Tailwind's utility classes.
Instructions for AI agents working with the HeroUI v3 repository.
## Repository Overview
HeroUI v3 is a modern React UI library built with **Tailwind CSS v4**, organized as a **pnpm monorepo** managed by **Turborepo**. Components are built on top of [React Aria Components](https://react-spectrum.adobe.com/react-aria/) and follow a compound component pattern similar to Radix UI.
│ └── testing/ # Shared test harness (@heroui/testing)
├── turbo.json
└── pnpm-workspace.yaml
```
## Commands
| Action | Command |
|---|---|
| Install dependencies | `pnpm i --hoist` |
| Build all packages | `pnpm build` |
| Build specific package | `pnpm build --filter=@heroui/react` |
| Dev (Storybook, port 6006) | `pnpm dev` |
| Dev (Docs site, port 3000) | `pnpm dev:docs` |
| Lint | `pnpm lint` |
| Typecheck | `pnpm typecheck` |
| Test all (jsdom + browser) | `pnpm test` |
| Test one file (filter) | `pnpm --filter @heroui/react exec vitest run button` |
| Test with coverage | `pnpm test:coverage` (jsdom floors only — not “done”) |
| Test changed files (local) | `pnpm --filter @heroui/react test:changed` (jsdom only; not a gate) |
| Format | `pnpm run format` |
| Bump version | `pnpm version:bump` |
| Scaffold a new component | `cd packages/react && pnpm add:component ComponentName` |
## Behavioral tests (`@heroui/react`)
- Suites live in `packages/react/tests/components/<name>/`:
-`*.test.tsx` — jsdom (~90% of contracts)
-`*.ssr.test.tsx` — Client SSR smoke via `ssrSmoke()` (not RSC)
-`*.browser.test.tsx` — Playwright (overlays + high-risk portals; not every component)
- optional `fixtures.tsx` — shared JSX across layers
- Import harness from `@heroui/testing/helpers` (`render`, `setupUser`, `runAllTimers`, `ssrSmoke`, `User`). Browser suites: `render` from `@heroui/testing/browser` (wraps `vitest-browser-react`; owned by `@heroui/testing`). Prefer `@/` for sources. Pattern testers: `const user = new User(...); user.createTester(...)` — not a top-level export.
- Query: `getByRole` / label / text first; `data-testid` when needed; avoid class-primary queries.
- Assert: roles/names, HeroUI `data-*` hooks, callbacks, focus, light BEM + documented `data-slot` on compound parts — not colors, full class lists, or RAC internals.
- Fake timers: per-suite only; wire `advanceTimers` into `setupUser` + `User`; use `runAllTimers()`.
- Pattern testers for groups / overlays / collections; skip for Button / Checkbox / Switch / TextField.
- Intentional skips (no dedicated suite required): internals (`rac`, `icons`), non-exported helpers (`color-input-group`, `date-input-group`), in-progress `calendar-year-picker`, parent-covered parts (`list-box-item`, `menu-item`, `menu-section`, `list-box-section`), Toast SSR (client portal only — covered by jsdom + browser). Public `input-group` has its own suite. SSR and browser are risk-based, not universal.
- Browser setup (once locally): `pnpm --filter @heroui/testing exec playwright install chromium` before `pnpm test`. CI uses `playwright install --with-deps chromium`, then `test:browser` + `test:coverage` (not a single `pnpm test`).
- Commands: `pnpm test` (jsdom + browser, needs Chromium); filter with `pnpm --filter @heroui/react exec vitest run <name>`.
- Coverage (`pnpm test:coverage`): jsdom only; `src/components/**` minus barrels. Thresholds are **CI floors** (statements/lines can pass with thin smoke). Green coverage ≠ sufficient depth — still require role/callback/focus (and browser for high-risk portals).
-`test:changed`: local jsdom-only shortcut (`vitest related --changed`). Does **not** run browser suites; never use it as the merge gate — use `pnpm test` / CI.
## Git Commit Convention
All commits must follow [Conventional Commits](https://www.conventionalcommits.org/) and are validated by Husky + commitlint. Pre-commit also runs `lint-staged`.
1.**`pnpm i` triggers builds** — The `postinstall` hook builds `@heroui/styles` and runs `typegen:docs` and `typegen:docs-cn`. If it fails, run `pnpm --filter @heroui/styles build` manually.
2.**Build order matters** — `@heroui/styles` must build before `@heroui/react`. Running `pnpm build` from root handles this via Turbo's `^build` dependency.
3.**Native addons allowlist** — `onlyBuiltDependencies` in root `pnpm-workspace.yaml` allows native compilation for `esbuild`, `@swc/core`, `@parcel/watcher`, etc. If this list is missing, you'll see "Ignored build scripts" warnings.
4.**Behavioral tests** — see [Behavioral tests](#behavioral-tests-herouireact) above. Harness lives in `@heroui/testing`; suites in `packages/react/tests/`.
5.**Commit hooks** — Husky runs `lint-staged` on pre-commit and `commitlint` on commit-msg. Non-conforming commits are rejected.
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Repository Overview
HeroUI v3 is a modern React UI library built with Tailwind CSS v4, using a pnpm monorepo structure managed by Turborepo.
### Key Technical Stack
- **Node.js**: v22+ required
- **pnpm**: v10.26.2 (package manager)
- **React**: v19+
- **Tailwind CSS**: v4.1.18
- **TypeScript**: v5.9.3
- **Turborepo**: Build orchestration
- **Storybook**: Component development
- **Vitest**: Testing framework
## Development Commands
### Core Development Commands
```bash
# Install dependencies (use --hoist flag)
pnpm i --hoist
# Start Storybook for component development
pnpm dev
# Start documentation site
pnpm dev:docs
# Build all packages
pnpm build
# Build specific package
pnpm build --filter=@heroui/react
# Run linting
pnpm lint
# Run tests (turbo → packages with a test script; jsdom + browser)
pnpm test
# Filter by file name (e.g. button.test.tsx)
pnpm --filter @heroui/react exec vitest run button
# Coverage (jsdom floors only — not a depth bar)
pnpm test:coverage
# Changed-set (local jsdom only; not a merge gate)
pnpm --filter @heroui/react test:changed
# Run formatting
pnpm run format
# Run type checking
pnpm typecheck
```
### Behavioral tests (`@heroui/react`)
- Suites: `packages/react/tests/components/<name>/` — `*.test.tsx` (jsdom), `*.ssr.test.tsx` (Client SSR via `ssrSmoke()`, not RSC), `*.browser.test.tsx` (Playwright for high-risk portals/overlays; not universal), optional `fixtures.tsx`
- Harness: `@heroui/testing/helpers` (`render`, `setupUser`, `runAllTimers`, `ssrSmoke`, `User`); browser `render` from `@heroui/testing/browser`. Sources via `@/`. Pattern testers: `user.createTester(...)` — do not import `createTester` directly
- Query/assert: role/label/text first; HeroUI `data-*` + light BEM + documented `data-slot` on compound parts; no colors, full class lists, or RAC internals
- Intentional skips: internals (`rac`, `icons`), non-exported helpers (`color-input-group`, `date-input-group`), in-progress `calendar-year-picker`, parent-covered parts (`list-box-item`, `menu-item`, …), Toast SSR (client portal — jsdom + browser). Public `input-group` has its own suite. SSR/browser are risk-based
- Browser setup (once locally): `playwright install chromium` before `pnpm test`. CI: `--with-deps`, then `test:browser` + `test:coverage`
- Commands: `pnpm test` (jsdom + browser, needs Chromium); filter with `pnpm --filter @heroui/react exec vitest run <name>`
- Coverage: jsdom-only floors — green ≠ depth. `test:changed`: local jsdom shortcut only, not a merge gate
### Package-Specific Commands
- Use `--filter` flag with package name: `pnpm build --filter=@heroui/react`
- Main packages: `@heroui/react`, `@heroui/styles`, `@heroui/docs`, `@heroui/storybook`
## Git Commit Convention
**IMPORTANT**: This repository uses conventional commits with strict validation. All commits must follow this format:
```
<type>(<scope>): <message>
```
### Allowed Types:
-`feat` / `feature`: New features
-`fix`: Bug fixes
-`refactor`: Code refactoring
-`docs`: Documentation changes
-`build`: Build system changes
-`test`: Test changes
-`ci`: CI configuration changes
-`chore`: Other changes
### Examples:
```bash
git commit -m "feat(components): add new prop to avatar component"
**IMPORTANT**: All Storybook stories must use the "Components" group in their title. For example: `title: "Components/Card"`, `title: "Components/Button"`, etc.
### CSS Class Naming Convention
**IMPORTANT**: HeroUI v3 uses BEM (Block Element Modifier) style for CSS classes to ensure predictable and maintainable styling:
- **Block**: The main component class (e.g., `button`, `card`, `alert`)
- **Modifier**: Variations of the component using double dashes (e.g., `button--primary`, `button--lg`, `button--icon-only`)
- **Element**: Child elements within a component (e.g., `card__header`, `alert__icon`)
**Migration to CSS-based Styling**:
- The `button` component has been migrated to use CSS styles from `@heroui/styles/src/components/button.css`
- This approach allows for better customization through CSS utilities and `@utility` directives
- Other components will gradually be migrated to follow this CSS-based pattern
- Components use `tv()` from `tailwind-variants` to map variant props to BEM class names
**Default Size Pattern**:
**CRITICAL**: All components MUST include default sizes in their base classes to prevent broken appearances when no size modifier is specified. Following the following pattern:
- **Base classes** include default dimensions (equivalent to the `--md` variant)
- **Medium variants** (`--md`) are empty with explanatory comments
- **Size modifiers** override the defaults when specified
This ensures components work properly without explicit size classes:
-`<div className="avatar">` → Works perfectly (size-10)
-`<div className="avatar avatar--lg">` → Override to large (size-12)
### Core Component Design Principles
**IMPORTANT**: HeroUI v3 follows a compound component pattern similar to Radix UI, built on top of React Aria Components primitives. This enables maximum flexibility and customization for users.
### React Aria Components Integration
**CRITICAL**: Before implementing any component, you MUST:
**How to check**: If unsure, check the React Aria docs or try both approaches - TypeScript will error if a component doesn't support render props
6. **Composition Pattern with Existing Components**:
**CRITICAL**: HeroUI follows a composition-based approach. Components should reuse existing primitives rather than creating component-specific versions.
**Key Principles**:
- **DO NOT** create component-specific Label, Description, or FieldError components
- **DO** reuse the existing `Label`, `Description`, and `FieldError` components
- **DO** use standard HTML composition patterns with `htmlFor`/`id` attributes
**Example Pattern**:
```typescript
// ❌ WRONG - Component-specific label
export const Checkbox = {
Root: CheckboxRoot,
Label: CheckboxLabel, // Don't create this!
};
// ✅ CORRECT - Compose with existing components
import { Label } from "@/components/label";
import { Description } from "@/components/description";
3. **For BEM-style classes, use complete mappings**
✅ **GOOD** - Complete class name mappings:
```jsx
const sizeClasses = {
sm: "button--sm",
md: "button--md",
lg: "button--lg",
};
// Use the mapping:
className={sizeClasses[size]}
```
### Why This Matters:
- Tailwind generates CSS only for classes it can detect in your source files
- Dynamic concatenation prevents Tailwind from finding the complete class names
- Missing classes = missing styles in production
## Figma Integration & MCP Server Rules
### Figma Dev Mode MCP Server
**IMPORTANT**: When creating components with Figma designs:
1. **Component Breakdown**: Figma designs are already broken down into component pieces (e.g., Menu Container, Menu Item, etc.). Use these as reference for:
- Component structure and naming (adapt to code conventions)
- Visual styling and spacing
- Component composition patterns
2. **MCP Server Rules**:
- The Figma Dev Mode MCP Server provides an assets endpoint for images and SVG assets
- **CRITICAL**: If the Figma MCP Server returns a localhost source for an image or SVG, use that source directly
- **DO NOT** import or add new icon packages - all assets should come from the Figma payload
- **DO NOT** use or create placeholders if a localhost source is provided
- Always use the actual assets from Figma MCP Server
3. **Workflow**:
- Check Figma for component visual design and breakdown
- Map Figma component names to appropriate React Aria primitives
- Use Figma assets (icons, images) directly from the MCP Server
- Implement styles based on Figma design tokens and specifications
## Library Documentation with Context7 MCP
**IMPORTANT**: We have the Context7 MCP server available (https://github.com/upstash/context7) for accessing up-to-date library documentation.
### When to Use Context7
Use Context7 MCP when working with external libraries, especially:
- **Tailwind CSS v4**: When working with Tailwind CSS v4 features, use Context7 to get the latest documentation at https://context7.com/context7/tailwindcss
- **Fumadocs**: When working on the documentation site in `apps/docs/`, use Context7 to get the latest Fumadocs framework documentation
- **Next.js**: For Next.js specific features and APIs used in the docs app
- Any other third-party libraries where up-to-date documentation is needed
### How to Use Context7
1. First, resolve the library ID using `mcp__context7__resolve-library-id`
2. Then fetch documentation using `mcp__context7__get-library-docs` with the resolved ID
3. This ensures you're always working with the latest documentation rather than outdated information
### Example Usage Areas
- Implementing new documentation features in `apps/docs/`
- Configuring Fumadocs settings in `source.config.ts`
- Working with MDX components and layouts
- Setting up search functionality
- Implementing documentation navigation and structure
## GitHub Repository Search with Grep MCP
**IMPORTANT**: We have the Grep MCP server available for searching over a million public GitHub repositories to find real-world code examples and patterns.
### When to Use Grep MCP
Use the Grep MCP (`mcp__grep__searchGitHub`) when tackling complex problems that require:
- **Real-world implementation examples**: Finding how other developers solve similar problems
- **Best practices and patterns**: Discovering production-ready code patterns
- **Library usage examples**: Understanding how specific APIs or libraries are used in practice
- **Complex integrations**: Seeing how different libraries work together
- **Error handling patterns**: Learning from battle-tested error handling approaches
### How to Use Grep MCP
The Grep MCP searches for **literal code patterns**, not keywords. Use actual code syntax:
**Good examples**:
- `'useState('` - Find React hooks usage
- `'import { tv } from "tailwind-variants"'` - Find tailwind-variants imports
As you canary, you can run `pnpm build --filter=<module>` and
`pnpm test packages/<module>/<pkg>` e.g. `pnpm build --filter=avatar & pnpm test packages/components/avatar` to make sure everything works as expected.
As you go, you can run `pnpm build --filter=<module>` and
`pnpm --filter @heroui/react exec vitest run <name>` e.g. `pnpm build --filter=@heroui/react && pnpm --filter @heroui/react exec vitest run avatar` to make sure everything works as expected.
> To know more about the `--filter` option, please check the turborepo [docs](https://turborepo.org/docs/core-concepts/filtering).
4.Run `pnpm changeset` to create a detailed description of your changes. This
will be used to generate a changelog when we publish an update.
[Learn more about Changeset](https://github.com/atlassian/changesets/tree/master/packages/cli).
Please note that you might have to run `git fetch origin main:master` (where
origin will be your fork on GitHub) before `pnpm changeset` works.
5. Also, if you provide `jsx` snippets to the changeset, please turn off the
live preview by doing the following at the beginning of the snippet:
` ```jsx live=false`
> If you made minor changes like CI config, prettier, etc, you can run
> `pnpm changeset add --empty` to generate an empty changeset file to document
> your changes.
4.Version bumping is handled by maintainers using `pnpm version:bump` which
uses [bumpp](https://github.com/antfu/bumpp) to interactively bump the
version, create a git commit, and push a tag that triggers the release CI.
## Development Setup
@@ -120,11 +111,9 @@ We use [Turbo Repo](https://turborepo.org/) for the project management.
## Start the dev babel server of HeroUI core components
pnpm dev
## optional
## optional — Storybook is also started by `pnpm dev`
pnpm sb ## this will start the storybook server for a faster development and testing.
pnpm dev:docs ## this will start the documentation next.js server and it will automatically detect the changes in the components.
pnpm dev:docs ## documentation next.js server; picks up component changes
```
- If you will be working just on the documentation source code / mdx, you can use the following commands to build
@@ -141,7 +130,7 @@ pnpm dev:docs
- You also can use Storybook to test the components and faster development:
```bash
pnpm sb
pnpm dev
```
Remember that these commands must be executed in the root folder of the project.
4. If your code passes all the tests, then push your feature/fix branch:
All commits that fix bugs or add features need a test.
You can run the nest command for component specific tests.
All commits that fix bugs or add features need a behavioral test when they change interactive component contracts.
See Behavioral tests in [`AGENTS.md`](AGENTS.md): query by role/label, use `setupUser()` from `@heroui/testing/helpers`, assert `data-*` state hooks and callbacks — not CSS pixels.
```bash
# Test current code
# One-time local Playwright install (required before browser suites / `pnpm test`)
pnpm --filter @heroui/react exec vitest run button
npm run test
# Coverage report (jsdom project + CI floors only — not a depth bar)
pnpm test:coverage
# Optional local shortcut: related jsdom tests for changed files (skips browser)
pnpm --filter @heroui/react test:changed
```
```bash
# Test isolated component code
CI (`QA` Test job) installs Chromium with `--with-deps`, then runs `test:browser` and `test:coverage` separately. Do not treat `test:changed` or coverage floors alone as “fully tested.”
pnpm test button
# or
npm run test button
```
5. Be sure the package builds.
@@ -196,7 +184,7 @@ pnpm build
npm run build
```
> Note: ensure that you have at least Node.js 20.16.0 as well as pnpm 9.6.0 or higher installed on your machine to run the scripts
> Note: ensure that you have at least Node.js 22.x as well as pnpm 10.26.2 (see root `packageManager`) installed on your machine to run the scripts
"company": "PRISMA European Capacity Platform GmbH",
"description": null,
"image": "/sponsors/375034.jpg",
"email": null,
"twitter": null,
"github": null,
"website": null
},
{
"MemberId": 395990,
"createdAt": "2023-02-11 13:12",
"type": "ORGANIZATION",
"role": "BACKER",
"tier": "Gold Sponsor 🥇",
"isActive": true,
"totalAmountDonated": 100,
"currency": "USD",
"lastTransactionAt": "2023-02-11 13:12",
"lastTransactionAmount": 100,
"profile": "https://opencollective.com/likn",
"name": "LIKN",
"company": null,
"description": "LIKN is a powerful, but simple Web3 component and protocol. Connect Web2 content to Web3, and solely mint content NFTs by URL. Share and Trade in different platforms and marketplaces. OpenAI empowers LIKN which can automatically generate NFT metadata. ",
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
# or
pnpm dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
[http://localhost:3000/api/hello](http://localhost:3000/api/hello) is an endpoint that uses [Route Handlers](https://beta.nextjs.org/docs/routing/route-handlers). This endpoint can be edited in `app/api/hello/route.ts`.
This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.