Skip to content

feat(react): modernize component APIs and layouts#1

Merged
kxpw merged 1 commit into
mainfrom
feat/modernize-component-library
Jul 21, 2026
Merged

feat(react): modernize component APIs and layouts#1
kxpw merged 1 commit into
mainfrom
feat/modernize-component-library

Conversation

@kxpw

@kxpw kxpw commented Jul 21, 2026

Copy link
Copy Markdown
Owner

Why

Modernize Velune component APIs, responsive layouts, accessibility, and bundle architecture while keeping documentation and quality gates aligned.

What Changed

  • Add Alert, Breadcrumb, Slider, and Combobox.
  • Add responsive props to Box, Container, Flex, Grid, and Stack.
  • Add Standard Schema validation to Form and shared dialog behavior for Modal and Drawer.
  • Add API improvements including Button asChild, style recipes, Checkbox group slots, Switch lg, TextArea resize, Pagination hideOnSinglePage, toast.promise, Stack dividers, and Spinner labels.
  • Remove the deprecated Stack spacing prop; use gap.
  • Replace react-aria and internationalized-date implementations for Slider, Dropdown, and DateRangePicker.
  • Update docs, Storybook, skills, exports, size limits, performance checks, and vulnerable dependencies.

Verification

  • pnpm verify
  • Relevant keyboard and accessibility tests
  • Light, dark, and high-contrast examples
  • Responsive desktop and mobile layouts
  • pnpm audit reports no known vulnerabilities
  • Package exports and packed entrypoints validated
  • Storybook performance budgets passed

Visual Evidence

Updated component examples are available in Storybook and the documentation app.

Public API and Release

  • Public API changes include one changeset
  • Breaking changes include migration guidance
  • Documentation and Storybook examples match the implementation

Migration: replace Stack spacing with Stack gap.

Component Quality

  • Native and ARIA semantics remain correct
  • Controlled and uncontrolled behavior is covered where applicable
  • Consumer props, handlers, and refs are preserved
  • Tests cover changed behavior and regression risk
  • Tailwind utilities use public semantic tokens
  • Bundle and performance impact is validated

Reviewer Notes

Review the new component APIs, responsive class generation, shared dialog primitive, and in-house interaction implementations most closely.

@vercel

vercel Bot commented Jul 21, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
velune Ready Ready Preview, Comment Jul 21, 2026 10:51pm

@kxpw
kxpw merged commit 64a1323 into main Jul 21, 2026
3 checks passed
@kxpw
kxpw deleted the feat/modernize-component-library branch July 21, 2026 22:51

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e44c5ee637

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +521 to +525
<input
type="hidden"
name={name}
{...(form !== undefined ? { form } : {})}
value={resolvedValue ?? ""}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Mirror form semantics on the combobox proxy

When a Combobox participates in a form via name, this hidden input is the submitted control, but hidden inputs do not participate in constraint validation and the proxy is not disabled. As a result, <Combobox name="plan" required> can submit an empty value instead of blocking, and <Combobox name="plan" disabled> still posts its last value; use a real visually-hidden form control that mirrors required/disabled like Select does, or otherwise propagate those semantics.

Useful? React with 👍 / 👎.

Comment on lines +364 to +366
<DateRangeField
value={selected.start}
onCommit={(date) => commit({ start: date, end: selected.end })}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Enforce min/max for typed date-range segments

When min or max is set, the calendar disables out-of-bounds days, but typed segment edits still call commit directly from DateRangeField without checking minDate/maxDate. A keyboard user can therefore enter and emit dates outside the allowed range through onValueChange and the native date values; apply the same bounds check before committing field edits.

Useful? React with 👍 / 👎.

Comment on lines +230 to +234
onClick={(event: MouseEvent<HTMLElement>) => {
preventDisabledInteraction(event);
if (!isDisabled) {
(providedOnClick as (e: MouseEvent<HTMLElement>) => void)?.(event);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Guard disabled asChild before child handlers run

When asChild is disabled or loading and the child element has its own onClick or a custom component performs navigation in that handler, Slot composes the child's handler before this Button handler, so the action can run before preventDisabledInteraction is called. Guard in capture phase or compose the disabled handling ahead of the child so disabled asChild buttons are inert.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant