@antadesign/anta 0.3.22 → 0.3.23

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.
Files changed (51) hide show
  1. package/dist/avatar-core.d.ts +160 -0
  2. package/dist/avatar-core.js +271 -0
  3. package/dist/bundle.css +1 -0
  4. package/dist/bundle.d.ts +11 -0
  5. package/dist/bundle.js +1239 -0
  6. package/dist/components/Avatar.d.ts +63 -0
  7. package/dist/components/Avatar.js +29 -0
  8. package/dist/components/Loader.d.ts +5 -1
  9. package/dist/components/Loader.js +2 -1
  10. package/dist/components/Slider.d.ts +1 -1
  11. package/dist/components/Steps.css +1 -0
  12. package/dist/components/Steps.d.ts +93 -0
  13. package/dist/components/Steps.js +128 -0
  14. package/dist/components/Tabs.d.ts +10 -5
  15. package/dist/components/Tabs.js +5 -2
  16. package/dist/components/Tooltip.d.ts +5 -5
  17. package/dist/elements/a-avatar.css +1 -0
  18. package/dist/elements/a-avatar.d.ts +31 -0
  19. package/dist/elements/a-avatar.js +98 -0
  20. package/dist/elements/a-icon.shapes.css +1 -1
  21. package/dist/elements/a-icon.shapes.d.ts +1 -8
  22. package/dist/elements/a-icon.shapes.js +0 -14
  23. package/dist/elements/a-loader.css +1 -1
  24. package/dist/elements/a-slider.css +1 -1
  25. package/dist/elements/a-tabs.css +1 -1
  26. package/dist/elements/a-tooltip.d.ts +4 -4
  27. package/dist/elements/a-tooltip.js +18 -15
  28. package/dist/elements/index.d.ts +1 -0
  29. package/dist/elements/index.js +3 -0
  30. package/dist/general_types.d.ts +36 -0
  31. package/dist/index.d.ts +6 -0
  32. package/dist/index.js +28 -0
  33. package/dist/jsx-runtime.d.ts +6 -1
  34. package/docs/changelog.md +40 -0
  35. package/docs/comparison.md +2 -2
  36. package/docs/components/banner.md +1 -1
  37. package/docs/components/button.md +3 -3
  38. package/docs/components/card.md +1 -1
  39. package/docs/components/expander.md +1 -1
  40. package/docs/components/input.md +1 -1
  41. package/docs/components/loader.md +1 -0
  42. package/docs/components/menu.md +1 -1
  43. package/docs/components/radio.md +1 -1
  44. package/docs/components/slider.md +1 -1
  45. package/docs/components/steps.md +324 -0
  46. package/docs/components/tabs.md +24 -8
  47. package/docs/components/tag.md +3 -3
  48. package/docs/components/tooltip.md +5 -5
  49. package/docs/index.md +1 -0
  50. package/docs/install-config.md +17 -0
  51. package/package.json +9 -3
@@ -12,7 +12,7 @@ const PROX_NEAR = 10;
12
12
  const PROX_FAR = 100;
13
13
  const PROX_FADE_MS = 60;
14
14
  const ENTER_TOUCH_DELAY = 500;
15
- const TRUNCATING_PARTS = "a-tab-label, a-button-label";
15
+ const TRUNCATING_PARTS = "a-tab-label, a-button-label, a-step-hint";
16
16
  const AUTOMATIC_TEXT_TOOLTIP = "data-anta-text-tooltip";
17
17
  const LEAVE_TOUCH_DELAY = 1500;
18
18
  const TOUCH_SLOP = 10;
