@adamjanicki/ui 1.6.1 → 1.6.3

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.
@@ -0,0 +1,26 @@
1
+ import React from "react";
2
+ import type { CornerType, SizeToken } from "../../utils/types";
3
+ import { type BoxProps } from "../Box/Box";
4
+ type Props = Omit<BoxProps, "children"> & {
5
+ /**
6
+ * How to treat the border radius of the avatar
7
+ * @default "rounded"
8
+ */
9
+ corners?: CornerType;
10
+ /**
11
+ * Size of the avatar
12
+ * @default "s"
13
+ */
14
+ size?: SizeToken | number;
15
+ /**
16
+ * Image to be used in the background
17
+ */
18
+ backgroundImage?: string;
19
+ /**
20
+ * Username to render the first char of,
21
+ * or as a fallback if there's a 404 getting the backgroundImage url
22
+ */
23
+ username: string;
24
+ };
25
+ declare const Avatar: React.ForwardRefExoticComponent<Omit<Props, "ref"> & React.RefAttributes<HTMLDivElement>>;
26
+ export default Avatar;
@@ -0,0 +1,56 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
20
+ }
21
+ return t;
22
+ };
23
+ import { jsx as _jsx } from "react/jsx-runtime";
24
+ import React, { useState } from "react";
25
+ import Box from "../Box/Box";
26
+ import { classNames } from "../../functions";
27
+ var Avatar = React.forwardRef(function (_a, ref) {
28
+ var _b = _a.size, size = _b === void 0 ? "s" : _b, backgroundImage = _a.backgroundImage, className = _a.className, style = _a.style, _c = _a.corners, corners = _c === void 0 ? "rounded" : _c, username = _a.username, rest = __rest(_a, ["size", "backgroundImage", "className", "style", "corners", "username"]);
29
+ var _d = useState(false), imageError = _d[0], setImageError = _d[1];
30
+ var useFallback = imageError || !backgroundImage;
31
+ var color = chooseColor(username);
32
+ var avatarClassName = "aui-avatar aui-corners--".concat(corners);
33
+ if (useFallback) {
34
+ avatarClassName = classNames(avatarClassName, "aui-avatar-".concat(color));
35
+ }
36
+ var imageClassName = undefined;
37
+ var avatarStyle = {};
38
+ var imageStyle = undefined;
39
+ if (typeof size === "number") {
40
+ avatarStyle = { width: size, height: size, fontSize: 0.8 * size };
41
+ imageStyle = { width: size, height: size };
42
+ }
43
+ else {
44
+ avatarClassName = classNames(avatarClassName, "aui-avatar-".concat(size));
45
+ imageClassName = "aui-avatar-".concat(size);
46
+ }
47
+ var fallbackCharacter = username[0];
48
+ return (_jsx(Box, __assign({ className: classNames(avatarClassName, className), style: __assign(__assign({}, avatarStyle), style) }, rest, { ref: ref, children: !useFallback ? (_jsx("img", { src: backgroundImage, alt: "", className: imageClassName, onError: function () { return setImageError(true); }, style: imageStyle })) : (fallbackCharacter) })));
49
+ });
50
+ var colorOptions = ["red", "yellow", "green", "blue", "purple"];
51
+ // simple deterministic "hash" to get a background color
52
+ function chooseColor(username) {
53
+ return colorOptions[username.split("").reduce(function (sum, char) { return sum + char.charCodeAt(0); }, 0) %
54
+ colorOptions.length];
55
+ }
56
+ export default Avatar;
@@ -0,0 +1,2 @@
1
+ import Avatar from "./Avatar";
2
+ export default Avatar;
@@ -0,0 +1,2 @@
1
+ import Avatar from "./Avatar";
2
+ export default Avatar;
@@ -1,6 +1,8 @@
1
1
  import React from "react";
2
2
  import type { CornerType, Layout } from "../../utils/types";
