@aortl/admin-react 0.12.1 → 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,5 +12,5 @@ export interface AdminRootProps extends ComponentProps<"div"> {
12
12
  */
13
13
  systemAccent?: string;
14
14
  }
15
- export declare function AdminRoot({ className, theme, systemAccent, style, ...rest }: AdminRootProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function AdminRoot({ className, theme, systemAccent, style, ref, ...rest }: AdminRootProps): import("react/jsx-runtime").JSX.Element;
16
16
  //# sourceMappingURL=AdminRoot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminRoot.d.ts","sourceRoot":"","sources":["../src/AdminRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,OAAO,CAAC;AAG3D,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC3D;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,2CAc3F"}
1
+ {"version":3,"file":"AdminRoot.d.ts","sourceRoot":"","sources":["../src/AdminRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2C,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAIrF,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC3D;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,2CAgChG"}
package/dist/Button.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Button as BaseButton } from '@base-ui/react/button';
2
2
  import { ComponentProps } from 'react';
3
3
  import { IconProp } from './icon';
4
- export type ButtonVariant = "default" | "primary" | "ghost" | "danger";
4
+ export type ButtonVariant = "default" | "primary" | "ghost" | "muted" | "danger";
5
5
  export type ButtonSize = "sm" | "md" | "lg";
6
6
  export interface ButtonProps extends ComponentProps<typeof BaseButton> {
7
7
  variant?: ButtonVariant;
@@ -15,13 +15,14 @@ export interface ButtonProps extends ComponentProps<typeof BaseButton> {
15
15
  /** Trailing icon. Pass a component (`iconTrailing={IconArrowRight}`) or an element. */
16
16
  iconTrailing?: IconProp;
17
17
  /**
18
- * Keyboard shortcut bound to this button. Pressing the chord invokes the
19
- * button's `onClick` handler not a real DOM click, so `type="submit"`
20
- * form submission and other native side effects only happen if `onClick`
21
- * triggers them itself. Same syntax as `useHotkey`. Pass an array for
22
- * alternatives — only the first is rendered as a visual chip.
18
+ * Keyboard shortcut bound to this button. Pressing the chord dispatches a
19
+ * native click on the underlying element, so `onClick` fires, `type="submit"`
20
+ * submits the form, and an anchor-rendered button (`render={<a href>}`)
21
+ * navigates all the native side effects of a real click. Same syntax as
22
+ * `useHotkey`. Pass an array for alternatives — only the first is rendered as
23
+ * a visual chip.
23
24
  */
24
25
  hotkey?: string | readonly string[];
25
26
  }
26
- export declare function Button({ variant, size, fullWidth, loading, icon, iconTrailing, hotkey, className, type, disabled, children, onClick, ...rest }: ButtonProps): import("react/jsx-runtime").JSX.Element;
27
+ export declare function Button({ variant, size, fullWidth, loading, icon, iconTrailing, hotkey, className, type, disabled, children, onClick, ref, ...rest }: ButtonProps): import("react/jsx-runtime").JSX.Element;
27
28
  //# sourceMappingURL=Button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../src/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAInD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AACvE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,OAAO,UAAU,CAAC;IACpE,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;uEACmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,uFAAuF;IACvF,YAAY,CAAC,EAAE,QAAQ,CAAC;IACxB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,wBAAgB,MAAM,CAAC,EACrB,OAAmB,EACnB,IAAW,EACX,SAAS,EACT,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,SAAS,EACT,IAAe,EACf,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,GAAG,IAAI,EACR,EAAE,WAAW,2CAoCb"}
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../src/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAInD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AACjF,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,MAAM,WAAW,WAAY,SAAQ,cAAc,CAAC,OAAO,UAAU,CAAC;IACpE,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;uEACmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,uFAAuF;IACvF,YAAY,CAAC,EAAE,QAAQ,CAAC;IACxB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,wBAAgB,MAAM,CAAC,EACrB,OAAmB,EACnB,IAAW,EACX,SAAS,EACT,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,SAAS,EACT,IAAe,EACf,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,GAAG,EACH,GAAG,IAAI,EACR,EAAE,WAAW,2CA+Cb"}
@@ -2,6 +2,12 @@ import { ComponentProps } from 'react';
2
2
  export type ButtonGroupOrientation = "horizontal" | "vertical";
3
3
  export interface ButtonGroupProps extends ComponentProps<"div"> {
4
4
  orientation?: ButtonGroupOrientation;
5
+ /**
6
+ * Stretch the group across its container. Horizontal groups split the row
7
+ * evenly so every button is the same width; vertical groups fill the
8
+ * container width.
9
+ */
10
+ fullWidth?: boolean;
5
11
  }
6
- export declare function ButtonGroup({ orientation, role, className, ...rest }: ButtonGroupProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function ButtonGroup({ orientation, fullWidth, role, className, ...rest }: ButtonGroupProps): import("react/jsx-runtime").JSX.Element;
7
13
  //# sourceMappingURL=ButtonGroup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ButtonGroup.d.ts","sourceRoot":"","sources":["../src/ButtonGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,UAAU,CAAC;AAE/D,MAAM,WAAW,gBAAiB,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC7D,WAAW,CAAC,EAAE,sBAAsB,CAAC;CACtC;AAED,wBAAgB,WAAW,CAAC,EAC1B,WAA0B,EAC1B,IAAc,EACd,SAAS,EACT,GAAG,IAAI,EACR,EAAE,gBAAgB,2CAQlB"}
1
+ {"version":3,"file":"ButtonGroup.d.ts","sourceRoot":"","sources":["../src/ButtonGroup.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,MAAM,sBAAsB,GAAG,YAAY,GAAG,UAAU,CAAC;AAE/D,MAAM,WAAW,gBAAiB,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC7D,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,EAC1B,WAA0B,EAC1B,SAAiB,EACjB,IAAc,EACd,SAAS,EACT,GAAG,IAAI,EACR,EAAE,gBAAgB,2CAelB"}
package/dist/Input.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Input as BaseInput } from '@base-ui/react/input';
2
2
  import { ComponentProps } from 'react';
3
- export type InputVariant = "bordered" | "ghost" | "danger";
3
+ export type InputVariant = "bordered" | "ghost" | "danger" | "info" | "success" | "warning";
4
4
  export type InputSize = "sm" | "md" | "lg";
5
5
  type BaseInputProps = Omit<ComponentProps<typeof BaseInput>, "size">;
6
6
  export interface InputProps extends BaseInputProps {
@@ -1 +1 @@
1
- {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../src/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,KAAK,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;AAErE,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,wBAAgB,KAAK,CAAC,EACpB,OAAoB,EACpB,SAAgB,EAChB,SAAS,EACT,IAAa,EACb,GAAG,IAAI,EACR,EAAE,UAAU,2CAeZ"}
1
+ {"version":3,"file":"Input.d.ts","sourceRoot":"","sources":["../src/Input.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAC5F,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,KAAK,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;AAErE,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,wBAAgB,KAAK,CAAC,EACpB,OAAoB,EACpB,SAAgB,EAChB,SAAS,EACT,IAAa,EACb,GAAG,IAAI,EACR,EAAE,UAAU,2CAeZ"}
package/dist/Link.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { ComponentProps } from 'react';
2
+ import { IconProp } from './icon';
3
+ export interface LinkProps extends ComponentProps<"a"> {
4
+ /**
5
+ * Marks the link as leaving the app: renders a trailing ↗ affordance and
6
+ * defaults `target="_blank"` + `rel="noopener noreferrer"`. Explicit
7
+ * `target`/`rel` props win, so you can keep the icon while overriding either.
8
+ */
9
+ external?: boolean;
10
+ /** Leading icon. Pass a component (`icon={IconHome}`) or an element. */
11
+ icon?: IconProp;
12
+ /** Trailing icon. Independent of `external`'s ↗ affordance. */
13
+ iconTrailing?: IconProp;
14
+ }
15
+ /**
16
+ * A text link — a plain `<a>` with the design system's link styling: primary
17
+ * color, hover shift, underline, and a focus-visible ring. Pass `external` for
18
+ * the new-tab affordance.
19
+ */
20
+ export declare function Link({ external, icon, iconTrailing, className, target, rel, children, ...rest }: LinkProps): import("react/jsx-runtime").JSX.Element;
21
+ //# sourceMappingURL=Link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Link.d.ts","sourceRoot":"","sources":["../src/Link.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEnD,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,GAAG,CAAC;IACpD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wEAAwE;IACxE,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,QAAQ,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,EACnB,QAAQ,EACR,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,MAAM,EACN,GAAG,EACH,QAAQ,EACR,GAAG,IAAI,EACR,EAAE,SAAS,2CAaX"}
@@ -1,9 +1,22 @@
1
1
  import { ComponentProps } from 'react';
2
- export type TextareaVariant = "bordered" | "ghost" | "danger";
2
+ export type TextareaVariant = "bordered" | "ghost" | "danger" | "info" | "success" | "warning";
3
3
  export type TextareaSize = "sm" | "md" | "lg";
4
4
  export interface TextareaProps extends Omit<ComponentProps<"textarea">, "size"> {
5
5
  variant?: TextareaVariant;
6
6
  textareaSize?: TextareaSize;
7
+ /**
8
+ * Height tracks content via CSS `field-sizing` (Chromium-only today; other
9
+ * browsers keep a fixed, resizable box). `rows`/min-height is the floor —
10
+ * set `max-height` via `className`/`style` for a ceiling.
11
+ */
12
+ autoResize?: boolean;
7
13
  }
8
- export declare function Textarea({ variant, textareaSize, className, ...rest }: TextareaProps): import("react/jsx-runtime").JSX.Element;
14
+ /**
15
+ * Multi-line text input. Rendered through Base UI's `Field.Control` with a
16
+ * `<textarea>` swapped in for the default `<input>`, so inside a `<Field>` it
17
+ * gets the same wiring as `<Input>`: a generated id, label `htmlFor`
18
+ * association, and validity-driven `:user-valid` / `<Field.Error>`. Works
19
+ * standalone too — `Field.Control` falls back to a default context.
20
+ */
21
+ export declare function Textarea({ variant, textareaSize, autoResize, className, ...rest }: TextareaProps): import("react/jsx-runtime").JSX.Element;
9
22
  //# sourceMappingURL=Textarea.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.d.ts","sourceRoot":"","sources":["../src/Textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7E,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,wBAAgB,QAAQ,CAAC,EACvB,OAAoB,EACpB,YAAmB,EACnB,SAAS,EACT,GAAG,IAAI,EACR,EAAE,aAAa,2CAcf"}
1
+ {"version":3,"file":"Textarea.d.ts","sourceRoot":"","sources":["../src/Textarea.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAC/F,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7E,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,EACvB,OAAoB,EACpB,YAAmB,EACnB,UAAU,EACV,SAAS,EACT,GAAG,IAAI,EACR,EAAE,aAAa,2CAmBf"}
@@ -704,6 +704,9 @@
704
704
  :scope._ao-accordion-summary::-webkit-details-marker, :scope ._ao-accordion-summary::-webkit-details-marker {
705
705
  display: none;
706
706
  }
707
+ :scope._ao-accordion-summary > :is(i, svg), :scope ._ao-accordion-summary > :is(i, svg) {
708
+ flex-shrink: 0;
709
+ }
707
710
  :scope._ao-accordion-summary::after, :scope ._ao-accordion-summary::after {
708
711
  content: "";
709
712
  width: 0.5rem;
@@ -896,6 +899,9 @@
896
899
  white-space: nowrap;
897
900
  color: var(--color-text);
898
901
  }
902
+ :scope._ao-badge > :is(i, svg), :scope ._ao-badge > :is(i, svg) {
903
+ flex-shrink: 0;
904
+ }
899
905
  :scope._ao-badge-info, :scope ._ao-badge-info {
900
906
  border-color: var(--color-info-muted);
901
907
  background-color: var(--color-info-muted);
@@ -1235,6 +1241,9 @@
1235
1241
  width: 0.875rem;
1236
1242
  height: 0.875rem;
1237
1243
  }
1244
+ :scope._ao-breadcrumb-item > :is(i, svg), :scope ._ao-breadcrumb-item > :is(i, svg), :scope._ao-breadcrumb-separator > :is(i, svg), :scope ._ao-breadcrumb-separator > :is(i, svg) {
1245
+ flex-shrink: 0;
1246
+ }
1238
1247
  :scope._ao-pagination > ol, :scope ._ao-pagination > ol, :scope._ao-pagination > ul, :scope ._ao-pagination > ul {
1239
1248
  margin: calc(var(--spacing) * 0);
1240
1249
  display: inline-flex;
@@ -1473,6 +1482,9 @@
1473
1482
  opacity: 50%;
1474
1483
  }
1475
1484
  }
1485
+ :scope._ao-btn > :is(i, svg), :scope ._ao-btn > :is(i, svg) {
1486
+ flex-shrink: 0;
1487
+ }
1476
1488
  :scope._ao-btn-primary, :scope ._ao-btn-primary {
1477
1489
  border-color: transparent;
1478
1490
  background-color: var(--color-primary);
@@ -1493,6 +1505,14 @@
1493
1505
  }
1494
1506
  }
1495
1507
  }
1508
+ :scope._ao-btn-muted, :scope ._ao-btn-muted {
1509
+ background-color: var(--color-surface);
1510
+ &:hover {
1511
+ @media (hover: hover) {
1512
+ background-color: var(--color-surface-muted);
1513
+ }
1514
+ }
1515
+ }
1496
1516
  :scope._ao-btn-danger, :scope ._ao-btn-danger {
1497
1517
  border-color: transparent;
1498
1518
  background-color: var(--color-danger);
@@ -1617,6 +1637,60 @@
1617
1637
  border-top-color: color-mix(in srgb, currentColor 25%, transparent);
1618
1638
  }
1619
1639
  }
1640
+ :scope._ao-btn-group-full-width:not(._ao-btn-group-vertical), :scope ._ao-btn-group-full-width:not(._ao-btn-group-vertical) {
1641
+ display: flex;
1642
+ width: 100%;
1643
+ }
1644
+ :scope._ao-btn-group-full-width:not(._ao-btn-group-vertical) > ._ao-btn, :scope ._ao-btn-group-full-width:not(._ao-btn-group-vertical) > ._ao-btn, :scope._ao-btn-group-full-width:not(._ao-btn-group-vertical) > ._ao-menu, :scope ._ao-btn-group-full-width:not(._ao-btn-group-vertical) > ._ao-menu {
1645
+ flex: 1;
1646
+ }
1647
+ :scope._ao-btn-group-full-width._ao-btn-group-vertical, :scope ._ao-btn-group-full-width._ao-btn-group-vertical {
1648
+ width: 100%;
1649
+ }
1650
+ :scope._ao-link, :scope ._ao-link {
1651
+ display: inline-flex;
1652
+ align-items: center;
1653
+ gap: calc(var(--spacing) * 1);
1654
+ border-radius: var(--radius-sm);
1655
+ color: var(--color-primary);
1656
+ text-decoration-line: underline;
1657
+ text-underline-offset: 2px;
1658
+ transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
1659
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
1660
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
1661
+ --tw-duration: 150ms;
1662
+ transition-duration: 150ms;
1663
+ &:hover {
1664
+ @media (hover: hover) {
1665
+ color: var(--color-primary-hover);
1666
+ }
1667
+ }
1668
+ &:focus-visible {
1669
+ outline-style: var(--tw-outline-style);
1670
+ outline-width: 2px;
1671
+ }
1672
+ &:focus-visible {
1673
+ outline-offset: 2px;
1674
+ }
1675
+ &:focus-visible {
1676
+ outline-color: var(--color-primary);
1677
+ }
1678
+ }
1679
+ :scope._ao-link > :is(i, svg), :scope ._ao-link > :is(i, svg) {
1680
+ flex-shrink: 0;
1681
+ }
1682
+ :scope._ao-link-external, :scope ._ao-link-external {
1683
+ --link-external-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M17 7 7 17'/%3E%3Cpath d='M8 7h9v9'/%3E%3C/svg%3E");
1684
+ }
1685
+ :scope._ao-link-external::after, :scope ._ao-link-external::after {
1686
+ content: "";
1687
+ flex: none;
1688
+ width: 0.85em;
1689
+ height: 0.85em;
1690
+ background-color: currentColor;
1691
+ -webkit-mask: var(--link-external-arrow) center / contain no-repeat;
1692
+ mask: var(--link-external-arrow) center / contain no-repeat;
1693
+ }
1620
1694
  :scope._ao-input, :scope ._ao-input {
1621
1695
  display: inline-flex;
1622
1696
  width: 100%;
@@ -1688,6 +1762,39 @@
1688
1762
  outline-color: var(--color-danger);
1689
1763
  }
1690
1764
  }
1765
+ :scope._ao-input-info, :scope ._ao-input-info {
1766
+ border-color: var(--color-info);
1767
+ &:hover {
1768
+ @media (hover: hover) {
1769
+ border-color: var(--color-info);
1770
+ }
1771
+ }
1772
+ &:focus-visible {
1773
+ outline-color: var(--color-info);
1774
+ }
1775
+ }
1776
+ :scope._ao-input-success, :scope ._ao-input-success {
1777
+ border-color: var(--color-success);
1778
+ &:hover {
1779
+ @media (hover: hover) {
1780
+ border-color: var(--color-success);
1781
+ }
1782
+ }
1783
+ &:focus-visible {
1784
+ outline-color: var(--color-success);
1785
+ }
1786
+ }
1787
+ :scope._ao-input-warning, :scope ._ao-input-warning {
1788
+ border-color: var(--color-warning);
1789
+ &:hover {
1790
+ @media (hover: hover) {
1791
+ border-color: var(--color-warning);
1792
+ }
1793
+ }
1794
+ &:focus-visible {
1795
+ outline-color: var(--color-warning);
1796
+ }
1797
+ }
1691
1798
  :scope._ao-input-sm, :scope ._ao-input-sm {
1692
1799
  padding-inline: calc(var(--spacing) * 2.5);
1693
1800
  padding-block: calc(var(--spacing) * 1.5);
@@ -1816,6 +1923,43 @@
1816
1923
  outline-color: var(--color-danger);
1817
1924
  }
1818
1925
  }
1926
+ :scope._ao-textarea-info, :scope ._ao-textarea-info {
1927
+ border-color: var(--color-info);
1928
+ &:hover {
1929
+ @media (hover: hover) {
1930
+ border-color: var(--color-info);
1931
+ }
1932
+ }
1933
+ &:focus-visible {
1934
+ outline-color: var(--color-info);
1935
+ }
1936
+ }
1937
+ :scope._ao-textarea-success, :scope ._ao-textarea-success {
1938
+ border-color: var(--color-success);
1939
+ &:hover {
1940
+ @media (hover: hover) {
1941
+ border-color: var(--color-success);
1942
+ }
1943
+ }
1944
+ &:focus-visible {
1945
+ outline-color: var(--color-success);
1946
+ }
1947
+ }
1948
+ :scope._ao-textarea-warning, :scope ._ao-textarea-warning {
1949
+ border-color: var(--color-warning);
1950
+ &:hover {
1951
+ @media (hover: hover) {
1952
+ border-color: var(--color-warning);
1953
+ }
1954
+ }
1955
+ &:focus-visible {
1956
+ outline-color: var(--color-warning);
1957
+ }
1958
+ }
1959
+ :scope._ao-textarea-autosize, :scope ._ao-textarea-autosize {
1960
+ field-sizing: content;
1961
+ resize: none;
1962
+ }
1819
1963
  :scope._ao-textarea-sm, :scope ._ao-textarea-sm {
1820
1964
  min-height: calc(var(--spacing) * 16);
1821
1965
  padding-inline: calc(var(--spacing) * 2.5);
@@ -2396,6 +2540,9 @@
2396
2540
  font-weight: var(--font-weight-medium);
2397
2541
  color: var(--color-text-muted);
2398
2542
  }
2543
+ :scope._ao-stat-card-label > :is(i, svg), :scope ._ao-stat-card-label > :is(i, svg) {
2544
+ flex-shrink: 0;
2545
+ }
2399
2546
  :scope._ao-stat-card-value, :scope ._ao-stat-card-value {
2400
2547
  font-size: var(--text-2xl);
2401
2548
  line-height: var(--tw-leading, var(--text-2xl--line-height));
@@ -2954,6 +3101,9 @@
2954
3101
  cursor: not-allowed;
2955
3102
  opacity: 50%;
2956
3103
  }
3104
+ :scope._ao-menu-trigger > :is(i, svg), :scope ._ao-menu-trigger > :is(i, svg), :scope._ao-menu-item > :is(i, svg), :scope ._ao-menu-item > :is(i, svg) {
3105
+ flex-shrink: 0;
3106
+ }
2957
3107
  :scope._ao-menu-separator, :scope ._ao-menu-separator {
2958
3108
  margin-block: calc(var(--spacing) * 1);
2959
3109
  height: 1px;
@@ -3045,6 +3195,9 @@
3045
3195
  background-color: var(--color-primary-muted);
3046
3196
  color: var(--color-primary);
3047
3197
  }
3198
+ :scope._ao-navbar-brand > :is(i, svg), :scope ._ao-navbar-brand > :is(i, svg), :scope._ao-navbar-item > :is(i, svg), :scope ._ao-navbar-item > :is(i, svg) {
3199
+ flex-shrink: 0;
3200
+ }
3048
3201
  :scope._ao-navbar-actions, :scope ._ao-navbar-actions {
3049
3202
  margin-left: auto;
3050
3203
  display: flex;
@@ -3527,6 +3680,9 @@
3527
3680
  :scope._ao-tabs ._ao-tab[data-selected], :scope ._ao-tabs ._ao-tab[data-selected], :scope._ao-tabs ._ao-tab[aria-selected="true"], :scope ._ao-tabs ._ao-tab[aria-selected="true"] {
3528
3681
  color: var(--color-text);
3529
3682
  }
3683
+ :scope._ao-tabs ._ao-tab > :is(i, svg), :scope ._ao-tabs ._ao-tab > :is(i, svg) {
3684
+ flex-shrink: 0;
3685
+ }
3530
3686
  :scope._ao-tabs ._ao-tab-input, :scope ._ao-tabs ._ao-tab-input {
3531
3687
  position: absolute;
3532
3688
  width: 1px;
@@ -1,13 +1,16 @@
1
1
  /**
2
2
  * Pure helpers for the hotkey system. Chord syntax: `<mod>+<mod>+…+<key>`
3
3
  *
4
- * Examples: `mod+s`, `shift+?`, `escape`, `mod+shift+k`, `arrowup`.
4
+ * Examples: `mod+s`, `?`, `escape`, `mod+shift+k`, `arrowup`.
5
5
  *
6
- * Modifiers are case-insensitive. `mod` is an alias for `ctrl` on every
7
- * platformdisplay and binding both render as `Ctrl`. The key is whatever
8
- * `KeyboardEvent.key` produces, lowercased. So pressing `shift+/` (which
9
- * yields `event.key === "?"`) is canonically `shift+?` match it by
10
- * binding either `"shift+?"`.
6
+ * Modifiers are case-insensitive. `mod` resolves to the platform's primary
7
+ * command modifier (`meta`) on Apple platforms, `Ctrl` elsewhere so
8
+ * `mod+s` fires on the OS-native gesture (Cmd+S on macOS, Ctrl+S otherwise)
9
+ * and the `<Kbd>` chip follows suit. The key is whatever
10
+ * `KeyboardEvent.key` produces, lowercased. A shifted printable symbol already
11
+ * encodes Shift in the character it produces, so bind `"?"` (not `"shift+?"`)
12
+ * to catch `shift+/`; `shift` stays explicit for letters and named keys, so
13
+ * `shift+a` and `shift+tab` remain distinct chords.
11
14
  */
12
15
  export type Modifier = "ctrl" | "shift" | "alt" | "meta";
13
16
  export interface ParsedChord {
@@ -1 +1 @@
1
- {"version":3,"file":"hotkey-parse.d.ts","sourceRoot":"","sources":["../src/hotkey-parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb;AAqBD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA2BrD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,WAAW,EAAE,CAGzE;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAOvD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAW9D;AAyBD,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CAcxD;AAkBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAEzE"}
1
+ {"version":3,"file":"hotkey-parse.d.ts","sourceRoot":"","sources":["../src/hotkey-parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb;AAsCD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA2BrD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,WAAW,EAAE,CAGzE;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAOvD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAgB9D;AA4BD,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CAcxD;AAkBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAEzE"}
@@ -4,11 +4,12 @@ import { RefObject } from 'react';
4
4
  * attached on first registration and detached when the registry empties.
5
5
  *
6
6
  * On keydown:
7
- * 1. Normalize the event to a canonical chord string.
8
- * 2. Look up the bucket. Skip if empty.
9
- * 3. Apply input suppression bare-key chords are skipped while focus is
7
+ * 1. Ignore OS autorepeat (`e.repeat`) so a held chord fires once, not per tick.
8
+ * 2. Normalize the event to a canonical chord string.
9
+ * 3. Look up the bucket. Skip if empty.
10
+ * 4. Apply input suppression — bare-key chords are skipped while focus is
10
11
  * in an editable element, except for `escape`.
11
- * 4. `preventDefault()`, then invoke every surviving handler (bag semantics).
12
+ * 5. `preventDefault()`, then invoke every surviving handler (bag semantics).
12
13
  */
13
14
  export type HotkeyHandler = (e: KeyboardEvent) => void;
14
15
  export interface HotkeyEntry {
@@ -1 +1 @@
1
- {"version":3,"file":"hotkey-registry.d.ts","sourceRoot":"","sources":["../src/hotkey-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;CACtC;AA0CD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,IAAI,CAmB3F;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}
1
+ {"version":3,"file":"hotkey-registry.d.ts","sourceRoot":"","sources":["../src/hotkey-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;CACtC;AA6CD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,IAAI,CAmB3F;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}