@antadesign/anta 0.3.33 → 0.3.35

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 (205) hide show
  1. package/LICENSE.md +14 -1
  2. package/README.md +9 -0
  3. package/dist/anta_helpers.d.ts +46 -30
  4. package/dist/anta_helpers.js +66 -25
  5. package/dist/bundle.css +1 -1
  6. package/dist/bundle.js +2 -1353
  7. package/dist/components/Banner.d.ts +25 -40
  8. package/dist/components/Banner.js +15 -17
  9. package/dist/components/Breadcrumbs.d.ts +0 -1
  10. package/dist/components/Breadcrumbs.js +0 -1
  11. package/dist/components/Button.d.ts +2 -3
  12. package/dist/components/Button.js +1 -0
  13. package/dist/components/ButtonCopy.js +3 -2
  14. package/dist/components/Calendar.js +13 -13
  15. package/dist/components/Card.d.ts +9 -17
  16. package/dist/components/Card.js +50 -46
  17. package/dist/components/Dialog.d.ts +1 -0
  18. package/dist/components/Dialog.js +16 -10
  19. package/dist/components/Expander.d.ts +6 -21
  20. package/dist/components/Expander.js +24 -23
  21. package/dist/components/Icon.d.ts +8 -14
  22. package/dist/components/Input.d.ts +77 -96
  23. package/dist/components/Input.js +23 -27
  24. package/dist/components/InputAutocomplete.d.ts +29 -10
  25. package/dist/components/InputAutocomplete.js +25 -8
  26. package/dist/components/InputDate.d.ts +0 -1
  27. package/dist/components/InputDate.js +2 -3
  28. package/dist/components/InputTime.d.ts +10 -4
  29. package/dist/components/InputTime.js +20 -16
  30. package/dist/components/Loader.d.ts +2 -2
  31. package/dist/components/Menu.d.ts +5 -4
  32. package/dist/components/Menu.js +13 -8
  33. package/dist/components/MenuItem.js +1 -14
  34. package/dist/components/MenuItemCopy.js +2 -2
  35. package/dist/components/Panel.d.ts +3 -1
  36. package/dist/components/Panel.js +17 -11
  37. package/dist/components/Progress.d.ts +21 -23
  38. package/dist/components/Progress.js +13 -9
  39. package/dist/components/RadioGroup.js +6 -8
  40. package/dist/components/{select-parts.css → Select.css} +1 -1
  41. package/dist/components/Select.d.ts +53 -36
  42. package/dist/components/Select.js +53 -98
  43. package/dist/components/SelectFaceted.d.ts +7 -4
  44. package/dist/components/SelectFaceted.js +21 -10
  45. package/dist/components/Slider.d.ts +28 -11
  46. package/dist/components/Slider.js +20 -20
  47. package/dist/components/Steps.css +1 -1
  48. package/dist/components/Steps.d.ts +0 -1
  49. package/dist/components/Steps.js +1 -12
  50. package/dist/components/Tabs.d.ts +17 -20
  51. package/dist/components/Tabs.js +7 -9
  52. package/dist/components/Text.d.ts +55 -36
  53. package/dist/components/Text.js +35 -22
  54. package/dist/components/Title.d.ts +19 -27
  55. package/dist/components/Title.js +2 -1
  56. package/dist/components/Toaster.js +9 -2
  57. package/dist/components/Tooltip.d.ts +10 -15
  58. package/dist/components/copy-props.d.ts +14 -3
  59. package/dist/components/copy-props.js +14 -3
  60. package/dist/components/select-tree.d.ts +24 -0
  61. package/dist/components/select-tree.js +35 -0
  62. package/dist/element-base.d.ts +10 -0
  63. package/dist/element-base.js +15 -0
  64. package/dist/elements/a-avatar.css +1 -1
  65. package/dist/elements/a-avatar.js +2 -28
  66. package/dist/elements/a-banner.css +1 -1
  67. package/dist/elements/a-banner.d.ts +4 -1
  68. package/dist/elements/a-banner.js +22 -112
  69. package/dist/elements/a-breadcrumbs.d.ts +1 -0
  70. package/dist/elements/a-breadcrumbs.js +1 -0
  71. package/dist/elements/a-button.css +1 -1
  72. package/dist/elements/a-button.d.ts +10 -7
  73. package/dist/elements/a-button.js +18 -1
  74. package/dist/elements/a-calendar.d.ts +14 -13
  75. package/dist/elements/a-calendar.js +29 -24
  76. package/dist/elements/a-card.css +1 -1
  77. package/dist/elements/a-card.d.ts +0 -9
  78. package/dist/elements/a-card.js +0 -184
  79. package/dist/elements/a-checkbox.css +1 -1
  80. package/dist/elements/a-copy.css +1 -1
  81. package/dist/elements/a-copy.d.ts +1 -5
  82. package/dist/elements/a-copy.js +129 -108
  83. package/dist/elements/a-dialog.css +1 -1
  84. package/dist/elements/a-dialog.d.ts +1 -1
  85. package/dist/elements/a-dialog.js +68 -194
  86. package/dist/elements/a-expander.css +1 -1
  87. package/dist/elements/a-expander.d.ts +4 -30
  88. package/dist/elements/a-expander.js +85 -344
  89. package/dist/elements/a-icon.d.ts +5 -23
  90. package/dist/elements/a-icon.js +1 -2
  91. package/dist/elements/a-input-date.d.ts +1 -0
  92. package/dist/elements/a-input-date.js +1 -0
  93. package/dist/elements/a-input-time.css +1 -1
  94. package/dist/elements/a-input-time.d.ts +2 -1
  95. package/dist/elements/a-input-time.js +101 -168
  96. package/dist/elements/a-input.css +1 -1
  97. package/dist/elements/a-input.d.ts +10 -8
  98. package/dist/elements/a-input.js +155 -230
  99. package/dist/elements/a-loader.d.ts +5 -8
  100. package/dist/elements/a-loader.js +1 -2
  101. package/dist/elements/a-menu-item.css +1 -1
  102. package/dist/elements/a-menu-item.d.ts +5 -3
  103. package/dist/elements/a-menu-item.js +5 -1
  104. package/dist/elements/a-menu.css +1 -1
  105. package/dist/elements/a-menu.d.ts +5 -7
  106. package/dist/elements/a-menu.js +383 -299
  107. package/dist/elements/a-panel.css +1 -1
  108. package/dist/elements/a-panel.js +19 -37
  109. package/dist/elements/a-progress.css +1 -1
  110. package/dist/elements/a-progress.d.ts +0 -22
  111. package/dist/elements/a-progress.js +0 -100
  112. package/dist/elements/a-radio-group.d.ts +1 -1
  113. package/dist/elements/a-radio-group.js +6 -4
  114. package/dist/elements/a-select-faceted.d.ts +1 -0
  115. package/dist/elements/a-select-faceted.js +1 -0
  116. package/dist/elements/a-select.d.ts +1 -0
  117. package/dist/elements/a-select.js +1 -0
  118. package/dist/elements/a-slider.css +1 -1
  119. package/dist/elements/a-slider.d.ts +11 -3
  120. package/dist/elements/a-slider.js +244 -242
  121. package/dist/elements/a-steps.d.ts +1 -0
  122. package/dist/elements/a-steps.js +1 -0
  123. package/dist/elements/a-switch.css +1 -1
  124. package/dist/elements/a-tab.css +1 -1
  125. package/dist/elements/a-tabpanel.d.ts +2 -2
  126. package/dist/elements/a-tabpanel.js +13 -3
  127. package/dist/elements/a-tabs.css +1 -1
  128. package/dist/elements/a-tabs.d.ts +1 -1
  129. package/dist/elements/a-tabs.js +6 -4
  130. package/dist/elements/a-tag.css +1 -1
  131. package/dist/elements/a-tag.d.ts +1 -0
  132. package/dist/elements/a-tag.js +1 -0
  133. package/dist/elements/a-text.css +1 -1
  134. package/dist/elements/a-text.d.ts +6 -43
  135. package/dist/elements/a-text.js +110 -193
  136. package/dist/elements/a-title.css +1 -1
  137. package/dist/elements/a-title.d.ts +1 -0
  138. package/dist/elements/a-title.js +1 -0
  139. package/dist/elements/a-toast.css +1 -1
  140. package/dist/elements/a-toast.d.ts +10 -45
  141. package/dist/elements/a-toast.js +80 -66
  142. package/dist/elements/a-toaster.css +1 -1
  143. package/dist/elements/a-toaster.js +9 -44
  144. package/dist/elements/a-tooltip.css +1 -1
  145. package/dist/elements/a-tooltip.d.ts +1 -1
  146. package/dist/elements/a-tooltip.js +142 -136
  147. package/dist/elements/copy-behavior.d.ts +1 -1
  148. package/dist/elements/copy-behavior.js +21 -21
  149. package/dist/elements/index.d.ts +9 -3
  150. package/dist/elements/index.js +6 -6
  151. package/dist/elements/input-focus-modality.d.ts +15 -0
  152. package/dist/elements/input-focus-modality.js +44 -0
  153. package/dist/elements/input-trailing-actions.d.ts +5 -0
  154. package/dist/elements/input-trailing-actions.js +38 -0
  155. package/dist/elements/shadow-aria.d.ts +2 -0
  156. package/dist/elements/shadow-aria.js +2 -1
  157. package/dist/elements/value-input.d.ts +3 -0
  158. package/dist/elements/value-input.js +12 -0
  159. package/dist/general_types.d.ts +103 -96
  160. package/dist/index.d.ts +1 -1
  161. package/dist/input-events.d.ts +4 -0
  162. package/dist/input-events.js +15 -0
  163. package/dist/jsx-runtime.d.ts +70 -23
  164. package/dist/jsx-runtime.js +26 -19
  165. package/dist/native-event-props.d.ts +2 -0
  166. package/dist/native-event-props.js +10 -0
  167. package/dist/reset.css +1 -1
  168. package/dist/theme-antithesis.css +10 -1
  169. package/dist/theme-antune.css +1 -1
  170. package/docs/accessibility.md +17 -3
  171. package/docs/changelog.md +384 -2
  172. package/docs/comparison.md +2 -2
  173. package/docs/components/avatar.md +5 -0
  174. package/docs/components/banner.md +117 -187
  175. package/docs/components/breadcrumbs.md +9 -6
  176. package/docs/components/button.md +22 -0
  177. package/docs/components/card.md +74 -28
  178. package/docs/components/checkbox.md +9 -10
  179. package/docs/components/dialog.md +83 -32
  180. package/docs/components/expander.md +198 -435
  181. package/docs/components/icon.md +11 -17
  182. package/docs/components/input-autocomplete.md +152 -52
  183. package/docs/components/input-date.md +175 -148
  184. package/docs/components/input-time.md +81 -38
  185. package/docs/components/input.md +343 -349
  186. package/docs/components/loader.md +2 -1
  187. package/docs/components/menu.md +35 -6
  188. package/docs/components/panel.md +18 -0
  189. package/docs/components/progress.md +83 -49
  190. package/docs/components/radio.md +39 -43
  191. package/docs/components/select-faceted.md +54 -7
  192. package/docs/components/select.md +390 -386
  193. package/docs/components/slider.md +136 -19
  194. package/docs/components/steps.md +6 -3
  195. package/docs/components/switch.md +8 -9
  196. package/docs/components/tabs.md +110 -104
  197. package/docs/components/text.md +110 -86
  198. package/docs/components/title.md +47 -33
  199. package/docs/components/toaster.md +242 -84
  200. package/docs/components/tooltip.md +204 -113
  201. package/docs/install-config.md +461 -96
  202. package/docs/packages/plot.md +228 -143
  203. package/docs/theming.md +29 -13
  204. package/package.json +43 -4
  205. package/theme-antithesis-license.md +66 -0
