@antadesign/anta 0.3.24 → 0.3.26

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 (93) hide show
  1. package/dist/anta_helpers.js +3 -3
  2. package/dist/box-types.d.ts +161 -0
  3. package/dist/box-types.js +0 -0
  4. package/dist/bundle.css +1 -1
  5. package/dist/bundle.js +26 -25
  6. package/dist/components/Banner.d.ts +10 -10
  7. package/dist/components/Banner.js +3 -1
  8. package/dist/components/Box.d.ts +37 -0
  9. package/dist/components/Box.js +63 -0
  10. package/dist/components/Breadcrumbs.css +1 -1
  11. package/dist/components/ButtonCopy.d.ts +2 -2
  12. package/dist/components/InputDate.css +1 -1
  13. package/dist/components/MenuItem.d.ts +5 -1
  14. package/dist/components/MenuItem.js +72 -2
  15. package/dist/components/MenuItemCopy.d.ts +2 -2
  16. package/dist/components/Steps.css +1 -1
  17. package/dist/components/copy-props.d.ts +3 -4
  18. package/dist/components/select-parts.css +1 -1
  19. package/dist/elements/a-avatar.css +1 -1
  20. package/dist/elements/a-banner.css +1 -1
  21. package/dist/elements/a-banner.js +16 -4
  22. package/dist/elements/a-box.css +1 -0
  23. package/dist/elements/a-box.d.ts +41 -0
  24. package/dist/elements/a-box.js +576 -0
  25. package/dist/elements/a-button.css +1 -1
  26. package/dist/elements/a-calendar.css +1 -1
  27. package/dist/elements/a-calendar.js +2 -2
  28. package/dist/elements/a-card.css +1 -1
  29. package/dist/elements/a-checkbox.css +1 -1
  30. package/dist/elements/a-copy.css +1 -1
  31. package/dist/elements/a-dialog.css +1 -1
  32. package/dist/elements/a-expander.css +1 -1
  33. package/dist/elements/a-expander.js +2 -2
  34. package/dist/elements/a-icon.css +1 -1
  35. package/dist/elements/a-icon.shapes.css +1 -1
  36. package/dist/elements/a-input-time.css +1 -1
  37. package/dist/elements/a-input-time.js +3 -3
  38. package/dist/elements/a-input.css +1 -1
  39. package/dist/elements/a-input.js +14 -6
  40. package/dist/elements/a-loader.css +1 -1
  41. package/dist/elements/a-menu-group.css +1 -1
  42. package/dist/elements/a-menu-item.css +1 -1
  43. package/dist/elements/a-menu-item.js +3 -3
  44. package/dist/elements/a-menu-separator.css +1 -1
  45. package/dist/elements/a-menu.css +1 -1
  46. package/dist/elements/a-menu.d.ts +4 -4
  47. package/dist/elements/a-menu.js +8 -6
  48. package/dist/elements/a-progress.css +1 -1
  49. package/dist/elements/a-radio-group.css +1 -1
  50. package/dist/elements/a-radio-group.js +3 -3
  51. package/dist/elements/a-radio.css +1 -1
  52. package/dist/elements/a-slider.css +1 -1
  53. package/dist/elements/a-switch.css +1 -1
  54. package/dist/elements/a-switch.js +2 -2
  55. package/dist/elements/a-tab.css +1 -1
  56. package/dist/elements/a-tabpanel.css +1 -1
  57. package/dist/elements/a-tabpanel.js +2 -2
  58. package/dist/elements/a-tabs.css +1 -1
  59. package/dist/elements/a-tabs.js +6 -6
  60. package/dist/elements/a-tag.css +1 -1
  61. package/dist/elements/a-text.css +1 -1
  62. package/dist/elements/a-title.css +1 -1
  63. package/dist/elements/a-toast.css +1 -1
  64. package/dist/elements/a-toast.js +2 -2
  65. package/dist/elements/a-toaster.css +1 -1
  66. package/dist/elements/a-tooltip.css +1 -1
  67. package/dist/elements/a-tooltip.d.ts +4 -3
  68. package/dist/elements/a-tooltip.js +9 -5
  69. package/dist/elements/copy-behavior.d.ts +13 -15
  70. package/dist/elements/index.d.ts +1 -0
  71. package/dist/elements/index.js +3 -0
  72. package/dist/general_types.d.ts +42 -4
  73. package/dist/generate-icons.mjs +3 -3
  74. package/dist/index.d.ts +3 -0
  75. package/dist/index.js +2 -0
  76. package/dist/jsx-runtime.d.ts +2 -1
  77. package/dist/reset.css +1 -1
  78. package/dist/theme-anta.css +1 -1
  79. package/dist/tokens.css +1 -1
  80. package/docs/changelog.md +42 -1
  81. package/docs/components/avatar.md +368 -0
  82. package/docs/components/banner.md +26 -15
  83. package/docs/components/box.md +282 -0
  84. package/docs/components/breadcrumbs.md +2 -2
  85. package/docs/components/button.md +26 -15
  86. package/docs/components/input.md +5 -0
  87. package/docs/components/menu.md +14 -11
  88. package/docs/components/tag.md +47 -0
  89. package/docs/index.md +4 -3
  90. package/docs/install-config.md +58 -13
  91. package/docs/normalization.md +37 -28
  92. package/docs/theming.md +4 -1
  93. package/package.json +2 -2
@@ -1,9 +1,8 @@
1
1
  import type { BaseProps } from "../general_types";
