@antadesign/anta 0.2.2 → 0.3.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.
Files changed (82) hide show
  1. package/README.md +14 -0
  2. package/dist/anta_helpers.d.ts +39 -1
  3. package/dist/anta_helpers.js +30 -2
  4. package/dist/components/Button.d.ts +7 -4
  5. package/dist/components/Button.js +6 -11
  6. package/dist/components/Checkbox.d.ts +97 -0
  7. package/dist/components/Checkbox.js +77 -0
  8. package/dist/components/Expander.d.ts +74 -0
  9. package/dist/components/Expander.js +53 -0
  10. package/dist/components/Input.d.ts +159 -0
  11. package/dist/components/Input.js +150 -0
  12. package/dist/components/Menu.d.ts +73 -0
  13. package/dist/components/Menu.js +42 -0
  14. package/dist/components/MenuGroup.d.ts +24 -0
  15. package/dist/components/MenuGroup.js +19 -0
  16. package/dist/components/MenuItem.d.ts +61 -0
  17. package/dist/components/MenuItem.js +50 -0
  18. package/dist/components/MenuSeparator.d.ts +14 -0
  19. package/dist/components/MenuSeparator.js +7 -0
  20. package/dist/components/Progress.d.ts +12 -6
  21. package/dist/components/Progress.js +7 -4
  22. package/dist/components/Radio.d.ts +37 -0
  23. package/dist/components/Radio.js +33 -0
  24. package/dist/components/RadioGroup.d.ts +119 -0
  25. package/dist/components/RadioGroup.js +108 -0
  26. package/dist/components/Tag.d.ts +38 -5
  27. package/dist/components/Tag.js +9 -5
  28. package/dist/components/Text.d.ts +27 -12
  29. package/dist/components/Text.js +6 -3
  30. package/dist/components/Title.d.ts +10 -1
  31. package/dist/elements/a-button.css +1 -1
  32. package/dist/elements/a-button.d.ts +56 -0
  33. package/dist/elements/a-button.js +13 -11
  34. package/dist/elements/a-checkbox.css +1 -0
  35. package/dist/elements/a-checkbox.d.ts +52 -0
  36. package/dist/elements/a-checkbox.js +130 -0
  37. package/dist/elements/a-expander.css +1 -0
  38. package/dist/elements/a-expander.d.ts +28 -0
  39. package/dist/elements/a-expander.js +237 -0
  40. package/dist/elements/a-icon.d.ts +14 -0
  41. package/dist/elements/a-icon.shapes.css +1 -1
  42. package/dist/elements/a-icon.shapes.d.ts +10 -1
  43. package/dist/elements/a-icon.shapes.js +11 -1
  44. package/dist/elements/a-input.css +1 -0
  45. package/dist/elements/a-input.d.ts +68 -0
  46. package/dist/elements/a-input.js +511 -0
  47. package/dist/elements/a-menu-group.css +1 -0
  48. package/dist/elements/a-menu-group.d.ts +13 -0
  49. package/dist/elements/a-menu-group.js +15 -0
  50. package/dist/elements/a-menu-item.css +1 -0
  51. package/dist/elements/a-menu-item.d.ts +47 -0
  52. package/dist/elements/a-menu-item.js +30 -0
  53. package/dist/elements/a-menu-separator.css +1 -0
  54. package/dist/elements/a-menu-separator.d.ts +13 -0
  55. package/dist/elements/a-menu-separator.js +15 -0
  56. package/dist/elements/a-menu.css +1 -0
  57. package/dist/elements/a-menu.d.ts +183 -0
  58. package/dist/elements/a-menu.js +763 -0
  59. package/dist/elements/a-progress.css +1 -1
  60. package/dist/elements/a-progress.d.ts +12 -0
  61. package/dist/elements/a-progress.js +1 -0
  62. package/dist/elements/a-radio-group.css +1 -0
  63. package/dist/elements/a-radio-group.d.ts +33 -0
  64. package/dist/elements/a-radio-group.js +160 -0
  65. package/dist/elements/a-radio.css +1 -0
  66. package/dist/elements/a-radio.d.ts +14 -0
  67. package/dist/elements/a-radio.js +46 -0
  68. package/dist/elements/a-tag.css +1 -1
  69. package/dist/elements/a-text.css +1 -1
  70. package/dist/elements/a-text.d.ts +42 -3
  71. package/dist/elements/a-text.js +73 -33
  72. package/dist/elements/a-tooltip.d.ts +43 -11
  73. package/dist/elements/a-tooltip.js +46 -51
  74. package/dist/elements/index.d.ts +9 -0
  75. package/dist/elements/index.js +27 -0
  76. package/dist/general_types.d.ts +468 -15
  77. package/dist/index.d.ts +16 -0
  78. package/dist/index.js +16 -0
  79. package/dist/jsx-runtime.d.ts +42 -7
  80. package/dist/jsx-runtime.js +14 -2
  81. package/dist/tokens.css +1 -1
  82. package/package.json +1 -1
@@ -0,0 +1,150 @@
1
+ import { jsx, jsxs } from "@antadesign/anta/jsx-runtime";
2
+ import { nativeStateChange, toneStyle } from "../anta_helpers";
3
+ import { Button } from "./Button";
4
+ import { Icon } from "./Icon";
5
+ const presence = (on) => on ? "" : void 0;
6
+ const isStringish = (n) => typeof n === "string" || typeof n === "number";
7
+ const attrsOf = (e) => {
8
+ const el = e?.target ?? {};
9
+ const value = el.value ?? "";
10
+ return {
11
+ value,
12
+ name: el.getAttribute?.("name") ?? void 0,
13
+ empty: !value,
14
+ valid: el.validity ? el.validity.valid : void 0,
15
+ validationMessage: el.validationMessage ?? ""
16
+ };
17
+ };
18
+ const AUTOCOMPLETE_BY_TYPE = { email: "email", tel: "tel", url: "url" };
19
+ const INPUTMODE_BY_TYPE = {
20
+ email: "email",
21
+ tel: "tel",
22
+ url: "url",
23
+ number: "numeric"
24
+ };
25
+ const STATUS_ICON = {
26
+ critical: "warning-diamond",
27
+ warning: "warning-triangle",
28
+ success: "circle-check",
29
+ info: "info",
30
+ brand: "circle-small-solid"
31
+ };
32
+ const Input = ({
33
+ label,
34
+ hint,
35
+ status,
36
+ statusIcon,
37
+ tone,
38
+ size,
39
+ value,
40
+ defaultValue,
41
+ multiline,
42
+ rows,
43
+ maxRows,
44
+ clearable,
45
+ leading,
46
+ trailing,
47
+ type,
48
+ autoComplete,
49
+ inputMode,
50
+ name,
51
+ placeholder,
52
+ disabled,
53
+ readOnly,
54
+ required,
55
+ dimActions,
56
+ spellCheck,
57
+ maxLength,
58
+ minLength,
59
+ pattern,
60
+ min,
61
+ max,
62
+ step,
63
+ onInput,
64
+ onChange,
65
+ onAnyChange,
66
+ onClearClick,
67
+ onClearInput,
68
+ children,
69
+ className,
70
+ style,
71
+ ...rest
72
+ }) => {
73
+ const statusTone = status && status !== "neutral" ? status : void 0;
74
+ const glyph = statusIcon === void 0 ? statusTone ? STATUS_ICON[statusTone] : void 0 : statusIcon;
75
+ return /* @__PURE__ */ jsxs(
76
+ "a-input",
77
+ {
78
+ size: size && size !== "medium" ? size : void 0,
79
+ value,
80
+ defaultvalue: defaultValue,
81
+ multiline: presence(multiline || rows != null),
82
+ rows: rows != null ? String(rows) : void 0,
83
+ maxrows: maxRows != null ? String(maxRows) : void 0,
84
+ status: statusTone,
85
+ tone: tone || void 0,
86
+ type: !multiline && rows == null ? type : void 0,
87
+ name,
88
+ placeholder,
89
+ disabled: presence(disabled),
90
+ readonly: presence(readOnly),
91
+ required: presence(required),
92
+ "dim-actions": presence(dimActions),
93
+ autocomplete: autoComplete ?? (!multiline && rows == null && type ? AUTOCOMPLETE_BY_TYPE[type] : void 0),
94
+ inputmode: inputMode ?? (!multiline && rows == null && type ? INPUTMODE_BY_TYPE[type] : void 0),
95
+ spellcheck: spellCheck != null ? spellCheck ? "true" : "false" : void 0,
96
+ maxlength: maxLength != null ? String(maxLength) : void 0,
97
+ minlength: minLength != null ? String(minLength) : void 0,
98
+ pattern,
99
+ min,
100
+ max,
101
+ step,
102
+ "aria-invalid": status === "critical" ? "true" : void 0,
103
+ oninput: onInput || onAnyChange ? (e) => {
104
+ onInput?.(e);
105
+ onAnyChange?.(e, attrsOf(e));
106
+ } : void 0,
107
+ onchange: onChange || onAnyChange ? (e) => {
108
+ onChange?.(e);
109
+ onAnyChange?.(e, attrsOf(e));
110
+ } : void 0,
111
+ onclearclick: onClearClick ? (e) => onClearClick(nativeStateChange(e).event) : void 0,
112
+ onclearinput: onClearInput ? (e) => onClearInput(nativeStateChange(e).event) : void 0,
113
+ class: className,
114
+ style: toneStyle(tone, "--input-tone-source", style),
115
+ ...rest,
116
+ children: [
117
+ label != null && (isStringish(label) ? /* @__PURE__ */ jsx("span", { slot: "label", children: label }) : /* @__PURE__ */ jsx("span", { slot: "label", style: { display: "contents" }, children: label })),
118
+ leading != null && /* @__PURE__ */ jsx("span", { slot: "leading", style: { display: "contents" }, children: leading }),
119
+ clearable && // A real <a-button> (light DOM → fully styled, keyboard-focusable) in
120
+ // the element's `clear` slot — the element owns its visibility (shown
121
+ // only when filled + editable). It fires the bubbling `clearrequest`
122
+ // event via a-button's global listener, so clearing works even without
123
+ // framework hydration; the element turns that into clearclick→clear().
124
+ // CONTRACT: the `data-custom-event` value below MUST match `CLEAR_TRIGGER`
125
+ // in the element (src/elements/a-input.ts). The string is duplicated, not
126
+ // shared — importing the element module here would self-register it and
127
+ // break the wrapper/element decoupling. Rename in both places.
128
+ /* @__PURE__ */ jsx("span", { slot: "clear", style: { display: "contents" }, children: /* @__PURE__ */ jsx(
129
+ Button,
130
+ {
131
+ priority: "tertiary",
132
+ size,
133
+ icon: "x",
134
+ "aria-label": "Clear",
135
+ "data-custom-event": "clearrequest"
136
+ }
137
+ ) }),
138
+ trailing != null && /* @__PURE__ */ jsx("span", { slot: "trailing", style: { display: "contents" }, children: trailing }),
139
+ hint != null && /* @__PURE__ */ jsxs("span", { slot: "hint", style: { display: "contents" }, children: [
140
+ glyph && /* @__PURE__ */ jsx(Icon, { shape: glyph, "aria-hidden": "true" }),
141
+ /* @__PURE__ */ jsx("span", { children: hint })
142
+ ] }),
143
+ children
144
+ ]
145
+ }
146
+ );
147
+ };
148
+ export {
149
+ Input
150
+ };
@@ -0,0 +1,73 @@
1
+ import type { BaseProps } from '../general_types';
2
+ export interface MenuProps extends BaseProps {
3
+ /** Preferred placement relative to the trigger. The cross-axis suffix
4
+ * (`-start` / `-end`) aligns the left / right edges; no suffix (`bottom` /
5
+ * `top`) centers the menu on the trigger. The menu auto-flips vertically and
6
+ * clamps horizontally when there isn't room.
7
+ * @defaultValue bottom-start */
8
+ placement?: 'bottom-start' | 'bottom-end' | 'top-start' | 'top-end' | 'bottom' | 'top';
9
+ /** Open on right-click (the `contextmenu` event) of the trigger region
10
+ * instead of a left click, positioned at the pointer. */
11
+ context?: boolean;
12
+ /** Open at the pointer coordinates rather than aligned to the trigger box.
13
+ * Pairs naturally with `context`; on its own it positions a left-click
14
+ * menu at the cursor. */
15
+ coord?: boolean;
16
+ /** Submenu-only (a `<Menu>` nested inside a `MenuItem`); ignored on a root
17
+ * menu. Submenus open on hover by default (with intent timing) as well as on
18
+ * click — set `nohover` to make this submenu click-only. Hover-intent is
19
+ * mouse-only regardless: on touch (and pen) a submenu always opens on tap and
20
+ * stays open until dismissed. */
21
+ nohover?: boolean;
22
+ /** Gap in pixels between the trigger and the menu.
23
+ * @defaultValue 4 */
24
+ offset?: number;
25
+ /** Controlled open state. Omit for the default **uncontrolled** menu (it
26
+ * opens/closes itself via its triggers). Pass a boolean to **control** it:
27
+ * the menu's visibility follows `open`, and user dismiss (Esc, outside-click,
28
+ * select) fires `onStateChange` *without* self-closing — you update `open`
29
+ * in response. Submenus are always uncontrolled regardless of this. See
30
+ * STATEFUL-COMPONENTS.md. */
31
+ open?: boolean;
32
+ /** Fired before the open state changes — on open, and on every dismiss (Esc,
33
+ * outside-click, scroll, selecting an item). `event` is the cancelable
34
+ * `statechange`; `detail.next`/`detail.prev` are the requested/previous open
35
+ * state (booleans). It's the declarative way to observe a menu, and the
36
+ * handler you pair with `open` to drive a controlled menu (apply
37
+ * `detail.next` to `open`). Uncontrolled, `event.preventDefault()` vetoes the
38
+ * transition (e.g. keep the menu open). */
39
+ onStateChange?: (event: CustomEvent, detail: {
40
+ next: boolean;
41
+ prev: boolean;
42
+ }) => void;
43
+ /** The menu's contents: `MenuItem`, `MenuSeparator`, `MenuGroup`, or any
44
+ * custom element. */
45
+ children?: React.ReactNode;
46
+ }
47
+ /**
48
+ * Menu — a dropdown / context menu that anchors to any target and "just
49
+ * works". Place `<Menu>` immediately after the trigger element (a button,
50
+ * say); it opens on click by default. For a whole-area right-click menu, put
51
+ * it after the region and pass `context`.
52
+ *
53
+ * Open state is uncontrolled by default — listen for `onStateChange`
54
+ * (`detail: { next, prev }`) to observe it, or pass `open` to control it. You
55
+ * can also grab a `ref` and call `.open()` / `.close()` / `.toggle()`.
56
+ * Selecting a `MenuItem` closes the menu;
57
+ * arbitrary injected content does not. Add `data-menu-open` to any item /
58
+ * container to keep it open, or `data-menu-close` to a custom element to let it
59
+ * close.
60
+ *
61
+ * Requires `@antadesign/anta/elements` to be imported (client-side only).
62
+ *
63
+ * @example Dropdown from a button
64
+ * ```tsx
65
+ * <a-button>Actions</a-button>
66
+ * <Menu>
67
+ * <MenuItem icon="edit" label="Edit" kbd="⌘E" onSelect={onEdit} />
68
+ * <MenuSeparator />
69
+ * <MenuItem tone="critical" icon="trash" label="Delete" onSelect={onDelete} />
70
+ * </Menu>
71
+ * ```
72
+ */
73
+ export declare const Menu: ({ placement, context, coord, nohover, offset, open, onStateChange, className, children, ...rest }: MenuProps) => any;
@@ -0,0 +1,42 @@
1
+ import { jsx } from "@antadesign/anta/jsx-runtime";
2
+ import { nativeStateChange } from "../anta_helpers";
3
+ const Menu = ({
4
+ placement,
5
+ context,
6
+ coord,
7
+ nohover,
8
+ offset,
9
+ open,
10
+ onStateChange,
11
+ className,
12
+ children,
13
+ ...rest
14
+ }) => {
15
+ return /* @__PURE__ */ jsx(
16
+ "a-menu",
17
+ {
18
+ placement: placement && placement !== "bottom-start" ? placement : void 0,
19
+ context: context ? "" : void 0,
20
+ coord: coord ? "" : void 0,
21
+ nohover: nohover ? "" : void 0,
22
+ offset: offset != null ? String(offset) : void 0,
23
+ state: open === void 0 ? void 0 : open ? "open" : "closed",
24
+ onstatechange: onStateChange ? (e) => {
25
+ const { event, detail } = nativeStateChange(e);
26
+ if (detail)
27
+ onStateChange(event, {
28
+ next: detail.next === "open",
29
+ prev: detail.prev === "open"
30
+ });
31
+ } : void 0,
32
+ role: "menu",
33
+ "aria-orientation": "vertical",
34
+ class: className,
35
+ ...rest,
36
+ children
37
+ }
38
+ );
39
+ };
40
+ export {
41
+ Menu
42
+ };
@@ -0,0 +1,24 @@
1
+ import type { BaseProps } from '../general_types';
2
+ export interface MenuGroupProps extends BaseProps {
3
+ /** The section heading shown above the grouped items (also the group's
4
+ * accessible name). */
5
+ label?: string;
6
+ /** The grouped `MenuItem`s. */
7
+ children?: React.ReactNode;
8
+ }
9
+ /**
10
+ * MenuGroup — a titled section that organises related `MenuItem`s. Keyboard
11
+ * navigation flattens items across groups, skipping the heading.
12
+ *
13
+ * Add `data-menu-open` to keep the menu open after any item in the group is
14
+ * chosen (it forwards to the element).
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * <MenuGroup label="Edit">
19
+ * <MenuItem icon="copy" label="Copy" />
20
+ * <MenuItem icon="cut" label="Cut" />
21
+ * </MenuGroup>
22
+ * ```
23
+ */
24
+ export declare const MenuGroup: ({ label, className, children, ...rest }: MenuGroupProps) => any;
@@ -0,0 +1,19 @@
1
+ import { jsx, jsxs } from "@antadesign/anta/jsx-runtime";
2
+ const MenuGroup = ({ label, className, children, ...rest }) => {
3
+ return /* @__PURE__ */ jsxs(
4
+ "a-menu-group",
5
+ {
6
+ role: "group",
7
+ "aria-label": label,
8
+ class: className,
9
+ ...rest,
10
+ children: [
11
+ label != null && /* @__PURE__ */ jsx("a-menu-group-label", { "aria-hidden": "true", children: label }),
12
+ children
13
+ ]
14
+ }
15
+ );
16
+ };
17
+ export {
18
+ MenuGroup
19
+ };
@@ -0,0 +1,61 @@
1
+ import type { BaseProps } from '../general_types';
2
+ import type { IconShape } from '../elements/a-icon.shapes';
3
+ export interface MenuItemProps extends BaseProps {
4
+ /** Leading icon shape. */
5
+ icon?: IconShape;
6
+ /** The item's text. Omit and pass `children` for richer content. */
7
+ label?: string;
8
+ /** A trailing keyboard-shortcut hint, e.g. `"⌘E"`. */
9
+ kbd?: string;
10
+ /** A trailing icon. On a `submenu` item this **overrides** the default
11
+ * chevron (omit it to keep the chevron); on a normal item it's the trailing
12
+ * glyph (omit for none). */
13
+ iconTrailing?: IconShape;
14
+ /** Disable the item: greyed out, not focusable for activation, no close. */
15
+ disabled?: boolean;
16
+ /** Semantic tone — colors the label, icon, and hover tint. `critical` is the
17
+ * destructive action; `neutral` (the default) is the standard gray.
18
+ * @defaultValue neutral */
19
+ tone?: 'neutral' | 'brand' | 'info' | 'success' | 'warning' | 'critical';
20
+ /** Marks this item as a submenu parent: adds the trailing chevron,
21
+ * `aria-haspopup="menu"`, and an `aria-expanded` baseline (kept in sync by
22
+ * the nested menu). Nest the flyout as a `<Menu>` child. */
23
+ submenu?: boolean;
24
+ /** An opaque value identifying this item, handed back in `onSelect`'s detail
25
+ * so a shared handler can tell which row was chosen without a per-item
26
+ * closure. */
27
+ value?: string | number;
28
+ /** Activation handler — fires when *this* item is chosen (click / Enter /
29
+ * Space), unless it's `disabled`. It does **not** fire for a submenu parent
30
+ * (clicking that opens the flyout, which isn't a selection) nor for a
31
+ * selection bubbling up from a nested submenu. Receives the event plus a
32
+ * `{ value, label }` detail. */
33
+ onSelect?: (event: any, detail: {
34
+ value?: string | number;
35
+ label?: string;
36
+ }) => void;
37
+ /** Item content. With `label` set, children are extra content — most
38
+ * notably the nested `<Menu>` for a submenu parent. */
39
+ children?: React.ReactNode;
40
+ }
41
+ /**
42
+ * MenuItem — a single selectable row inside a `Menu`. Composes a leading
43
+ * `icon`, a `label` (or `children`), an optional trailing `kbd` hint, and an
44
+ * optional trailing icon. For a submenu, set `submenu` and nest a
45
+ * `<Menu>` as a child — a chevron is added automatically.
46
+ *
47
+ * Selecting an item closes the menu; add `data-menu-open` to keep it open
48
+ * (toggles / multi-select) — it forwards to the element.
49
+ *
50
+ * @example
51
+ * ```tsx
52
+ * <MenuItem icon="copy" label="Duplicate" kbd="⌘D" onSelect={dup} />
53
+ * <MenuItem label="Word wrap" data-menu-open onSelect={toggleWrap} />
54
+ * <MenuItem label="Share" submenu>
55
+ * <Menu>
56
+ * <MenuItem label="Copy link" onSelect={copyLink} />
57
+ * </Menu>
58
+ * </MenuItem>
59
+ * ```
60
+ */
61
+ export declare const MenuItem: ({ icon, label, kbd, iconTrailing, disabled, tone, submenu, value, onSelect, className, children, ...rest }: MenuItemProps) => any;
@@ -0,0 +1,50 @@
1
+ import { jsx, jsxs } from "@antadesign/anta/jsx-runtime";
2
+ const MenuItem = ({
3
+ icon,
4
+ label,
5
+ kbd,
6
+ iconTrailing,
7
+ disabled,
8
+ tone,
9
+ submenu,
10
+ value,
11
+ onSelect,
12
+ className,
13
+ children,
14
+ ...rest
15
+ }) => {
16
+ return /* @__PURE__ */ jsxs(
17
+ "a-menu-item",
18
+ {
19
+ role: "menuitem",
20
+ tabIndex: 0,
21
+ disabled: disabled ? "" : void 0,
22
+ tone: tone && tone !== "neutral" ? tone : void 0,
23
+ submenu: submenu ? "" : void 0,
24
+ "aria-haspopup": submenu ? "menu" : void 0,
25
+ "aria-expanded": submenu ? "false" : void 0,
26
+ "aria-disabled": disabled ? "true" : void 0,
27
+ onClick: disabled || !onSelect ? void 0 : (e) => {
28
+ if (submenu) return;
29
+ const t = e.target;
30
+ if (t?.closest?.("a-menu-item") !== e.currentTarget) return;
31
+ onSelect(e, { value, label });
32
+ },
33
+ class: className,
34
+ ...rest,
35
+ children: [
36
+ icon && /* @__PURE__ */ jsx("a-icon", { shape: icon, "aria-hidden": "true" }),
37
+ label != null && /* @__PURE__ */ jsx("a-menu-item-label", { children: label }),
38
+ kbd && /* @__PURE__ */ jsx("kbd", { children: kbd }),
39
+ /* @__PURE__ */ (() => {
40
+ const trailing = submenu ? iconTrailing ?? "chevron-right" : iconTrailing;
41
+ return trailing ? /* @__PURE__ */ jsx("a-icon", { shape: trailing, "aria-hidden": "true" }) : null;
42
+ })(),
43
+ children
44
+ ]
45
+ }
46
+ );
47
+ };
48
+ export {
49
+ MenuItem
50
+ };
@@ -0,0 +1,14 @@
1
+ import type { BaseProps } from '../general_types';
2
+ export interface MenuSeparatorProps extends BaseProps {
3
+ }
4
+ /**
5
+ * MenuSeparator — a thin divider between groups of `MenuItem`s.
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * <MenuItem label="Edit" />
10
+ * <MenuSeparator />
11
+ * <MenuItem tone="critical" label="Delete" />
12
+ * ```
13
+ */
14
+ export declare const MenuSeparator: ({ className, ...rest }: MenuSeparatorProps) => any;
@@ -0,0 +1,7 @@
1
+ import { jsx } from "@antadesign/anta/jsx-runtime";
2
+ const MenuSeparator = ({ className, ...rest }) => {
3
+ return /* @__PURE__ */ jsx("a-menu-separator", { role: "separator", class: className, ...rest });
4
+ };
5
+ export {
6
+ MenuSeparator
7
+ };
@@ -5,12 +5,18 @@ export interface ProgressProps extends BaseProps {
5
5
  /** Upper bound of the range.
6
6
  * @defaultValue 100 */
7
7
  max?: number;
8
- /** Color variant. `'info'` applies a blue tint.
9
- * @defaultValue neutral */
10
- tone?: 'neutral' | 'info';
11
- /** Text label displayed after the percentage. */
8
+ /** Colour variant, or any literal CSS colour for a one-off custom tone (the
9
+ * surface / indicator / text are derived from it in oklch). Named tones track
10
+ * light/dark automatically.
11
+ * @defaultValue 'neutral' */
12
+ tone?: 'neutral' | 'brand' | 'info' | 'success' | 'warning' | 'critical' | (string & {});
13
+ /** Text label displayed after the percentage. When you provide custom
14
+ * `children` (which replace the default label row), `label` is no longer
15
+ * rendered — but it still supplies the progressbar's accessible name, so
16
+ * pass it for screen readers to announce more than the bare percentage. */
12
17
  label?: string;
13
- /** Right-aligned hint text (e.g. "3 of 7"). */
18
+ /** Right-aligned hint text (e.g. "3 of 7"). Like `label`, it's not rendered
19
+ * when custom `children` are provided but still feeds the accessible name. */
14
20
  hint?: string;
15
21
  }