@@ -289,34 +289,37 @@ class ATooltipElement extends HTMLElementBase {
289
289
  syncAutomaticTextContent() {
290
290
  if (this.#isAutomaticTextTooltip) this.bubble.textContent = this.anchorText();
291
291
  }
292
- /** The element whose overflow decides whether the tooltip shows: a
293
- * `truncated-selector` resolved within the anchor wins; else the first of
292
+ /** The elements whose overflow decides whether the tooltip shows: every
293
+ * `truncated-selector` match within the anchor wins; else every one of
294
294
  * Anta's ellipsizing label parts inside the anchor; else the anchor itself
295
295
  * (which may be the clipping box for a hand-authored target). */
296
- resolveTruncationTarget() {
296
+ resolveTruncationTargets() {
297
297
  const anchor = this.anchor;
298
- if (!anchor) return null;
298
+ if (!anchor) return [];
299
299
  const sel = this.getAttribute("truncated-selector");
300
300
  if (sel) {
301
301
  try {
302
- const found = anchor.querySelector(sel);
303
- if (found) return found;
302
+ const found = Array.from(anchor.querySelectorAll(sel));
303
+ if (found.length) return found;
304
304
  } catch {
305
305
  }
306
306
  }
307
- return anchor.querySelector(TRUNCATING_PARTS) ?? anchor;
307
+ const parts = Array.from(
308
+ anchor.querySelectorAll(TRUNCATING_PARTS)
309
+ );
310
+ return parts.length ? parts : [anchor];
308
311
  }
309
- /** True when the resolved target overflows its box (horizontal ellipsis or
312
+ /** True when any resolved target overflows its box (horizontal ellipsis or
310
313
  * vertical clamp). A 1px threshold absorbs sub-pixel rounding; a zero-size
311
314
  * (hidden / detached) target counts as not truncated. Measured fresh on each
312
315
  * show attempt, so late fonts / resizes self-correct with no observer. */
313
316
  isTargetTruncated() {
314
- const t = this.resolveTruncationTarget();
315
- if (!t) return false;
316
- const reported = t.isTruncated;
317
- if (typeof reported === "boolean") return reported;
318
- if (t.clientWidth === 0 && t.clientHeight === 0) return false;
319
- return t.scrollWidth - t.clientWidth > 1 || t.scrollHeight - t.clientHeight > 1;
317
+ return this.resolveTruncationTargets().some((target) => {
318
+ const reported = target.isTruncated;
319
+ if (typeof reported === "boolean") return reported;
320
+ if (target.clientWidth === 0 && target.clientHeight === 0) return false;
321
+ return target.scrollWidth - target.clientWidth > 1 || target.scrollHeight - target.clientHeight > 1;
322
+ });
320
323
  }
321
324
  /** True when there's nothing worth showing: no element children (so an
322
325
  * icon/image-only bubble still counts as content) and no non-whitespace text
@@ -13,6 +13,7 @@
13
13
  * Must only be imported client-side — registration is guarded against missing
14
14
  * `customElements` (SSR), but there's no reason to load it server-side.
15
15
  */
16
+ export { AAvatarElement, register_a_avatar } from './a-avatar';
16
17
  export { AProgressElement, register_a_progress } from './a-progress';
17
18
  export { ALoaderElement, register_a_loader } from './a-loader';
18
19
  export { ATextElement, register_a_text } from './a-text';
@@ -1,3 +1,4 @@
1
+ import { AAvatarElement, register_a_avatar } from "./a-avatar";
1
2
  import { AProgressElement, register_a_progress } from "./a-progress";
2
3
  import { ALoaderElement, register_a_loader } from "./a-loader";
3
4
  import { ATextElement, register_a_text } from "./a-text";
@@ -29,6 +30,7 @@ import { AToastElement, register_a_toast } from "./a-toast";
29
30
  import "./a-title.css";
30
31
  import "./a-tag.css";
31
32
  export {
33
+ AAvatarElement,
32
34
  ABannerElement,
33
35
  AButtonElement,
34
36
  ACalendarElement,
@@ -57,6 +59,7 @@ export {
57
59
  AToastElement,
58
60
  AToasterElement,
59
61
  ATooltipElement,
62
+ register_a_avatar,
60
63
  register_a_banner,
61
64
  register_a_button,
62
65
  register_a_calendar,
@@ -181,12 +181,45 @@ export interface AProgressAttributes extends BaseAttributes {
181
181
  /** ARIA accessible name. */
182
182
  'aria-label'?: string;
183
183
  }
184
+ /**
185
+ * Attributes for the `<a-avatar>` custom element.
186
+ *
187
+ * These are the low-level web component attributes. For the typed JSX wrapper,
188
+ * use `Avatar` from `@antadesign/anta`.
189
+ */
190
+ export interface AAvatarAttributes extends BaseAttributes {
191
+ /** Alphanumeric seed driving the generated userpic. Falls back to `name`. */
192
+ seed?: string;
193
+ /** Name — supplies the initials fallback and accessible name, and seeds
194
+ * generation when `seed` is absent. */
195
+ name?: string;
196
+ /** Image URL. Shown instead of a generated userpic when present. */
197
+ src?: string;
198
+ /** Size of the square container. `medium` is the default; set a pixel size via
199
+ * the `--avatar-size` custom property. */
200
+ size?: 'small' | 'medium' | 'large';
201
+ /** Corner badge, colored by tone — a named tone or any literal CSS color
202
+ * (derived in oklch). Omit for no badge. */
203
+ badge?: 'neutral' | 'brand' | 'info' | 'success' | 'warning' | 'critical' | (string & {});
204
+ /** Fully-round (circular) frame, or a custom radius via a length value
205
+ * (`round="12px"`). Presence-based for the boolean form. */
206
+ round?: boolean | number | string;
207
+ /** Brand generation constraints as a JSON string (an `AvatarGenConfig`). With
208
+ * the `Avatar` wrapper, pass the object as `generator` and it is serialized. */
209
+ config?: string;
210
+ /** ARIA role — the JSX wrapper sets this to `'img'`. */
211
+ role?: string;
212
+ /** ARIA accessible name. */
213
+ 'aria-label'?: string;
214
+ }
184
215
  /**
185
216
  * Attributes for the `<a-loader>` custom element. For the JSX wrapper with
186
217
  * cross-browser sizing and accessible progress semantics, use `Loader` from
187
218
  * `@antadesign/anta`.
188
219
  */
189
220
  export interface ALoaderAttributes extends BaseAttributes {
221
+ /** Color tone for the loader. */
222
+ tone?: 'neutral' | 'brand' | 'info' | 'success' | 'warning' | 'critical';
190
223
  /** Presence selects the static, determinate gradient. Set `--loader-value`
191
224
  * in `style` to its percentage. Omit this attribute for the rotating
192
225
  * indeterminate gradient. */
@@ -1119,6 +1152,9 @@ export interface ATabsAttributes extends BaseAttributes {
1119
1152
  /** Layout + arrow-key axis. `'horizontal'` (default) ellipsizes labels when tabs
1120
1153
  * overflow (scrolling is opt-in via CSS); `'vertical'` stacks them. */
1121
1154
  orientation?: 'horizontal' | 'vertical';
1155
+ /** Make horizontal tabs share the available inline space equally. Presence-based
1156
+ * (`''` on, omit off). */
1157
+ fill?: boolean | '';
1122
1158
  /** Disable the sliding indicator. By default the selected-tab indicator is a single
1123
1159
  * rectangle that animates between tabs via CSS anchor positioning; with `noslide` the
1124
1160
  * highlight is painted on each tab and snaps with no movement (also the automatic
package/dist/index.d.ts CHANGED
@@ -16,6 +16,10 @@
16
16
  *
17
17
  * @packageDocumentation
18
18
  */
19
+ export { Avatar } from './components/Avatar';
20
+ export type { AvatarProps } from './components/Avatar';
21
+ export { resolveAvatar, avatarToSvg, getInitials, hashSeed, mulberry32, rngFromSeed, maxChroma, oklchString, colorLightness, hasFigure, DEFAULT_CONFIG, } from './avatar-core';
22
+ export type { AvatarGenConfig, DimMode, ScalarDim, Vec2Dim, ColorDim, ResolvedAvatar, ResolvedHead, ResolvedBody, SvgOptions, } from './avatar-core';
19
23
  export { Progress } from './components/Progress';
20
24
  export type { ProgressProps } from './components/Progress';
21
25
  export { Loader } from './components/Loader';
@@ -74,6 +78,8 @@ export { SelectFaceted } from './components/SelectFaceted';
74
78
  export type { SelectFacetedProps, SelectFacet, SelectFacetSingle, SelectFacetMultiple, SelectFacetText, SelectFacetCustom, SelectFacetCustomContext, FacetFilter, SelectFacetedValue, SelectFacetedChangeAttrs, SelectFacetedTriggerState, } from './components/SelectFaceted';
75
79
  export { Tabs } from './components/Tabs';
76
80
  export type { TabsProps, TabOption, TabsChangeAttrs } from './components/Tabs';
81
+ export { Steps } from './components/Steps';
82
+ export type { StepsProps, StepMarker, StepMarkerState, StepOption, StepPriority, StepState, StepTone, } from './components/Steps';
77
83
  export { TabPanel } from './components/TabPanel';
78
84
  export type { TabPanelProps } from './components/TabPanel';
79
85
  export { Dialog } from './components/Dialog';
package/dist/index.js CHANGED
@@ -1,3 +1,17 @@
1
+ import { Avatar } from "./components/Avatar";
2
+ import {
3
+ resolveAvatar,
4
+ avatarToSvg,
5
+ getInitials,
6
+ hashSeed,
7
+ mulberry32,
8
+ rngFromSeed,
9
+ maxChroma,
10
+ oklchString,
11
+ colorLightness,
12
+ hasFigure,
13
+ DEFAULT_CONFIG
14
+ } from "./avatar-core";
1
15
  import { Progress } from "./components/Progress";
2
16
  import { Loader } from "./components/Loader";
3
17
  import { Text } from "./components/Text";
@@ -42,6 +56,7 @@ import { RadioGroup } from "./components/RadioGroup";
42
56
  import { Select, optionsWithSelection } from "./components/Select";
43
57
  import { SelectFaceted } from "./components/SelectFaceted";
44
58
  import { Tabs } from "./components/Tabs";
59
+ import { Steps } from "./components/Steps";
45
60
  import { TabPanel } from "./components/TabPanel";
46
61
  import { Dialog } from "./components/Dialog";
47
62
  import { Card } from "./components/Card";
@@ -49,12 +64,14 @@ import { Banner } from "./components/Banner";
49
64
  import { Toaster, createToaster } from "./components/Toaster";
50
65
  import { configure } from "./jsx-runtime";
51
66
  export {
67
+ Avatar,
52
68
  Banner,
53
69
  Button,
54
70
  ButtonCopy,
55
71
  Calendar,
56
72
  Card,
57
73
  Checkbox,
74
+ DEFAULT_CONFIG,
58
75
  Dialog,
59
76
  Expander,
60
77
  ICON_SHAPES,
@@ -75,6 +92,7 @@ export {
75
92
  Select,
76
93
  SelectFaceted,
77
94
  Slider,
95
+ Steps,
78
96
  Switch,
79
97
  TabPanel,
80
98
  Tabs,
@@ -83,8 +101,10 @@ export {
83
101
  Title,
84
102
  Toaster,
85
103
  Tooltip,
104
+ avatarToSvg,
86
105
  buildMonth,
87
106
  clampDate,
107
+ colorLightness,
88
108
  configure,
89
109
  createToaster,
90
110
  dateFormatPattern,
@@ -92,12 +112,20 @@ export {
92
112
  firstDayOfWeek,
93
113
  formatDateInput,
94
114
  formatDateTimeInput,
115
+ getInitials,
95
116
  getWeekdays,
117
+ hasFigure,
118
+ hashSeed,
96
119
  isOutOfRange,
120
+ maxChroma,
121
+ mulberry32,
122
+ oklchString,
97
123
  optionsWithSelection,
98
124
  parseDateInput,
99
125
  parseDateTimeInput,
100
126
  parseISODate,
101
127
  parseTimeInput,
128
+ resolveAvatar,
129
+ rngFromSeed,
102
130
  usesHour12
103
131
  };
@@ -44,7 +44,7 @@ export declare function useSyncExternalStore<T>(subscribe: (onChange: () => void
44
44
  export declare function jsx(type: ComponentType, props: Record<string, unknown> | null, key?: string | number): unknown;
45
45
  export declare function jsxs(type: ComponentType, props: Record<string, unknown> | null, key?: string | number): unknown;
46
46
  export { _Fragment as Fragment };
47
- import type { AProgressAttributes, ALoaderAttributes, ATextAttributes, ATitleAttributes, ATagAttributes, AExpanderAttributes, AIconAttributes, AButtonAttributes, ACopyAttributes, ACheckboxAttributes, ASwitchAttributes, ATooltipAttributes, AInputAttributes, ASliderAttributes, AInputTimeAttributes, ACalendarAttributes, ARadioAttributes, ARadioGroupAttributes, AMenuAttributes, AMenuItemAttributes, AMenuGroupAttributes, ATabsAttributes, ATabAttributes, ATabpanelAttributes, ADialogAttributes, ACardAttributes, ABannerAttributes, AToasterAttributes, AToastAttributes, BaseAttributes } from './general_types';
47
+ import type { AAvatarAttributes, AProgressAttributes, ALoaderAttributes, ATextAttributes, ATitleAttributes, ATagAttributes, AExpanderAttributes, AIconAttributes, AButtonAttributes, ACopyAttributes, ACheckboxAttributes, ASwitchAttributes, ATooltipAttributes, AInputAttributes, ASliderAttributes, AInputTimeAttributes, ACalendarAttributes, ARadioAttributes, ARadioGroupAttributes, AMenuAttributes, AMenuItemAttributes, AMenuGroupAttributes, ATabsAttributes, ATabAttributes, ATabpanelAttributes, ADialogAttributes, ACardAttributes, ABannerAttributes, AToasterAttributes, AToastAttributes, BaseAttributes } from './general_types';
48
48
  export declare namespace JSX {
49
49
  interface IntrinsicElements extends React.JSX.IntrinsicElements, AntaIntrinsicElements {
50
50
  }
@@ -52,6 +52,7 @@ export declare namespace JSX {
52
52
  }
53
53
  }
54
54
  export interface AntaIntrinsicElements {
55
+ 'a-avatar': AAvatarAttributes;
55
56
  'a-progress': AProgressAttributes;
56
57
  'a-loader': ALoaderAttributes;
57
58
  'a-progress-label': BaseAttributes;
@@ -108,6 +109,10 @@ export interface AntaIntrinsicElements {
108
109
  'a-tab': ATabAttributes;
109
110
  'a-tab-label': BaseAttributes;
110
111
  'a-tabpanel': ATabpanelAttributes;
112
+ 'a-steps': BaseAttributes;
113
+ 'a-step-marker': BaseAttributes;
114
+ 'a-step-desc': BaseAttributes;
115
+ 'a-step-hint': BaseAttributes;
111
116
  'a-dialog': ADialogAttributes;
112
117
  'a-card': ACardAttributes;
113
118
  'a-card-icon-chip': BaseAttributes;
package/docs/changelog.md CHANGED
@@ -3,6 +3,46 @@
3
3
  This page tracks changes that ship in `@antadesign/anta`. Documentation-only
4
4
  changes are not listed.
5
5
 
6
+ ## Unreleased
7
+
8
+ ## 0.3.23 — August 23, 2026
9
+
10
+ ### Removed
11
+
12
+ - Removed the `education-disk`, `help-disk`, and all `*-logo` icon shapes.
13
+
14
+ ### Added
15
+
16
+ - `@antadesign/anta/bundle` and `bundle.css` provide one minified full-runtime
17
+ entry and one matching stylesheet for applications that prefer full imports.
18
+ - `Steps` provides controlled and uncontrolled process navigation with optional
19
+ panels, horizontal and vertical layouts, accessible tab semantics, process
20
+ states, number and icon-shape markers, state-aware `renderMarker`, labels
21
+ and hints with clipped-content tooltips, and per-option tones.
22
+ - `Loader` accepts a named `tone`; the loading Steps state forwards the
23
+ option tone to it.
24
+ - `Tabs` and `Steps` accept `fill`. Tabs share the available width equally;
25
+ Steps stretch their connectors between content-sized phases.
26
+ - `Steps` adds `primary`, `secondary`, and `tertiary` priorities. Primary uses a
27
+ solid selected marker and stronger completed connectors; tertiary is compact
28
+ and borderless.
29
+ - `StepOption` defaults to the neutral tone. Omitting its `tone` or passing an
30
+ empty string produces the same result; selected rings use the stronger
31
+ `border-1` step.
32
+
33
+ - `Avatar` renders an image, seed-generated placeholder, or initials, with
34
+ `generator`, `badge`, and `round` options. `avatar-core` generation helpers are
35
+ also exported.
36
+
37
+ ### Changed
38
+
39
+ - `Avatar` default generation uses a larger head-to-body gap, shifts figures
40
+ slightly upward, and varies their position, rotation, color, scale, and shape
41
+ more widely.
42
+ - `Slider` thumbs are smaller: 12px at `small`, 16px at `medium` (the default,
43
+ previously 18px), and 20px at `large`, unchanged. `thumbSize` still overrides
44
+ any of them.
45
+
6
46
  ## 0.3.22 — August 20, 2026
7
47
 
8
48
  ### Changed
@@ -24,5 +24,5 @@ stable releases in this snapshot.
24
24
  ## Component coverage
25
25
 
26
26
  Rows group components by job, so Dialog, Modal, and Drawer share one mark.
27
- Anta covers the common controls but remains narrower than full suites. Base UI
28
- intentionally focuses on behavior rather than styled components.
27
+ Anta covers the common controls but remains narrower than full suites. The
28
+ shadcn row reflects its default Base UI registry.
@@ -11,7 +11,7 @@ twice the resting height of `Progress`. It's **borderless by default**; add a ru
11
11
  under it or an outline around it with `border-bottom-width` / `border-width`, the
12
12
  same opt-in as `Progress` ([Styling](#styling)).
13
13
 
14
- ## Tones
14
+ ## Tone
15
15
 
16
16
  Pick a semantic `tone` to tint the surface and text together — and the ✕ adopts the
17
17
  same tone (it also sets the border color, used if you opt into a border). The set
@@ -5,7 +5,7 @@ component (or `<a role="button">` when `href` is set). Tone, priority,
5
5
  size, and state are all plain attributes, so the styling is identical
6
6
  whether you use the wrapper or author the element by hand.
7
7
 
8
- ## Priorities
8
+ ## Priority
9
9
 
10
10
  A button's priority helps control how much attention it draws:
11
11
 
@@ -21,7 +21,7 @@ A button's priority helps control how much attention it draws:
21
21
  - `tertiary` — Background-less at rest, fills on hover.
22
22
  - `quaternary` — Text only, no background.
23
23
 
24
- ## Tones
24
+ ## Tone
25
25
 
26
26
  Six named tones — `neutral` (default), `brand`, `critical`, `info`,
27
27
  `success`, `warning`. Omitting `tone` — or passing an empty string —
@@ -66,7 +66,7 @@ too, so there's no state change; to keep distinct states, set the per-state
66
66
  variables instead — `--button-bg-{priority}-hover`,
67
67
  `--button-bg-{priority}-active`, and the `--button-fg-*` equivalents.
68
68
 
69
- ## Sizes
69
+ ## Size
70
70
 
71
71
  ```tsx
72
72
  <Button tone="brand" size="small" label="Small" />
@@ -62,7 +62,7 @@ when toned (stepping to `border-3` on hover).
62
62
  <Card priority="tertiary" header="Tertiary">…</Card>
63
63
  ```
64
64
 
65
- ## Tones
65
+ ## Tone
66
66
 
67
67
  A semantic `tone` tints the surface, border, and text. The set matches the rest of
68
68
  Anta: `neutral` (the default) plus `brand`, `info`, `success`, `warning`, and
@@ -36,7 +36,7 @@ to see the corners hold their radius as the body appears.
36
36
  <Expander round title="Details" priority="primary">…</Expander>
37
37
  ```
38
38
 
39
- ## Tones
39
+ ## Tone
40
40
 
41
41
  Pick a semantic `tone` to tint the header text and — on the filled
42
42
  priorities (`secondary` / `primary`) — the surface too. The set matches
@@ -6,7 +6,7 @@ self-contained (you never pass a control in) yet fully native underneath:
6
6
  focus, IME, autofill, and form submission all work, and the control is reachable
7
7
  for styling through `::part(input)`.
8
8
 
9
- ## Sizes
9
+ ## Size
10
10
 
11
11
  ```tsx
12
12
  <Input size="small" label="Small" placeholder="24px tall" />
@@ -61,6 +61,7 @@ decorative so nearby status text remains the single announcement. |
61
61
  | `max?` | number | 100 | Upper bound of the range. |
62
62
  | `size?` | number | 16 | Width and height in pixels. |
63
63
  | `speed?` | number | 0.75 | Seconds per rotation. Pass a positive number. |
64
+ | `tone?` | LoaderTone | — | Color tone for the loader. Omit it to use the standard text-3 color. |
64
65
  | `value?` | number \| false | — | Current progress value. Omit this prop, or pass `false`, for an
65
66
  indeterminate rotating gradient. |
66
67
 
@@ -39,7 +39,7 @@ const onSelect = (e, { value }) => act(value)
39
39
  </Menu>
40
40
  ```
41
41
 
42
- ## Tones
42
+ ## Tone
43
43
 
44
44
  `tone` colors an item's label, icon, and hover/selected tint (and its
45
45
  `selectionIndicator`) with a semantic palette — `brand`, `info`, `success`,
@@ -31,7 +31,7 @@ Each option can also set `className`, `style`, and `data-*`.
31
31
  `RadioGroup` forwards them to that option's `<a-radio>` so you can add
32
32
  per-option presentation and application metadata.
33
33
 
34
- ## Tones
34
+ ## Tone
35
35
 
36
36
  ```tsx
37
37
  {/* Usually one tone for the whole group: */}
@@ -80,7 +80,7 @@ for a shared custom radius. |
80
80
  | `step?` | number | 1 | Smallest keyboard and drag increment. |
81
81
  | `thumbFill?` | boolean | false | Fill the thumb with its resolved border color. This follows `thumbTone`
82
82
  and interactive states. |
83
- | `thumbSize?` | number \| string | 18 | Diameter of the thumb. Numbers use pixels; strings are CSS lengths. Keep
83
+ | `thumbSize?` | number \| string | 16 | Diameter of the thumb. Numbers use pixels; strings are CSS lengths. Keep
84
84
  it at least as large as `trackSize`. |
85
85
  | `thumbTone?` | 'neutral' \| 'brand' \| 'info' \| 'success' \| 'warning' \| 'critical' \| (string & {}) | 'neutral' | Color of the thumb stroke. Pass a named tone or a literal CSS color for a
86
86
  one-off custom tone. Omit it to keep the thumb neutral. |