3
- type DefaultButtonProps = React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement> & {
3
+ import { Props as IconProps } from "../Icon/Icon";
4
+ type BaseButtonProps = React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
5
+ type DefaultButtonProps = BaseButtonProps & {
4
6
  /**
5
7
  * Additional styles to apply to the layout that are transformed to classNames to be easier to override if needed
6
8
  */
@@ -25,6 +27,26 @@ export type VisualButtonProps = {
25
27
  };
26
28
  type ButtonProps = DefaultButtonProps & VisualButtonProps;
27
29
  export declare const UnstyledButton: React.ForwardRefExoticComponent<Omit<DefaultButtonProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
30
+ type IconButtonProps = Omit<BaseButtonProps, "children"> & {
31
+ /**
32
+ * The hover effect to play when the user hovers over the button
33
+ * @default "dim"
34
+ */
35
+ variant?: "dim" | "undim";
36
+ /**
37
+ * Which icon to render in the button
38
+ */
39
+ icon: IconProps["icon"];
40
+ /**
41
+ * The size of the icon
42
+ */
43
+ size?: IconProps["size"];
44
+ /**
45
+ * Other props to pass to the icon element
46
+ */
47
+ iconProps?: Omit<IconProps, "icon" | "size">;
48
+ };
49
+ export declare const IconButton: React.ForwardRefExoticComponent<Omit<IconButtonProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
28
50
  declare const Button: React.ForwardRefExoticComponent<Omit<ButtonProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
29
51
  export declare const getButtonClassName: ({ variant, corners, size, }: VisualButtonProps) => string;
30
52
  export default Button;
@@ -24,13 +24,18 @@ import { jsx as _jsx } from "react/jsx-runtime";
24
24
  import React from "react";
25
25
  import classNames from "../../functions/classNames";
26
26
  import transformLayout from "../../utils/transformLayout";
27
+ import Icon from "../Icon/Icon";
27
28
  export var UnstyledButton = React.forwardRef(function (_a, ref) {
28
29
  var className = _a.className, layout = _a.layout, props = __rest(_a, ["className", "layout"]);
29
30
  return (_jsx("button", __assign({}, props, { className: classNames("aui-action aui-button", transformLayout(layout), className), ref: ref })));
30
31
  });
32
+ export var IconButton = React.forwardRef(function (_a, ref) {
33
+ var icon = _a.icon, size = _a.size, iconProps = _a.iconProps, _b = _a.variant, variant = _b === void 0 ? "dim" : _b, className = _a.className, rest = __rest(_a, ["icon", "size", "iconProps", "variant", "className"]);
34
+ return (_jsx(UnstyledButton, __assign({}, rest, { layout: { axis: "x", align: "center", justify: "center" }, className: classNames("aui-".concat(variant), className), ref: ref, children: _jsx(Icon, __assign({ icon: icon, size: size }, iconProps)) })));
35
+ });
31
36
  var Button = React.forwardRef(function (_a, ref) {
32
- var variant = _a.variant, corners = _a.corners, className = _a.className, size = _a.size, rest = __rest(_a, ["variant", "corners", "className", "size"]);
33
- return (_jsx(UnstyledButton, __assign({}, rest, { className: classNames(getButtonClassName({ variant: variant, corners: corners, size: size }), className), ref: ref })));
37
+ var variant = _a.variant, layout = _a.layout, corners = _a.corners, className = _a.className, size = _a.size, rest = __rest(_a, ["variant", "layout", "corners", "className", "size"]);
38
+ return (_jsx(UnstyledButton, __assign({}, rest, { className: classNames(getButtonClassName({ variant: variant, corners: corners, size: size }), transformLayout(layout), className), ref: ref })));
34
39
  });
35
40
  export var getButtonClassName = function (_a) {
36
41
  var _b = _a.variant, variant = _b === void 0 ? "primary" : _b, _c = _a.corners, corners = _c === void 0 ? "rounded" : _c, _d = _a.size, size = _d === void 0 ? "regular" : _d;
@@ -1,3 +1,3 @@
1
- import Button, { UnstyledButton } from "./Button";
2
- export { UnstyledButton };
1
+ import Button, { UnstyledButton, IconButton } from "./Button";
2
+ export { UnstyledButton, IconButton };
3
3
  export default Button;
@@ -1,3 +1,3 @@
1
- import Button, { UnstyledButton } from "./Button";
2
- export { UnstyledButton };
1
+ import Button, { UnstyledButton, IconButton } from "./Button";
2
+ export { UnstyledButton, IconButton };
3
3
  export default Button;
@@ -1,6 +1,7 @@
1
1
  import React from "react";
2
2
  import { type IconType } from "./icons";
3
- type Props = Omit<React.DetailedHTMLProps<React.SVGAttributes<SVGSVGElement>, SVGSVGElement>, "children" | "viewBox"> & {
3
+ import type { SizeToken } from "../../utils/types";
4
+ export type Props = Omit<React.DetailedHTMLProps<React.SVGAttributes<SVGSVGElement>, SVGSVGElement>, "children" | "viewBox"> & {
4
5
  /**
5
6
  * The version of icon to render
6
7
  */
@@ -9,7 +10,7 @@ type Props = Omit<React.DetailedHTMLProps<React.SVGAttributes<SVGSVGElement>, SV
9
10
  * Size of the icon; will control both width and height
10
11
  * @default "s"
11
12
  */
12
- size?: "xxs" | "xs" | "s" | "m" | "l" | "xl" | "xxl";
13
+ size?: SizeToken;
13
14
  };
14
15
  declare const Icon: React.ForwardRefExoticComponent<Omit<Props, "ref"> & React.RefAttributes<SVGSVGElement>>;
15
16
  export default Icon;
@@ -1,4 +1,4 @@
1
- export declare const iconTypes: readonly ["architect", "arrow-down", "arrow-left", "arrow-right", "arrow-up", "atom", "award", "bar-graph", "building", "calculator", "calendar", "car", "check", "check-circle", "chevron-down", "chevron-left", "chevron-right", "chevron-up", "city", "clipboard", "clock", "clone", "cloud", "code", "comment", "cube", "database", "desktop", "document", "download", "edit", "evergreen", "export", "external", "file", "film", "flower", "folder", "gem", "globe", "graph-down", "graph-up", "grid", "heart", "home", "info-circle", "info-square", "letter", "license", "link", "list", "lock", "login", "logout", "menu", "minus", "minus-circle", "moon", "more", "mountains", "newspaper", "not-a-moon", "overflow", "person", "plus", "plus-circle", "podium", "search", "settings", "shell", "shuffle", "snowflake", "sparkles", "star", "sun", "tag", "ticket", "trash", "tree", "tv", "unlock", "upload", "vista", "warning-circle", "x", "x-circle"];
1
+ export declare const iconTypes: readonly ["architect", "arrow-down", "arrow-left", "arrow-right", "arrow-up", "atom", "award", "bar-graph", "bell", "building", "calculator", "calendar", "car", "check", "check-circle", "chevron-down", "chevron-left", "chevron-right", "chevron-up", "city", "clipboard", "clock", "clone", "cloud", "code", "comment", "cube", "database", "desktop", "document", "download", "edit", "evergreen", "export", "external", "file", "film", "flower", "folder", "gem", "globe", "graph-down", "graph-up", "grid", "heart", "home", "info-circle", "info-square", "letter", "license", "link", "list", "lock", "login", "logout", "menu", "minus", "minus-circle", "moon", "more", "mountains", "newspaper", "not-a-moon", "overflow", "person", "plus", "plus-circle", "podium", "search", "settings", "shell", "shuffle", "snowflake", "sparkles", "star", "sun", "tag", "ticket", "trash", "tree", "tv", "unlock", "upload", "vista", "warning-circle", "x", "x-circle"];
2
2
  export type IconType = (typeof iconTypes)[number];
3
3
  declare const icons: Record<IconType, string>;
4
4
  export default icons;
@@ -7,6 +7,7 @@ export var iconTypes = [
7
7
  "atom",
8
8
  "award",
9
9
  "bar-graph",
10
+ "bell",
10
11
  "building",
11
12
  "calculator",
12
13
  "calendar",
@@ -173,5 +174,6 @@ var icons = {
173
174
  award: "M14.3374,6.1735h.0001c-.0375-.4687-.512-.8192-.6546-1.2562l-.0419-.1562c-.0953-.4498.1407-.9905-.0612-1.4155-.2278-.6859-.9683-.6907-1.4266-1.1453-.389-.3591-.4005-.9323-.8239-1.2454-.5374-.4791-1.1875-.1111-1.8097-.275-.594-.1584-.9305-.7239-1.5197-.6772-.5906-.0469-.9323.519-1.5233.6772-.522.155-1.0462-.1177-1.4901.095-.507.1795-.6814.6392-.9037,1.1151-.3085.6185-1.1274.673-1.4871,1.1352-.3477.4052-.2687.8929-.222,1.4184.0414.7628-.7646,1.2202-.7302,1.9108-.047.5906.519.9322.6772,1.5234.1625.622-.2001,1.2735.2803,1.8109.2726.3875.837.4611,1.2141.8203v4.9668c0,.466.5634.6993.893.3698l2.9217-2.9218c.2043-.2043.5355-.2043.7399,0l2.9218,2.9218c.3295.3295.893.0962.893-.3699v-4.9854c.0103-.0192.0187-.0348.029-.0541.5892-.3795,1.4185-.5754,1.4506-1.4131.0268-.3505-.1125-.7572.0103-1.1447.1692-.6226.8096-.9972.6628-1.7051ZM8.0001,8.7724c-1.3807,0-2.5-1.1172-2.5-2.4954s1.1193-2.4953,2.5-2.4953,2.5,1.1172,2.5,2.4953-1.1193,2.4954-2.5,2.4954Z",
174
175
  flower: "M12.2426,9.364c1.1716-1.1716,1.1716-3.071,0-4.2426,1.1716-1.1716,1.1716-3.0711,0-4.2427-1.1716-1.1716-3.071-1.1716-4.2426,0C6.8284-.2929,4.929-.2929,3.7574.8787c-1.1716,1.1716-1.1716,3.071,0,4.2427-1.1716,1.1716-1.1716,3.071,0,4.2426.8765.8765,2.1601,1.0964,3.2418.6615v2.668c-1.421-.8044-2.8931-.8878-3.3029-.1779-.4142.7175.4132,1.9706,1.8481,2.7991.8587.4958,1.7356.721,2.394.673.0212.0013.0392.0123.0609.0123s.0396-.0109.0609-.0123c.6584.048,1.5353-.1772,2.394-.673,1.4349-.8284,2.2623-2.0816,1.848-2.7991-.4099-.7099-1.8818-.6265-3.3029.1779v-2.6686c1.082.4358,2.3665.2159,3.2434-.661ZM6.2322,3.3535c.9763-.9763,2.5592-.9763,3.5355,0s.9763,2.5592,0,3.5356c-.9763.9763-2.5593.9763-3.5355,0-.9763-.9764-.9763-2.5592,0-3.5356Z",
175
176
  overflow: "M8,6.25c.9665,0,1.75.7835,1.75,1.75s-.7835,1.75-1.75,1.75-1.75-.7835-1.75-1.75.7835-1.75,1.75-1.75ZM6.25,1.75c0,.9665.7835,1.75,1.75,1.75s1.75-.7835,1.75-1.75-.7835-1.75-1.75-1.75-1.75.7835-1.75,1.75ZM6.25,14.25c0,.9665.7835,1.75,1.75,1.75s1.75-.7835,1.75-1.75-.7835-1.75-1.75-1.75-1.75.7835-1.75,1.75Z",
177
+ bell: "M14.1079,12.2049c-.512-.3928-.8403-.9752-.9876-1.6036-.2782-1.1865-.6092-3.0107-.62-5.006-.0114-2.1172-1.4575-4.0092-3.5003-4.4756v-.1196c0-.5523-.4477-1-1-1s-1,.4477-1,1v.1196c-2.0428.4664-3.4889,2.3584-3.5003,4.4756-.0108,1.9953-.3418,3.8195-.62,5.006-.1473.6284-.4756,1.2109-.9876,1.6036-.2736.2098-.4356.5579-.3818.9399.0714.5071.5548.8552,1.0666.8552h3.4232c0,1.0972.9028,2,2,2s2-.9028,2-2h3.4232c.5118,0,.9952-.3481,1.0666-.8552.0538-.382-.1083-.73-.3818-.9399ZM8,14h-.0292c.0162,0,.0292-.0131.0292-.0292,0,.0161.0131.0292.0292.0292h-.0292Z",
176
178
  };
177
179
  export default icons;
@@ -10,11 +10,6 @@ type Props = Omit<BoxProps, "children"> & {
10
10
  * IMPORTANT: the child must be able to accept a ref
11
11
  */
12
12
  children: React.ReactElement<any>;
13
- /**
14
- * [Optional] Whether to disable the escape key to close the layer
15
- * @default false
16
- */
17
- disableEscape?: boolean;
18
13
  /**
19
14
  * [Optional] Whether to return focus to the element that triggered the layer
20
15
  * @default false
@@ -25,22 +25,27 @@ import React, { useEffect } from "react";
25
25
  import { useFocusTrap, useScrollLock } from "../../hooks";
26
26
  import classNames from "../../functions/classNames";
27
27
  import Box from "../Box/Box";
28
- var BaseLayer = React.forwardRef(function (_a, ref) {
29
- var onClose = _a.onClose, children = _a.children, className = _a.className, _b = _a.disableEscape, disableEscape = _b === void 0 ? false : _b, visible = _a.visible, onMouseDown = _a.onMouseDown, layout = _a.layout, rest = __rest(_a, ["onClose", "children", "className", "disableEscape", "visible", "onMouseDown", "layout"]);
30
- var focusRef = useFocusTrap(visible);
28
+ var Layer = React.forwardRef(function (_a, ref) {
29
+ var returnFocusOnEscape = _a.returnFocusOnEscape, disableScrollLock = _a.disableScrollLock, onClose = _a.onClose, children = _a.children, className = _a.className, onMouseDown = _a.onMouseDown, layout = _a.layout, rest = __rest(_a, ["returnFocusOnEscape", "disableScrollLock", "onClose", "children", "className", "onMouseDown", "layout"]);
30
+ var focusRef = useFocusTrap(true);
31
+ // Lock and unlock on mount and unmount
32
+ useScrollLock(!disableScrollLock);
31
33
  useEffect(function () {
32
34
  var handleEscape = function (event) {
35
+ var _a;
33
36
  if (event.key === "Escape") {
37
+ if (!returnFocusOnEscape) {
38
+ var activeEl = document.activeElement;
39
+ (_a = activeEl === null || activeEl === void 0 ? void 0 : activeEl.blur) === null || _a === void 0 ? void 0 : _a.call(activeEl);
40
+ }
34
41
  onClose === null || onClose === void 0 ? void 0 : onClose();
35
42
  }
36
43
  };
37
- if (!disableEscape)
38
- document.addEventListener("keydown", handleEscape);
44
+ document.addEventListener("keydown", handleEscape);
39
45
  return function () {
40
- if (!disableEscape)
41
- document.removeEventListener("keydown", handleEscape);
46
+ document.removeEventListener("keydown", handleEscape);
42
47
  };
43
- }, [onClose, disableEscape]);
48
+ }, [onClose, returnFocusOnEscape]);
44
49
  return (_jsx(Box, __assign({ layout: __assign({ axis: "y", align: "center", justify: "center" }, layout) }, rest, { className: classNames("aui-layer-backdrop", className), onMouseDown: function (e) {
45
50
  onMouseDown === null || onMouseDown === void 0 ? void 0 : onMouseDown(e);
46
51
  onClose === null || onClose === void 0 ? void 0 : onClose();
@@ -53,17 +58,4 @@ var BaseLayer = React.forwardRef(function (_a, ref) {
53
58
  },
54
59
  }) })));
55
60
  });
56
- var Layer = React.forwardRef(function (_a, ref) {
57
- var returnFocusOnEscape = _a.returnFocusOnEscape, disableScrollLock = _a.disableScrollLock, rest = __rest(_a, ["returnFocusOnEscape", "disableScrollLock"]);
58
- // Lock and unlock on mount and unmount
59
- useScrollLock(!disableScrollLock);
60
- useEffect(function () { return function () {
61
- var _a;
62
- var activeEl = document.activeElement;
63
- if (!returnFocusOnEscape) {
64
- (_a = activeEl === null || activeEl === void 0 ? void 0 : activeEl.blur) === null || _a === void 0 ? void 0 : _a.call(activeEl);
65
- }
66
- }; }, [returnFocusOnEscape]);
67
- return _jsx(BaseLayer, __assign({}, rest, { visible: true, ref: ref }));
68
- });
69
61
  export default Layer;
@@ -1,11 +1,11 @@
1
1
  import React from "react";
2
2
  import { type VisualButtonProps } from "../Button/Button";
3
3
  import { Layout } from "../../utils/types";
4
- type BaseLinkProps = Omit<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "href"> & {
4
+ export type BaseLinkProps = Omit<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "href"> & {
5
5
  /**
6
6
  * URL to navigate to
7
7
  */
8
- to?: string;
8
+ to: string;
9
9
  };
10
10
  type CustomLinkElement = React.ForwardRefExoticComponent<BaseLinkProps & React.RefAttributes<HTMLAnchorElement>>;
11
11
  type LinkProps = BaseLinkProps & {
@@ -29,7 +29,7 @@ export declare const ButtonLink: React.ForwardRefExoticComponent<Omit<Omit<React
29
29
  /**
30
30
  * URL to navigate to
31
31
  */
32
- to?: string;
32
+ to: string;
33
33
  } & {
34
34
  /**
35
35
  * Whether the link should open in a new tab
@@ -34,11 +34,11 @@ export var UnstyledLink = React.forwardRef(function (_a, ref) {
34
34
  return _jsx("a", __assign({}, props, { href: to, ref: ref }));
35
35
  });
36
36
  export var ButtonLink = React.forwardRef(function (_a, ref) {
37
- var className = _a.className, variant = _a.variant, corners = _a.corners, size = _a.size, props = __rest(_a, ["className", "variant", "corners", "size"]);
38
- return (_jsx(UnstyledLink, __assign({}, props, { className: classNames(getButtonClassName({ variant: variant, corners: corners, size: size }), className), ref: ref })));
37
+ var className = _a.className, layout = _a.layout, variant = _a.variant, corners = _a.corners, size = _a.size, props = __rest(_a, ["className", "layout", "variant", "corners", "size"]);
38
+ return (_jsx(UnstyledLink, __assign({}, props, { className: classNames(getButtonClassName({ variant: variant, corners: corners, size: size }), transformLayout(layout), className), ref: ref })));
39
39
  });
40
40
  var Link = React.forwardRef(function (_a, ref) {
41
- var className = _a.className, props = __rest(_a, ["className"]);
42
- return (_jsx(UnstyledLink, __assign({}, props, { className: classNames("aui-link", className), ref: ref })));
41
+ var className = _a.className, layout = _a.layout, props = __rest(_a, ["className", "layout"]);
42
+ return (_jsx(UnstyledLink, __assign({}, props, { className: classNames("aui-link", transformLayout(layout), className), ref: ref })));
43
43
  });
44
44
  export default Link;
@@ -0,0 +1,33 @@
1
+ import React from "react";
2
+ import { type BoxProps } from "../Box/Box";
3
+ type Props = BoxProps & {
4
+ /**
5
+ * Callback that fires when the user clicks the Ok button in the modal
6
+ */
7
+ onConfirm: () => void;
8
+ /**
9
+ * Label rendered in the ok/confirm button
10
+ * @default "Ok"
11
+ */
12
+ confirmLabel?: React.ReactNode;
13
+ /**
14
+ * Label rendered in the cancel button
15
+ * @default "Cancel"
16
+ */
17
+ cancelLabel?: React.ReactNode;
18
+ /**
19
+ * Whether the modal is open or not
20
+ */
21
+ open: boolean;
22
+ /**
23
+ * Callback that fires when the user closes the modal
24
+ */
25
+ onClose: () => void;
26
+ /**
27
+ * [Optional] Whether to return focus to the element that triggered the modal
28
+ * @default false
29
+ */
30
+ returnFocusOnEscape?: boolean;
31
+ };
32
+ declare const Modal: React.ForwardRefExoticComponent<Omit<Props, "ref"> & React.RefAttributes<HTMLDivElement>>;
33
+ export default Modal;
@@ -0,0 +1,47 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
20
+ }
21
+ return t;
22
+ };
23
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
24
+ import React from "react";
25
+ import Box from "../Box/Box";
26
+ import Layer from "../Layer";
27
+ import Button, { IconButton } from "../Button";
28
+ import Animated from "../Animated";
29
+ var Modal = React.forwardRef(function (_a, ref) {
30
+ var open = _a.open, onClose = _a.onClose, onConfirm = _a.onConfirm, _b = _a.confirmLabel, confirmLabel = _b === void 0 ? "Ok" : _b, _c = _a.cancelLabel, cancelLabel = _c === void 0 ? "Cancel" : _c, returnFocusOnEscape = _a.returnFocusOnEscape, rest = __rest(_a, ["open", "onClose", "onConfirm", "confirmLabel", "cancelLabel", "returnFocusOnEscape"]);
31
+ return (_jsx(Animated, { className: "aui-modal-backdrop", animated: open, animateTo: { style: { opacity: 1 } }, animateFrom: { style: { opacity: 0 } }, children: _jsx(Layer, { onClose: onClose, returnFocusOnEscape: returnFocusOnEscape, children: _jsxs(Box, { role: "dialog", "aria-modal": "true", className: "aui-modal aui-corners--rounded", layout: { axis: "y", padding: "m", gap: "m" }, children: [_jsx(Box, { layout: {
32
+ axis: "x",
33
+ align: "center",
34
+ justify: "end",
35
+ width: "full",
36
+ }, children: _jsx(IconButton, { icon: "x", onClick: onClose }) }), _jsx(Box, __assign({}, rest, { ref: ref })), _jsxs(Box, { layout: {
37
+ axis: "x",
38
+ align: "center",
39
+ justify: "end",
40
+ width: "full",
41
+ gap: "m",
42
+ }, children: [_jsx(Button, { variant: "secondary", onClick: onClose, children: cancelLabel }), _jsx(Button, { onClick: function () {
43
+ onConfirm();
44
+ onClose();
45
+ }, children: confirmLabel })] })] }) }) }));
46
+ });
47
+ export default Modal;
@@ -0,0 +1,2 @@
1
+ import Modal from "./Modal";
2
+ export default Modal;
@@ -0,0 +1,2 @@
1
+ import Modal from "./Modal";
2
+ export default Modal;
@@ -18,5 +18,5 @@ type Props = React.DetailedHTMLProps<React.SelectHTMLAttributes<HTMLSelectElemen
18
18
  */
19
19
  corners?: CornerType;
20
20
  };
21
- declare const _default: React.ForwardRefExoticComponent<Omit<Props, "ref"> & React.RefAttributes<HTMLSelectElement>>;
22
- export default _default;
21
+ declare const Select: React.ForwardRefExoticComponent<Omit<Props, "ref"> & React.RefAttributes<HTMLSelectElement>>;
22
+ export default Select;
@@ -21,12 +21,12 @@ var __rest = (this && this.__rest) || function (s, e) {
21
21
  return t;
22
22
  };
23
23
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
24
- import { forwardRef } from "react";
24
+ import React from "react";
25
25
  import classNames from "../../functions/classNames";
26
26
  import Box from "../Box";
27
27
  import Icon from "../Icon";
28
- var Select = function (_a, ref) {
28
+ var Select = React.forwardRef(function (_a, ref) {
29
29
  var className = _a.className, options = _a.options, getOptionLabel = _a.getOptionLabel, _b = _a.corners, corners = _b === void 0 ? "rounded" : _b, style = _a.style, disabled = _a.disabled, props = __rest(_a, ["className", "options", "getOptionLabel", "corners", "style", "disabled"]);
30
- return (_jsxs(Box, { className: classNames("aui-select-container", "aui-corners--".concat(corners), disabled ? "aui-select-disabled" : undefined, className), style: style, children: [_jsx("select", __assign({}, props, { ref: ref, className: "aui-select aui-corners--".concat(corners), disabled: disabled, children: options.map(function (option, index) { return (_jsx("option", { value: option, children: (getOptionLabel === null || getOptionLabel === void 0 ? void 0 : getOptionLabel(option)) || option }, index)); }) })), _jsx(Icon, { icon: "chevron-down", className: "aui-select-icon", "aria-hidden": true })] }));
31
- };
32
- export default forwardRef(Select);
30
+ return (_jsxs(Box, { layout: { axis: "x", align: "center" }, className: classNames("aui-select-container", "aui-corners--".concat(corners), disabled ? "aui-select-disabled" : undefined, className), style: style, children: [_jsx("select", __assign({}, props, { ref: ref, className: "aui-select aui-corners--".concat(corners), disabled: disabled, children: options.map(function (option, index) { return (_jsx("option", { value: option, children: (getOptionLabel === null || getOptionLabel === void 0 ? void 0 : getOptionLabel(option)) || option }, index)); }) })), _jsx(Icon, { icon: "chevron-down", className: "aui-select-icon", "aria-hidden": true })] }));
31
+ });
32
+ export default Select;
@@ -1,4 +1,4 @@
1
- import { useEffect, useRef, useCallback } from "react";
1
+ import { useEffect, useRef } from "react";
2
2
  var selector = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex="0"], [contenteditable]';
3
3
  /**
4
4
  * A hook for trapping focus within an element.
@@ -10,48 +10,39 @@ var selector = 'a[href], area[href], input:not([disabled]), select:not([disabled
10
10
  var useFocusTrap = function (isActive) {
11
11
  if (isActive === void 0) { isActive = true; }
12
12
  var trapRef = useRef(null);
13
- var focusableElements = useRef(null);
14
- var updateFocusableElements = useCallback(function () {
15
- if (trapRef.current) {
16
- focusableElements.current = trapRef.current.querySelectorAll(selector);
17
- }
18
- }, []);
19
13
  useEffect(function () {
20
- if (!isActive || !trapRef.current)
14
+ var trap = trapRef.current;
15
+ if (!isActive || !trap)
21
16
  return;
22
- updateFocusableElements();
23
17
  var handleKeyDown = function (event) {
24
- var _a;
25
18
  if (event.key !== "Tab")
26
19
  return;
27
- if (!focusableElements.current ||
28
- focusableElements.current.length === 0) {
29
- return event.preventDefault();
30
- }
31
- var activeElement = document.activeElement;
32
- var firstEl = focusableElements.current[0];
33
- var lastEl = focusableElements.current[focusableElements.current.length - 1];
34
- if (event.shiftKey && activeElement === firstEl) {
35
- lastEl.focus();
20
+ var focusableElements = trap.querySelectorAll(selector);
21
+ if (!focusableElements.length) {
36
22
  event.preventDefault();
23
+ return;
37
24
  }
38
- else if (!event.shiftKey && activeElement === lastEl) {
39
- firstEl.focus();
40
- event.preventDefault();
25
+ var first = focusableElements[0];
26
+ var last = focusableElements[focusableElements.length - 1];
27
+ var active = document.activeElement;
28
+ if (event.shiftKey) {
29
+ if (active === first || !trap.contains(active)) {
30
+ last.focus();
31
+ event.preventDefault();
32
+ }
41
33
  }
42
- else if (!((_a = trapRef.current) === null || _a === void 0 ? void 0 : _a.contains(activeElement))) {
43
- (event.shiftKey ? lastEl : firstEl).focus();
44
- event.preventDefault();
34
+ else {
35
+ if (active === last || !trap.contains(active)) {
36
+ first.focus();
37
+ event.preventDefault();
38
+ }
45
39
  }
46
40
  };
47
- var observer = new MutationObserver(updateFocusableElements);
48
- observer.observe(trapRef.current, { childList: true, subtree: true });
49
- document.addEventListener("keydown", handleKeyDown);
41
+ trap.addEventListener("keydown", handleKeyDown, true);
50
42
  return function () {
51
- document.removeEventListener("keydown", handleKeyDown);
52
- observer.disconnect();
43
+ trap.removeEventListener("keydown", handleKeyDown, true);
53
44
  };
54
- }, [isActive, updateFocusableElements]);
45
+ }, [isActive]);
55
46
  return trapRef;
56
47
  };
57
48
  export default useFocusTrap;
package/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export { default as Accordion } from "./components/Accordion";
2
2
  export { default as Alert } from "./components/Alert";
3
3
  export { default as Animated } from "./components/Animated";
4
+ export { default as Avatar } from "./components/Avatar";
4
5
  export { default as Badge } from "./components/Badge";
5
6
  export { default as Banner } from "./components/Banner";
6
7
  export { default as Box } from "./components/Box";
@@ -16,6 +17,7 @@ export * from "./components/Input";
16
17
  export { default as Layer } from "./components/Layer";
17
18
  export { default as Link } from "./components/Link";
18
19
  export * from "./components/Link";
20
+ export { default as Modal } from "./components/Modal";
19
21
  export { default as Select } from "./components/Select";
20
22
  export { default as Spinner } from "./components/Spinner";
21
23
  export * from "./hooks";
package/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  export { default as Accordion } from "./components/Accordion";
3
3
  export { default as Alert } from "./components/Alert";
4
4
  export { default as Animated } from "./components/Animated";
5
+ export { default as Avatar } from "./components/Avatar";
5
6
  export { default as Badge } from "./components/Badge";
6
7
  export { default as Banner } from "./components/Banner";
7
8
  export { default as Box } from "./components/Box";
@@ -17,6 +18,7 @@ export * from "./components/Input";
17
18
  export { default as Layer } from "./components/Layer";
18
19
  export { default as Link } from "./components/Link";
19
20
  export * from "./components/Link";
21
+ export { default as Modal } from "./components/Modal";
20
22
  export { default as Select } from "./components/Select";
21
23
  export { default as Spinner } from "./components/Spinner";
22
24
  // Hooks
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adamjanicki/ui",
3
- "version": "1.6.1",
3
+ "version": "1.6.3",
4
4
  "description": "Basic UI components and hooks for React in TypeScript",
5
5
  "type": "module",
6
6
  "main": "./index.js",
package/style.css CHANGED
@@ -1 +1 @@
1
- :root{--aui-xxs: 2px;--aui-xs: 4px;--aui-s: 8px;--aui-m: 16px;--aui-l: 24px;--aui-xl: 32px;--aui-xxl: 64px;--aui-moon-gray: #ccc;--aui-dark-gray: #555;--aui-darkest-gray: #333;--aui-obsidian: #121212;--aui-focus-ring-color: #b2dbfa;--aui-default-text-color: black;--aui-default-background: white;--aui-default-border: var(--aui-moon-gray);--aui-disabled-opacity: 0.5;--aui-default-transition: 0.25s ease-in-out;--aui-default-opacity-dim: 0.75;--aui-container-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.16);--aui-sharp-radius: 0;--aui-rounded-radius: 8px;--aui-pill-radius: 9999px;--aui-button-primary-background: black;--aui-button-primary-color: white;--aui-button-secondary-border-hover: var(--aui-darkest-gray);--aui-subtle-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.16);--aui-button-primary-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.36);--aui-success-background: #dff2e1;--aui-success-color: #1b5e20;--aui-success-border: #b2dfb1;--aui-warning-background: #fceeb6;--aui-warning-color: #b23904;--aui-warning-border: #e6d5a2;--aui-error-background: #fdecea;--aui-error-color: #b71c1c;--aui-error-border: #f5b7b7;--aui-info-background: #e3f2fd;--aui-info-color: #0d47a1;--aui-info-border: #90caf9;--aui-static-background: #e8e8e8;--aui-layer-backdrop-background: rgba(200, 200, 200, 0.7);--aui-link-color: #0070ff;--aui-select-icon: var(--aui-dark-gray)}[data-theme=dark]{--aui-focus-ring-color: #6699cc;--aui-default-text-color: white;--aui-default-background: var(--aui-obsidian);--aui-default-border: var(--aui-dark-gray);--aui-container-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.36);--aui-button-primary-background: white;--aui-button-primary-color: var(--aui-obsidian);--aui-button-secondary-border-hover: var(--aui-moon-gray);--aui-subtle-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);--aui-button-primary-box-shadow: 0 1px 2px rgba(64, 64, 64, 0.8);--aui-success-background: #2a5733;--aui-success-color: #d9efd8;--aui-success-border: #439e4a;--aui-warning-background: #736230;--aui-warning-color: #fff6d1;--aui-warning-border: #927a3b;--aui-error-background: #663232;--aui-error-color: #f9dadc;--aui-error-border: #8d2a2a;--aui-info-background: #335f72;--aui-info-color: #d4f1f5;--aui-info-border: #1d8ea4;--aui-static-background: var(--aui-darkest-gray);--aui-layer-backdrop-background: rgba(55, 55, 55, 0.7);--aui-link-color: #33bfff;--aui-select-icon: var(--aui-moon-gray)}.aui-flex-x,.aui-flex-y,.aui-flex--x,.aui-flex--y{display:flex}.aui-flex-x{flex-direction:row}.aui-flex-y{flex-direction:column}.aui-flex--x{flex-direction:row-reverse}.aui-flex--y{flex-direction:column-reverse}.aui-flex-wrap{flex-wrap:wrap}.aui-align-start{align-items:flex-start}.aui-align-center{align-items:center}.aui-align-end{align-items:flex-end}.aui-justify-start{justify-content:flex-start}.aui-justify-center{justify-content:center}.aui-justify-between{justify-content:space-between}.aui-justify-around{justify-content:space-around}.aui-justify-end{justify-content:flex-end}.aui-icon-xxs{width:8px;height:8px}.aui-icon-xs{width:12px;height:12px}.aui-icon-s{width:16px;height:16px}.aui-icon-m{width:24px;height:24px}.aui-icon-l{width:32px;height:32px}.aui-icon-xl{width:48px;height:48px}.aui-icon-xxl{width:64px;height:64px}.aui-gap-none{gap:0}.aui-gap-xxs{gap:var(--aui-xxs)}.aui-gap-xs{gap:var(--aui-xs)}.aui-gap-s{gap:var(--aui-s)}.aui-gap-m{gap:var(--aui-m)}.aui-gap-l{gap:var(--aui-l)}.aui-gap-xl{gap:var(--aui-xl)}.aui-gap-xxl{gap:var(--aui-xxl)}.aui-pa-none{padding:0}.aui-pa-xxs{padding:var(--aui-xxs)}.aui-pa-xs{padding:var(--aui-xs)}.aui-pa-s{padding:var(--aui-s)}.aui-pa-m{padding:var(--aui-m)}.aui-pa-l{padding:var(--aui-l)}.aui-pa-xl{padding:var(--aui-xl)}.aui-pa-xxl{padding:var(--aui-xxl)}.aui-pt-none{padding-top:0}.aui-pt-xxs{padding-top:var(--aui-xxs)}.aui-pt-xs{padding-top:var(--aui-xs)}.aui-pt-s{padding-top:var(--aui-s)}.aui-pt-m{padding-top:var(--aui-m)}.aui-pt-l{padding-top:var(--aui-l)}.aui-pt-xl{padding-top:var(--aui-xl)}.aui-pt-xxl{padding-top:var(--aui-xxl)}.aui-pb-none{padding-bottom:0}.aui-pb-xxs{padding-bottom:var(--aui-xxs)}.aui-pb-xs{padding-bottom:var(--aui-xs)}.aui-pb-s{padding-bottom:var(--aui-s)}.aui-pb-m{padding-bottom:var(--aui-m)}.aui-pb-l{padding-bottom:var(--aui-l)}.aui-pb-xl{padding-bottom:var(--aui-xl)}.aui-pb-xxl{padding-bottom:var(--aui-xxl)}.aui-pl-none{padding-left:0}.aui-pl-xxs{padding-left:var(--aui-xxs)}.aui-pl-xs{padding-left:var(--aui-xs)}.aui-pl-s{padding-left:var(--aui-s)}.aui-pl-m{padding-left:var(--aui-m)}.aui-pl-l{padding-left:var(--aui-l)}.aui-pl-xl{padding-left:var(--aui-xl)}.aui-pl-xxl{padding-left:var(--aui-xxl)}.aui-pr-none{padding-right:0}.aui-pr-xxs{padding-right:var(--aui-xxs)}.aui-pr-xs{padding-right:var(--aui-xs)}.aui-pr-s{padding-right:var(--aui-s)}.aui-pr-m{padding-right:var(--aui-m)}.aui-pr-l{padding-right:var(--aui-l)}.aui-pr-xl{padding-right:var(--aui-xl)}.aui-pr-xxl{padding-right:var(--aui-xxl)}.aui-ma-auto{margin:auto}.aui-mt-auto{margin-top:auto}.aui-mb-auto{margin-bottom:auto}.aui-ml-auto{margin-left:auto}.aui-mr-auto{margin-right:auto}.aui-ma-none{margin:0}.aui-ma-xxs{margin:var(--aui-xxs)}.aui-ma-xs{margin:var(--aui-xs)}.aui-ma-s{margin:var(--aui-s)}.aui-ma-m{margin:var(--aui-m)}.aui-ma-l{margin:var(--aui-l)}.aui-ma-xl{margin:var(--aui-xl)}.aui-ma-xxl{margin:var(--aui-xxl)}.aui-mt-none{margin-top:0}.aui-mt-xxs{margin-top:var(--aui-xxs)}.aui-mt-xs{margin-top:var(--aui-xs)}.aui-mt-s{margin-top:var(--aui-s)}.aui-mt-m{margin-top:var(--aui-m)}.aui-mt-l{margin-top:var(--aui-l)}.aui-mt-xl{margin-top:var(--aui-xl)}.aui-mt-xxl{margin-top:var(--aui-xxl)}.aui-mb-none{margin-bottom:0}.aui-mb-xxs{margin-bottom:var(--aui-xxs)}.aui-mb-xs{margin-bottom:var(--aui-xs)}.aui-mb-s{margin-bottom:var(--aui-s)}.aui-mb-m{margin-bottom:var(--aui-m)}.aui-mb-l{margin-bottom:var(--aui-l)}.aui-mb-xl{margin-bottom:var(--aui-xl)}.aui-mb-xxl{margin-bottom:var(--aui-xxl)}.aui-ml-none{margin-left:0}.aui-ml-xxs{margin-left:var(--aui-xxs)}.aui-ml-xs{margin-left:var(--aui-xs)}.aui-ml-s{margin-left:var(--aui-s)}.aui-ml-m{margin-left:var(--aui-m)}.aui-ml-l{margin-left:var(--aui-l)}.aui-ml-xl{margin-left:var(--aui-xl)}.aui-ml-xxl{margin-left:var(--aui-xxl)}.aui-mr-none{margin-right:0}.aui-mr-xxs{margin-right:var(--aui-xxs)}.aui-mr-xs{margin-right:var(--aui-xs)}.aui-mr-s{margin-right:var(--aui-s)}.aui-mr-m{margin-right:var(--aui-m)}.aui-mr-l{margin-right:var(--aui-l)}.aui-mr-xl{margin-right:var(--aui-xl)}.aui-mr-xxl{margin-right:var(--aui-xxl)}.aui-w-full{width:100%}.aui-w-fit{width:fit-content}.aui-w-min{width:min-content}.aui-w-max{width:max-content}.aui-mw-full{max-width:100%}.aui-mw-fit{max-width:fit-content}.aui-mw-min{max-width:min-content}.aui-mw-max{max-width:max-content}.aui-h-full{height:100%}.aui-h-fit{height:fit-content}.aui-h-min{height:min-content}.aui-h-max{height:max-content}.aui-mh-full{max-height:100%}.aui-mh-fit{max-height:fit-content}.aui-mh-min{max-height:min-content}.aui-mh-max{max-height:max-content}.aui-corners--rounded{border-radius:var(--aui-rounded-radius)}.aui-corners--pill{border-radius:var(--aui-pill-radius)}.aui-corners--sharp{border-radius:var(--aui-sharp-radius)}.aui-content--success{background-color:var(--aui-success-background);color:var(--aui-success-color);border-color:var(--aui-success-border)}.aui-content--warning{background-color:var(--aui-warning-background);color:var(--aui-warning-color);border-color:var(--aui-warning-border)}.aui-content--error{background-color:var(--aui-error-background);color:var(--aui-error-color);border-color:var(--aui-error-border)}.aui-content--info{background-color:var(--aui-info-background);color:var(--aui-info-color);border-color:var(--aui-info-border)}.aui-content--static{background-color:var(--aui-static-background);color:var(--aui-default-text-color);border-color:var(--aui-default-border)}.aui-accordion{background-color:var(--aui-default-background);box-shadow:0 0 0 1px var(--aui-default-border) inset,var(--aui-container-box-shadow)}.aui-accordion-label{font-weight:600}.aui-accordion-hr{border:none;height:1px;background-color:var(--aui-default-border);width:100%;margin:0}.aui-accordion-arrow{color:var(--aui-select-icon)}.aui-alert{padding:var(--aui-m);border-style:solid;border-width:1px;font-weight:400}.aui-badge{padding:var(--aui-xxs) var(--aui-xs);border-style:solid;border-width:1px;font-weight:500;font-size:14px;width:fit-content}.aui-banner{padding:var(--aui-l) var(--aui-xl);border:none;font-weight:400;width:100%}.aui-action{color:inherit;text-decoration:none;cursor:pointer;outline-color:var(--aui-link-color)}.aui-action:focus:not(:focus-visible){outline:none}.aui-button{background:none;border:none;padding:0}.aui-button-size--regular{padding:var(--aui-s);font-weight:600}.aui-button-size--small{padding:var(--aui-xs);font-size:12px;font-weight:600}.aui-button:disabled{cursor:default !important;opacity:var(--aui-disabled-opacity)}.aui-button--primary{background-color:var(--aui-button-primary-background);color:var(--aui-button-primary-color);box-shadow:var(--aui-button-primary-box-shadow);transition:opacity var(--aui-default-transition)}.aui-button--secondary{color:var(--aui-default-text-color);background-color:var(--aui-default-background);box-shadow:0 0 0 1px var(--aui-default-border) inset,var(--aui-subtle-box-shadow);transition:box-shadow var(--aui-default-transition)}.aui-link{font-weight:600;color:var(--aui-link-color);transition:opacity var(--aui-default-transition)}@media(hover: hover){.aui-button--primary:not([disabled]):hover,.aui-link:hover{opacity:var(--aui-default-opacity-dim)}.aui-button--secondary:not([disabled]):hover{box-shadow:0 0 0 1px var(--aui-button-secondary-border-hover) inset,var(--aui-subtle-box-shadow)}}.aui-input-base{outline:none;border:none;background-color:inherit;color:inherit;padding:var(--aui-s);font-weight:400}.aui-input-base::selection{background-color:var(--aui-focus-ring-color)}.aui-icon-input{overflow:scroll}.aui-icon-input input{background-color:rgba(0,0,0,0);width:100%}.aui-input{transition:box-shadow var(--aui-default-transition);box-shadow:0 0 0 1px var(--aui-default-border) inset,var(--aui-subtle-box-shadow);background-color:var(--aui-default-background)}.aui-input:disabled{opacity:var(--aui-disabled-opacity);cursor:default}.aui-input:not([disabled]):focus-within,.aui-select-container:not([disabled]):focus-within{box-shadow:0 0 0 1px var(--aui-default-border) inset,var(--aui-subtle-box-shadow),0 0 0 3px var(--aui-focus-ring-color)}.aui-select-container{position:relative;padding:0;width:fit-content;transition:box-shadow var(--aui-default-transition);box-shadow:0 0 0 1px var(--aui-default-border) inset,var(--aui-subtle-box-shadow);background-color:var(--aui-default-background)}.aui-select{width:100%;color:inherit;border:none;outline:none;box-shadow:none;cursor:pointer;background-color:rgba(0,0,0,0);padding:var(--aui-s) 28px var(--aui-s) var(--aui-s);font-weight:600;appearance:none;-webkit-appearance:none;-moz-appearance:none}.aui-select-disabled *{opacity:var(--aui-disabled-opacity);cursor:default}.aui-select-icon{--size: 10px;color:var(--aui-select-icon);width:var(--size);height:var(--size);position:absolute;top:calc(50% + 1px);transform:translateY(-50%);right:var(--size);pointer-events:none}.aui-layer-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;z-index:10000;background:var(--aui-layer-backdrop-background)}.aui-icon *{color:currentColor;fill:currentColor}.aui-spinner{animation:aui-spinner-animation 1s linear infinite;transform-origin:center;height:var(--aui-l)}@keyframes aui-spinner-animation{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.aui-carousel{max-width:100%;position:relative;overflow:hidden;min-height:var(--aui-xxl);min-width:var(--aui-xxl);width:fit-content}.aui-carousel-item{flex:0 0 100%;width:100%;height:100%}.aui-carousel-arrow{position:absolute;top:50%;transform:translateY(-50%);width:var(--aui-l);height:var(--aui-l);padding:0}.aui-carousel-dots{position:absolute;bottom:var(--aui-s);transform:translateX(-50%);left:50%}.aui-carousel-dot{width:var(--aui-m);height:var(--aui-s);padding:0}
1
+ :root{--aui-xxs: 2px;--aui-xs: 4px;--aui-s: 8px;--aui-m: 16px;--aui-l: 24px;--aui-xl: 32px;--aui-xxl: 64px;--aui-moon-gray: #ccc;--aui-dark-gray: #555;--aui-darkest-gray: #333;--aui-obsidian: #121212;--aui-focus-ring-color: #b2dbfa;--aui-default-text-color: black;--aui-default-background: white;--aui-default-border: var(--aui-moon-gray);--aui-disabled-opacity: 0.5;--aui-default-transition: 0.25s ease-in-out;--aui-default-opacity-dim: 0.75;--aui-floating-box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);--aui-sharp-radius: 0;--aui-rounded-radius: 8px;--aui-pill-radius: 9999px;--aui-button-primary-background: black;--aui-button-primary-color: white;--aui-button-secondary-border-hover: var(--aui-darkest-gray);--aui-subtle-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.16);--aui-button-primary-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.36);--aui-success-background: #dff2e1;--aui-success-color: #1b5e20;--aui-success-border: #b2dfb1;--aui-warning-background: #fceeb6;--aui-warning-color: #b23904;--aui-warning-border: #e6d5a2;--aui-error-background: #fdecea;--aui-error-color: #b71c1c;--aui-error-border: #f5b7b7;--aui-info-background: #e3f2fd;--aui-info-color: #0d47a1;--aui-info-border: #90caf9;--aui-avatar-purple: #bc54d6;--aui-avatar-blue: #618bdc;--aui-avatar-red: #ee6060;--aui-avatar-green: #add386;--aui-avatar-yellow: #f5c76d;--aui-static-background: #e8e8e8;--aui-layer-backdrop-background: rgba(200, 200, 200, 0.6);--aui-link-color: #0070ff;--aui-select-icon: var(--aui-dark-gray)}[data-theme=dark]{--aui-focus-ring-color: #6699cc;--aui-default-text-color: white;--aui-default-background: var(--aui-obsidian);--aui-default-border: var(--aui-dark-gray);--aui-floating-box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);--aui-button-primary-background: white;--aui-button-primary-color: var(--aui-obsidian);--aui-button-secondary-border-hover: var(--aui-moon-gray);--aui-subtle-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);--aui-button-primary-box-shadow: 0 1px 2px rgba(64, 64, 64, 0.8);--aui-success-background: #2a5733;--aui-success-color: #d9efd8;--aui-success-border: #439e4a;--aui-warning-background: #736230;--aui-warning-color: #fff6d1;--aui-warning-border: #927a3b;--aui-error-background: #663232;--aui-error-color: #f9dadc;--aui-error-border: #8d2a2a;--aui-info-background: #335f72;--aui-info-color: #d4f1f5;--aui-info-border: #1d8ea4;--aui-avatar-purple: #771199;--aui-avatar-blue: #0b4cce;--aui-avatar-red: #bb1111;--aui-avatar-green: #307040;--aui-avatar-yellow: #bb8822;--aui-static-background: var(--aui-darkest-gray);--aui-layer-backdrop-background: rgba(55, 55, 55, 0.7);--aui-link-color: #33bfff;--aui-select-icon: var(--aui-moon-gray)}.aui-corners--rounded{border-radius:var(--aui-rounded-radius)}.aui-corners--pill{border-radius:var(--aui-pill-radius)}.aui-corners--sharp{border-radius:var(--aui-sharp-radius)}.aui-content--success{background-color:var(--aui-success-background);color:var(--aui-success-color);border-color:var(--aui-success-border)}.aui-content--warning{background-color:var(--aui-warning-background);color:var(--aui-warning-color);border-color:var(--aui-warning-border)}.aui-content--error{background-color:var(--aui-error-background);color:var(--aui-error-color);border-color:var(--aui-error-border)}.aui-content--info{background-color:var(--aui-info-background);color:var(--aui-info-color);border-color:var(--aui-info-border)}.aui-content--static{background-color:var(--aui-static-background);color:var(--aui-default-text-color);border-color:var(--aui-default-border)}.aui-modal{color:var(--aui-default-text-color);background-color:var(--aui-default-background);box-shadow:0 0 0 1px var(--aui-default-border) inset,var(--aui-floating-box-shadow);border-radius:var(--aui-rounded-radius);min-width:40%;max-width:100%}.aui-accordion{background-color:var(--aui-default-background);box-shadow:0 0 0 1px var(--aui-default-border) inset,var(--aui-subtle-box-shadow)}.aui-accordion-label{font-weight:600}.aui-accordion-hr{border:none;height:1px;background-color:var(--aui-default-border);width:100%;margin:0}.aui-accordion-arrow{color:var(--aui-select-icon)}.aui-alert{padding:var(--aui-m);border-style:solid;border-width:1px;font-weight:400}.aui-avatar{overflow:hidden;text-align:center;font-weight:600}.aui-badge{padding:var(--aui-xxs) var(--aui-xs);border-style:solid;border-width:1px;font-weight:500;font-size:14px;width:fit-content}.aui-banner{padding:var(--aui-l) var(--aui-xl);border:none;font-weight:400;width:100%}.aui-action{color:inherit;text-decoration:none;cursor:pointer;outline-color:var(--aui-link-color)}.aui-action:focus:not(:focus-visible){outline:none}.aui-button{background:none;border:none;padding:0}.aui-button-size--regular{padding:var(--aui-s);font-weight:600}.aui-button-size--small{padding:var(--aui-xs);font-size:12px;font-weight:600}.aui-button:disabled{cursor:default !important;opacity:var(--aui-disabled-opacity)}.aui-button--primary{background-color:var(--aui-button-primary-background);color:var(--aui-button-primary-color);box-shadow:var(--aui-button-primary-box-shadow);transition:opacity var(--aui-default-transition)}.aui-button--secondary{color:var(--aui-default-text-color);background-color:var(--aui-default-background);box-shadow:0 0 0 1px var(--aui-default-border) inset,var(--aui-subtle-box-shadow);transition:box-shadow var(--aui-default-transition)}.aui-dim,.aui-undim{transition:opacity var(--aui-default-transition)}.aui-dim{opacity:1}.aui-undim{opacity:var(--aui-default-opacity-dim)}.aui-link{font-weight:600;color:var(--aui-link-color);transition:opacity var(--aui-default-transition)}@media(hover: hover){.aui-button--primary:not([disabled]):hover,.aui-dim:not([disabled]):hover,.aui-link:hover{opacity:var(--aui-default-opacity-dim)}.aui-button--secondary:not([disabled]):hover{box-shadow:0 0 0 1px var(--aui-button-secondary-border-hover) inset,var(--aui-subtle-box-shadow)}.aui-undim:not([disabled]):hover{opacity:1}}.aui-input-base{outline:none;border:none;background-color:inherit;color:inherit;padding:var(--aui-s);font-weight:400}.aui-input-base::selection{background-color:var(--aui-focus-ring-color)}.aui-icon-input{overflow:scroll}.aui-icon-input input{background-color:rgba(0,0,0,0);width:100%}.aui-input{transition:box-shadow var(--aui-default-transition);box-shadow:0 0 0 1px var(--aui-default-border) inset,var(--aui-subtle-box-shadow);background-color:var(--aui-default-background)}.aui-input:disabled{opacity:var(--aui-disabled-opacity);cursor:default}.aui-input:not([disabled]):focus-within,.aui-select-container:not([disabled]):focus-within{box-shadow:0 0 0 1px var(--aui-default-border) inset,var(--aui-subtle-box-shadow),0 0 0 3px var(--aui-focus-ring-color)}.aui-select-container{position:relative;padding:0;width:fit-content;transition:box-shadow var(--aui-default-transition);box-shadow:0 0 0 1px var(--aui-default-border) inset,var(--aui-subtle-box-shadow);background-color:var(--aui-default-background)}.aui-select{width:100%;color:inherit;border:none;outline:none;box-shadow:none;cursor:pointer;background-color:rgba(0,0,0,0);padding:var(--aui-s) 28px var(--aui-s) var(--aui-s);font-weight:600;appearance:none;-webkit-appearance:none;-moz-appearance:none}.aui-select-disabled *{opacity:var(--aui-disabled-opacity);cursor:default}.aui-modal-backdrop,.aui-layer-backdrop{z-index:10000}.aui-layer-backdrop{position:fixed;top:0;left:0;width:100vw;height:100vh;background:var(--aui-layer-backdrop-background)}.aui-icon *{color:currentColor;fill:currentColor}.aui-spinner{animation:aui-spinner-animation 1s linear infinite;transform-origin:center;height:var(--aui-l)}@keyframes aui-spinner-animation{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.aui-carousel{max-width:100%;position:relative;overflow:hidden;min-height:var(--aui-xxl);min-width:var(--aui-xxl);width:fit-content}.aui-carousel-item{flex:0 0 100%;width:100%;height:100%}.aui-carousel-arrow{position:absolute;top:50%;transform:translateY(-50%);width:var(--aui-l);height:var(--aui-l);padding:0}.aui-carousel-dots{position:absolute;bottom:var(--aui-s);transform:translateX(-50%);left:50%}.aui-carousel-dot{width:var(--aui-m);height:var(--aui-s);padding:0}.aui-flex-x,.aui-flex-y,.aui-flex--x,.aui-flex--y{display:flex}.aui-flex-x{flex-direction:row}.aui-flex-y{flex-direction:column}.aui-flex--x{flex-direction:row-reverse}.aui-flex--y{flex-direction:column-reverse}.aui-flex-wrap{flex-wrap:wrap}.aui-align-start{align-items:flex-start}.aui-align-center{align-items:center}.aui-align-end{align-items:flex-end}.aui-justify-start{justify-content:flex-start}.aui-justify-center{justify-content:center}.aui-justify-between{justify-content:space-between}.aui-justify-around{justify-content:space-around}.aui-justify-end{justify-content:flex-end}.aui-avatar-red{background-color:var(--aui-avatar-red)}.aui-avatar-yellow{background-color:var(--aui-avatar-yellow)}.aui-avatar-green{background-color:var(--aui-avatar-green)}.aui-avatar-blue{background-color:var(--aui-avatar-blue)}.aui-avatar-purple{background-color:var(--aui-avatar-purple)}.aui-avatar-xxs{width:12px;height:12px;line-height:12px;font-size:9.6px}.aui-avatar-xs{width:16px;height:16px;line-height:16px;font-size:12.8px}.aui-avatar-s{width:24px;height:24px;line-height:24px;font-size:19.2px}.aui-avatar-m{width:32px;height:32px;line-height:32px;font-size:25.6px}.aui-avatar-l{width:48px;height:48px;line-height:48px;font-size:38.4px}.aui-avatar-xl{width:64px;height:64px;line-height:64px;font-size:51.2px}.aui-avatar-xxl{width:128px;height:128px;line-height:128px;font-size:102.4px}.aui-icon-xxs{width:8px;height:8px}.aui-icon-xs{width:12px;height:12px}.aui-icon-s{width:16px;height:16px}.aui-icon-m{width:24px;height:24px}.aui-icon-l{width:32px;height:32px}.aui-icon-xl{width:48px;height:48px}.aui-icon-xxl{width:64px;height:64px}.aui-gap-none{gap:0}.aui-gap-xxs{gap:var(--aui-xxs)}.aui-gap-xs{gap:var(--aui-xs)}.aui-gap-s{gap:var(--aui-s)}.aui-gap-m{gap:var(--aui-m)}.aui-gap-l{gap:var(--aui-l)}.aui-gap-xl{gap:var(--aui-xl)}.aui-gap-xxl{gap:var(--aui-xxl)}.aui-pa-none{padding:0}.aui-pa-xxs{padding:var(--aui-xxs)}.aui-pa-xs{padding:var(--aui-xs)}.aui-pa-s{padding:var(--aui-s)}.aui-pa-m{padding:var(--aui-m)}.aui-pa-l{padding:var(--aui-l)}.aui-pa-xl{padding:var(--aui-xl)}.aui-pa-xxl{padding:var(--aui-xxl)}.aui-pt-none{padding-top:0}.aui-pt-xxs{padding-top:var(--aui-xxs)}.aui-pt-xs{padding-top:var(--aui-xs)}.aui-pt-s{padding-top:var(--aui-s)}.aui-pt-m{padding-top:var(--aui-m)}.aui-pt-l{padding-top:var(--aui-l)}.aui-pt-xl{padding-top:var(--aui-xl)}.aui-pt-xxl{padding-top:var(--aui-xxl)}.aui-pb-none{padding-bottom:0}.aui-pb-xxs{padding-bottom:var(--aui-xxs)}.aui-pb-xs{padding-bottom:var(--aui-xs)}.aui-pb-s{padding-bottom:var(--aui-s)}.aui-pb-m{padding-bottom:var(--aui-m)}.aui-pb-l{padding-bottom:var(--aui-l)}.aui-pb-xl{padding-bottom:var(--aui-xl)}.aui-pb-xxl{padding-bottom:var(--aui-xxl)}.aui-pl-none{padding-left:0}.aui-pl-xxs{padding-left:var(--aui-xxs)}.aui-pl-xs{padding-left:var(--aui-xs)}.aui-pl-s{padding-left:var(--aui-s)}.aui-pl-m{padding-left:var(--aui-m)}.aui-pl-l{padding-left:var(--aui-l)}.aui-pl-xl{padding-left:var(--aui-xl)}.aui-pl-xxl{padding-left:var(--aui-xxl)}.aui-pr-none{padding-right:0}.aui-pr-xxs{padding-right:var(--aui-xxs)}.aui-pr-xs{padding-right:var(--aui-xs)}.aui-pr-s{padding-right:var(--aui-s)}.aui-pr-m{padding-right:var(--aui-m)}.aui-pr-l{padding-right:var(--aui-l)}.aui-pr-xl{padding-right:var(--aui-xl)}.aui-pr-xxl{padding-right:var(--aui-xxl)}.aui-ma-auto{margin:auto}.aui-mt-auto{margin-top:auto}.aui-mb-auto{margin-bottom:auto}.aui-ml-auto{margin-left:auto}.aui-mr-auto{margin-right:auto}.aui-ma-none{margin:0}.aui-ma-xxs{margin:var(--aui-xxs)}.aui-ma-xs{margin:var(--aui-xs)}.aui-ma-s{margin:var(--aui-s)}.aui-ma-m{margin:var(--aui-m)}.aui-ma-l{margin:var(--aui-l)}.aui-ma-xl{margin:var(--aui-xl)}.aui-ma-xxl{margin:var(--aui-xxl)}.aui-mt-none{margin-top:0}.aui-mt-xxs{margin-top:var(--aui-xxs)}.aui-mt-xs{margin-top:var(--aui-xs)}.aui-mt-s{margin-top:var(--aui-s)}.aui-mt-m{margin-top:var(--aui-m)}.aui-mt-l{margin-top:var(--aui-l)}.aui-mt-xl{margin-top:var(--aui-xl)}.aui-mt-xxl{margin-top:var(--aui-xxl)}.aui-mb-none{margin-bottom:0}.aui-mb-xxs{margin-bottom:var(--aui-xxs)}.aui-mb-xs{margin-bottom:var(--aui-xs)}.aui-mb-s{margin-bottom:var(--aui-s)}.aui-mb-m{margin-bottom:var(--aui-m)}.aui-mb-l{margin-bottom:var(--aui-l)}.aui-mb-xl{margin-bottom:var(--aui-xl)}.aui-mb-xxl{margin-bottom:var(--aui-xxl)}.aui-ml-none{margin-left:0}.aui-ml-xxs{margin-left:var(--aui-xxs)}.aui-ml-xs{margin-left:var(--aui-xs)}.aui-ml-s{margin-left:var(--aui-s)}.aui-ml-m{margin-left:var(--aui-m)}.aui-ml-l{margin-left:var(--aui-l)}.aui-ml-xl{margin-left:var(--aui-xl)}.aui-ml-xxl{margin-left:var(--aui-xxl)}.aui-mr-none{margin-right:0}.aui-mr-xxs{margin-right:var(--aui-xxs)}.aui-mr-xs{margin-right:var(--aui-xs)}.aui-mr-s{margin-right:var(--aui-s)}.aui-mr-m{margin-right:var(--aui-m)}.aui-mr-l{margin-right:var(--aui-l)}.aui-mr-xl{margin-right:var(--aui-xl)}.aui-mr-xxl{margin-right:var(--aui-xxl)}.aui-w-full{width:100%}.aui-w-fit{width:fit-content}.aui-w-min{width:min-content}.aui-w-max{width:max-content}.aui-mw-full{max-width:100%}.aui-mw-fit{max-width:fit-content}.aui-mw-min{max-width:min-content}.aui-mw-max{max-width:max-content}.aui-h-full{height:100%}.aui-h-fit{height:fit-content}.aui-h-min{height:min-content}.aui-h-max{height:max-content}.aui-mh-full{max-height:100%}.aui-mh-fit{max-height:fit-content}.aui-mh-min{max-height:min-content}.aui-mh-max{max-height:max-content}.aui-select-icon{--size: 10px;color:var(--aui-select-icon);width:var(--size);height:var(--size);position:absolute;top:calc(50% + 1px);transform:translateY(-50%);right:var(--size);pointer-events:none}
package/utils/types.d.ts CHANGED
@@ -22,17 +22,21 @@ export type SizeDimension = "full" | "fit" | "min" | "max";
22
22
  /**
23
23
  * Size variants used for CSS.
24
24
  */
25
- type SizeToken = "none" | "xxs" | "xs" | "s" | "m" | "l" | "xl" | "xxl";
25
+ export type SizeToken = "xxs" | "xs" | "s" | "m" | "l" | "xl" | "xxl";
26
+ /**
27
+ * Size variants used for padding & margin
28
+ */
29
+ type SpacingSize = "none" | "xxs" | "xs" | "s" | "m" | "l" | "xl" | "xxl";
26
30
  /**
27
31
  * Used for margin
28
32
  */
29
- type AutoSize = SizeToken | "auto";
33
+ type AutoSize = SpacingSize | "auto";
30
34
  /** Layout props for a component */
31
35
  export type Layout = {
32
36
  /** Direction the layout spans; along the x-axis or y-axis (Equivalent to flex-direction) */
33
37
  axis?: "x" | "y" | "-x" | "-y";
34
38
  /** Spacing between children of the layout */
35
- gap?: SizeToken;
39
+ gap?: SpacingSize;
36
40
  /** Alignment orthogonal to the selected axis (Equivalent to align-items) */
37
41
  align?: "start" | "center" | "end";
38
42
  /** How to layout the children (Equivalent to justify-content) */
@@ -40,19 +44,19 @@ export type Layout = {
40
44
  /** Whether to allow wrapping of layout children */
41
45
  wrap?: boolean;
42
46
  /** Padding inside the layout */
43
- padding?: SizeToken;
47
+ padding?: SpacingSize;
44
48
  /** Horizontal padding inside the layout */
45
- paddingX?: SizeToken;
49
+ paddingX?: SpacingSize;
46
50
  /** Vertical padding inside the layout */
47
- paddingY?: SizeToken;
51
+ paddingY?: SpacingSize;
48
52
  /** Top padding inside the layout */
49
- paddingTop?: SizeToken;
53
+ paddingTop?: SpacingSize;
50
54
  /** Bottom padding inside the layout */
51
- paddingBottom?: SizeToken;
55
+ paddingBottom?: SpacingSize;
52
56
  /** Left padding inside the layout */
53
- paddingLeft?: SizeToken;
57
+ paddingLeft?: SpacingSize;
54
58
  /** Right padding inside the layout */
55
- paddingRight?: SizeToken;
59
+ paddingRight?: SpacingSize;
56
60
  /** Margin outside the layout */
57
61
  margin?: AutoSize;
58
62
  /** Horizontal margin outside the layout */