2
- /** Public props for the `<Banner>` message strip. `message` is the leading
3
- * content, `children` sit between it and `actions`, all centered in one row. */
2
+ /** Props for the `<Banner>` message strip. `message` leads, `children` precede
3
+ * `actions`, and `align` places the row. */
4
4
  export interface BannerProps extends BaseProps {
5
- /** Leading message — a string (rendered at the banner type scale) or any node.
6
- * Centered in the bar, followed by `children` and then `actions`. */
5
+ /** Leading message: a string at the banner type scale or any node. */
7
6
  message?: React.ReactNode;
8
7
  /** Trailing controls (buttons, links) rendered as a compact row after the
9
8
  * message and `children`. */
@@ -16,6 +15,10 @@ export interface BannerProps extends BaseProps {
16
15
  * lightness/chroma are pinned. `'neutral'` (the default) is the same as omitting it.
17
16
  * @defaultValue 'neutral' */
18
17
  tone?: "neutral" | "brand" | "info" | "success" | "warning" | "critical" | (string & {});
18
+ /** Positions the content row. `'start'` aligns it to the inline edge; `'center'`
19
+ * centers it. Wrapped message text follows the selected alignment.
20
+ * @defaultValue 'start' */
21
+ align?: "start" | "center";
19
22
  /** Rounded corners for a standalone, floating banner (`border-radius: 999px`,
20
23
  * which clamps to a stadium) instead of the edge-to-edge strip. Still borderless
21
24
  * by default. Pass a `number` (px) or a CSS length string for a custom radius. */
@@ -45,11 +48,8 @@ export interface BannerProps extends BaseProps {
45
48
  onDismiss?: () => void;
46
49
  }
47
50
  /**
48
- * `<Banner>` — a full-width, dismissible message strip with a bottom border.
49
- *
50
- * A close cousin of `<Card>` with a small, centered horizontal payload:
51
- * `message` leads, `children` sit in the middle, `actions` trail, and (when
52
- * `closable`) a 40px-wide, full-height ✕ fills the right edge without shifting the centered group.
51
+ * `<Banner>` — a full-width, dismissible message strip. `message`, `children`, and
52
+ * `actions` form a row at the inline start by default; `align="center"` centers it.
53
53
  *
54
54
  * A pure, stateless pass-through to `<a-banner>`: the element owns dismissal and
55
55
  * visibility, so the wrapper holds no state and grabs no ref — it maps props to
@@ -76,4 +76,4 @@ export interface BannerProps extends BaseProps {
76
76
  * <Banner message="Saved." dismissed={hidden} onDismiss={() => setHidden(true)} />
77
77
  * ```
78
78
  */
79
- export declare const Banner: ({ message, actions, tone, round, closable, role, dismissed, defaultDismissed, onDismiss, className, style, children, ...rest }: BannerProps) => any;
79
+ export declare const Banner: ({ message, actions, tone, align, round, closable, role, dismissed, defaultDismissed, onDismiss, className, style, children, ...rest }: BannerProps) => any;
@@ -5,6 +5,7 @@ const Banner = ({
5
5
  message,
6
6
  actions,
7
7
  tone,
8
+ align,
8
9
  round,
9
10
  closable,
10
11
  role = "status",
@@ -29,6 +30,7 @@ const Banner = ({
29
30
  state: controlled ? dismissed ? "closed" : "open" : void 0,
30
31
  "default-state": !controlled ? defaultDismissed ? "closed" : "open" : void 0,
31
32
  tone: tone && tone !== "neutral" ? tone : void 0,
33
+ align: align === "center" ? "center" : void 0,
32
34
  round: roundAttr(round),
33
35
  role,
34
36
  onstatechange: onDismiss ? (e) => {
@@ -41,7 +43,7 @@ const Banner = ({
41
43
  children: [
42
44
  messageNode,
43
45
  children,
44
- actions != null && /* @__PURE__ */ jsx("span", { slot: "actions", style: { display: "contents" }, children: actions }),
46
+ actions != null && /* @__PURE__ */ jsx("span", { "data-anta-banner-actions-wrapper": "", slot: "actions", style: { display: "contents" }, children: actions }),
45
47
  closable !== false && // A real <a-button> (light DOM → fully styled, keyboard-focusable) in the
46
48
  // element's `close` slot. It fires the bubbling `dismissrequest` event via
47
49
  // a-button's global listener, so dismissing works even without framework
@@ -0,0 +1,37 @@
1
+ import type { BoxContextChange, BoxDisplay, BoxMeasurementChange } from '../box-types';
2
+ import type { BaseProps } from '../general_types';
3
+ /** JSX props for the observing light-DOM `<a-box>` container. */
4
+ export interface BoxProps extends BaseProps {
5
+ /** Layout model for the host. All other layout, sizing, mask, and shadow
6
+ * properties stay ordinary `className` / `style` CSS on the Box itself.
7
+ * @defaultValue block */
8
+ display?: BoxDisplay;
9
+ /** Fully-round corners (`border-radius: 999px`, clamped to the box). Pass a
10
+ * `number` (px) or a CSS length string (`'1rem'`) for a custom radius. Omit
11
+ * for square corners. */
12
+ round?: boolean | number | string;
13
+ /** Gap between children, matching the CSS `gap` property. A `number` is
14
+ * pixels; a string is any CSS length or two-value gap (`'1rem'`,
15
+ * `'8px 16px'`). Applies while the Box is a flex or grid container. */
16
+ gap?: number | string;
17
+ /** What the Box watches, when a handler is not what turns it on. `'size'`
18
+ * keeps the overflow CSS states (`:state(clipped-x)`, `:state(scrollable-y)`,
19
+ * …) current — reach for it when your own CSS is the only reader. `'context'`
20
+ * and `'all'` are there for symmetry; passing `onMeasureChange` or
21
+ * `onContextChange` already turns the matching half on. */
22
+ observe?: 'size' | 'context' | 'all';
23
+ /** Fades out every edge that currently hides clipped content, and drops the
24
+ * fade from an edge once the reader scrolls to it. */
25
+ fade?: boolean;
26
+ /** Depth of the `fade` gradient. A `number` is pixels; a string is any CSS
27
+ * length.
28
+ * @defaultValue 24 */
29
+ fadeSize?: number | string;
30
+ /** Fired after Box geometry or its content-overflow state changes. `detail`
31
+ * contains the changed fields and a full current snapshot. */
32
+ onMeasureChange?: (event: CustomEvent<BoxMeasurementChange>, detail: BoxMeasurementChange) => void;
33
+ /** Fired after Box's browser and local rendering context changes. `detail`
34
+ * contains the changed fields and a full current snapshot. */
35
+ onContextChange?: (event: CustomEvent<BoxContextChange>, detail: BoxContextChange) => void;
36
+ }
37
+ export declare const Box: ({ display, round, gap, observe, fade, fadeSize, onMeasureChange, onContextChange, className, style, children, ...rest }: BoxProps) => any;
@@ -0,0 +1,63 @@
1
+ import { jsx } from "@antadesign/anta/jsx-runtime";
2
+ import {
3
+ cssLength,
4
+ lengthStyle,
5
+ nativeStateChange,
6
+ roundAttr,
7
+ roundStyle
8
+ } from "../anta_helpers";
9
+ function observeAttr(observe, onMeasureChange, onContextChange) {
10
+ const size = observe === "size" || observe === "all" || onMeasureChange != null;
11
+ const context = observe === "context" || observe === "all" || onContextChange != null;
12
+ if (size && context) return "all";
13
+ if (size) return "size";
14
+ if (context) return "context";
15
+ return void 0;
16
+ }
17
+ const Box = ({
18
+ display,
19
+ round,
20
+ gap,
21
+ observe,
22
+ fade,
23
+ fadeSize,
24
+ onMeasureChange,
25
+ onContextChange,
26
+ className,
27
+ style,
28
+ children,
29
+ ...rest
30
+ }) => {
31
+ const measureHandler = onMeasureChange ? (input) => {
32
+ const { event, detail } = nativeStateChange(input);
33
+ if (detail) onMeasureChange(event, detail);
34
+ } : void 0;
35
+ const contextHandler = onContextChange ? (input) => {
36
+ const { event, detail } = nativeStateChange(input);
37
+ if (detail) onContextChange(event, detail);
38
+ } : void 0;
39
+ return /* @__PURE__ */ jsx(
40
+ "a-box",
41
+ {
42
+ display: display === "block" ? void 0 : display,
43
+ round: roundAttr(round),
44
+ gap: gap != null ? "" : void 0,
45
+ observe: observeAttr(observe, onMeasureChange, onContextChange),
46
+ fade: fade ? "" : void 0,
47
+ "fade-size": fade && fadeSize != null ? cssLength(fadeSize) : void 0,
48
+ onmeasurechange: measureHandler,
49
+ oncontextchange: contextHandler,
50
+ class: className,
51
+ style: lengthStyle(
52
+ fade ? fadeSize : void 0,
53
+ "--box-fade-size",
54
+ lengthStyle(gap, "--box-gap", roundStyle(round, "--box-round", style))
55
+ ),
56
+ ...rest,
57
+ children
58
+ }
59
+ );
60
+ };
61
+ export {
62
+ Box
63
+ };
@@ -1 +1 @@
1
- @layer anta{a-breadcrumbs{--breadcrumb-gap: 1px;--breadcrumb-separator-color: var(--text-5);--breadcrumb-separator-icon-size: 16px;--breadcrumb-separator-font-size: 15px;display:flex;align-items:center;gap:var(--breadcrumb-gap);width:max-content;min-width:100%;max-width:100%;overflow-x:auto}a-breadcrumbs[data-size=small]{--breadcrumb-separator-icon-size: 14px;--breadcrumb-separator-font-size: 13px}a-breadcrumbs[data-size=large]{--breadcrumb-separator-icon-size: 18px;--breadcrumb-separator-font-size: 17px}a-breadcrumbs[data-paddingless]{--breadcrumb-gap: .75ch}a-breadcrumbs[data-separator-icon]{--breadcrumb-gap: 0}a-breadcrumbs>*{flex:none}a-breadcrumb-separator{display:inline-flex;flex:none;align-items:center;justify-content:center;color:var(--breadcrumb-separator-color);font-family:var(--sans-serif);font-size:var(--breadcrumb-separator-font-size);line-height:1;user-select:none}a-breadcrumb-separator>a-icon{--icon-size: var(--breadcrumb-separator-icon-size)}}
1
+ @layer anta.components{a-breadcrumbs{--breadcrumb-gap: 1px;--breadcrumb-separator-color: var(--text-5);--breadcrumb-separator-icon-size: 16px;--breadcrumb-separator-font-size: 15px;display:flex;align-items:center;gap:var(--breadcrumb-gap);width:max-content;min-width:100%;max-width:100%;overflow-x:auto}a-breadcrumbs[data-size=small]{--breadcrumb-separator-icon-size: 14px;--breadcrumb-separator-font-size: 13px}a-breadcrumbs[data-size=large]{--breadcrumb-separator-icon-size: 18px;--breadcrumb-separator-font-size: 17px}a-breadcrumbs[data-paddingless]{--breadcrumb-gap: .75ch}a-breadcrumbs[data-separator-icon]{--breadcrumb-gap: 0}a-breadcrumbs>*{flex:none}a-breadcrumb-separator{display:inline-flex;flex:none;align-items:center;justify-content:center;color:var(--breadcrumb-separator-color);font-family:var(--sans-serif);font-size:var(--breadcrumb-separator-font-size);line-height:1;user-select:none}a-breadcrumb-separator>a-icon{--icon-size: var(--breadcrumb-separator-icon-size)}}
@@ -32,8 +32,8 @@ export type ButtonCopyProps = ButtonProps & {
32
32
  /**
33
33
  * Copy button — a `Button` preset for copy-to-clipboard. Set `copy` for a literal
34
34
  * string, `copyNode` to copy a DOM region, or `copyUrl` to copy the current page
35
- * URL. For content computed on demand, keep `copy` reactive and refresh it in
36
- * `onCopyRequest` (fired on pointerdown / keydown).
35
+ * URL. For dynamic text, pass a controlled `copy` string and set it in
36
+ * `onCopyRequest` before activation.
37
37
  *
38
38
  * It composes a plain `<Button>` with a slotted `<a-copy>` child that performs
39
39
  * the write — the button itself carries no copy behavior. This wrapper flips the
@@ -1 +1 @@
1
- @layer anta{a-input-date-time-container{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:6px;padding-top:8px;border-top:1px solid var(--border-3)}}
1
+ @layer anta.components{a-input-date-time-container{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:6px;padding-top:8px;border-top:1px solid var(--border-3)}}
@@ -12,7 +12,11 @@ export interface MenuItemCommonProps extends BaseProps {
12
12
  * option `hint`. Requires `label` (it stacks in a column beneath it). Muted
13
13
  * (`--text-3`) and tracks the row's `tone`. A string, or any node. */
14
14
  hint?: React.ReactNode;
15
- /** A trailing keyboard-shortcut hint, e.g. `"⌘E"`. */
15
+ /** Trailing shortcut hint, e.g. `"⌘E"`. Anta translates it to
16
+ * `aria-keyshortcuts` and hides the visual glyphs from assistive technology.
17
+ * Use `+` within a chord and spaces between shortcuts (`"⌘K ⌘S"` becomes
18
+ * `"Meta+K Meta+S"`). Pass `aria-keyshortcuts` to override the translation.
19
+ * This does not bind the shortcut. */
16
20
  kbd?: string;
17
21
  /** A trailing icon. On a `submenu` item this **overrides** the default
18
22
  * chevron (omit it to keep the chevron); on a normal item it's the trailing
@@ -1,5 +1,70 @@
1
1
  import { jsx, jsxs } from "@antadesign/anta/jsx-runtime";
2
2
  import { toneStyle } from "../anta_helpers";
3
+ const SHORTCUT_KEYS = {
4
+ "\u2318": "Meta",
5
+ cmd: "Meta",
6
+ command: "Meta",
7
+ win: "Meta",
8
+ super: "Meta",
9
+ "\u2303": "Control",
10
+ ctrl: "Control",
11
+ control: "Control",
12
+ "\u2325": "Alt",
13
+ alt: "Alt",
14
+ opt: "Alt",
15
+ option: "Alt",
16
+ "\u21E7": "Shift",
17
+ shift: "Shift",
18
+ "\u21B5": "Enter",
19
+ "\u23CE": "Enter",
20
+ enter: "Enter",
21
+ return: "Enter",
22
+ "\u232B": "Backspace",
23
+ backspace: "Backspace",
24
+ "\u2326": "Delete",
25
+ del: "Delete",
26
+ delete: "Delete",
27
+ "\u238B": "Escape",
28
+ esc: "Escape",
29
+ escape: "Escape",
30
+ "\u21E5": "Tab",
31
+ tab: "Tab",
32
+ "\u2423": "Space",
33
+ space: "Space",
34
+ "\u2191": "ArrowUp",
35
+ "\u2193": "ArrowDown",
36
+ "\u2190": "ArrowLeft",
37
+ "\u2192": "ArrowRight",
38
+ "\u21DE": "PageUp",
39
+ "\u21DF": "PageDown",
40
+ "\u2196": "Home",
41
+ "\u2198": "End"
42
+ };
43
+ function shortcutChordLabel(kbd) {
44
+ const parts = [];
45
+ let word = "";
46
+ const flush = () => {
47
+ if (!word) return;
48
+ parts.push(SHORTCUT_KEYS[word.toLowerCase()] ?? (word.length === 1 ? word.toUpperCase() : word));
49
+ word = "";
50
+ };
51
+ for (const char of kbd) {
52
+ if (SHORTCUT_KEYS[char]) {
53
+ flush();
54
+ parts.push(SHORTCUT_KEYS[char]);
55
+ } else if (char === "+") {
56
+ flush();
57
+ } else {
58
+ word += char;
59
+ }
60
+ }
61
+ flush();
62
+ return parts.length ? parts.join("+") : void 0;
63
+ }
64
+ function shortcutLabel(kbd) {
65
+ const shortcuts = kbd.trim().replace(/\s*\+\s*/g, "+").split(/\s+/).map(shortcutChordLabel).filter((shortcut) => shortcut !== void 0);
66
+ return shortcuts.length ? shortcuts.join(" ") : void 0;
67
+ }
3
68
  const MenuItem = ({
4
69
  icon,
5
70
  label,
@@ -34,6 +99,9 @@ const MenuItem = ({
34
99
  const keepTint = selected && (selectionIndicator === void 0 || selectionIndicator === "check");
35
100
  const effectiveTone = selected && toneSelected || tone;
36
101
  const toneAttr = effectiveTone && effectiveTone !== "neutral" ? effectiveTone : void 0;
102
+ const declaredShortcuts = rest["aria-keyshortcuts"];
103
+ const keyShortcuts = kbd ? shortcutLabel(kbd) : void 0;
104
+ const kbdNode = kbd ? /* @__PURE__ */ jsx("kbd", { "aria-hidden": declaredShortcuts ?? keyShortcuts ? "true" : void 0, children: kbd }) : null;
37
105
  const labelNode = label != null && (hint != null ? /* @__PURE__ */ jsxs("a-menu-item-text", { children: [
38
106
  /* @__PURE__ */ jsx("a-menu-item-label", { children: label }),
39
107
  /* @__PURE__ */ jsx("a-menu-item-hint", { children: hint })
@@ -50,6 +118,7 @@ const MenuItem = ({
50
118
  tabIndex: disabled ? -1 : 0,
51
119
  "aria-disabled": disabled ? "true" : void 0,
52
120
  "aria-current": selected ? "true" : void 0,
121
+ "aria-keyshortcuts": keyShortcuts,
53
122
  tone: toneAttr,
54
123
  style: toneStyle(effectiveTone, "--menu-item-tone-source", style),
55
124
  onClick: onSelect && !disabled ? (e) => onSelect(e, { value, label }) : void 0,
@@ -59,7 +128,7 @@ const MenuItem = ({
59
128
  icon && /* @__PURE__ */ jsx("a-icon", { shape: icon, "aria-hidden": "true" }),
60
129
  labelNode,
61
130
  children,
62
- kbd && /* @__PURE__ */ jsx("kbd", { children: kbd }),
131
+ kbdNode,
63
132
  iconTrailing && /* @__PURE__ */ jsx("a-icon", { shape: iconTrailing, "aria-hidden": "true" })
64
133
  ] });
65
134
  }
@@ -76,6 +145,7 @@ const MenuItem = ({
76
145
  submenu: submenu ? "" : void 0,
77
146
  "aria-haspopup": submenu ? "menu" : void 0,
78
147
  "aria-disabled": disabled ? "true" : void 0,
148
+ "aria-keyshortcuts": keyShortcuts,
79
149
  onmenuselect: onSelect ? (e) => onSelect(e, { value, label }) : void 0,
80
150
  class: className,
81
151
  ...rest,
@@ -120,7 +190,7 @@ const MenuItem = ({
120
190
  leadingIcon && /* @__PURE__ */ jsx("a-icon", { shape: leadingIcon, "aria-hidden": "true" }),
121
191
  labelNode,
122
192
  children,
123
- kbd && /* @__PURE__ */ jsx("kbd", { children: kbd }),
193
+ kbdNode,
124
194
  (() => {
125
195
  let trailing = submenu ? iconTrailing ?? "chevron-right" : iconTrailing;
126
196
  if (!submenu && !iconTrailing && selectionIndicator === "check" && indicator == null)
@@ -25,8 +25,8 @@ export type MenuItemCopyProps = MenuItemCommonProps & MenuItemActionMode & {
25
25
  /**
26
26
  * Copying menu item — a `MenuItem` preset for copy-to-clipboard rows inside a
27
27
  * `Menu`. Set `copy` for a literal string, `copyNode` to copy a DOM region, or
28
- * `copyUrl` to copy the current page URL. For content computed on demand, keep
29
- * `copy` reactive and refresh it in `onCopyRequest` (fired on pointerdown / keydown).
28
+ * `copyUrl` to copy the current page URL. For dynamic text, pass a controlled
29
+ * `copy` string and set it in `onCopyRequest` before activation.
30
30
  *
31
31
  * It composes a plain `<MenuItem>` with a slotted `<a-copy>` child that performs
32
32
  * the write when the row is chosen — the item itself carries no copy behavior.
@@ -1 +1 @@
1
- @layer anta{a-steps{--steps-marker-size: 28px;--steps-icon-size: 16px;--steps-marker-border-width: 1.5px;--steps-marker-rest-border: var(--border-4);--steps-item-gap: 6px;--steps-gap: 4px;--steps-connector-color: var(--border-3);--steps-connector-width: 1px;--steps-complete-connector-color: var(--border-2);--steps-tab-padding-x: 9px;--steps-tab-padding-block: 0px;--steps-hint-leading: 16px;display:flex;flex-direction:column;width:100%;min-width:0}a-steps:has(>a-tabs[size=small]){--steps-marker-size: 24px;--steps-icon-size: 14px;--steps-tab-padding-x: 7px;--steps-hint-leading: 14px}a-steps:has(>a-tabs[size=large]){--steps-marker-size: 32px;--steps-icon-size: 18px;--steps-tab-padding-x: 13px;--steps-hint-leading: 20px}a-tabs[data-steps]{--steps-marker-active-border: var(--border-1);--steps-primary-marker-lightness: .5;--steps-primary-marker-chroma: .02;--steps-primary-marker-fg: #ffffff;--tabs-gap: 0px;align-items:center;width:fit-content;align-self:flex-start;overflow-x:auto;scrollbar-width:thin}a-tabs[data-steps][fill]{width:100%;align-self:stretch;justify-content:space-between}a-tabs[data-steps]>a-tab[tone=brand]{--steps-marker-active-border: var(--border-1-brand)}a-tabs[data-steps]>a-tab[tone=info]{--steps-marker-active-border: var(--border-1-info)}a-tabs[data-steps]>a-tab[tone=success]{--steps-marker-active-border: var(--border-1-success)}a-tabs[data-steps]>a-tab[tone=warning]{--steps-marker-active-border: var(--border-1-warning)}a-tabs[data-steps]>a-tab[tone=critical]{--steps-marker-active-border: var(--border-1-critical)}a-tabs[data-steps]>a-tab[tone=neutral]{--steps-marker-active-border: var(--border-1)}a-tabs[data-steps]>a-tab[tone]:not([tone=""],[tone=neutral]){--steps-primary-marker-chroma: .17}.dark a-tabs[data-steps]{--steps-primary-marker-lightness: .4;--steps-primary-marker-chroma: .015}.dark a-tabs[data-steps]>a-tab[tone]:not([tone=""],[tone=neutral]){--steps-primary-marker-chroma: .16}a-tabs[data-steps]:not([priority=secondary],[priority=tertiary]){--steps-marker-border-width: 2px;--steps-marker-rest-border: var(--border-3);--steps-connector-color: var(--border-3);--steps-connector-width: 2px}a-tabs[data-steps][priority=tertiary]{--steps-marker-size: calc(var(--steps-icon-size) + 4px);--steps-marker-border-width: 0px}a-steps>a-tabs[data-steps]{background:transparent;border-radius:0;box-shadow:none}a-tabs[data-steps]>a-tab{--steps-complete-connector-color: var(--tab-selected-border);--steps-primary-marker-bg: oklch( from var(--tabs-tone-source) var(--steps-primary-marker-lightness) var(--steps-primary-marker-chroma) h );--steps-primary-completed-marker-bg: color-mix( in oklch, var(--steps-primary-marker-bg) 80%, transparent );position:relative;flex:1 1 0;min-width:0;max-width:max-content;padding-block:0;justify-content:flex-start;gap:var(--steps-item-gap);transition:color var(--tab-timing),background-color var(--tab-timing),box-shadow var(--tab-timing)}a-steps[data-orientation=vertical]:has(>a-tabs[data-steps]>a-tab:state(selected)[tone=brand]){--steps-complete-connector-color: var(--border-2-brand)}a-steps[data-orientation=vertical]:has(>a-tabs[data-steps]>a-tab:state(selected)[tone=info]){--steps-complete-connector-color: var(--border-2-info)}a-steps[data-orientation=vertical]:has(>a-tabs[data-steps]>a-tab:state(selected)[tone=success]){--steps-complete-connector-color: var(--border-2-success)}a-steps[data-orientation=vertical]:has(>a-tabs[data-steps]>a-tab:state(selected)[tone=warning]){--steps-complete-connector-color: var(--border-2-warning)}a-steps[data-orientation=vertical]:has(>a-tabs[data-steps]>a-tab:state(selected)[tone=critical]){--steps-complete-connector-color: var(--border-2-critical)}a-tabs[data-steps]:not([orientation=vertical])>a-tab:first-child{padding-inline-start:0}a-steps>a-tabs[data-steps][fill]>a-tab:not(:last-child){flex:1 1 0;max-width:none}a-steps>a-tabs[data-steps][fill]>a-tab:last-child{flex:0 1 auto;max-width:max-content}a-steps>a-tabs[data-steps]>a-tab:state(selected){--tab-bg: transparent;box-shadow:none}a-steps>a-tabs[data-steps][priority=tertiary]>a-tab:after{border:0}a-step-desc{display:inline-flex;flex:0 1 auto;flex-direction:column;min-width:0;max-width:100%}a-step-desc>a-tab-label{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}a-step-hint{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--tab-rest-tone, var(--text-3));font-size:calc(1em - 2px);font-weight:400;line-height:var(--steps-hint-leading)}a-step-marker{display:inline-flex;flex:none;align-items:center;justify-content:center;width:var(--steps-marker-size);height:var(--steps-marker-size);box-sizing:border-box;color:var(--text-4);border:var(--steps-marker-border-width) solid var(--steps-marker-rest-border);border-radius:999px;transition:color var(--tab-timing),background-color var(--tab-timing),border-color var(--tab-timing)}a-tabs[data-steps] a-step-marker :is(a-icon,a-loader){--icon-size: var(--steps-icon-size)}a-tabs[data-steps]>a-tab[tone]{--tab-secondary-bg: oklch( from var(--tabs-tone-source) var(--_track-l) var(--_track-c) h / var(--_sec-a) )}a-tabs[data-steps]>a-tab[tone] a-step-marker{color:var(--tab-selected-text)}a-tabs[data-steps]>a-tab:is(:state(selected),[data-step-state=completed]) a-step-marker{border-color:var(--steps-marker-active-border)}a-tabs[data-steps]>a-tab[data-step-state=error]:not(:state(selected)):not([disabled]) a-step-marker{border-color:var(--border-2-critical)}a-tabs[data-steps]:is([priority=secondary],[priority=tertiary])>a-tab[tone]:not([tone=""],[tone=neutral]) a-step-marker{color:var(--tab-fg)}a-tabs[data-steps][priority=secondary] a-tab:state(selected):not([disabled]) a-step-marker{color:var(--tab-selected-text);background-color:var(--tab-secondary-bg);border-color:var(--steps-marker-active-border)}a-tabs[data-steps]:not([priority=secondary],[priority=tertiary]) a-tab:state(selected):not([disabled]) a-step-marker{color:var(--steps-primary-marker-fg);background-color:var(--steps-primary-marker-bg);border-color:var(--steps-primary-marker-bg)}a-tabs[data-steps]:not([priority=secondary],[priority=tertiary]) a-tab[data-step-state=completed]:not(:state(selected)):not([disabled]) a-step-marker{color:var(--steps-primary-marker-fg);background-color:var(--steps-primary-completed-marker-bg);border-color:transparent}a-tabs[data-steps][priority=tertiary] a-tab:state(selected):not([disabled]) a-step-marker{color:var(--tab-selected-text);background-color:transparent;border-color:transparent}a-tabs[data-steps] a-step-marker>a-loader{transition:color var(--tab-timing)}a-tabs[data-steps]:is([priority=secondary],[priority=tertiary]) a-step-marker>a-loader:not([tone=neutral]){color:inherit}a-tabs[data-steps] a-tab:state(selected):not([disabled]) a-step-marker>a-loader{color:inherit}a-tabs[data-steps]:not([orientation=vertical])>a-tab:not(:last-child):before{content:"";order:3;flex:1 1 auto;align-self:center;min-width:calc(var(--steps-marker-size) / 2);height:var(--steps-connector-width);margin-inline-start:calc(1ch - var(--steps-item-gap));margin-inline-end:calc(1ch - 2 * var(--steps-tab-padding-x));background:var(--steps-connector-color);pointer-events:none}a-tabs[data-steps]:not([orientation=vertical])>a-tab[data-step-state=completed]:not(:last-child):before{background:var(--steps-complete-connector-color)}a-tabs[data-steps] a-tab[disabled]{--tab-fg: var(--text-5);opacity:1}a-tabs[data-steps] a-tab[disabled] a-step-marker,a-tabs[data-steps] a-tab[disabled] a-step-marker>a-loader{color:var(--text-5)}a-tabs[data-steps] a-tab[disabled] a-step-hint{color:var(--text-5)}a-steps[data-orientation=vertical]{--steps-content-indent: calc( var(--steps-marker-size) + var(--steps-item-gap) );--steps-vertical-gap: calc(var(--steps-gap) + 4px);display:grid;grid-template-columns:minmax(0,1fr);row-gap:var(--steps-vertical-gap)}a-steps[data-orientation=vertical]>a-tabs[orientation=vertical]{display:contents}a-steps[data-orientation=vertical]>a-tabs[orientation=vertical]>a-tab{flex:none;min-width:0;grid-column:1;width:max-content;max-width:100%;padding-inline-start:0}a-steps[data-orientation=vertical] a-tab:not(:last-child):before{content:"";position:absolute;inset-block-start:calc(var(--steps-tab-padding-block) + var(--steps-marker-size));inset-inline-start:calc(var(--steps-marker-size) / 2 - var(--steps-connector-width) / 2);inset-inline-end:auto;width:var(--steps-connector-width);height:calc(100% - var(--steps-marker-size) + var(--steps-vertical-gap));background:var(--steps-connector-color);transform:none;pointer-events:none}a-steps[data-orientation=vertical]>a-tabpanel{grid-column:1;grid-row:var(--steps-panel-row);width:calc(100% - var(--steps-content-indent));margin-inline-start:var(--steps-content-indent)}a-steps[data-orientation=vertical]:has(>a-tabpanel):has(>a-tabs[orientation=vertical]>a-tab:state(selected):not(:last-child)):after{content:"";grid-column:1;grid-row:var(--steps-panel-row);align-self:stretch;justify-self:start;width:var(--steps-connector-width);min-height:var(--steps-marker-size);margin-inline-start:calc(var(--steps-marker-size) / 2 - var(--steps-connector-width) / 2);margin-block-end:calc(-1 * var(--steps-vertical-gap));background:var(--steps-connector-color);pointer-events:none;z-index:1}a-steps[data-orientation=vertical]>a-tabs[data-steps]>a-tab[data-step-state=completed]:not(:last-child):before{background:var(--steps-complete-connector-color)}a-steps[data-orientation=vertical]:has(>a-tabpanel):has(>a-tabs[data-steps][orientation=vertical]>a-tab[data-step-state=completed]:state(selected):not(:last-child)):after{background:var(--steps-complete-connector-color)}@media(forced-colors:active){a-tabs[data-steps][priority=secondary] a-tab:state(selected){background-color:transparent;border:0;box-shadow:none}a-step-marker{color:CanvasText;background-color:Canvas;border-color:CanvasText}a-tabs[data-steps] a-tab:state(selected):not([disabled]) a-step-marker{border-color:Highlight}}}
1
+ @layer anta.components{a-steps{--steps-marker-size: 28px;--steps-icon-size: 16px;--steps-marker-border-width: 1.5px;--steps-marker-rest-border: var(--border-4);--steps-item-gap: 6px;--steps-gap: 4px;--steps-connector-color: var(--border-3);--steps-connector-width: 1px;--steps-complete-connector-color: var(--border-2);--steps-tab-padding-x: 9px;--steps-tab-padding-block: 0px;--steps-hint-leading: 16px;display:flex;flex-direction:column;width:100%;min-width:0}a-steps:has(>a-tabs[size=small]){--steps-marker-size: 24px;--steps-icon-size: 14px;--steps-tab-padding-x: 7px;--steps-hint-leading: 14px}a-steps:has(>a-tabs[size=large]){--steps-marker-size: 32px;--steps-icon-size: 18px;--steps-tab-padding-x: 13px;--steps-hint-leading: 20px}a-tabs[data-steps]{--steps-marker-active-border: var(--border-1);--steps-primary-marker-lightness: .5;--steps-primary-marker-chroma: .02;--steps-primary-marker-fg: #ffffff;--tabs-gap: 0px;align-items:center;width:fit-content;align-self:flex-start;overflow-x:auto;scrollbar-width:thin}a-tabs[data-steps][fill]{width:100%;align-self:stretch;justify-content:space-between}a-tabs[data-steps]>a-tab[tone=brand]{--steps-marker-active-border: var(--border-1-brand)}a-tabs[data-steps]>a-tab[tone=info]{--steps-marker-active-border: var(--border-1-info)}a-tabs[data-steps]>a-tab[tone=success]{--steps-marker-active-border: var(--border-1-success)}a-tabs[data-steps]>a-tab[tone=warning]{--steps-marker-active-border: var(--border-1-warning)}a-tabs[data-steps]>a-tab[tone=critical]{--steps-marker-active-border: var(--border-1-critical)}a-tabs[data-steps]>a-tab[tone=neutral]{--steps-marker-active-border: var(--border-1)}a-tabs[data-steps]>a-tab[tone]:not([tone=""],[tone=neutral]){--steps-primary-marker-chroma: .17}.dark a-tabs[data-steps]{--steps-primary-marker-lightness: .4;--steps-primary-marker-chroma: .015}.dark a-tabs[data-steps]>a-tab[tone]:not([tone=""],[tone=neutral]){--steps-primary-marker-chroma: .16}a-tabs[data-steps]:not([priority=secondary],[priority=tertiary]){--steps-marker-border-width: 2px;--steps-marker-rest-border: var(--border-3);--steps-connector-color: var(--border-3);--steps-connector-width: 2px}a-tabs[data-steps][priority=tertiary]{--steps-marker-size: calc(var(--steps-icon-size) + 4px);--steps-marker-border-width: 0px}a-steps>a-tabs[data-steps]{background:transparent;border-radius:0;box-shadow:none}a-tabs[data-steps]>a-tab{--steps-complete-connector-color: var(--tab-selected-border);--steps-primary-marker-bg: oklch( from var(--tabs-tone-source) var(--steps-primary-marker-lightness) var(--steps-primary-marker-chroma) h );--steps-primary-completed-marker-bg: color-mix( in oklch, var(--steps-primary-marker-bg) 80%, transparent );position:relative;flex:1 1 0;min-width:0;max-width:max-content;padding-block:0;justify-content:flex-start;gap:var(--steps-item-gap);transition:color var(--tab-timing),background-color var(--tab-timing),box-shadow var(--tab-timing)}a-steps[data-orientation=vertical]:has(>a-tabs[data-steps]>a-tab:state(selected)[tone=brand]){--steps-complete-connector-color: var(--border-2-brand)}a-steps[data-orientation=vertical]:has(>a-tabs[data-steps]>a-tab:state(selected)[tone=info]){--steps-complete-connector-color: var(--border-2-info)}a-steps[data-orientation=vertical]:has(>a-tabs[data-steps]>a-tab:state(selected)[tone=success]){--steps-complete-connector-color: var(--border-2-success)}a-steps[data-orientation=vertical]:has(>a-tabs[data-steps]>a-tab:state(selected)[tone=warning]){--steps-complete-connector-color: var(--border-2-warning)}a-steps[data-orientation=vertical]:has(>a-tabs[data-steps]>a-tab:state(selected)[tone=critical]){--steps-complete-connector-color: var(--border-2-critical)}a-tabs[data-steps]:not([orientation=vertical])>a-tab:first-child{padding-inline-start:0}a-steps>a-tabs[data-steps][fill]>a-tab:not(:last-child){flex:1 1 0;max-width:none}a-steps>a-tabs[data-steps][fill]>a-tab:last-child{flex:0 1 auto;max-width:max-content}a-steps>a-tabs[data-steps]>a-tab:state(selected){--tab-bg: transparent;box-shadow:none}a-steps>a-tabs[data-steps][priority=tertiary]>a-tab:after{border:0}a-step-desc{display:inline-flex;flex:0 1 auto;flex-direction:column;min-width:0;max-width:100%}a-step-desc>a-tab-label{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}a-step-hint{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--tab-rest-tone, var(--text-3));font-size:calc(1em - 2px);font-weight:400;line-height:var(--steps-hint-leading)}a-step-marker{display:inline-flex;flex:none;align-items:center;justify-content:center;width:var(--steps-marker-size);height:var(--steps-marker-size);box-sizing:border-box;color:var(--text-4);border:var(--steps-marker-border-width) solid var(--steps-marker-rest-border);border-radius:999px;transition:color var(--tab-timing),background-color var(--tab-timing),border-color var(--tab-timing)}a-tabs[data-steps] a-step-marker :is(a-icon,a-loader){--icon-size: var(--steps-icon-size)}a-tabs[data-steps]>a-tab[tone]{--tab-secondary-bg: oklch( from var(--tabs-tone-source) var(--_track-l) var(--_track-c) h / var(--_sec-a) )}a-tabs[data-steps]>a-tab[tone] a-step-marker{color:var(--tab-selected-text)}a-tabs[data-steps]>a-tab:is(:state(selected),[data-step-state=completed]) a-step-marker{border-color:var(--steps-marker-active-border)}a-tabs[data-steps]>a-tab[data-step-state=error]:not(:state(selected)):not([disabled]) a-step-marker{border-color:var(--border-2-critical)}a-tabs[data-steps]:is([priority=secondary],[priority=tertiary])>a-tab[tone]:not([tone=""],[tone=neutral]) a-step-marker{color:var(--tab-fg)}a-tabs[data-steps][priority=secondary] a-tab:state(selected):not([disabled]) a-step-marker{color:var(--tab-selected-text);background-color:var(--tab-secondary-bg);border-color:var(--steps-marker-active-border)}a-tabs[data-steps]:not([priority=secondary],[priority=tertiary]) a-tab:state(selected):not([disabled]) a-step-marker{color:var(--steps-primary-marker-fg);background-color:var(--steps-primary-marker-bg);border-color:var(--steps-primary-marker-bg)}a-tabs[data-steps]:not([priority=secondary],[priority=tertiary]) a-tab[data-step-state=completed]:not(:state(selected)):not([disabled]) a-step-marker{color:var(--steps-primary-marker-fg);background-color:var(--steps-primary-completed-marker-bg);border-color:transparent}a-tabs[data-steps][priority=tertiary] a-tab:state(selected):not([disabled]) a-step-marker{color:var(--tab-selected-text);background-color:transparent;border-color:transparent}a-tabs[data-steps] a-step-marker>a-loader{transition:color var(--tab-timing)}a-tabs[data-steps]:is([priority=secondary],[priority=tertiary]) a-step-marker>a-loader:not([tone=neutral]){color:inherit}a-tabs[data-steps] a-tab:state(selected):not([disabled]) a-step-marker>a-loader{color:inherit}a-tabs[data-steps]:not([orientation=vertical])>a-tab:not(:last-child):before{content:"";order:3;flex:1 1 auto;align-self:center;min-width:calc(var(--steps-marker-size) / 2);height:var(--steps-connector-width);margin-inline-start:calc(1ch - var(--steps-item-gap));margin-inline-end:calc(1ch - 2 * var(--steps-tab-padding-x));background:var(--steps-connector-color);pointer-events:none}a-tabs[data-steps]:not([orientation=vertical])>a-tab[data-step-state=completed]:not(:last-child):before{background:var(--steps-complete-connector-color)}a-tabs[data-steps] a-tab[disabled]{--tab-fg: var(--text-5);opacity:1}a-tabs[data-steps] a-tab[disabled] a-step-marker,a-tabs[data-steps] a-tab[disabled] a-step-marker>a-loader{color:var(--text-5)}a-tabs[data-steps] a-tab[disabled] a-step-hint{color:var(--text-5)}a-steps[data-orientation=vertical]{--steps-content-indent: calc( var(--steps-marker-size) + var(--steps-item-gap) );--steps-vertical-gap: calc(var(--steps-gap) + 4px);display:grid;grid-template-columns:minmax(0,1fr);row-gap:var(--steps-vertical-gap)}a-steps[data-orientation=vertical]>a-tabs[orientation=vertical]{display:contents}a-steps[data-orientation=vertical]>a-tabs[orientation=vertical]>a-tab{flex:none;min-width:0;grid-column:1;width:max-content;max-width:100%;padding-inline-start:0}a-steps[data-orientation=vertical] a-tab:not(:last-child):before{content:"";position:absolute;inset-block-start:calc(var(--steps-tab-padding-block) + var(--steps-marker-size));inset-inline-start:calc(var(--steps-marker-size) / 2 - var(--steps-connector-width) / 2);inset-inline-end:auto;width:var(--steps-connector-width);height:calc(100% - var(--steps-marker-size) + var(--steps-vertical-gap));background:var(--steps-connector-color);transform:none;pointer-events:none}a-steps[data-orientation=vertical]>a-tabpanel{grid-column:1;grid-row:var(--steps-panel-row);width:calc(100% - var(--steps-content-indent));margin-inline-start:var(--steps-content-indent)}a-steps[data-orientation=vertical]:has(>a-tabpanel):has(>a-tabs[orientation=vertical]>a-tab:state(selected):not(:last-child)):after{content:"";grid-column:1;grid-row:var(--steps-panel-row);align-self:stretch;justify-self:start;width:var(--steps-connector-width);min-height:var(--steps-marker-size);margin-inline-start:calc(var(--steps-marker-size) / 2 - var(--steps-connector-width) / 2);margin-block-end:calc(-1 * var(--steps-vertical-gap));background:var(--steps-connector-color);pointer-events:none;z-index:1}a-steps[data-orientation=vertical]>a-tabs[data-steps]>a-tab[data-step-state=completed]:not(:last-child):before{background:var(--steps-complete-connector-color)}a-steps[data-orientation=vertical]:has(>a-tabpanel):has(>a-tabs[data-steps][orientation=vertical]>a-tab[data-step-state=completed]:state(selected):not(:last-child)):after{background:var(--steps-complete-connector-color)}@media(forced-colors:active){a-tabs[data-steps][priority=secondary] a-tab:state(selected){background-color:transparent;border:0;box-shadow:none}a-step-marker{color:CanvasText;background-color:Canvas;border-color:CanvasText}a-tabs[data-steps] a-tab:state(selected):not([disabled]) a-step-marker{border-color:Highlight}}}
@@ -10,10 +10,9 @@ export type CopyTarget = {
10
10
  copy: string;
11
11
  /** Prefix the copied text with `// URL: <current page URL>`. */
12
12
  copyWithUrl?: boolean;
13
- /** Compute the copy content lazily. Fires on pointerdown / keydown; update
14
- * `copy` (a state change) here and the activation copies the latest value.
15
- * The gap lets the update land even off the UI thread — only the
16
- * serializable `copy` string crosses. */
13
+ /** Refresh a dynamic `copy` value before activation. Set the new string in
14
+ * application state so the next render updates `copy`. Return values are
15
+ * ignored. Fires on pointerdown and Enter/Space keydown. */
17
16
  onCopyRequest?: () => void;
18
17
  /** Fires after the copy attempt with whether it succeeded. */
19
18
  onCopied?: (ok: boolean) => void;
@@ -1 +1 @@
1
- @layer anta{a-select-chevron{display:inline-flex;transition:transform .15s ease}a-select-chevron[open]{transform:rotate(180deg)}a-select-faceted-summary{display:block;max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}
1
+ @layer anta.components{a-select-chevron{display:inline-flex;transition:transform .15s ease}a-select-chevron[open]{transform:rotate(180deg)}a-select-faceted-summary{display:block;max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}
@@ -1 +1 @@
1
- @layer anta{a-avatar{--avatar-size: 44px;--avatar-radius: 22%;--avatar-placeholder-bg: var(--bg-3);--avatar-badge-ratio: .24;--avatar-badge-size: calc(var(--avatar-size) * var(--avatar-badge-ratio));--avatar-badge-inset: 0px;--avatar-badge-gap: 2px;--avatar-badge-mask: none;--avatar-badge-tone-source: var(--anta-seed-neutral);--avatar-badge-chroma: .17;--avatar-badge-color: oklch(from var(--avatar-badge-tone-source) .62 var(--avatar-badge-chroma) h);display:inline-block;inline-size:var(--avatar-size);block-size:var(--avatar-size);vertical-align:middle}a-avatar[round]{--avatar-round: attr(round type(<length>));--avatar-radius: var(--avatar-round, 50%);--avatar-badge-inset: calc(var(--avatar-size) * .03)}a-avatar[size=small]{--avatar-size: 32px;--avatar-badge-gap: 1.5px}a-avatar[size=large]{--avatar-size: 64px;--avatar-badge-gap: 2.5px}a-avatar[badge]:not([badge=""],[badge=none]){--avatar-badge-mask: radial-gradient( circle calc(var(--avatar-badge-size) / 2 + var(--avatar-badge-gap)) at calc(100% - var(--avatar-badge-inset) - var(--avatar-badge-size) / 2) calc(100% - var(--avatar-badge-inset) - var(--avatar-badge-size) / 2), transparent 99%, #000 100% )}a-avatar:not(:defined){display:inline-block;inline-size:var(--avatar-size);block-size:var(--avatar-size);border-radius:var(--avatar-radius);background:var(--avatar-placeholder-bg);vertical-align:middle}a-avatar[badge=neutral]{--avatar-badge-chroma: .005}a-avatar[badge=brand]{--avatar-badge-tone-source: var(--anta-seed-brand)}a-avatar[badge=info]{--avatar-badge-tone-source: var(--anta-seed-info)}a-avatar[badge=success]{--avatar-badge-tone-source: var(--anta-seed-success)}a-avatar[badge=warning]{--avatar-badge-tone-source: var(--anta-seed-warning)}a-avatar[badge=critical]{--avatar-badge-tone-source: var(--anta-seed-critical)}@supports (color: attr(badge type(<color>),transparent)){a-avatar[badge]:not([badge=""],[badge=neutral],[badge=brand],[badge=info],[badge=success],[badge=warning],[badge=critical]){--avatar-badge-tone-source: attr(badge type(<color>), transparent)}}.dark a-avatar{--avatar-badge-color: oklch(from var(--avatar-badge-tone-source) .68 var(--avatar-badge-chroma) h)}.dark a-avatar[badge=neutral]{--avatar-badge-chroma: .008}}
1
+ @layer anta.components{a-avatar{--avatar-size: 44px;--avatar-radius: 22%;--avatar-placeholder-bg: var(--bg-3);--avatar-badge-ratio: .24;--avatar-badge-size: calc(var(--avatar-size) * var(--avatar-badge-ratio));--avatar-badge-inset: 0px;--avatar-badge-gap: 2px;--avatar-badge-mask: none;--avatar-badge-tone-source: var(--anta-seed-neutral);--avatar-badge-chroma: .17;--avatar-badge-color: oklch(from var(--avatar-badge-tone-source) .62 var(--avatar-badge-chroma) h);display:inline-block;inline-size:var(--avatar-size);block-size:var(--avatar-size);vertical-align:middle}a-avatar[round]{--avatar-radius: var(--avatar-round, 50%);--avatar-badge-inset: calc(var(--avatar-size) * .03);@supports (border-radius: attr(probe type(<length>),1px)){--avatar-round: attr(round type(<length>))}}a-avatar[size=small]{--avatar-size: 32px;--avatar-badge-gap: 1.5px}a-avatar[size=large]{--avatar-size: 64px;--avatar-badge-gap: 2.5px}a-avatar[badge]:not([badge=""],[badge=none]){--avatar-badge-mask: radial-gradient( circle calc(var(--avatar-badge-size) / 2 + var(--avatar-badge-gap)) at calc(100% - var(--avatar-badge-inset) - var(--avatar-badge-size) / 2) calc(100% - var(--avatar-badge-inset) - var(--avatar-badge-size) / 2), transparent 99%, #000 100% )}a-avatar:not(:defined){display:inline-block;inline-size:var(--avatar-size);block-size:var(--avatar-size);border-radius:var(--avatar-radius);background:var(--avatar-placeholder-bg);vertical-align:middle}a-avatar[badge=neutral]{--avatar-badge-chroma: .005}a-avatar[badge=brand]{--avatar-badge-tone-source: var(--anta-seed-brand)}a-avatar[badge=info]{--avatar-badge-tone-source: var(--anta-seed-info)}a-avatar[badge=success]{--avatar-badge-tone-source: var(--anta-seed-success)}a-avatar[badge=warning]{--avatar-badge-tone-source: var(--anta-seed-warning)}a-avatar[badge=critical]{--avatar-badge-tone-source: var(--anta-seed-critical)}@supports (color: attr(badge type(<color>),transparent)){a-avatar[badge]:not([badge=""],[badge=neutral],[badge=brand],[badge=info],[badge=success],[badge=warning],[badge=critical]){--avatar-badge-tone-source: attr(badge type(<color>), transparent)}}.dark a-avatar{--avatar-badge-color: oklch(from var(--avatar-badge-tone-source) .68 var(--avatar-badge-chroma) h)}.dark a-avatar[badge=neutral]{--avatar-badge-chroma: .008}}
@@ -1 +1 @@
1
- @layer anta{a-banner{--banner-bg: var(--bg-4);--banner-border: var(--border-4);--banner-text: var(--text-2);display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:4px 1ch;position:relative;box-sizing:border-box;width:100%;min-height:40px;padding:6px 52px;color:var(--banner-text);background:var(--banner-bg);border:0 solid var(--banner-border);border-radius:0;overflow:clip;overflow-clip-margin:3px;interpolate-size:allow-keywords;transition:opacity .16s ease,block-size .2s ease,padding-block .2s ease,border-block-width .2s ease,display .2s allow-discrete}a-banner[round]{--banner-round: attr(round type(<length>));border-radius:var(--banner-round, 999px)}a-banner [slot=close] a-button,a-banner a-button[slot=close]{height:100%;width:40px}a-banner-message{font-size:14px;line-height:20px;font-weight:475;text-align:center}a-banner[tone=brand]{--banner-bg: var(--bg-4-brand);--banner-border: var(--border-4-brand);--banner-text: var(--text-2-brand)}a-banner[tone=info]{--banner-bg: var(--bg-4-info);--banner-border: var(--border-4-info);--banner-text: var(--text-2-info)}a-banner[tone=success]{--banner-bg: var(--bg-4-success);--banner-border: var(--border-4-success);--banner-text: var(--text-2-success)}a-banner[tone=warning]{--banner-bg: var(--bg-4-warning);--banner-border: var(--border-4-warning);--banner-text: var(--text-2-warning)}a-banner[tone=critical]{--banner-bg: var(--bg-4-critical);--banner-border: var(--border-4-critical);--banner-text: var(--text-2-critical)}a-banner[tone]:not([tone=""],[tone=neutral],[tone=brand],[tone=info],[tone=success],[tone=warning],[tone=critical]){--banner-tone-source: attr(tone type(<color>), currentColor);--banner-text: oklch(from var(--banner-tone-source) .5 .125 h);--banner-bg: oklch(from var(--banner-tone-source) .955 .02 h);--banner-border: oklch(from var(--banner-tone-source) .9 .04 h);.dark &{--banner-text: oklch(from var(--banner-tone-source) .77 .11 h);--banner-bg: oklch(from var(--banner-tone-source) .185 .05 h);--banner-border: oklch(from var(--banner-tone-source) .26 .06 h)}}a-banner:not(:defined){opacity:0}a-banner[state=closed],a-banner[default-state=closed],a-banner:state(closed){display:none;block-size:0;min-block-size:0;padding-block:0;border-block-width:0;opacity:0}@media(forced-colors:active){a-banner{border-width:1px;border-color:CanvasText}}@media(prefers-reduced-motion:reduce){a-banner{transition:none}}}
1
+ @layer anta.components{a-banner{--banner-bg: var(--bg-4);--banner-border: var(--border-4);--banner-text: var(--text-2);display:flex;align-items:center;justify-content:flex-start;flex-wrap:wrap;gap:4px 1ch;position:relative;box-sizing:border-box;width:100%;min-height:40px;padding-block:6px;padding-inline:16px 48px;color:var(--banner-text);background:var(--banner-bg);border:0 solid var(--banner-border);border-radius:0;overflow:clip;overflow-clip-margin:3px;interpolate-size:allow-keywords;transition:opacity .16s ease,block-size .2s ease,padding-block .2s ease,border-block-width .2s ease,display .2s allow-discrete}a-banner[align=center]{justify-content:center;padding-inline:48px}a-banner[round]{border-radius:var(--banner-round, 999px);@supports (border-radius: attr(probe type(<length>),1px)){--banner-round: attr(round type(<length>))}}a-banner [slot=close] a-button,a-banner a-button[slot=close]{height:100%;width:40px}a-banner-message{font-size:14px;line-height:20px;font-weight:475;text-align:start}a-banner[align=center] a-banner-message{text-align:center}a-banner[tone=brand]{--banner-bg: var(--bg-4-brand);--banner-border: var(--border-4-brand);--banner-text: var(--text-2-brand)}a-banner[tone=info]{--banner-bg: var(--bg-4-info);--banner-border: var(--border-4-info);--banner-text: var(--text-2-info)}a-banner[tone=success]{--banner-bg: var(--bg-4-success);--banner-border: var(--border-4-success);--banner-text: var(--text-2-success)}a-banner[tone=warning]{--banner-bg: var(--bg-4-warning);--banner-border: var(--border-4-warning);--banner-text: var(--text-2-warning)}a-banner[tone=critical]{--banner-bg: var(--bg-4-critical);--banner-border: var(--border-4-critical);--banner-text: var(--text-2-critical)}a-banner[tone]:not([tone=""],[tone=neutral],[tone=brand],[tone=info],[tone=success],[tone=warning],[tone=critical]){--banner-tone-source: currentColor;--banner-text: oklch(from var(--banner-tone-source) .5 .125 h);--banner-bg: oklch(from var(--banner-tone-source) .955 .02 h);--banner-border: oklch(from var(--banner-tone-source) .9 .04 h);.dark &{--banner-text: oklch(from var(--banner-tone-source) .77 .11 h);--banner-bg: oklch(from var(--banner-tone-source) .185 .05 h);--banner-border: oklch(from var(--banner-tone-source) .26 .06 h)}@supports (color: attr(probe type(<color>),red)){--banner-tone-source: attr(tone type(<color>), currentColor)}}a-banner:not(:defined){opacity:0}a-banner[state=closed],a-banner[default-state=closed],a-banner:state(closed){display:none;block-size:0;min-block-size:0;padding-block:0;border-block-width:0;opacity:0}@media(forced-colors:active){a-banner{border-width:1px;border-color:CanvasText}}@media(prefers-reduced-motion:reduce){a-banner{transition:none}}}
@@ -11,6 +11,7 @@ const SHADOW_STYLE = `
11
11
  gap: 4px;
12
12
  flex-shrink: 0;
13
13
  }
14
+ slot[name="actions"][hidden] { display: none; }
14
15
 
15
16
  slot[name="close"] {
16
17
  position: absolute;
@@ -57,10 +58,21 @@ class ABannerElement extends HTMLElementBase {
57
58
  const actionsSlot = document.createElement("slot");
58
59
  actionsSlot.name = "actions";
59
60
  actionsSlot.setAttribute("part", "actions");
61
+ const syncActionsSlot = () => {
62
+ actionsSlot.hidden = !actionsSlot.assignedNodes({ flatten: true }).some((node) => {
63
+ if (node.nodeType === Node.TEXT_NODE) return node.textContent?.trim() !== "";
64
+ if (node.nodeType !== Node.ELEMENT_NODE) return false;
65
+ const element = node;
66
+ return !element.hasAttribute("data-anta-banner-actions-wrapper") || !element.matches(":empty");
67
+ });
68
+ };
69
+ actionsSlot.hidden = true;
70
+ actionsSlot.addEventListener("slotchange", syncActionsSlot);
60
71
  const closeSlot = document.createElement("slot");
61
72
  closeSlot.name = "close";
62
73
  closeSlot.setAttribute("part", "close");
63
74
  shadow.append(style, messageSlot, contentSlot, actionsSlot, closeSlot);
75
+ syncActionsSlot();
64
76
  this.addEventListener(DISMISS_TRIGGER, (e) => {
65
77
  e.stopPropagation();
66
78
  this.#requestDismiss();
@@ -102,11 +114,11 @@ class ABannerElement extends HTMLElementBase {
102
114
  if (!this.#internals) return;
103
115
  try {
104
116
  if (state === "closed") {
105
- this.#internals.states.add("closed");
106
- this.#internals.states.delete("open");
117
+ this.#internals?.states?.add("closed");
118
+ this.#internals?.states?.delete("open");
107
119
  } else {
108
- this.#internals.states.add("open");
109
- this.#internals.states.delete("closed");
120
+ this.#internals?.states?.add("open");
121
+ this.#internals?.states?.delete("closed");
110
122
  }
111
123
  } catch {
112
124
  }
@@ -0,0 +1 @@
1
+ @layer anta.components{a-box{display:block;min-width:0}a-box[display=inline-block]{display:inline-block}a-box[display=flex]{display:flex}a-box[display=inline-flex]{display:inline-flex}a-box[display=grid]{display:grid}a-box[display=inline-grid]{display:inline-grid}a-box[gap]{gap:var(--box-gap, normal);@supports (border-radius: attr(probe type(<length>),1px)){--box-gap: attr(gap type(<length>))}}a-box[round]{border-radius:var(--box-round, 999px);@supports (border-radius: attr(probe type(<length>),1px)){--box-round: attr(round type(<length>))}}a-box[fade]{--box-fade-size: 24px;--box-fade-x: linear-gradient(transparent, transparent);--box-fade-y: linear-gradient(transparent, transparent);--box-fade-to-start: to left;--box-fade-to-end: to right}a-box[fade]:is(:state(hidden-start-x),:state(hidden-end-x),:state(hidden-start-y),:state(hidden-end-y)){mask-image:linear-gradient(#000,#000),var(--box-fade-x),var(--box-fade-y);mask-clip:border-box,padding-box,padding-box;mask-origin:border-box,padding-box,padding-box;mask-composite:exclude,add,add;mask-repeat:no-repeat;mask-size:100% 100%}a-box[fade][fade-size]{--box-fade-size: 24px;@supports (border-radius: attr(probe type(<length>),1px)){--box-fade-size: attr(fade-size type(<length>), 24px)}}a-box[fade]:dir(rtl){--box-fade-to-start: to right;--box-fade-to-end: to left}a-box[fade]:state(hidden-end-x){--box-fade-x: linear-gradient(var(--box-fade-to-end), transparent calc(100% - var(--box-fade-size)), black)}a-box[fade]:state(hidden-start-x){--box-fade-x: linear-gradient(var(--box-fade-to-start), transparent calc(100% - var(--box-fade-size)), black)}a-box[fade]:state(hidden-start-x):state(hidden-end-x){--box-fade-x: linear-gradient( to right, black, transparent var(--box-fade-size), transparent calc(100% - var(--box-fade-size)), black )}a-box[fade]:state(hidden-end-y){--box-fade-y: linear-gradient(to bottom, transparent calc(100% - var(--box-fade-size)), black)}a-box[fade]:state(hidden-start-y){--box-fade-y: linear-gradient(to top, transparent calc(100% - var(--box-fade-size)), black)}a-box[fade]:state(hidden-start-y):state(hidden-end-y){--box-fade-y: linear-gradient( to bottom, black, transparent var(--box-fade-size), transparent calc(100% - var(--box-fade-size)), black )}}
@@ -0,0 +1,41 @@
1
+ import { HTMLElementBase } from '../anta_helpers';
2
+ import type { BoxContext, BoxMeasurement } from '../box-types';
3
+ import './a-box.css';
4
+ /**
5
+ * `<a-box>` is a light-DOM container that observes itself. It leaves the host
6
+ * and its children entirely to the renderer: all output is read-only getters,
7
+ * `measurechange` / `contextchange` events, and private `ElementInternals`
8
+ * states. This keeps measurement usable when JSX itself cannot access the DOM.
9
+ *
10
+ * Observation is opt-in by attribute and pauses off screen. `fade` or
11
+ * `observe="size"` turns measurement on, `observe="context"` turns
12
+ * `contextchange` on, `observe="all"` (or a bare `observe`) turns on both, and a box
13
+ * with neither runs no observers at all — not even the shared visibility one.
14
+ * The `measurement` / `context` / `isTruncated` getters still read on demand.
15
+ *
16
+ * Attributes rather than "is a listener attached" on purpose. A listener tally
17
+ * cannot see listeners added before the element upgrades (the SSR pattern in
18
+ * AGENTS.md), cannot see `once` or `AbortSignal` removals, and churns on every
19
+ * React 19 render, because React removes and re-adds an `on*` prop whenever its
20
+ * identity changes. The JSX wrapper stamps both attributes from its handler
21
+ * props, so this is invisible to anyone using `Box`.
22
+ */
23
+ export declare class ABoxElement extends HTMLElementBase {
24
+ #private;
25
+ static observedAttributes: string[];
26
+ connectedCallback(): void;
27
+ disconnectedCallback(): void;
28
+ attributeChangedCallback(): void;
29
+ /** A fresh measurement snapshot. For notifications, prefer `measurechange`:
30
+ * it batches browser observers and includes the field-level delta. */
31
+ get measurement(): BoxMeasurement;
32
+ /** A fresh context snapshot. For changes, prefer `contextchange`. */
33
+ get context(): BoxContext;
34
+ /** Allows a nested `Tooltip truncatedOnly` to use Box's clipping decision. */
35
+ get isTruncated(): boolean;
36
+ /** Called by the per-window context cache. It is intentionally not a JSX prop. */
37
+ contextStoreDidChange(): void;
38
+ /** Called by the per-window visibility observer. Also not a JSX prop. */
39
+ visibilityDidChange(visible: boolean): void;
40
+ }
41
+ export declare function register_a_box(): void;