@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.
- package/dist/anta_helpers.js +3 -3
- package/dist/box-types.d.ts +161 -0
- package/dist/box-types.js +0 -0
- package/dist/bundle.css +1 -1
- package/dist/bundle.js +26 -25
- package/dist/components/Banner.d.ts +10 -10
- package/dist/components/Banner.js +3 -1
- package/dist/components/Box.d.ts +37 -0
- package/dist/components/Box.js +63 -0
- package/dist/components/Breadcrumbs.css +1 -1
- package/dist/components/ButtonCopy.d.ts +2 -2
- package/dist/components/InputDate.css +1 -1
- package/dist/components/MenuItem.d.ts +5 -1
- package/dist/components/MenuItem.js +72 -2
- package/dist/components/MenuItemCopy.d.ts +2 -2
- package/dist/components/Steps.css +1 -1
- package/dist/components/copy-props.d.ts +3 -4
- package/dist/components/select-parts.css +1 -1
- package/dist/elements/a-avatar.css +1 -1
- package/dist/elements/a-banner.css +1 -1
- package/dist/elements/a-banner.js +16 -4
- package/dist/elements/a-box.css +1 -0
- package/dist/elements/a-box.d.ts +41 -0
- package/dist/elements/a-box.js +576 -0
- package/dist/elements/a-button.css +1 -1
- package/dist/elements/a-calendar.css +1 -1
- package/dist/elements/a-calendar.js +2 -2
- package/dist/elements/a-card.css +1 -1
- package/dist/elements/a-checkbox.css +1 -1
- package/dist/elements/a-copy.css +1 -1
- package/dist/elements/a-dialog.css +1 -1
- package/dist/elements/a-expander.css +1 -1
- package/dist/elements/a-expander.js +2 -2
- package/dist/elements/a-icon.css +1 -1
- package/dist/elements/a-icon.shapes.css +1 -1
- package/dist/elements/a-input-time.css +1 -1
- package/dist/elements/a-input-time.js +3 -3
- package/dist/elements/a-input.css +1 -1
- package/dist/elements/a-input.js +14 -6
- package/dist/elements/a-loader.css +1 -1
- package/dist/elements/a-menu-group.css +1 -1
- package/dist/elements/a-menu-item.css +1 -1
- package/dist/elements/a-menu-item.js +3 -3
- package/dist/elements/a-menu-separator.css +1 -1
- package/dist/elements/a-menu.css +1 -1
- package/dist/elements/a-menu.d.ts +4 -4
- package/dist/elements/a-menu.js +8 -6
- package/dist/elements/a-progress.css +1 -1
- package/dist/elements/a-radio-group.css +1 -1
- package/dist/elements/a-radio-group.js +3 -3
- package/dist/elements/a-radio.css +1 -1
- package/dist/elements/a-slider.css +1 -1
- package/dist/elements/a-switch.css +1 -1
- package/dist/elements/a-switch.js +2 -2
- package/dist/elements/a-tab.css +1 -1
- package/dist/elements/a-tabpanel.css +1 -1
- package/dist/elements/a-tabpanel.js +2 -2
- package/dist/elements/a-tabs.css +1 -1
- package/dist/elements/a-tabs.js +6 -6
- package/dist/elements/a-tag.css +1 -1
- package/dist/elements/a-text.css +1 -1
- package/dist/elements/a-title.css +1 -1
- package/dist/elements/a-toast.css +1 -1
- package/dist/elements/a-toast.js +2 -2
- package/dist/elements/a-toaster.css +1 -1
- package/dist/elements/a-tooltip.css +1 -1
- package/dist/elements/a-tooltip.d.ts +4 -3
- package/dist/elements/a-tooltip.js +9 -5
- package/dist/elements/copy-behavior.d.ts +13 -15
- package/dist/elements/index.d.ts +1 -0
- package/dist/elements/index.js +3 -0
- package/dist/general_types.d.ts +42 -4
- package/dist/generate-icons.mjs +3 -3
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/jsx-runtime.d.ts +2 -1
- package/dist/reset.css +1 -1
- package/dist/theme-anta.css +1 -1
- package/dist/tokens.css +1 -1
- package/docs/changelog.md +42 -1
- package/docs/components/avatar.md +368 -0
- package/docs/components/banner.md +26 -15
- package/docs/components/box.md +282 -0
- package/docs/components/breadcrumbs.md +2 -2
- package/docs/components/button.md +26 -15
- package/docs/components/input.md +5 -0
- package/docs/components/menu.md +14 -11
- package/docs/components/tag.md +47 -0
- package/docs/index.md +4 -3
- package/docs/install-config.md +58 -13
- package/docs/normalization.md +37 -28
- package/docs/theming.md +4 -1
- package/package.json +2 -2
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import type { BaseProps } from "../general_types";
|
|
2
|
-
/**
|
|
3
|
-
*
|
|
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
|
|
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
|
|
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
|
|
36
|
-
* `onCopyRequest`
|
|
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
|
-
/**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
29
|
-
* `copy`
|
|
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
|
-
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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-
|
|
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:
|
|
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
|
|
106
|
-
this.#internals
|
|
117
|
+
this.#internals?.states?.add("closed");
|
|
118
|
+
this.#internals?.states?.delete("open");
|
|
107
119
|
} else {
|
|
108
|
-
this.#internals
|
|
109
|
-
this.#internals
|
|
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;
|