@@ -1,10 +1,8 @@
1
1
  import type { BaseProps } from "../general_types";
2
2
  export interface TooltipProps extends BaseProps {
3
- /** Tooltip content. Renders anything — text, markup, an icon + text.
4
- * Lives in the light DOM, so it's styleable with your own plain CSS. */
3
+ /** Supplementary text or markup. Content stays in light DOM for application CSS. */
5
4
  children?: React.ReactNode;
6
- /** Show delay in milliseconds after hover / focus. Never use `0` — use
7
- * ~`50` for a near-instant tooltip (0 has caused issues in practice).
5
+ /** Wait in milliseconds after hover or keyboard focus. Use `50` for a short delay.
8
6
  * @defaultValue 300 */
9
7
  delay?: number;
10
8
  /** Which side of the anchor the bubble prefers. Auto-flips to the other
@@ -18,10 +16,9 @@ export interface TooltipProps extends BaseProps {
18
16
  * pinned (anchored beneath the target) by default; pass `follow` for the
19
17
  * cursor-tracking behavior, which fades by distance as the cursor leaves. */
20
18
  follow?: boolean;
21
- /** Make the bubble hoverable and clickable — enables pointer events and
22
- * keeps it open while the cursor is over it, so its content (links,
23
- * buttons) can be interacted with. Always pinned (an interactive bubble
24
- * can't follow the cursor, even with `follow`). */
19
+ /** Keep content available while the pointer or keyboard focus is inside it.
20
+ * Enables pointer events and pins the bubble even with `follow`. Essential
21
+ * actions belong in a Menu or Dialog with an explicit trigger. */
25
22
  interactive?: boolean;
26
23
  /** Only show when the target is actually truncated (its text overflows and is
27
24
  * ellipsized); a label that fits gets no tooltip. The check is a UI-thread
@@ -49,13 +46,12 @@ export interface TooltipProps extends BaseProps {
49
46
  *
50
47
  * @example Basic usage
51
48
  * ```tsx
52
- * import { Tooltip } from '@antadesign/anta'
49
+ * import { Tooltip, Button } from '@antadesign/anta'
53
50
  * import '@antadesign/anta/elements'
54
51
  *
55
- * <button>
56
- * Save
52
+ * <Button label="Save">
57
53
  * <Tooltip>Saves your work</Tooltip>
58
- * </button>
54
+ * </Button>
59
55
  * ```
60
56
  *
61
57
  * @example Above the anchor, rich content
@@ -70,10 +66,9 @@ export interface TooltipProps extends BaseProps {
70
66
  *
71
67
  * @example Follow the cursor
72
68
  * ```tsx
73
- * <button>
74
- * Hover me
69
+ * <Button label="Hover me">
75
70
  * <Tooltip follow>Tracks the pointer</Tooltip>
76
- * </button>
71
+ * </Button>
77
72
  * ```
78
73
  */
79
74
  export declare const Tooltip: ({ delay, placement, round, follow, interactive, truncatedOnly, truncatedSelector, className, style, children, ...rest }: TooltipProps) => any;
@@ -2,7 +2,7 @@
2
2
  * The copy target for a copy preset (`ButtonCopy` / `MenuItemCopy`) — exactly
3
3
  * one of a literal string, a DOM region, or the page URL. The write itself is
4
4
  * performed by the slotted `<a-copy>` element; these props map to its attributes
5
- * via `copyElementProps`. `copyWithUrl` / `onCopyRequest` are only meaningful for
5
+ * via `useCopyElementProps`. `copyWithUrl` / `onCopyRequest` are only meaningful for
6
6
  * the string target, so the union pins them `never` elsewhere.
7
7
  */
8
8
  export type CopyTarget = {
@@ -40,7 +40,7 @@ export type CopyTarget = {
40
40
  copyWithUrl?: never;
41
41
  onCopyRequest?: never;
42
42
  };
43
- /** Everything `copyElementProps` reads: the target plus the resolved `onCopied`
43
+ /** Everything `useCopyElementProps` reads: the target plus the resolved `onCopied`
44
44
  * (the preset passes its feedback-wrapped handler) and the `toast` opt-in. */
45
45
  type CopyElementInput = {
46
46
  copy?: string;
@@ -63,7 +63,18 @@ export declare function copyElementProps(p: CopyElementInput): {
63
63
  readonly toast: "" | undefined;
64
64
  readonly 'copied-label': string | undefined;
65
65
  readonly oncopydone: ((e: any) => void) | undefined;
66
- readonly oncopyrequest: (() => void) | undefined;
66
+ readonly oncopyrequest: ((e: any) => void) | undefined;
67
+ };
68
+ /** @internal Apply the shared browser hydration option to copy event props. */
69
+ export declare function useCopyElementProps(p: CopyElementInput): {
70
+ copy: string | undefined;
71
+ 'copy-node': string | undefined;
72
+ 'copy-url': "" | undefined;
73
+ 'copy-with-url': "" | undefined;
74
+ toast: "" | undefined;
75
+ 'copied-label': string | undefined;
76
+ oncopydone?: ((e: any) => void) | undefined;
77
+ oncopyrequest?: ((e: any) => void) | undefined;
67
78
  };
68
79
  /** True when these props copy a DOM node — the host control must then be marked
69
80
  * `data-copy-node-button` so the serializer strips it from the copied region. */
@@ -1,4 +1,5 @@
1
1
  import { nativeStateChange } from "../anta_helpers";
2
+ import { useNativeEventProps } from "../native-event-props";
2
3
  function copyElementProps(p) {
3
4
  const { copy, copyNode, copyUrl, copyWithUrl, onCopyRequest, onCopied, toast, copiedLabel } = p;
4
5
  return {
@@ -8,14 +9,24 @@ function copyElementProps(p) {
8
9
  "copy-with-url": copyWithUrl ? "" : void 0,
9
10
  toast: toast ? "" : void 0,
10
11
  "copied-label": copiedLabel,
11
- oncopydone: onCopied ? (e) => onCopied(nativeStateChange(e).detail?.ok ?? false) : void 0,
12
- oncopyrequest: onCopyRequest ? () => onCopyRequest() : void 0
12
+ oncopydone: onCopied ? (e) => {
13
+ const result = nativeStateChange(e);
14
+ if (result.isOwn) onCopied(result.detail?.ok ?? false);
15
+ } : void 0,
16
+ oncopyrequest: onCopyRequest ? (e) => {
17
+ if (nativeStateChange(e).isOwn) onCopyRequest();
18
+ } : void 0
13
19
  };
14
20
  }
21
+ function useCopyElementProps(p) {
22
+ const { oncopydone, oncopyrequest, ...attributes } = copyElementProps(p);
23
+ return { ...attributes, ...useNativeEventProps({ oncopydone, oncopyrequest }) };
24
+ }
15
25
  function isNodeCopy(p) {
16
26
  return p.copyNode != null && p.copyNode !== false;
17
27
  }
18
28
  export {
19
29
  copyElementProps,
20
- isNodeCopy
30
+ isNodeCopy,
31
+ useCopyElementProps
21
32
  };
@@ -0,0 +1,24 @@
1
+ import type { OptionValue, SelectGroup, SelectItem, SelectOption, SelectSubmenu } from './Select';
2
+ interface Leaf<V extends OptionValue> {
3
+ kind: 'option';
4
+ opt: SelectOption<V>;
5
+ disabled: boolean;
6
+ group?: string;
7
+ }
8
+ export type SelectNode<V extends OptionValue> = Leaf<V> | ({
9
+ key: string;
10
+ disabled: boolean;
11
+ children: SelectNode<V>[];
12
+ } & ({
13
+ kind: 'group';
14
+ source: SelectGroup<V>;
15
+ } | {
16
+ kind: 'submenu';
17
+ source: SelectSubmenu<V>;
18
+ }));
19
+ export declare function prepareSelectOptions<V extends OptionValue>(items: SelectItem<V>[], matches?: (option: SelectOption<V>) => boolean): {
20
+ tree: SelectNode<V>[];
21
+ allLeaves: Leaf<V>[];
22
+ visibleLeaves: Leaf<V>[];
23
+ };
24
+ export {};
@@ -0,0 +1,35 @@
1
+ import { normalizeOpt } from "./select-options";
2
+ function prepareSelectOptions(items, matches) {
3
+ const allLeaves = [];
4
+ const visibleLeaves = [];
5
+ const walk = (items2, group, disabled = false) => {
6
+ const nodes = [];
7
+ items2.forEach((raw, index) => {
8
+ if (typeof raw !== "string" && Array.isArray(raw.submenu)) {
9
+ const source = raw;
10
+ const effectiveDisabled = disabled || !!source.disabled;
11
+ const children = walk(source.submenu, source.label, effectiveDisabled);
12
+ if (children.length) nodes.push({ kind: "submenu", source, disabled: effectiveDisabled, children, key: `sub-${index}-${source.label}` });
13
+ } else if (typeof raw !== "string" && Array.isArray(raw.options)) {
14
+ const source = raw;
15
+ const effectiveDisabled = disabled || !!source.disabled;
16
+ const children = walk(source.options, source.label, effectiveDisabled);
17
+ if (children.length) nodes.push({ kind: "group", source, disabled: effectiveDisabled, children, key: `grp-${index}-${source.label}` });
18
+ } else {
19
+ const opt = normalizeOpt(raw);
20
+ const leaf = { kind: "option", opt, disabled: disabled || !!opt.disabled, group };
21
+ allLeaves.push(leaf);
22
+ if (!matches || matches(opt)) {
23
+ visibleLeaves.push(leaf);
24
+ nodes.push(leaf);
25
+ }
26
+ }
27
+ });
28
+ return nodes;
29
+ };
30
+ const tree = walk(items);
31
+ return { tree, allLeaves, visibleLeaves };
32
+ }
33
+ export {
34
+ prepareSelectOptions
35
+ };
@@ -0,0 +1,10 @@
1
+ /** Use a harmless base when importing element classes without a browser DOM. */
2
+ declare const NativeHTMLElement: typeof HTMLElement;
3
+ /** Base for custom elements that can live in a different document or iframe. */
4
+ export declare class HTMLElementBase extends NativeHTMLElement {
5
+ /** This element's own window, including when rendered in an iframe. */
6
+ protected get view(): Window & typeof globalThis;
7
+ /** This element's own document. */
8
+ protected get doc(): Document;
9
+ }
10
+ export {};
@@ -0,0 +1,15 @@
1
+ const NativeHTMLElement = typeof HTMLElement !== "undefined" ? HTMLElement : class {
2
+ };
3
+ class HTMLElementBase extends NativeHTMLElement {
4
+ /** This element's own window, including when rendered in an iframe. */
5
+ get view() {
6
+ return this.ownerDocument?.defaultView ?? window;
7
+ }
8
+ /** This element's own document. */
9
+ get doc() {
10
+ return this.ownerDocument ?? document;
11
+ }
12
+ }
13
+ export {
14
+ HTMLElementBase
15
+ };
@@ -1 +1 @@
1
- @layer base,anta,components,utilities;@layer anta.reset,anta.components,anta.theme;@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: light-dark( oklch(from var(--avatar-badge-tone-source) .62 var(--avatar-badge-chroma) h), oklch(from var(--avatar-badge-tone-source) .68 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)}}}
1
+ @layer base,anta,components,utilities;@layer anta.reset,anta.components,anta.theme;@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: light-dark( oklch(from var(--avatar-badge-tone-source) .62 var(--avatar-badge-chroma) h), oklch(from var(--avatar-badge-tone-source) .68 var(--avatar-badge-chroma) h) );display:inline-block;position:relative;inline-size:var(--avatar-size);block-size:var(--avatar-size);vertical-align:middle}a-avatar::part(frame){display:block;inline-size:100%;block-size:100%;border-radius:var(--avatar-radius);background:var(--avatar-placeholder-bg);mask-image:var(--avatar-badge-mask)}a-avatar::part(image){object-fit:cover}a-avatar::part(badge){display:none;position:absolute;right:var(--avatar-badge-inset);bottom:var(--avatar-badge-inset);inline-size:var(--avatar-badge-size);block-size:var(--avatar-badge-size);border-radius:50%;background:var(--avatar-badge-color)}a-avatar[badge]:not([badge=""],[badge=none])::part(badge){display:block}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)}}}
@@ -8,15 +8,12 @@ class AAvatarElement extends HTMLElementBase {
8
8
  constructor() {
9
9
  super();
10
10
  const shadow = this.attachShadow({ mode: "open" });
11
- const style = document.createElement("style");
12
- style.textContent = SHADOW_STYLE;
13
11
  this.#badge = document.createElement("span");
14
12
  this.#badge.className = "badge";
15
13
  this.#badge.setAttribute("part", "badge");
16
- this.#badge.style.display = "none";
17
- shadow.append(style, this.#badge);
14
+ shadow.append(this.#badge);
18
15
  }
19
- /** Swap in the picture, keeping it between the style and the indicator. */
16
+ /** Swap in the picture, keeping it before the indicator. */
20
17
  #setPicture(node) {
21
18
  if (this.#picture) this.#picture.replaceWith(node);
22
19
  else this.#badge.before(node);
@@ -40,8 +37,6 @@ class AAvatarElement extends HTMLElementBase {
40
37
  }
41
38
  }
42
39
  #render() {
43
- const badge = this.getAttribute("badge");
44
- this.#badge.style.display = badge && badge !== "none" ? "" : "none";
45
40
  const name = this.getAttribute("name") ?? void 0;
46
41
  const src = this.getAttribute("src");
47
42
  if (src) {
@@ -64,27 +59,6 @@ class AAvatarElement extends HTMLElementBase {
64
59
  }
65
60
  }
66
61
  }
67
- const SHADOW_STYLE = `
68
- :host { display: inline-block; position: relative; vertical-align: middle; }
69
- svg, img {
70
- display: block;
71
- inline-size: 100%;
72
- block-size: 100%;
73
- border-radius: var(--avatar-radius);
74
- background: var(--avatar-placeholder-bg);
75
- mask-image: var(--avatar-badge-mask);
76
- }
77
- img { object-fit: cover; }
78
- .badge {
79
- position: absolute;
80
- right: var(--avatar-badge-inset);
81
- bottom: var(--avatar-badge-inset);
82
- inline-size: var(--avatar-badge-size);
83
- block-size: var(--avatar-badge-size);
84
- border-radius: 50%;
85
- background: var(--avatar-badge-color);
86
- }
87
- `;
88
62
  function register_a_avatar() {
89
63
  if (typeof customElements === "undefined") return;
90
64
  if (!customElements.get("a-avatar")) {
@@ -1 +1 @@
1
- @layer base,anta,components,utilities;@layer anta.reset,anta.components,anta.theme;@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: light-dark( oklch(from var(--banner-tone-source) .5 .125 h), oklch(from var(--banner-tone-source) .77 .11 h) );--banner-bg: light-dark( oklch(from var(--banner-tone-source) .955 .02 h), oklch(from var(--banner-tone-source) .185 .05 h) );--banner-border: light-dark( oklch(from var(--banner-tone-source) .9 .04 h), 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}}}
1
+ @layer base,anta,components,utilities;@layer anta.reset,anta.components,anta.theme;@layer anta.components{a-banner{--banner-bg: var(--bg-4);--banner-border: var(--border-4);--banner-text: var(--text-2);--banner-round: initial;--banner-tone-source: initial;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>a-banner-content{display:contents}a-banner>a-banner-actions{display:flex;align-items:center;gap:4px;flex-shrink:0}a-banner>a-banner-actions:empty{display:none}a-banner>a-banner-message:empty,a-banner>:is(a-banner-message,a-banner-content,a-banner-actions,a-banner-close)[hidden]{display:none}a-banner>a-banner-close{position:absolute;inset-inline-end:0;inset-block:0;display:grid;place-items:center;opacity:.65;transition:opacity .15s ease}a-banner>a-banner-close:hover,a-banner>a-banner-close:focus-within{opacity:1}a-banner>a-banner-close>a-button{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: light-dark( oklch(from var(--banner-tone-source) .5 .125 h), oklch(from var(--banner-tone-source) .77 .11 h) );--banner-bg: light-dark( oklch(from var(--banner-tone-source) .955 .02 h), oklch(from var(--banner-tone-source) .185 .05 h) );--banner-border: light-dark( oklch(from var(--banner-tone-source) .9 .04 h), 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[state]:not([state=open]),a-banner:not([state])[default-state=closed]:not(:state(open)),a-banner:not([state]):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,a-banner>a-banner-close{transition:none}}}
@@ -1,10 +1,13 @@
1
1
  import { HTMLElementBase } from '../anta_helpers';
2
2
  import './a-banner.css';
3
+ /** Light-DOM notice with declarative regions and external styling. The element
4
+ * owns dismissal through ElementInternals, without changing
5
+ * application-owned markup, attributes, styles, or ARIA. */
3
6
  export declare class ABannerElement extends HTMLElementBase {
4
7
  #private;
5
8
  static observedAttributes: string[];
6
9
  constructor();
7
10
  connectedCallback(): void;
8
- attributeChangedCallback(name: string): void;
11
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
9
12
  }
10
13
  export declare function register_a_banner(): void;
@@ -1,145 +1,55 @@
1
1
  import { HTMLElementBase, installDismissTrigger, parseOpenState } from "../anta_helpers";
2
2
  import "./a-banner.css";
3
- const DISMISS_TRIGGER = "dismissrequest";
4
- const DISMISS_ATTR = "data-banner-dismiss";
5
- const SHADOW_STYLE = `
6
- slot[name="message"], slot:not([name]) { display: contents; }
7
-
8
- slot[name="actions"] {
9
- display: flex;
10
- align-items: center;
11
- gap: 4px;
12
- flex-shrink: 0;
13
- }
14
- slot[name="actions"][hidden] { display: none; }
15
-
16
- slot[name="close"] {
17
- position: absolute;
18
- inset-inline-end: 0;
19
- inset-block: 0;
20
- display: grid;
21
- place-items: center;
22
- opacity: 0.65;
23
- transition: opacity 150ms ease;
24
- }
25
- slot[name="close"]:hover,
26
- slot[name="close"]:focus-within {
27
- opacity: 1;
28
- }
29
- `;
30
- const parseState = parseOpenState;
31
3
  class ABannerElement extends HTMLElementBase {
32
4
  static observedAttributes = ["state"];
33
- // Visibility is held here as a custom state (`:state(open)` / `:state(closed)`),
34
- // NOT a host attribute — declarative-DOM safe (no host mutation, no reconcile
35
- // churn). This is the ONLY declarative-safe self-hide channel, so a runtime
36
- // (uncontrolled) ✕ dismiss needs CustomStateSet + the CSS `:state()` selector
37
- // (Chrome 90+, Safari 17.4+, Firefox 126+); below that the ✕ can't self-hide (an
38
- // attribute fallback would violate the no-host-mutation rule). Controlled mode
39
- // degrades everywhere — the `state="closed"` attribute the wrapper sets has the
40
- // `[state="closed"]` CSS fallback, which needs no custom-state support.
41
5
  #internals;
42
- // `default-state` seeds the uncontrolled intent ONCE, on the first connect; a
43
- // re-parent (disconnect → reconnect) then keeps the applied state (which lives
44
- // off-DOM in #internals and survives the move) instead of re-seeding `open` over a
45
- // banner the user already dismissed. Mirrors a-dialog's #seeded.
46
6
  #seeded = false;
47
7
  constructor() {
48
8
  super();
49
- this.#internals = typeof this.attachInternals === "function" ? this.attachInternals() : void 0;
50
- const shadow = this.attachShadow({ mode: "open" });
51
- const style = document.createElement("style");
52
- style.textContent = SHADOW_STYLE;
53
- const messageSlot = document.createElement("slot");
54
- messageSlot.name = "message";
55
- messageSlot.setAttribute("part", "message");
56
- const contentSlot = document.createElement("slot");
57
- contentSlot.setAttribute("part", "content");
58
- const actionsSlot = document.createElement("slot");
59
- actionsSlot.name = "actions";
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);
71
- const closeSlot = document.createElement("slot");
72
- closeSlot.name = "close";
73
- closeSlot.setAttribute("part", "close");
74
- shadow.append(style, messageSlot, contentSlot, actionsSlot, closeSlot);
75
- syncActionsSlot();
76
- this.addEventListener(DISMISS_TRIGGER, (e) => {
77
- e.stopPropagation();
9
+ this.#internals = this.attachInternals();
10
+ this.addEventListener("dismissrequest", (event) => {
11
+ const banner = event.composedPath().find((node) => node.nodeType === 1 && node.localName === "a-banner");
12
+ if (banner !== this) return;
13
+ event.stopPropagation();
78
14
  this.#requestDismiss();
79
15
  });
80
- installDismissTrigger(this, DISMISS_ATTR, () => this.#requestDismiss());
16
+ installDismissTrigger(this, "data-banner-dismiss", () => this.#requestDismiss());
81
17
  }
82
- /** Controlled mode: the `state` attribute is present and owns visibility. */
83
18
  get #controlled() {
84
19
  return this.hasAttribute("state");
85
20
  }
86
- /** The currently *applied* state (read from the custom state — the source of
87
- * truth for what's painted). Reads open until the element has applied a state.
88
- * Both `?.` guard engines with ElementInternals but no CustomStateSet (`.states`
89
- * undefined), where reading it would otherwise throw inside the ✕ click. */
90
21
  get #current() {
91
- return this.#internals?.states?.has("closed") ? "closed" : "open";
22
+ return this.#internals.states.has("closed") ? "closed" : "open";
92
23
  }
93
24
  connectedCallback() {
94
25
  if (this.#controlled) {
95
- this.#applyState(parseState(this.getAttribute("state")));
26
+ this.#applyState(parseOpenState(this.getAttribute("state")));
96
27
  } else if (!this.#seeded) {
97
- this.#applyState(this.#seedState());
98
- this.#seeded = true;
28
+ this.#applyState(this.getAttribute("default-state") === "closed" ? "closed" : "open");
99
29
  }
30
+ this.#seeded = true;
100
31
  }
101
- /** The uncontrolled initial state. A banner is shown by DEFAULT, so `open` unless
102
- * `default-state="closed"` is explicit. (Unlike a-dialog / a-expander, whose
103
- * absent default-state means closed — a banner is the inverse, so it can't share
104
- * `parseState` here. A hand-authored `<a-banner>` with no attributes shows.) */
105
- #seedState() {
106
- return this.getAttribute("default-state") === "closed" ? "closed" : "open";
32
+ attributeChangedCallback(name, oldValue, newValue) {
33
+ if (oldValue === newValue) return;
34
+ if (name === "state" && this.#controlled) this.#applyState(parseOpenState(newValue));
107
35
  }
108
- attributeChangedCallback(name) {
109
- if (name === "state" && this.#controlled) this.#applyState(parseState(this.getAttribute("state")));
110
- }
111
- /** Mirror the state to `:state(open)` / `:state(closed)` (idempotent). The
112
- * external sheet collapses the host on `:state(closed)`. Off-DOM only. */
113
36
  #applyState(state) {
114
- if (!this.#internals) return;
115
- try {
116
- if (state === "closed") {
117
- this.#internals?.states?.add("closed");
118
- this.#internals?.states?.delete("open");
119
- } else {
120
- this.#internals?.states?.add("open");
121
- this.#internals?.states?.delete("closed");
122
- }
123
- } catch {
124
- }
37
+ this.#internals.states.delete(state === "closed" ? "open" : "closed");
38
+ this.#internals.states.add(state);
125
39
  }
126
- /** Announce a requested dismiss (cancelable, before applying), then — uncontrolled
127
- * and un-vetoed — apply it. Controlled: never self-apply; the consumer answers
128
- * via `state`. See STATEFUL-COMPONENTS.md. */
129
40
  #requestDismiss() {
130
41
  if (this.#current === "closed") return;
131
- const ok = this.dispatchEvent(
132
- new CustomEvent("statechange", { cancelable: true, detail: { next: "closed", prev: "open" } })
133
- );
134
- if (this.#controlled) return;
135
- if (ok) this.#applyState("closed");
42
+ const controlled = this.#controlled;
43
+ const accepted = this.dispatchEvent(new this.view.CustomEvent("statechange", {
44
+ cancelable: true,
45
+ detail: { next: "closed", prev: "open" }
46
+ }));
47
+ if (!controlled && !this.#controlled && accepted) this.#applyState("closed");
136
48
  }
137
49
  }
138
50
  function register_a_banner() {
139
51
  if (typeof customElements === "undefined") return;
140
- if (!customElements.get("a-banner")) {
141
- customElements.define("a-banner", ABannerElement);
142
- }
52
+ if (!customElements.get("a-banner")) customElements.define("a-banner", ABannerElement);
143
53
  }
144
54
  register_a_banner();
145
55
  export {
@@ -0,0 +1 @@
1
+ import '../components/Breadcrumbs.css';
@@ -0,0 +1 @@
1
+ import "../components/Breadcrumbs.css";
@@ -1 +1 @@
1
- @layer base,anta,components,utilities;@layer anta.reset,anta.components,anta.theme;@layer anta.components{a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]){--button-primary-fg: #ffffff;--bg-primary-disabled: light-dark(#ece9ec, #272329);--bg-secondary-disabled: light-dark(#f6f4f6, #1d1a1e);--fg-disabled-primary: light-dark(#afa9b1, #776e77);--fg-disabled: light-dark(#afa9b1, #635b65);--button-loading-stripe: 14px;--button-loading-stripe-gap: 16px;--button-loading-period: calc( var(--button-loading-stripe) + var(--button-loading-stripe-gap) );--button-loading-angle: 125deg;--button-loading-x-period: calc( var(--button-loading-period) / cos(var(--button-loading-angle) - 90deg) );--button-loading-opacity: .15;--button-loading-blur: 5px;--_src: var(--anta-seed-neutral);--button-bg-primary-rest: light-dark(oklch(from var(--_src) .5 .02 h), oklch(from var(--_src) .4 .015 h));--button-bg-primary-hover: light-dark(oklch(from var(--_src) .45 .02 h), oklch(from var(--_src) .44 .015 h));--button-bg-primary-active: light-dark(oklch(from var(--_src) .4 .02 h), oklch(from var(--_src) .48 .015 h));--button-fg-primary-rest: var(--button-primary-fg);--button-fg-secondary-rest: light-dark(oklch(from var(--_src) .46 .008 h), oklch(from var(--_src) .86 .015 h));--button-fg-secondary-hover: light-dark(oklch(from var(--_src) .4 .008 h), oklch(from var(--_src) .86 .015 h));--button-fg-tertiary-rest: var(--button-fg-secondary-rest);--button-fg-tertiary-hover: var(--button-fg-secondary-hover);--button-bg-tertiary-hover: light-dark(oklch(from var(--_src) .54 .03 h / .1), oklch(from var(--_src) .44 .01 h / .24));--button-bg-tertiary-active: light-dark(oklch(from var(--_src) .54 .03 h / .15), oklch(from var(--_src) .44 .01 h / .34));--button-fg-quaternary-rest: light-dark(oklch(from var(--_src) .46 .008 h / .85), oklch(from var(--_src) .86 .015 h / .85));--button-fg-quaternary-hover: light-dark(oklch(from var(--_src) .38 .008 h), oklch(from var(--_src) .9 .015 h));--button-bg-secondary-rest: light-dark(oklch(from var(--_src) .54 .03 h / .1), oklch(from var(--_src) .44 .01 h / .24));--button-bg-secondary-hover: light-dark(oklch(from var(--_src) .54 .03 h / .15), oklch(from var(--_src) .44 .01 h / .34));--button-bg-secondary-active: light-dark(oklch(from var(--_src) .54 .03 h / .2), oklch(from var(--_src) .44 .01 h / .44));--_fs: 15px;--_lh: 20px;--_pb: 1px;--_radius: 4px;--button-padding-x: 9px;--button-padding-y: calc((8px - var(--_pb)) / 2);--button-timing-in: 75ms ease-in;--button-timing-active: 50ms linear;--button-timing-out: .15s ease-out;--button-loading-duration: .5s}a-button[round],a[role=button][data-anta][round],button[data-anta][round],input[data-anta]:is([type=reset],[type=submit])[round]{--button-round: 999px;--_radius: var(--button-round, 999px);@supports (border-radius: attr(probe type(<length>),1px)){--button-round: attr(round type(<length>), 999px)}}a-button[tone]:not([tone=""],[tone=neutral]),a[role=button][data-anta][tone]:not([tone=""],[tone=neutral]),button[data-anta][tone]:not([tone=""],[tone=neutral]),input[data-anta]:is([type=reset],[type=submit])[tone]:not([tone=""],[tone=neutral]){--button-bg-primary-rest: light-dark(oklch(from var(--_src) .51 .17 h), oklch(from var(--_src) .4 .16 h));--button-bg-primary-hover: light-dark(oklch(from var(--_src) .46 .17 h), oklch(from var(--_src) .44 .16 h));--button-bg-primary-active: light-dark(oklch(from var(--_src) .41 .17 h), oklch(from var(--_src) .48 .16 h));--button-fg-secondary-rest: light-dark(oklch(from var(--_src) .46 .17 h), oklch(from var(--_src) .86 .13 h));--button-fg-secondary-hover: light-dark(oklch(from var(--_src) .4 .17 h), oklch(from var(--_src) .86 .13 h));--button-fg-tertiary-rest: var(--button-fg-secondary-rest);--button-fg-tertiary-hover: var(--button-fg-secondary-hover);--button-bg-tertiary-hover: light-dark(oklch(from var(--_src) .54 .17 h / .1), oklch(from var(--_src) .58 .16 h / .215));--button-bg-tertiary-active: light-dark(oklch(from var(--_src) .54 .17 h / .15), oklch(from var(--_src) .58 .16 h / .29));--button-fg-quaternary-rest: light-dark(oklch(from var(--_src) .46 .17 h / .85), oklch(from var(--_src) .86 .13 h / .85));--button-fg-quaternary-hover: light-dark(oklch(from var(--_src) .38 .17 h), oklch(from var(--_src) .9 .13 h));--button-bg-secondary-rest: light-dark(oklch(from var(--_src) .54 .17 h / .1), oklch(from var(--_src) .58 .16 h / .215));--button-bg-secondary-hover: light-dark(oklch(from var(--_src) .54 .17 h / .15), oklch(from var(--_src) .58 .16 h / .29));--button-bg-secondary-active: light-dark(oklch(from var(--_src) .54 .17 h / .2), oklch(from var(--_src) .58 .16 h / .34))}a-button[tone=brand],a[role=button][data-anta][tone=brand],button[data-anta][tone=brand],input[data-anta]:is([type=reset],[type=submit])[tone=brand]{--_src: var(--anta-seed-brand)}a-button[tone=info],a[role=button][data-anta][tone=info],button[data-anta][tone=info],input[data-anta]:is([type=reset],[type=submit])[tone=info]{--_src: var(--anta-seed-info)}a-button[tone=success],a[role=button][data-anta][tone=success],button[data-anta][tone=success],input[data-anta]:is([type=reset],[type=submit])[tone=success]{--_src: var(--anta-seed-success)}a-button[tone=warning],a[role=button][data-anta][tone=warning],button[data-anta][tone=warning],input[data-anta]:is([type=reset],[type=submit])[tone=warning]{--_src: var(--anta-seed-warning)}a-button[tone=critical],a[role=button][data-anta][tone=critical],button[data-anta][tone=critical],input[data-anta]:is([type=reset],[type=submit])[tone=critical]{--_src: var(--anta-seed-critical)}a-button[tone]:not([tone=""],[tone=neutral],[tone=brand],[tone=info],[tone=success],[tone=warning],[tone=critical]),a[role=button][data-anta][tone]:not([tone=""],[tone=neutral],[tone=brand],[tone=info],[tone=success],[tone=warning],[tone=critical]),button[data-anta][tone]:not([tone=""],[tone=neutral],[tone=brand],[tone=info],[tone=success],[tone=warning],[tone=critical]),input[data-anta]:is([type=reset],[type=submit])[tone]:not([tone=""],[tone=neutral],[tone=brand],[tone=info],[tone=success],[tone=warning],[tone=critical]){--_src: var(--button-tone-source, transparent);@supports (color: attr(probe type(<color>),red)){--_src: var(--button-tone-source, attr(tone type(<color>), transparent))}}button[data-anta],input[data-anta]:is([type=reset],[type=submit]){box-sizing:border-box;margin:0;appearance:none;-webkit-appearance:none;border:none}a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]){user-select:none;display:inline-flex;align-items:center;gap:.5ch;cursor:pointer;&:has(>a-copy):not(:has(>a-icon)){cursor:copy}flex-shrink:0;color:var(--button-fg);background-color:var(--button-bg);border-radius:var(--_radius);text-decoration:none;box-shadow:inset 0 0 1px color-mix(in oklch,currentColor,transparent 90%);font-size:var(--_fs);font-family:var(--sans-serif);font-weight:450;font-stretch:normal;line-height:var(--_lh);letter-spacing:.025ch;text-overflow:ellipsis;text-wrap:nowrap;white-space:nowrap;max-width:100%;padding-inline:var(--button-padding-x);padding-block:var(--button-padding-y);min-height:28px;>a-button-label{display:inline-block;text-overflow:ellipsis;text-wrap:nowrap;white-space:nowrap;overflow:hidden;min-width:0;line-height:var(--_lh);padding-bottom:var(--_pb);&:has(>*){display:inline-flex;gap:.25ch}}>*{pointer-events:none}& a-icon{transition:color var(--button-timing-out)}transition:color var(--button-timing-out),background-color var(--button-timing-out);&:hover,&:focus-visible{transition:color var(--button-timing-in),background-color var(--button-timing-in);& a-icon{transition:color var(--button-timing-in)}}&:active,&[selected]{transition:color var(--button-timing-active),background-color var(--button-timing-active);& a-icon{transition:color var(--button-timing-active)}}&[disabled]{pointer-events:none;cursor:not-allowed;transition:none;& a-icon{transition:none}}&:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}&[priority=quaternary]{--button-timing-in: 0s;--button-timing-active: 0s;--button-timing-out: 0s}&[size=small]{--button-padding-x: 7px;--_fs: 13px;--_lh: 16px;--_pb: .5px;min-height:24px;& a-icon{--icon-size: 14px}}&[size=large]{--button-padding-x: 13px;--_fs: 17px;--_lh: 24px;--_pb: 1.5px;min-height:32px;& a-icon{--icon-size: 18px}}&[priority=tertiary],&[priority=quaternary]{&[underline=solid]{text-decoration:underline solid}&[underline=dashed]{text-decoration:underline dashed}&[underline=dotted]{text-decoration:underline dotted}&[underline]{text-decoration-color:color-mix(in oklch,currentColor 75%,transparent);text-decoration-thickness:1px;text-underline-offset:3px;&[selected]{text-decoration-color:var(--button-fg);text-decoration-thickness:1px}@media(hover:hover)and (pointer:fine){&:hover{text-decoration-color:var(--button-fg);text-decoration-thickness:1px}}}&[underline][underline-on-hover]{text-decoration-color:transparent;&[selected]{text-decoration-color:transparent}@media(hover:hover)and (pointer:fine){&:hover{text-decoration-color:var(--button-fg)}}}}&[priority=quaternary][paddingless]{--button-padding-x: 0;--button-padding-y: 0;min-height:0}&:has(>a-icon):not(:has(>a-icon~a-icon)):not(:has(>:not(a-icon):not(a-tooltip):not(a-copy))){--button-padding-y: 5px;--button-padding-x: 5px;min-width:28px;justify-content:center;&[size=small]{--button-padding-y: 3px;--button-padding-x: 3px;min-width:24px}&[size=large]{--button-padding-y: 7px;--button-padding-x: 7px;min-width:32px}}&:is(:has(>a-icon:first-child),:has(>a-tooltip:first-child+a-icon)):is(:has(>a-icon~a-icon),:has(>:not(a-icon):not(a-tooltip):not(a-copy))){padding-inline-start:max(0px,var(--button-padding-x) - 2px)}&:is(:has(>a-icon:last-child),:has(>a-icon+a-tooltip:last-child)):is(:has(>a-icon~a-icon),:has(>:not(a-icon):not(a-tooltip):not(a-copy))){padding-inline-end:max(0px,var(--button-padding-x) - 2px)}&[loading]{position:relative;pointer-events:none;cursor:wait;&:before{content:"";position:absolute;top:0;bottom:0;left:calc(0px - var(--button-loading-x-period));width:calc(100% + var(--button-loading-x-period));pointer-events:none;clip-path:inset(0 0 0 var(--button-loading-x-period) round var(--_radius));background:repeating-linear-gradient(var(--button-loading-angle),transparent 0,transparent var(--button-loading-stripe-gap),currentColor var(--button-loading-stripe-gap),currentColor calc(var(--button-loading-stripe-gap) + var(--button-loading-stripe)));opacity:var(--button-loading-opacity);filter:blur(var(--button-loading-blur));will-change:transform,clip-path;animation:btn-loading-slide var(--button-loading-duration) linear infinite;animation-delay:-9999s}}--button-fg: light-dark( oklch(from var(--button-fg-secondary-rest) calc(l - .05) c h), var(--button-fg-secondary-rest) );--button-bg: var(--button-bg-secondary-rest);@media(hover:hover)and (pointer:fine){&:hover{--button-fg: var(--button-fg-secondary-hover);--button-bg: var(--button-bg-secondary-hover)}}&:active{--button-fg: var(--button-fg-secondary-hover);--button-bg: var(--button-bg-secondary-active)}&[selected]{--button-fg: var(--button-fg-secondary-hover);--button-bg: var(--button-bg-secondary-hover)}&[priority=primary]{--button-fg: var(--button-fg-primary-rest);--button-bg: var(--button-bg-primary-rest);box-shadow:none;@media(hover:hover)and (pointer:fine){&:hover{--button-bg: var(--button-bg-primary-hover)}}&:active{--button-bg: var(--button-bg-primary-active)}&[selected]{--button-bg: var(--button-bg-primary-hover)}}&[priority=tertiary]{--button-fg: var(--button-fg-tertiary-rest);--button-bg: transparent;box-shadow:none;@media(hover:hover)and (pointer:fine){&:hover{--button-fg: var(--button-fg-tertiary-hover);--button-bg: var(--button-bg-tertiary-hover)}}&:active{--button-fg: var(--button-fg-tertiary-hover);--button-bg: var(--button-bg-tertiary-active)}&[selected]{--button-fg: var(--button-fg-tertiary-hover);--button-bg: var(--button-bg-tertiary-hover)}}&[priority=quaternary]{--button-fg: var(--button-fg-quaternary-rest);--button-bg: transparent;box-shadow:none;font-weight:400;@media(hover:hover)and (pointer:fine){&:hover{--button-fg: var(--button-fg-quaternary-hover)}}&:active{--button-fg: var(--button-fg-quaternary-rest)}&[selected]{--button-fg: var(--button-fg-quaternary-hover)}}&[selected]{box-shadow:inset 0 0 0 .5px currentColor}&[disabled]{background-color:var(--bg-secondary-disabled);color:var(--fg-disabled);&[priority=primary]{background-color:var(--bg-primary-disabled);color:var(--fg-disabled-primary)}&[priority=tertiary],&[priority=quaternary]{background-color:transparent;color:var(--fg-disabled)}}}@media(forced-colors:active){:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit])){--anta-forced-foreground: ButtonText;color:ButtonText;background-color:ButtonFace;border:1px solid ButtonText;box-shadow:none}:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]))[priority=primary]{--anta-forced-foreground: ButtonFace;color:ButtonFace;background-color:ButtonText;border-color:ButtonText}a-button:is([priority=primary],[selected]){forced-color-adjust:none}:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]))[priority=tertiary]{--anta-forced-foreground: CanvasText;color:CanvasText;background-color:Canvas;border:0}@media(hover:hover)and (pointer:fine){:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]))[priority=tertiary]:hover:not(:focus-visible){outline:1px solid ButtonText;outline-offset:0}}:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]))[priority=quaternary]{--anta-forced-foreground: LinkText;color:LinkText;background-color:ButtonFace;border:0;text-decoration:none}:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]))[selected]{--anta-forced-foreground: HighlightText;color:HighlightText;background-color:Highlight;border-color:Highlight}:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]))[disabled]{--anta-forced-foreground: GrayText;color:GrayText;background-color:Canvas;border-color:GrayText;text-decoration-color:GrayText}}}@keyframes btn-loading-slide{to{transform:translate(var(--button-loading-x-period));clip-path:inset(0 var(--button-loading-x-period) 0 0 round var(--_radius))}}
1
+ @layer base,anta,components,utilities;@layer anta.reset,anta.components,anta.theme;@layer anta.components{a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]){--button-primary-fg: #ffffff;--bg-primary-disabled: light-dark(#ece9ec, #272329);--bg-secondary-disabled: light-dark(#f6f4f6, #1d1a1e);--fg-disabled-primary: light-dark(#afa9b1, #776e77);--fg-disabled: light-dark(#afa9b1, #635b65);--button-loading-stripe: 14px;--button-loading-stripe-gap: 16px;--button-loading-period: calc( var(--button-loading-stripe) + var(--button-loading-stripe-gap) );--button-loading-angle: 125deg;--button-loading-x-period: calc( var(--button-loading-period) / cos(var(--button-loading-angle) - 90deg) );--button-loading-opacity: .15;--button-loading-blur: 5px;--_src: var(--anta-seed-neutral);--button-bg-primary-rest: light-dark(oklch(from var(--_src) .5 .02 h), oklch(from var(--_src) .4 .015 h));--button-bg-primary-hover: light-dark(oklch(from var(--_src) .45 .02 h), oklch(from var(--_src) .44 .015 h));--button-bg-primary-active: light-dark(oklch(from var(--_src) .4 .02 h), oklch(from var(--_src) .48 .015 h));--button-fg-primary-rest: var(--button-primary-fg);--button-fg-secondary-rest: light-dark(oklch(from var(--_src) .46 .008 h), oklch(from var(--_src) .86 .015 h));--button-fg-secondary-hover: light-dark(oklch(from var(--_src) .4 .008 h), oklch(from var(--_src) .86 .015 h));--button-fg-tertiary-rest: var(--button-fg-secondary-rest);--button-fg-tertiary-hover: var(--button-fg-secondary-hover);--button-bg-tertiary-hover: light-dark(oklch(from var(--_src) .54 .03 h / .1), oklch(from var(--_src) .44 .01 h / .24));--button-bg-tertiary-active: light-dark(oklch(from var(--_src) .54 .03 h / .15), oklch(from var(--_src) .44 .01 h / .34));--button-fg-quaternary-rest: light-dark(oklch(from var(--_src) .46 .008 h / .85), oklch(from var(--_src) .86 .015 h / .85));--button-fg-quaternary-hover: light-dark(oklch(from var(--_src) .38 .008 h), oklch(from var(--_src) .9 .015 h));--button-bg-secondary-rest: light-dark(oklch(from var(--_src) .54 .03 h / .1), oklch(from var(--_src) .44 .01 h / .24));--button-bg-secondary-hover: light-dark(oklch(from var(--_src) .54 .03 h / .15), oklch(from var(--_src) .44 .01 h / .34));--button-bg-secondary-active: light-dark(oklch(from var(--_src) .54 .03 h / .2), oklch(from var(--_src) .44 .01 h / .44));--_fs: 15px;--_lh: 20px;--_pb: 1px;--_radius: 4px;--_padding-x-text: round( calc(.8em - 2px) , 1px);--button-padding-x: var(--_padding-x-text);--button-padding-y: calc((8px - var(--_pb)) / 2);--button-timing-in: 75ms ease-in;--button-timing-active: 50ms linear;--button-timing-out: .15s ease-out;--button-loading-duration: .5s}a-button[round],a[role=button][data-anta][round],button[data-anta][round],input[data-anta]:is([type=reset],[type=submit])[round]{--button-round: 999px;--_radius: var(--button-round, 999px);@supports (border-radius: attr(probe type(<length>),1px)){--button-round: attr(round type(<length>), 999px)}}a-button[tone]:not([tone=""],[tone=neutral]),a[role=button][data-anta][tone]:not([tone=""],[tone=neutral]),button[data-anta][tone]:not([tone=""],[tone=neutral]),input[data-anta]:is([type=reset],[type=submit])[tone]:not([tone=""],[tone=neutral]){--button-bg-primary-rest: light-dark(oklch(from var(--_src) .51 .17 h), oklch(from var(--_src) .4 .16 h));--button-bg-primary-hover: light-dark(oklch(from var(--_src) .46 .17 h), oklch(from var(--_src) .44 .16 h));--button-bg-primary-active: light-dark(oklch(from var(--_src) .41 .17 h), oklch(from var(--_src) .48 .16 h));--button-fg-secondary-rest: light-dark(oklch(from var(--_src) .46 .17 h), oklch(from var(--_src) .86 .13 h));--button-fg-secondary-hover: light-dark(oklch(from var(--_src) .4 .17 h), oklch(from var(--_src) .86 .13 h));--button-fg-tertiary-rest: var(--button-fg-secondary-rest);--button-fg-tertiary-hover: var(--button-fg-secondary-hover);--button-bg-tertiary-hover: light-dark(oklch(from var(--_src) .54 .17 h / .1), oklch(from var(--_src) .58 .16 h / .215));--button-bg-tertiary-active: light-dark(oklch(from var(--_src) .54 .17 h / .15), oklch(from var(--_src) .58 .16 h / .29));--button-fg-quaternary-rest: light-dark(oklch(from var(--_src) .46 .17 h / .85), oklch(from var(--_src) .86 .13 h / .85));--button-fg-quaternary-hover: light-dark(oklch(from var(--_src) .38 .17 h), oklch(from var(--_src) .9 .13 h));--button-bg-secondary-rest: light-dark(oklch(from var(--_src) .54 .17 h / .1), oklch(from var(--_src) .58 .16 h / .215));--button-bg-secondary-hover: light-dark(oklch(from var(--_src) .54 .17 h / .15), oklch(from var(--_src) .58 .16 h / .29));--button-bg-secondary-active: light-dark(oklch(from var(--_src) .54 .17 h / .2), oklch(from var(--_src) .58 .16 h / .34))}a-button[tone=brand],a[role=button][data-anta][tone=brand],button[data-anta][tone=brand],input[data-anta]:is([type=reset],[type=submit])[tone=brand]{--_src: var(--anta-seed-brand)}a-button[tone=info],a[role=button][data-anta][tone=info],button[data-anta][tone=info],input[data-anta]:is([type=reset],[type=submit])[tone=info]{--_src: var(--anta-seed-info)}a-button[tone=success],a[role=button][data-anta][tone=success],button[data-anta][tone=success],input[data-anta]:is([type=reset],[type=submit])[tone=success]{--_src: var(--anta-seed-success)}a-button[tone=warning],a[role=button][data-anta][tone=warning],button[data-anta][tone=warning],input[data-anta]:is([type=reset],[type=submit])[tone=warning]{--_src: var(--anta-seed-warning)}a-button[tone=critical],a[role=button][data-anta][tone=critical],button[data-anta][tone=critical],input[data-anta]:is([type=reset],[type=submit])[tone=critical]{--_src: var(--anta-seed-critical)}a-button[tone]:not([tone=""],[tone=neutral],[tone=brand],[tone=info],[tone=success],[tone=warning],[tone=critical]),a[role=button][data-anta][tone]:not([tone=""],[tone=neutral],[tone=brand],[tone=info],[tone=success],[tone=warning],[tone=critical]),button[data-anta][tone]:not([tone=""],[tone=neutral],[tone=brand],[tone=info],[tone=success],[tone=warning],[tone=critical]),input[data-anta]:is([type=reset],[type=submit])[tone]:not([tone=""],[tone=neutral],[tone=brand],[tone=info],[tone=success],[tone=warning],[tone=critical]){--_src: var(--button-tone-source, transparent);@supports (color: attr(probe type(<color>),red)){--_src: var(--button-tone-source, attr(tone type(<color>), transparent))}}button[data-anta],input[data-anta]:is([type=reset],[type=submit]){box-sizing:border-box;margin:0;appearance:none;-webkit-appearance:none;border:none}a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]){user-select:none;display:inline-flex;align-items:center;gap:.5ch;cursor:pointer;&:has(>a-copy):not(:has(>a-icon)){cursor:copy}flex-shrink:0;color:var(--button-fg);background-color:var(--button-bg);border-radius:var(--_radius);text-decoration:none;box-shadow:inset 0 0 1px color-mix(in oklch,currentColor,transparent 90%);font-size:var(--_fs);font-family:var(--sans-serif);font-weight:450;font-stretch:normal;line-height:var(--_lh);letter-spacing:.025ch;text-overflow:ellipsis;text-wrap:nowrap;white-space:nowrap;max-width:100%;padding-inline:var(--button-padding-x);padding-block:var(--button-padding-y);min-height:28px;>a-button-label{display:inline-block;text-overflow:ellipsis;text-wrap:nowrap;white-space:nowrap;overflow:hidden;min-width:0;line-height:var(--_lh);padding-bottom:var(--_pb);&:has(>*){display:inline-flex;gap:.25ch}}>*{pointer-events:none}& a-icon{transition:color var(--button-timing-out)}transition:color var(--button-timing-out),background-color var(--button-timing-out);&:hover,&:focus-visible{transition:color var(--button-timing-in),background-color var(--button-timing-in);& a-icon{transition:color var(--button-timing-in)}}&:active,&[selected]{transition:color var(--button-timing-active),background-color var(--button-timing-active);& a-icon{transition:color var(--button-timing-active)}}&[disabled]{pointer-events:none;cursor:not-allowed;transition:none;& a-icon{transition:none}}&:focus-visible{outline:1px solid var(--focus-ring);outline-offset:1px}&[priority=quaternary]{--button-timing-in: 0s;--button-timing-active: 0s;--button-timing-out: 0s}&[size=small]{--_fs: 13px;--_lh: 16px;--_pb: .5px;min-height:24px;& a-icon{--icon-size: 14px}}&[size=large]{--_fs: 17px;--_lh: 24px;--_pb: 1.5px;min-height:32px;& a-icon{--icon-size: 18px}}&[priority=tertiary],&[priority=quaternary]{&[underline=solid]{text-decoration:underline solid}&[underline=dashed]{text-decoration:underline dashed}&[underline=dotted]{text-decoration:underline dotted}&[underline]{text-decoration-color:color-mix(in oklch,currentColor 75%,transparent);text-decoration-thickness:1px;text-underline-offset:3px;&[selected]{text-decoration-color:var(--button-fg);text-decoration-thickness:1px}@media(hover:hover)and (pointer:fine){&:hover{text-decoration-color:var(--button-fg);text-decoration-thickness:1px}}}&[underline][underline-on-hover]{text-decoration-color:transparent;&[selected]{text-decoration-color:transparent}@media(hover:hover)and (pointer:fine){&:hover{text-decoration-color:var(--button-fg)}}}}&[priority=quaternary][paddingless]{--button-padding-x: 0;--button-padding-y: 0;border-radius:min(var(--_radius),3px);min-height:0;&[loading]:before{clip-path:inset(0 0 0 var(--button-loading-x-period) round min(var(--_radius),3px));animation-name:btn-loading-slide-paddingless}}&:has(>a-icon):not(:has(>a-icon~a-icon)):not(:has(>:not(a-icon):not(a-tooltip):not(a-copy))){--button-padding-y: calc(.5em - 1.5px) ;--button-padding-x: var(--button-padding-y);min-height:0;justify-content:center}&:is(:has(>a-icon:first-child),:has(>a-tooltip:first-child+a-icon)):is(:has(>a-icon~a-icon),:has(>:not(a-icon):not(a-tooltip):not(a-copy))){padding-inline-start:max(0px,var(--button-padding-x) - 2px)}&:is(:has(>a-icon:last-child),:has(>a-icon+a-tooltip:last-child)):is(:has(>a-icon~a-icon),:has(>:not(a-icon):not(a-tooltip):not(a-copy))){padding-inline-end:max(0px,var(--button-padding-x) - 2px)}&[loading]{position:relative;pointer-events:none;cursor:wait;&:before{content:"";position:absolute;top:0;bottom:0;left:calc(0px - var(--button-loading-x-period));width:calc(100% + var(--button-loading-x-period));pointer-events:none;clip-path:inset(0 0 0 var(--button-loading-x-period) round var(--_radius));background:repeating-linear-gradient(var(--button-loading-angle),transparent 0,transparent var(--button-loading-stripe-gap),currentColor var(--button-loading-stripe-gap),currentColor calc(var(--button-loading-stripe-gap) + var(--button-loading-stripe)));opacity:var(--button-loading-opacity);filter:blur(var(--button-loading-blur));will-change:transform,clip-path;animation:btn-loading-slide var(--button-loading-duration) linear infinite;animation-delay:-9999s}}--button-fg: light-dark( oklch(from var(--button-fg-secondary-rest) calc(l - .05) c h), var(--button-fg-secondary-rest) );--button-bg: var(--button-bg-secondary-rest);@media(hover:hover)and (pointer:fine){&:hover{--button-fg: var(--button-fg-secondary-hover);--button-bg: var(--button-bg-secondary-hover)}}&:active{--button-fg: var(--button-fg-secondary-hover);--button-bg: var(--button-bg-secondary-active)}&[selected]{--button-fg: var(--button-fg-secondary-hover);--button-bg: var(--button-bg-secondary-hover)}&[priority=primary]{--button-fg: var(--button-fg-primary-rest);--button-bg: var(--button-bg-primary-rest);box-shadow:none;@media(hover:hover)and (pointer:fine){&:hover{--button-bg: var(--button-bg-primary-hover)}}&:active{--button-bg: var(--button-bg-primary-active)}&[selected]{--button-bg: var(--button-bg-primary-hover)}}&[priority=tertiary]{--button-fg: var(--button-fg-tertiary-rest);--button-bg: transparent;box-shadow:none;@media(hover:hover)and (pointer:fine){&:hover{--button-fg: var(--button-fg-tertiary-hover);--button-bg: var(--button-bg-tertiary-hover)}}&:active{--button-fg: var(--button-fg-tertiary-hover);--button-bg: var(--button-bg-tertiary-active)}&[selected]{--button-fg: var(--button-fg-tertiary-hover);--button-bg: var(--button-bg-tertiary-hover)}}&[priority=quaternary]{--button-fg: var(--button-fg-quaternary-rest);--button-bg: transparent;box-shadow:none;font-weight:400;@media(hover:hover)and (pointer:fine){&:hover{--button-fg: var(--button-fg-quaternary-hover)}}&:active{--button-fg: var(--button-fg-quaternary-rest)}&[selected]{--button-fg: var(--button-fg-quaternary-hover)}}&[selected]{box-shadow:inset 0 0 0 1px color-mix(in oklch,currentColor 50%,transparent);&[priority=quaternary][paddingless]{box-shadow:0 0 0 1px color-mix(in oklch,currentColor 50%,transparent)}}&[disabled]{background-color:var(--bg-secondary-disabled);color:var(--fg-disabled);&[priority=primary]{background-color:var(--bg-primary-disabled);color:var(--fg-disabled-primary)}&[priority=tertiary],&[priority=quaternary]{background-color:transparent;color:var(--fg-disabled)}}}@media(forced-colors:active){:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit])){--anta-forced-foreground: ButtonText;color:ButtonText;background-color:ButtonFace;border:1px solid ButtonText;box-shadow:none}:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]))[priority=primary]{--anta-forced-foreground: ButtonFace;color:ButtonFace;background-color:ButtonText;border-color:ButtonText}a-button:is([priority=primary],[selected]){forced-color-adjust:none}:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]))[priority=tertiary]{--anta-forced-foreground: CanvasText;color:CanvasText;background-color:Canvas;border:0}@media(hover:hover)and (pointer:fine){:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]))[priority=tertiary]:hover:not(:focus-visible){outline:1px solid ButtonText;outline-offset:0}}:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]))[priority=quaternary]{--anta-forced-foreground: LinkText;color:LinkText;background-color:ButtonFace;border:0;text-decoration:none}:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]))[selected]{--anta-forced-foreground: HighlightText;color:HighlightText;background-color:Highlight;border-color:Highlight}:is(a-button,a[role=button][data-anta],button[data-anta],input[data-anta]:is([type=reset],[type=submit]))[disabled]{--anta-forced-foreground: GrayText;color:GrayText;background-color:Canvas;border-color:GrayText;text-decoration-color:GrayText}}}@keyframes btn-loading-slide{to{transform:translate(var(--button-loading-x-period));clip-path:inset(0 var(--button-loading-x-period) 0 0 round var(--_radius))}}@keyframes btn-loading-slide-paddingless{to{transform:translate(var(--button-loading-x-period));clip-path:inset(0 var(--button-loading-x-period) 0 0 round min(var(--_radius),3px))}}
@@ -1,4 +1,4 @@
1
- import { HTMLElementBase, SYNC_POPUP_ARIA, type PopupAriaRelations } from "../anta_helpers";
1
+ import { HTMLElementBase, SYNC_POPUP_ARIA, type PopupAriaRelations, SYNC_TEXT_TOGGLE, type TextToggleAria } from "../anta_helpers";
2
2
  import "./a-button.css";
3
3
  declare global {
4
4
  interface Document {
@@ -22,8 +22,9 @@ declare global {
22
22
  * covers named and custom tones alike; secondary also carries a 1px
23
23
  * hairline box-shadow in the current fg tone at 50% alpha, which the
24
24
  * other priorities cancel in their own blocks. `[selected]` adds a 1px
25
- * inset ring in `currentColor`, declared after the priority blocks so it
26
- * survives their `box-shadow: none` cancels.
25
+ * inset ring at 50% `currentColor`, declared after the priority blocks so it
26
+ * survives their `box-shadow: none` cancels. Paddingless uses an outside ring
27
+ * so the selection mark stays clear of the label.
27
28
  * - **Dark mode** re-tunes with heavier alphas (30/40% vs 10/15%) and flips
28
29
  * neutral's anchor to a lilac — mixing dark gray into a dark bg yields no
29
30
  * contrast.
@@ -43,10 +44,11 @@ declare global {
43
44
  * - **Layout gotchas:** `flex-shrink: 0` (shrinking + `overflow: hidden`
44
45
  * would clip the label silently); the label uses a 17px line box + 1px
45
46
  * bottom padding for optical vertical centering at an unchanged 18px box.
46
- * - **Icon-only** is purely structural — `:has(> a-icon:only-child)` gives
47
- * square padding + a min-size pin (and centers when the host is sized
48
- * bigger). A non-only edge icon trims ~2px off its side's padding
49
- * (optical), `max(0px, …)` keeping paddingless at 0.
47
+ * - **Icon-only** is purely structural: one direct icon, with optional
48
+ * tooltip or copy helpers, gets equal font-relative padding on both axes
49
+ * and no size floor. The default icons produce 24/28/32px square boxes.
50
+ * A non-only edge icon trims 2px off its side's padding; `max(0px, …)`
51
+ * keeps paddingless at 0.
50
52
  * - **Underline** renders only on tertiary/quaternary: 0.5px hairline at 75%
51
53
  * alpha at rest, 1px at full alpha on hover/`[selected]`, mirroring the
52
54
  * prose-link rule in `<Text>`.
@@ -71,6 +73,7 @@ export declare class AButtonElement extends HTMLElementBase {
71
73
  connectedCallback(): void;
72
74
  disconnectedCallback(): void;
73
75
  attributeChangedCallback(): void;
76
+ [SYNC_TEXT_TOGGLE](state: TextToggleAria): void;
74
77
  [SYNC_POPUP_ARIA](relations: PopupAriaRelations): void;
75
78
  }
76
79
  export declare function register_a_button(): void;