@botiverse/raft-ui 0.58.0 → 0.58.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## [0.58.1](https://github.com/botiverse/raft-design/compare/v0.58.0...v0.58.1) (2026-11-03)
2
+
3
+ ### Fixed
4
+
5
+ - **Button**: a `loading` button keeps keyboard focus. It is `aria-disabled` and stays in the tab order instead of becoming natively `disabled`; click, Enter, Space and form submit are blocked while it runs. A `disabled` button stays natively disabled. ([#956](https://github.com/botiverse/raft-design/pull/956))
6
+ - Why: pressing a button that then turned busy dropped focus to the page, and it didn't come back when the request failed.
7
+ - Affects: every component that passes `loading` to Button (DialogCommit, AlertDialog, Dialog, Drawer, Banner, SidebarSectionControl and others). A busy button now receives pointer events: the wait cursor shows, and a wrapping Tooltip opens on hover. Its look is unchanged.
8
+ - Docs: https://raft-design.botiverse.build/components/button/
9
+
10
+ ### Docs
11
+
12
+ - **Table**: a Sorting section on sorting rows from a column heading. ([#954](https://github.com/botiverse/raft-design/pull/954))
13
+
1
14
  ## [0.58.0](https://github.com/botiverse/raft-design/compare/v0.57.2...v0.58.0) (2026-11-03)
2
15
 
3
16
  ### Added
@@ -249,9 +249,16 @@ export type ButtonProps = StyledProps<Button.Props> & Omit<ButtonVariantProps, "
249
249
  * `icon-md`, removed in raft-ui 1.0 (`codemods/button-sizes.mjs`).
250
250
  */
251
251
  size?: "md" | "lg" | "xl" | "icon-md" | "icon-lg" | DeprecatedButtonSize;
252
+ /**
253
+ * Busy: shows the spinner and blocks activation (click, Enter, Space and
254
+ * form submission) while keeping the button focusable. A busy button is
255
+ * `aria-disabled`, not natively `disabled`, so the focus a press left on
256
+ * it stays there and is still there when the wait ends.
257
+ */
252
258
  loading?: boolean;
259
+ /** The spinner's accessible name while `loading`: say what is happening. */
253
260
  loadingLabel?: string;
254
261
  };
255
- declare function Button$1({ variant, size, loading, loadingLabel, disabled, className, children, render, nativeButton, ...props }: ButtonProps): import("react").JSX.Element;
262
+ declare function Button$1({ variant, size, loading, loadingLabel, disabled, focusableWhenDisabled, className, children, render, nativeButton, ...props }: ButtonProps): import("react").JSX.Element;
256
263
  //#endregion
257
264
  export { Button$1 as Button };
@@ -146,7 +146,7 @@ const ICON_SIZES = /* @__PURE__ */ new Set([
146
146
  "icon-md",
147
147
  "icon-lg"
148
148
  ]);
149
- function Button$1({ variant, size, loading = false, loadingLabel = "Loading", disabled, className, children, render, nativeButton, ...props }) {
149
+ function Button$1({ variant, size, loading = false, loadingLabel = "Loading", disabled, focusableWhenDisabled, className, children, render, nativeButton, ...props }) {
150
150
  const { root, content, loadingIndicator } = buttonVariants({
151
151
  variant,
152
152
  size
@@ -160,6 +160,7 @@ function Button$1({ variant, size, loading = false, loadingLabel = "Loading", di
160
160
  className: root({ className }),
161
161
  "data-loading": loading ? "true" : void 0,
162
162
  disabled: disabled || loading,
163
+ focusableWhenDisabled: loading && !disabled || focusableWhenDisabled,
163
164
  ...loading ? { "aria-disabled": true } : {},
164
165
  children: [loading ? /* @__PURE__ */ jsx("span", {
165
166
  "data-slot": "button-loading-indicator",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botiverse/raft-ui",
3
- "version": "0.58.0",
3
+ "version": "0.58.1",
4
4
  "description": "React components and CSS foundations for the Raft Design System.",
5
5
  "keywords": [
6
6
  "agent-skills",