16
22
  /**
@@ -40,4 +46,4 @@ export interface ProgressProps extends BaseProps {
40
46
  * <Progress value={75} tone="info" label="Processing" />
41
47
  * ```
42
48
  */
43
- export declare const Progress: ({ value, max, tone, label, hint, className, children, ...rest }: ProgressProps) => any;
49
+ export declare const Progress: ({ value, max, tone, label, hint, className, style, children, ...rest }: ProgressProps) => any;
@@ -1,19 +1,22 @@
1
1
  import { jsx, jsxs } from "@antadesign/anta/jsx-runtime";
2
- import { hasChildren } from "../anta_helpers";
3
- const Progress = ({ value, max = 100, tone, label, hint, className, children, ...rest }) => {
2
+ import { hasChildren, toneStyle } from "../anta_helpers";
3
+ const Progress = ({ value, max = 100, tone, label, hint, className, style, children, ...rest }) => {
4
4
  const percent = max > 0 ? Math.round(Math.min(100, Math.max(0, value / max * 100))) : 0;
5
+ const clampedValue = max > 0 ? Math.min(max, Math.max(0, value)) : 0;
5
6
  const ariaLabel = [label, `${percent}%`, hint].filter(Boolean).join(" \xB7 ") || void 0;
6
7
  return /* @__PURE__ */ jsx(
7
8
  "a-progress",
8
9
  {
9
10
  value,
10
11
  max,
11
- tone,
12
+ tone: tone && tone !== "neutral" ? tone : void 0,
12
13
  role: "progressbar",
13
- "aria-valuenow": value,
14
+ "aria-valuenow": clampedValue,
15
+ "aria-valuemin": 0,
14
16
  "aria-valuemax": max,
15
17
  "aria-label": ariaLabel,
16
18
  class: className,
19
+ style: toneStyle(tone, "--progress-tone-source", style),
17
20
  ...rest,
18
21
  children: hasChildren(children) ? children : /* @__PURE__ */ jsxs("a-progress-label", { children: [
19
22
  /* @__PURE__ */ jsxs("a-progress-number", { children: [
@@ -0,0 +1,37 @@
1
+ import type { BaseProps } from "../general_types";
2
+ /** Public props for a single `<Radio>` option. */
3
+ export interface RadioProps extends BaseProps {
4
+ /** This option's value — its identity within the group and the value
5
+ * submitted when it's selected. */
6
+ value: string;
7
+ /** Disable just this option. */
8
+ disabled?: boolean;
9
+ /** Semantic tone, or any literal CSS color (`'#ff1493'`, `'rebeccapurple'`)
10
+ * for a one-off custom tone. Named tones track light/dark mode automatically;
11
+ * a custom colour keeps its hue + chroma and pins lightness to the brand
12
+ * fill curve. Defaults to the group's tone (or `brand`).
13
+ * @defaultValue 'brand' */
14
+ tone?: "brand" | "neutral" | "info" | "success" | "warning" | "critical" | (string & {});
15
+ /** Size variant. Defaults to the group's size (or `medium`); set it here to
16
+ * override a single option.
17
+ * @defaultValue 'medium' */
18
+ size?: "small" | "medium" | "large";
19
+ /** The label. Plain text, or any nodes (e.g. text + an info `<Icon>`). */
20
+ children?: React.ReactNode;
21
+ }
22
+ /**
23
+ * `<Radio>` — one option in a `<RadioGroup>`.
24
+ *
25
+ * A pure, stateless pass-through to `<a-radio>`: selection, keyboard, roving
26
+ * tabindex, and form value are all owned by the enclosing `<a-radio-group>`
27
+ * (see `<RadioGroup>`), so this wrapper only maps props to attributes and
28
+ * projects the label. Renders nothing interactive on its own — use it inside a
29
+ * `<RadioGroup>`.
30
+ *
31
+ * `role="radio"` and `aria-disabled` are set here. `aria-checked` is **not** —
32
+ * `<a-radio>` publishes it through `ElementInternals` (off the DOM), driven by
33
+ * the `selected` property the enclosing `<RadioGroup>` sets.
34
+ *
35
+ * Requires `@antadesign/anta/elements` to be imported (client-side only).
36
+ */
37
+ export declare const Radio: ({ value, disabled, tone, size, className, style, children, ...rest }: RadioProps) => any;
@@ -0,0 +1,33 @@
1
+ import { jsx } from "@antadesign/anta/jsx-runtime";
2
+ const NAMED_TONES = /* @__PURE__ */ new Set(["brand", "neutral", "info", "success", "warning", "critical"]);
3
+ const Radio = ({
4
+ value,
5
+ disabled,
6
+ tone,
7
+ size,
8
+ className,
9
+ style,
10
+ children,
11
+ ...rest
12
+ }) => {
13
+ const isCustomTone = tone != null && !NAMED_TONES.has(tone);
14
+ const computedStyle = isCustomTone ? { ...style, ["--radio-tone-source"]: tone } : style;
15
+ return /* @__PURE__ */ jsx(
16
+ "a-radio",
17
+ {
18
+ role: "radio",
19
+ "aria-disabled": disabled ? "true" : void 0,
20
+ ...rest,
21
+ value,
22
+ tone: tone && tone !== "brand" ? tone : void 0,
23
+ size: size && size !== "medium" ? size : void 0,
24
+ disabled: disabled ? "" : void 0,
25
+ class: className,
26
+ style: computedStyle,
27
+ children
28
+ }
29
+ );
30
+ };
31
+ export {
32
+ Radio
33
+ };