@k8o/arte-odyssey 7.0.1 → 8.0.0

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 (91) hide show
  1. package/dist/components/buttons/button/button.d.mts +8 -2
  2. package/dist/components/buttons/button/button.mjs +25 -18
  3. package/dist/components/buttons/icon-button/icon-button.d.mts +13 -2
  4. package/dist/components/buttons/icon-button/icon-button.mjs +74 -15
  5. package/dist/components/data-display/avatar/avatar.d.mts +2 -2
  6. package/dist/components/data-display/avatar/avatar.mjs +3 -2
  7. package/dist/components/data-display/badge/badge.d.mts +2 -2
  8. package/dist/components/data-display/badge/badge.mjs +5 -3
  9. package/dist/components/data-display/card/card.mjs +3 -2
  10. package/dist/components/data-display/card/interactive-card.mjs +3 -2
  11. package/dist/components/data-display/card/type.d.mts +3 -3
  12. package/dist/components/data-display/code/code.d.mts +4 -3
  13. package/dist/components/data-display/code/code.mjs +6 -3
  14. package/dist/components/data-display/heading/heading.d.mts +3 -4
  15. package/dist/components/data-display/heading/heading.mjs +14 -13
  16. package/dist/components/feedback/alert/alert.d.mts +2 -2
  17. package/dist/components/feedback/alert/alert.mjs +3 -2
  18. package/dist/components/feedback/progress/progress.d.mts +4 -3
  19. package/dist/components/feedback/progress/progress.mjs +4 -2
  20. package/dist/components/feedback/skeleton/skeleton.d.mts +2 -2
  21. package/dist/components/feedback/skeleton/skeleton.mjs +3 -2
  22. package/dist/components/feedback/spinner/spinner.d.mts +2 -2
  23. package/dist/components/feedback/spinner/spinner.mjs +3 -2
  24. package/dist/components/feedback/toast/toast.mjs +1 -1
  25. package/dist/components/form/autocomplete/autocomplete.d.mts +3 -7
  26. package/dist/components/form/autocomplete/autocomplete.mjs +7 -7
  27. package/dist/components/form/checkbox/checkbox.d.mts +2 -4
  28. package/dist/components/form/checkbox/checkbox.mjs +6 -5
  29. package/dist/components/form/checkbox-card/checkbox-card.d.mts +3 -6
  30. package/dist/components/form/checkbox-card/checkbox-card.mjs +6 -6
  31. package/dist/components/form/checkbox-group/checkbox-group.d.mts +5 -8
  32. package/dist/components/form/checkbox-group/checkbox-group.mjs +6 -7
  33. package/dist/components/form/checkbox-group/index.d.mts +7 -15
  34. package/dist/components/form/file-field/file-field.d.mts +14 -23
  35. package/dist/components/form/file-field/file-field.mjs +15 -17
  36. package/dist/components/form/form-control/form-control.d.mts +8 -8
  37. package/dist/components/form/form-control/form-control.mjs +10 -10
  38. package/dist/components/form/number-field/number-field.d.mts +5 -10
  39. package/dist/components/form/number-field/number-field.mjs +10 -13
  40. package/dist/components/form/password-input/password-input.d.mts +4 -22
  41. package/dist/components/form/password-input/password-input.mjs +8 -16
  42. package/dist/components/form/radio/radio.d.mts +4 -4
  43. package/dist/components/form/radio/radio.mjs +9 -8
  44. package/dist/components/form/radio-card/radio-card.d.mts +4 -6
  45. package/dist/components/form/radio-card/radio-card.mjs +7 -6
  46. package/dist/components/form/select/select.d.mts +4 -20
  47. package/dist/components/form/select/select.mjs +4 -10
  48. package/dist/components/form/slider/slider.d.mts +3 -8
  49. package/dist/components/form/slider/slider.mjs +8 -10
  50. package/dist/components/form/switch/switch.d.mts +3 -8
  51. package/dist/components/form/switch/switch.mjs +10 -11
  52. package/dist/components/form/text-field/text-field.d.mts +4 -21
  53. package/dist/components/form/text-field/text-field.mjs +4 -12
  54. package/dist/components/form/textarea/textarea.d.mts +4 -22
  55. package/dist/components/form/textarea/textarea.mjs +7 -13
  56. package/dist/components/index.d.mts +2 -4
  57. package/dist/components/index.mjs +10 -12
  58. package/dist/components/layout/separator/separator.d.mts +4 -3
  59. package/dist/components/layout/separator/separator.mjs +3 -2
  60. package/dist/components/navigation/anchor/anchor.d.mts +13 -10
  61. package/dist/components/navigation/anchor/anchor.mjs +13 -11
  62. package/dist/components/navigation/pagination/pagination.d.mts +1 -1
  63. package/dist/components/navigation/pagination/pagination.mjs +3 -3
  64. package/dist/components/overlays/dialog/dialog.mjs +2 -1
  65. package/dist/components/overlays/drawer/drawer.mjs +2 -1
  66. package/dist/components/overlays/dropdown-menu/dropdown-menu.mjs +3 -2
  67. package/dist/components/overlays/dropdown-menu/hooks.d.mts +286 -8
  68. package/dist/components/overlays/list-box/hooks.d.mts +286 -9
  69. package/dist/components/overlays/list-box/list-box.mjs +3 -2
  70. package/dist/components/overlays/popover/hooks.d.mts +24 -33
  71. package/dist/components/overlays/popover/hooks.mjs +5 -25
  72. package/dist/components/overlays/popover/popover.d.mts +9 -7
  73. package/dist/components/overlays/popover/popover.mjs +7 -7
  74. package/dist/components/overlays/tooltip/index.d.mts +2 -2
  75. package/dist/components/overlays/tooltip/tooltip.d.mts +11 -3
  76. package/dist/components/overlays/tooltip/tooltip.mjs +29 -6
  77. package/dist/helpers/index.mjs +2 -2
  78. package/dist/helpers/merge-refs.d.mts +6 -0
  79. package/dist/helpers/merge-refs.mjs +23 -0
  80. package/dist/hooks/index.mjs +1 -1
  81. package/dist/index.d.mts +2 -4
  82. package/dist/index.mjs +15 -17
  83. package/package.json +9 -9
  84. package/dist/components/buttons/icon-link/icon-link.d.mts +0 -27
  85. package/dist/components/buttons/icon-link/icon-link.mjs +0 -24
  86. package/dist/components/buttons/icon-link/index.d.mts +0 -2
  87. package/dist/components/buttons/icon-link/index.mjs +0 -2
  88. package/dist/components/buttons/link-button/index.d.mts +0 -2
  89. package/dist/components/buttons/link-button/index.mjs +0 -2
  90. package/dist/components/buttons/link-button/link-button.d.mts +0 -35
  91. package/dist/components/buttons/link-button/link-button.mjs +0 -34
@@ -1,15 +1,21 @@
1
1
  import { FC, HTMLProps, ReactNode } from "react";
2
2
 
3
3
  //#region src/components/buttons/button/button.d.ts
4
- declare const Button: FC<{
4
+ type Props = {
5
5
  type?: 'button' | 'submit';
6
6
  size?: 'sm' | 'md' | 'lg';
7
7
  color?: 'primary' | 'secondary' | 'gray';
8
8
  variant?: 'contained' | 'outlined' | 'skeleton';
9
9
  fullWidth?: boolean;
10
+ isActive?: boolean;
10
11
  startIcon?: ReactNode;
11
12
  endIcon?: ReactNode;
12
13
  onAction?: () => void | Promise<void>;
13
- } & Omit<HTMLProps<HTMLButtonElement>, 'size' | 'type'>>;
14
+ renderItem?: (props: {
15
+ className: string;
16
+ children: ReactNode;
17
+ }) => ReactNode;
18
+ } & Omit<HTMLProps<HTMLButtonElement>, 'size' | 'type'>;
19
+ declare const Button: FC<Props>;
14
20
  //#endregion
15
21
  export { Button };
@@ -3,9 +3,9 @@ import { cn } from "../../../helpers/cn.mjs";
3
3
  import { Spinner } from "../../feedback/spinner/spinner.mjs";
4
4
  import { useTransition } from "react";
5
5
  import { useFormStatus } from "react-dom";
6
- import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region src/components/buttons/button/button.tsx
8
- const Button = ({ ref, children, type = "button", size = "md", color = "primary", variant = "contained", disabled = false, fullWidth = false, onAction, onClick, startIcon, endIcon, ...rest }) => {
8
+ const Button = ({ ref, children, type = "button", size = "md", color = "primary", variant = "contained", disabled = false, fullWidth = false, isActive = false, onAction, onClick, startIcon, endIcon, renderItem, ...rest }) => {
9
9
  const [transitionPending, startTransition] = useTransition();
10
10
  const { pending: formPending } = useFormStatus();
11
11
  const isPending = transitionPending || type === "submit" && formPending;
@@ -17,38 +17,45 @@ const Button = ({ ref, children, type = "button", size = "md", color = "primary"
17
17
  await onAction();
18
18
  });
19
19
  } : void 0;
20
- const resolvedStartIcon = isPending ? /* @__PURE__ */ jsx(Spinner, {
20
+ const resolvedStartIcon = !renderItem && isPending ? /* @__PURE__ */ jsx(Spinner, {
21
21
  label: "Loading",
22
22
  size: size === "lg" ? "md" : "sm"
23
23
  }) : startIcon;
24
24
  const hasStartIcon = resolvedStartIcon !== void 0;
25
25
  const hasEndIcon = endIcon !== void 0;
26
- return /* @__PURE__ */ jsxs("button", {
26
+ const baseClassName = cn("rounded-full border-2 text-center font-bold transition-colors", {
27
+ "border-transparent bg-primary-bg text-primary-fg hover:bg-primary-bg-emphasize/80 active:bg-primary-bg-emphasize": variant === "contained" && color === "primary",
28
+ "border-transparent bg-secondary-bg text-secondary-fg hover:bg-secondary-bg-emphasize/80 active:bg-secondary-bg-emphasize": variant === "contained" && color === "secondary",
29
+ "border-transparent bg-bg-subtle text-fg-base hover:bg-bg-mute/80 active:bg-bg-mute": variant === "contained" && color === "gray",
30
+ "border-primary-border bg-bg-base text-primary-fg hover:bg-bg-subtle active:bg-bg-mute": variant === "outlined" && color === "primary",
31
+ "border-secondary-border bg-bg-base text-secondary-fg hover:bg-bg-subtle active:bg-bg-mute": variant === "outlined" && color === "secondary",
32
+ "border-border-base bg-bg-base text-fg-base hover:bg-bg-subtle active:bg-bg-mute": variant === "outlined" && color === "gray",
33
+ "border-transparent bg-transparent text-fg-mute hover:bg-bg-subtle hover:text-fg-base active:bg-bg-mute active:text-fg-base": variant === "skeleton"
34
+ }, "focus-visible:border-transparent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-border-info", size === "sm" && "px-3 py-1 text-sm", size === "md" && "px-4 py-2 text-md", size === "lg" && "px-6 py-3 text-lg", fullWidth && "w-full", (hasStartIcon || hasEndIcon) && "flex items-center gap-2", hasStartIcon && hasEndIcon ? "justify-between" : hasStartIcon && variant !== "skeleton" ? "justify-center" : hasEndIcon && "justify-between", isActive && "text-fg-info");
35
+ const composedChildren = /* @__PURE__ */ jsxs(Fragment$1, { children: [
36
+ resolvedStartIcon,
37
+ children,
38
+ endIcon
39
+ ] });
40
+ if (renderItem) return renderItem({
41
+ className: baseClassName,
42
+ children: composedChildren
43
+ });
44
+ return /* @__PURE__ */ jsx("button", {
27
45
  "aria-busy": isPending || void 0,
28
- className: cn("cursor-pointer rounded-full border-2 text-center font-bold transition-colors", {
29
- "border-transparent bg-primary-bg text-primary-fg hover:bg-primary-bg-emphasize/80 active:bg-primary-bg-emphasize": variant === "contained" && color === "primary",
30
- "border-transparent bg-secondary-bg text-secondary-fg hover:bg-secondary-bg-emphasize/80 active:bg-secondary-bg-emphasize": variant === "contained" && color === "secondary",
31
- "border-transparent bg-bg-subtle text-fg-base hover:bg-bg-mute/80 active:bg-bg-mute": variant === "contained" && color === "gray",
46
+ className: cn(baseClassName, "cursor-pointer", {
32
47
  "cursor-not-allowed opacity-35 hover:bg-primary-bg active:bg-primary-bg": isDisabled && variant === "contained" && color === "primary",
33
48
  "cursor-not-allowed opacity-35 hover:bg-secondary-bg active:bg-secondary-bg": isDisabled && variant === "contained" && color === "secondary",
34
49
  "cursor-not-allowed opacity-35 hover:bg-bg-subtle active:bg-bg-subtle": isDisabled && variant === "contained" && color === "gray",
35
- "border-primary-border bg-bg-base text-primary-fg hover:bg-bg-subtle active:bg-bg-mute": variant === "outlined" && color === "primary",
36
- "border-secondary-border bg-bg-base text-secondary-fg hover:bg-bg-subtle active:bg-bg-mute": variant === "outlined" && color === "secondary",
37
- "border-border-base bg-bg-base text-fg-base hover:bg-bg-subtle active:bg-bg-mute": variant === "outlined" && color === "gray",
38
50
  "cursor-not-allowed bg-bg-base opacity-35": isDisabled && variant === "outlined",
39
- "border-transparent bg-transparent text-fg-mute hover:bg-bg-subtle hover:text-fg-base active:bg-bg-mute active:text-fg-base": variant === "skeleton",
40
51
  "cursor-not-allowed bg-transparent text-fg-mute opacity-35": isDisabled && variant === "skeleton"
41
- }, "focus-visible:border-transparent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-border-info", size === "sm" && "px-3 py-1 text-sm", size === "md" && "px-4 py-2 text-md", size === "lg" && "px-6 py-3 text-lg", fullWidth && "w-full", (hasStartIcon || hasEndIcon) && "flex items-center gap-2", hasStartIcon && hasEndIcon ? "justify-between" : hasStartIcon && variant !== "skeleton" ? "justify-center" : hasEndIcon && "justify-between"),
52
+ }),
42
53
  disabled: isDisabled,
43
54
  onClick: handleClick,
44
55
  ref,
45
56
  type: type === "submit" ? "submit" : "button",
46
57
  ...rest,
47
- children: [
48
- resolvedStartIcon,
49
- children,
50
- endIcon
51
- ]
58
+ children: composedChildren
52
59
  });
53
60
  };
54
61
  //#endregion
@@ -1,12 +1,23 @@
1
- import { FC, HTMLProps } from "react";
1
+ import { TooltipTriggerProps } from "../../overlays/tooltip/tooltip.mjs";
2
+ import { FC, HTMLProps, ReactNode } from "react";
3
+ import { Placement } from "@floating-ui/react";
2
4
 
3
5
  //#region src/components/buttons/icon-button/icon-button.d.ts
6
+ type IconButtonTriggerProps = Partial<TooltipTriggerProps>;
4
7
  type Props = {
5
8
  size?: 'sm' | 'md' | 'lg';
6
9
  bg?: 'transparent' | 'base' | 'primary' | 'secondary';
7
10
  label: string;
11
+ tooltipPlacement?: Placement;
12
+ tooltipDisabled?: boolean;
8
13
  onAction?: () => void | Promise<void>;
14
+ renderItem?: (props: {
15
+ className: string;
16
+ children: ReactNode;
17
+ 'aria-label': string;
18
+ triggerProps: IconButtonTriggerProps;
19
+ }) => ReactNode;
9
20
  } & Omit<HTMLProps<HTMLButtonElement>, 'size' | 'type'>;
10
21
  declare const IconButton: FC<Props>;
11
22
  //#endregion
12
- export { IconButton };
23
+ export { IconButton, IconButtonTriggerProps };
@@ -1,10 +1,16 @@
1
1
  "use client";
2
2
  import { cn } from "../../../helpers/cn.mjs";
3
+ import { Tooltip } from "../../overlays/tooltip/tooltip.mjs";
4
+ import { mergeRefs } from "../../../helpers/merge-refs.mjs";
3
5
  import { useTransition } from "react";
4
6
  import { useFormStatus } from "react-dom";
5
- import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
8
  //#region src/components/buttons/icon-button/icon-button.tsx
7
- const IconButton = ({ ref, size = "md", bg = "transparent", label, children, onAction, onClick, disabled, ...props }) => {
9
+ const joinIds = (...ids) => {
10
+ const filtered = ids.filter(Boolean);
11
+ return filtered.length === 0 ? void 0 : filtered.join(" ");
12
+ };
13
+ const IconButton = ({ ref, size = "md", bg = "transparent", label, tooltipPlacement = "bottom", tooltipDisabled = false, children, onAction, onClick, onMouseEnter, onMouseLeave, onFocus, onBlur, disabled, renderItem, "aria-describedby": describedBy, ...props }) => {
8
14
  const [transitionPending, startTransition] = useTransition();
9
15
  const { pending: formPending } = useFormStatus();
10
16
  const isPending = transitionPending || formPending;
@@ -16,19 +22,72 @@ const IconButton = ({ ref, size = "md", bg = "transparent", label, children, onA
16
22
  await onAction();
17
23
  });
18
24
  } : void 0;
19
- return /* @__PURE__ */ jsxs("button", {
20
- "aria-busy": isPending || void 0,
21
- "aria-label": props.role !== void 0 && props.role !== "" ? label : void 0,
22
- className: cn("inline-flex cursor-pointer rounded-full transition-colors", "focus-visible:border-transparent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-border-info", (bg === "transparent" || bg === "base") && "hover:bg-bg-subtle active:bg-bg-mute", bg === "base" && "bg-bg-base", bg === "transparent" && "bg-transparent", bg === "primary" && "bg-primary-bg hover:bg-primary-bg-emphasize/80 active:bg-primary-bg-emphasize", bg === "secondary" && "bg-secondary-bg hover:bg-secondary-bg-emphasize/80 active:bg-secondary-bg-emphasize", size === "sm" && "p-1", size === "md" && "p-2", size === "lg" && "p-3", isDisabled && "cursor-not-allowed opacity-50 hover:bg-transparent active:bg-transparent"),
23
- disabled: isDisabled,
24
- onClick: handleClick,
25
- ref,
26
- type: "button",
27
- ...props,
28
- children: [(props.role === void 0 || props.role === "") && /* @__PURE__ */ jsx("span", {
29
- className: "sr-only",
30
- children: label
31
- }), children]
25
+ const className = cn("inline-flex rounded-full transition-colors", "focus-visible:border-transparent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-border-info", (bg === "transparent" || bg === "base") && "hover:bg-bg-subtle active:bg-bg-mute", bg === "base" && "bg-bg-base", bg === "transparent" && "bg-transparent", bg === "primary" && "bg-primary-bg hover:bg-primary-bg-emphasize/80 active:bg-primary-bg-emphasize", bg === "secondary" && "bg-secondary-bg hover:bg-secondary-bg-emphasize/80 active:bg-secondary-bg-emphasize", size === "sm" && "p-1", size === "md" && "p-2", size === "lg" && "p-3", !renderItem && "cursor-pointer", !renderItem && isDisabled && "cursor-not-allowed opacity-50 hover:bg-transparent active:bg-transparent");
26
+ if (tooltipDisabled) {
27
+ if (renderItem) return /* @__PURE__ */ jsx(Fragment$1, { children: renderItem({
28
+ className,
29
+ children,
30
+ "aria-label": label,
31
+ triggerProps: {}
32
+ }) });
33
+ return /* @__PURE__ */ jsx("button", {
34
+ ...props,
35
+ "aria-busy": isPending || void 0,
36
+ "aria-describedby": describedBy,
37
+ "aria-label": label,
38
+ className,
39
+ disabled: isDisabled,
40
+ onBlur,
41
+ onClick: handleClick,
42
+ onFocus,
43
+ onMouseEnter,
44
+ onMouseLeave,
45
+ ref,
46
+ type: "button",
47
+ children
48
+ });
49
+ }
50
+ return /* @__PURE__ */ jsxs(Tooltip.Root, {
51
+ placement: tooltipPlacement,
52
+ children: [/* @__PURE__ */ jsx(Tooltip.Trigger, { renderItem: (triggerProps) => {
53
+ if (renderItem) return /* @__PURE__ */ jsx(Fragment$1, { children: renderItem({
54
+ className,
55
+ children,
56
+ "aria-label": label,
57
+ triggerProps: {
58
+ ...triggerProps,
59
+ "aria-describedby": joinIds(describedBy, triggerProps["aria-describedby"])
60
+ }
61
+ }) });
62
+ return /* @__PURE__ */ jsx("button", {
63
+ ...props,
64
+ "aria-busy": isPending || void 0,
65
+ "aria-describedby": joinIds(describedBy, triggerProps["aria-describedby"]),
66
+ "aria-label": label,
67
+ className,
68
+ disabled: isDisabled,
69
+ onBlur: (e) => {
70
+ triggerProps.onBlur(e);
71
+ onBlur?.(e);
72
+ },
73
+ onClick: handleClick,
74
+ onFocus: (e) => {
75
+ triggerProps.onFocus(e);
76
+ onFocus?.(e);
77
+ },
78
+ onMouseEnter: (e) => {
79
+ triggerProps.onMouseEnter(e);
80
+ onMouseEnter?.(e);
81
+ },
82
+ onMouseLeave: (e) => {
83
+ triggerProps.onMouseLeave(e);
84
+ onMouseLeave?.(e);
85
+ },
86
+ ref: mergeRefs(ref, triggerProps.ref),
87
+ type: "button",
88
+ children
89
+ });
90
+ } }), /* @__PURE__ */ jsx(Tooltip.Content, { children: label })]
32
91
  });
33
92
  };
34
93
  //#endregion
@@ -1,4 +1,4 @@
1
- import { FC } from "react";
1
+ import { FC, HTMLAttributes } from "react";
2
2
 
3
3
  //#region src/components/data-display/avatar/avatar.d.ts
4
4
  type Props = {
@@ -7,7 +7,7 @@ type Props = {
7
7
  name?: string;
8
8
  size?: 'sm' | 'md' | 'lg';
9
9
  src?: string;
10
- };
10
+ } & Omit<HTMLAttributes<HTMLSpanElement>, 'role' | 'aria-label'>;
11
11
  declare const Avatar: FC<Props>;
12
12
  //#endregion
13
13
  export { Avatar };
@@ -8,14 +8,15 @@ const getInitials = (name) => {
8
8
  const initials = name.trim().split(/\s+/).slice(0, 2).map((part) => part.charAt(0).toUpperCase()).join("");
9
9
  return initials === "" ? "?" : initials;
10
10
  };
11
- const Avatar = ({ alt, fallback, name, size = "md", src }) => {
11
+ const Avatar = ({ alt, fallback, name, size = "md", src, className, ...rest }) => {
12
12
  const [failedSrc, setFailedSrc] = useState(null);
13
13
  const showImage = Boolean(src) && failedSrc !== src;
14
14
  const label = alt ?? name ?? "Avatar";
15
15
  const imageSize = size === "sm" ? 32 : size === "md" ? 40 : 56;
16
16
  return /* @__PURE__ */ jsx("span", {
17
+ ...rest,
17
18
  "aria-label": label,
18
- className: cn("inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full border border-border-base bg-bg-mute font-medium text-fg-base", size === "sm" && "size-8 text-xs", size === "md" && "size-10 text-sm", size === "lg" && "size-14 text-lg"),
19
+ className: cn("inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full border border-border-base bg-bg-mute font-medium text-fg-base", size === "sm" && "size-8 text-xs", size === "md" && "size-10 text-sm", size === "lg" && "size-14 text-lg", className),
19
20
  role: "img",
20
21
  children: showImage ? /* @__PURE__ */ jsx("img", {
21
22
  alt: alt ?? "",
@@ -1,4 +1,4 @@
1
- import { FC } from "react";
1
+ import { FC, HTMLAttributes } from "react";
2
2
 
3
3
  //#region src/components/data-display/badge/badge.d.ts
4
4
  type Props = {
@@ -7,7 +7,7 @@ type Props = {
7
7
  interactive?: boolean;
8
8
  tone?: 'neutral' | 'info' | 'success' | 'warning' | 'error';
9
9
  variant?: 'solid' | 'outline';
10
- };
10
+ } & Omit<HTMLAttributes<HTMLElement>, 'children'>;
11
11
  declare const Badge: FC<Props>;
12
12
  //#endregion
13
13
  export { Badge };
@@ -1,16 +1,18 @@
1
1
  import { cn } from "../../../helpers/cn.mjs";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  //#region src/components/data-display/badge/badge.tsx
4
- const Badge = ({ interactive = false, size = "md", text, tone = "neutral", variant = "solid" }) => {
4
+ const Badge = ({ interactive = false, size = "md", text, tone = "neutral", variant = "solid", className, ...rest }) => {
5
5
  const interactiveClassName = cn(interactive && "cursor-pointer focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-border-info", interactive && tone === "neutral" && variant === "solid" && "hover:bg-bg-emphasize active:bg-bg-base", interactive && tone === "neutral" && variant === "outline" && "hover:bg-bg-subtle active:bg-bg-mute", interactive && tone === "info" && variant === "solid" && "hover:bg-bg-info/80 active:bg-bg-info/60", interactive && tone === "info" && variant === "outline" && "hover:bg-bg-info active:bg-bg-info/80", interactive && tone === "success" && variant === "solid" && "hover:bg-bg-success/80 active:bg-bg-success/60", interactive && tone === "success" && variant === "outline" && "hover:bg-bg-success active:bg-bg-success/80", interactive && tone === "warning" && variant === "solid" && "hover:bg-bg-warning/80 active:bg-bg-warning/60", interactive && tone === "warning" && variant === "outline" && "hover:bg-bg-warning active:bg-bg-warning/80", interactive && tone === "error" && variant === "solid" && "hover:bg-bg-error/80 active:bg-bg-error/60", interactive && tone === "error" && variant === "outline" && "hover:bg-bg-error active:bg-bg-error/80");
6
6
  const badgeClassName = cn("inline-flex items-center rounded-full border font-medium transition-colors", size === "sm" && "px-2 py-0.5 text-xs", size === "md" && "px-2.5 py-1 text-xs", tone === "neutral" && variant === "solid" && "border-border-mute bg-bg-mute text-fg-base", tone === "neutral" && variant === "outline" && "border-border-base bg-bg-base text-fg-base", tone === "info" && variant === "solid" && "border-border-info bg-bg-info text-fg-info", tone === "info" && variant === "outline" && "border-border-info bg-bg-base text-fg-info", tone === "success" && variant === "solid" && "border-border-success bg-bg-success text-fg-success", tone === "success" && variant === "outline" && "border-border-success bg-bg-base text-fg-success", tone === "warning" && variant === "solid" && "border-border-warning bg-bg-warning text-fg-warning", tone === "warning" && variant === "outline" && "border-border-warning bg-bg-base text-fg-warning", tone === "error" && variant === "solid" && "border-border-error bg-bg-error text-fg-error", tone === "error" && variant === "outline" && "border-border-error bg-bg-base text-fg-error", interactiveClassName);
7
7
  if (interactive) return /* @__PURE__ */ jsx("button", {
8
- className: badgeClassName,
8
+ ...rest,
9
+ className: cn(badgeClassName, className),
9
10
  type: "button",
10
11
  children: text
11
12
  });
12
13
  return /* @__PURE__ */ jsx("span", {
13
- className: badgeClassName,
14
+ ...rest,
15
+ className: cn(badgeClassName, className),
14
16
  children: text
15
17
  });
16
18
  };
@@ -1,8 +1,9 @@
1
1
  import { cn } from "../../../helpers/cn.mjs";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  //#region src/components/data-display/card/card.tsx
4
- const Card = ({ children, width = "full", appearance = "shadow" }) => /* @__PURE__ */ jsx("div", {
5
- className: cn("rounded-xl", appearance === "shadow" && "shadow-sm", appearance === "bordered" && "border border-border-mute", width === "full" && "w-full", width === "fit" && "w-fit", "bg-bg-base"),
4
+ const Card = ({ children, width = "full", appearance = "shadow", className, ...rest }) => /* @__PURE__ */ jsx("div", {
5
+ ...rest,
6
+ className: cn("rounded-xl", appearance === "shadow" && "shadow-sm", appearance === "bordered" && "border border-border-mute", width === "full" && "w-full", width === "fit" && "w-fit", "bg-bg-base", className),
6
7
  children
7
8
  });
8
9
  //#endregion
@@ -1,8 +1,9 @@
1
1
  import { cn } from "../../../helpers/cn.mjs";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  //#region src/components/data-display/card/interactive-card.tsx
4
- const InteractiveCard = ({ children, width = "full", appearance = "shadow" }) => /* @__PURE__ */ jsx("div", {
5
- className: cn("rounded-xl transition-transform hover:scale-[1.02] active:scale-[0.98]", appearance === "shadow" && "shadow-sm", appearance === "bordered" && "border border-border-mute", width === "full" && "w-full", width === "fit" && "w-fit", "bg-bg-base"),
4
+ const InteractiveCard = ({ children, width = "full", appearance = "shadow", className, ...rest }) => /* @__PURE__ */ jsx("div", {
5
+ ...rest,
6
+ className: cn("rounded-xl transition-transform hover:scale-[1.02] active:scale-[0.98]", appearance === "shadow" && "shadow-sm", appearance === "bordered" && "border border-border-mute", width === "full" && "w-full", width === "fit" && "w-fit", "bg-bg-base", className),
6
7
  children
7
8
  });
8
9
  //#endregion
@@ -1,9 +1,9 @@
1
- import { PropsWithChildren } from "react";
1
+ import { HTMLAttributes } from "react";
2
2
 
3
3
  //#region src/components/data-display/card/type.d.ts
4
- type CardProps = PropsWithChildren<{
4
+ type CardProps = {
5
5
  width?: 'full' | 'fit';
6
6
  appearance?: 'shadow' | 'bordered';
7
- }>;
7
+ } & HTMLAttributes<HTMLDivElement>;
8
8
  //#endregion
9
9
  export { CardProps };
@@ -1,8 +1,9 @@
1
- import { FC } from "react";
1
+ import { FC, HTMLAttributes } from "react";
2
2
 
3
3
  //#region src/components/data-display/code/code.d.ts
4
- declare const Code: FC<{
4
+ type Props = {
5
5
  children: string;
6
- }>;
6
+ } & Omit<HTMLAttributes<HTMLElement>, 'children'>;
7
+ declare const Code: FC<Props>;
7
8
  //#endregion
8
9
  export { Code };
@@ -1,11 +1,13 @@
1
+ import { cn } from "../../../helpers/cn.mjs";
1
2
  import { findAllColors } from "../../../helpers/color/find-all-colors.mjs";
2
3
  import { Fragment } from "react";
3
4
  import { jsx, jsxs } from "react/jsx-runtime";
4
5
  //#region src/components/data-display/code/code.tsx
5
- const Code = ({ children }) => {
6
+ const Code = ({ children, className, ...rest }) => {
6
7
  const colors = findAllColors(children);
7
8
  if (colors.length === 0) return /* @__PURE__ */ jsx("code", {
8
- className: "bg-bg-mute m-0.5 rounded-md px-1.5 sm:py-0.5",
9
+ ...rest,
10
+ className: cn("bg-bg-mute m-0.5 rounded-md px-1.5 sm:py-0.5", className),
9
11
  children
10
12
  });
11
13
  const parts = [];
@@ -22,7 +24,8 @@ const Code = ({ children }) => {
22
24
  }
23
25
  if (lastIndex < children.length) parts.push(children.slice(lastIndex));
24
26
  return /* @__PURE__ */ jsx("code", {
25
- className: "bg-bg-mute m-0.5 inline-flex items-center gap-1 rounded-md px-1.5 sm:py-0.5",
27
+ ...rest,
28
+ className: cn("bg-bg-mute m-0.5 inline-flex items-center gap-1 rounded-md px-1.5 sm:py-0.5", className),
26
29
  children: parts
27
30
  });
28
31
  };
@@ -1,11 +1,10 @@
1
- import { FC, PropsWithChildren } from "react";
1
+ import { FC, HTMLAttributes } from "react";
2
2
 
3
3
  //#region src/components/data-display/heading/heading.d.ts
4
- type Props = PropsWithChildren<{
5
- id?: string;
4
+ type Props = {
6
5
  type: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
7
6
  lineClamp?: number;
8
- }>;
7
+ } & HTMLAttributes<HTMLHeadingElement>;
9
8
  declare const Heading: FC<Props>;
10
9
  //#endregion
11
10
  export { Heading };
@@ -1,35 +1,36 @@
1
1
  import { cn } from "../../../helpers/cn.mjs";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  //#region src/components/data-display/heading/heading.tsx
4
- const Heading = ({ children, id, type, lineClamp }) => {
4
+ const Heading = ({ children, type, lineClamp, className, ...rest }) => {
5
+ const lineClampClass = { [`line-clamp-${lineClamp?.toString() ?? ""}`]: lineClamp };
5
6
  if (type === "h1") return /* @__PURE__ */ jsx("h1", {
6
- className: cn("font-bold text-2xl md:text-3xl", { [`line-clamp-${lineClamp?.toString() ?? ""}`]: lineClamp }),
7
- id,
7
+ ...rest,
8
+ className: cn("font-bold text-2xl md:text-3xl", lineClampClass, className),
8
9
  children
9
10
  });
10
11
  if (type === "h2") return /* @__PURE__ */ jsx("h2", {
11
- className: cn("font-bold text-xl md:text-2xl", { [`line-clamp-${lineClamp?.toString() ?? ""}`]: lineClamp }),
12
- id,
12
+ ...rest,
13
+ className: cn("font-bold text-xl md:text-2xl", lineClampClass, className),
13
14
  children
14
15
  });
15
16
  if (type === "h3") return /* @__PURE__ */ jsx("h3", {
16
- className: cn("font-bold text-lg md:text-xl", { [`line-clamp-${lineClamp?.toString() ?? ""}`]: lineClamp }),
17
- id,
17
+ ...rest,
18
+ className: cn("font-bold text-lg md:text-xl", lineClampClass, className),
18
19
  children
19
20
  });
20
21
  if (type === "h4") return /* @__PURE__ */ jsx("h4", {
21
- className: cn("font-bold text-md md:text-lg", { [`line-clamp-${lineClamp?.toString() ?? ""}`]: lineClamp }),
22
- id,
22
+ ...rest,
23
+ className: cn("font-bold text-md md:text-lg", lineClampClass, className),
23
24
  children
24
25
  });
25
26
  if (type === "h5") return /* @__PURE__ */ jsx("h5", {
26
- className: cn("font-bold text-sm md:text-md", { [`line-clamp-${lineClamp?.toString() ?? ""}`]: lineClamp }),
27
- id,
27
+ ...rest,
28
+ className: cn("font-bold text-sm md:text-md", lineClampClass, className),
28
29
  children
29
30
  });
30
31
  return /* @__PURE__ */ jsx("h6", {
31
- className: cn("font-bold text-xs md:text-sm", { [`line-clamp-${lineClamp?.toString() ?? ""}`]: lineClamp }),
32
- id,
32
+ ...rest,
33
+ className: cn("font-bold text-xs md:text-sm", lineClampClass, className),
33
34
  children
34
35
  });
35
36
  };
@@ -1,11 +1,11 @@
1
1
  import { Status } from "../../../types/variables.mjs";
2
- import { FC } from "react";
2
+ import { FC, HTMLAttributes } from "react";
3
3
 
4
4
  //#region src/components/feedback/alert/alert.d.ts
5
5
  type Props = {
6
6
  status: Status;
7
7
  message: string | string[];
8
- };
8
+ } & Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'role'>;
9
9
  declare const Alert: FC<Props>;
10
10
  //#endregion
11
11
  export { Alert };
@@ -8,8 +8,9 @@ const STATUS_LABEL = {
8
8
  warning: "警告",
9
9
  error: "エラー"
10
10
  };
11
- const Alert = ({ status, message }) => /* @__PURE__ */ jsxs("div", {
12
- className: cn("flex items-center gap-3 rounded-lg p-4", status === "success" && "bg-bg-success", status === "info" && "bg-bg-info", status === "warning" && "bg-bg-warning", status === "error" && "bg-bg-error"),
11
+ const Alert = ({ status, message, className, ...rest }) => /* @__PURE__ */ jsxs("div", {
12
+ ...rest,
13
+ className: cn("flex items-center gap-3 rounded-lg p-4", status === "success" && "bg-bg-success", status === "info" && "bg-bg-info", status === "warning" && "bg-bg-warning", status === "error" && "bg-bg-error", className),
13
14
  role: status === "error" || status === "warning" ? "alert" : "status",
14
15
  children: [/* @__PURE__ */ jsxs("span", {
15
16
  className: cn(status === "success" && "text-fg-success", status === "info" && "text-fg-info", status === "warning" && "text-fg-warning", status === "error" && "text-fg-error"),
@@ -1,11 +1,12 @@
1
- import { FC } from "react";
1
+ import { FC, HTMLAttributes } from "react";
2
2
 
3
3
  //#region src/components/feedback/progress/progress.d.ts
4
- declare const Progress: FC<{
4
+ type Props = {
5
5
  progress: number;
6
6
  maxProgress: number;
7
7
  minProgress?: number;
8
8
  label?: string;
9
- }>;
9
+ } & Omit<HTMLAttributes<HTMLDivElement>, 'children'>;
10
+ declare const Progress: FC<Props>;
10
11
  //#endregion
11
12
  export { Progress };
@@ -1,8 +1,10 @@
1
+ import { cn } from "../../../helpers/cn.mjs";
1
2
  import { toPrecision } from "../../../helpers/number/to-precision.mjs";
2
3
  import { jsx } from "react/jsx-runtime";
3
4
  //#region src/components/feedback/progress/progress.tsx
4
- const Progress = ({ progress, maxProgress, minProgress = 0, label }) => /* @__PURE__ */ jsx("div", {
5
- className: "bg-bg-emphasize w-full rounded-full",
5
+ const Progress = ({ progress, maxProgress, minProgress = 0, label, className, ...rest }) => /* @__PURE__ */ jsx("div", {
6
+ ...rest,
7
+ className: cn("bg-bg-emphasize w-full rounded-full", className),
6
8
  children: /* @__PURE__ */ jsx("div", {
7
9
  "aria-label": label ?? `${toPrecision(progress / maxProgress).toString()}%`,
8
10
  "aria-valuemax": maxProgress,
@@ -1,11 +1,11 @@
1
- import { FC } from "react";
1
+ import { FC, HTMLAttributes } from "react";
2
2
 
3
3
  //#region src/components/feedback/skeleton/skeleton.d.ts
4
4
  type Props = {
5
5
  animate?: boolean;
6
6
  shape?: 'rect' | 'circle';
7
7
  size?: 'sm' | 'md' | 'lg';
8
- };
8
+ } & Omit<HTMLAttributes<HTMLDivElement>, 'children'>;
9
9
  declare const Skeleton: FC<Props>;
10
10
  //#endregion
11
11
  export { Skeleton };
@@ -1,9 +1,10 @@
1
1
  import { cn } from "../../../helpers/cn.mjs";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  //#region src/components/feedback/skeleton/skeleton.tsx
4
- const Skeleton = ({ animate = true, shape = "rect", size = "md" }) => /* @__PURE__ */ jsx("div", {
4
+ const Skeleton = ({ animate = true, shape = "rect", size = "md", className, ...rest }) => /* @__PURE__ */ jsx("div", {
5
+ ...rest,
5
6
  "aria-hidden": true,
6
- className: cn("bg-bg-mute", animate && "animate-pulse", shape === "rect" && "rounded-lg", shape === "rect" && size === "sm" && "h-3 w-24", shape === "rect" && size === "md" && "h-4 w-40", shape === "rect" && size === "lg" && "h-5 w-56", shape === "circle" && "rounded-full", shape === "circle" && size === "sm" && "size-8", shape === "circle" && size === "md" && "size-12", shape === "circle" && size === "lg" && "size-16")
7
+ className: cn("bg-bg-mute", animate && "animate-pulse", shape === "rect" && "rounded-lg", shape === "rect" && size === "sm" && "h-3 w-24", shape === "rect" && size === "md" && "h-4 w-40", shape === "rect" && size === "lg" && "h-5 w-56", shape === "circle" && "rounded-full", shape === "circle" && size === "sm" && "size-8", shape === "circle" && size === "md" && "size-12", shape === "circle" && size === "lg" && "size-16", className)
7
8
  });
8
9
  //#endregion
9
10
  export { Skeleton };
@@ -1,10 +1,10 @@
1
- import { FC } from "react";
1
+ import { FC, OutputHTMLAttributes } from "react";
2
2
 
3
3
  //#region src/components/feedback/spinner/spinner.d.ts
4
4
  type Props = {
5
5
  label?: string;
6
6
  size?: 'sm' | 'md' | 'lg';
7
- };
7
+ } & Omit<OutputHTMLAttributes<HTMLOutputElement>, 'children' | 'aria-label'>;
8
8
  declare const Spinner: FC<Props>;
9
9
  //#endregion
10
10
  export { Spinner };
@@ -1,10 +1,11 @@
1
1
  import { cn } from "../../../helpers/cn.mjs";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  //#region src/components/feedback/spinner/spinner.tsx
4
- const Spinner = ({ label = "Loading", size = "md" }) => /* @__PURE__ */ jsxs("output", {
4
+ const Spinner = ({ label = "Loading", size = "md", className, ...rest }) => /* @__PURE__ */ jsxs("output", {
5
+ ...rest,
5
6
  "aria-label": label,
6
7
  "aria-live": "polite",
7
- className: "inline-flex items-center justify-center",
8
+ className: cn("inline-flex items-center justify-center", className),
8
9
  children: [/* @__PURE__ */ jsx("span", {
9
10
  "aria-hidden": true,
10
11
  className: cn("inline-block animate-spin rounded-full border-4 border-border-base border-t-primary-border", size === "sm" && "size-4", size === "md" && "size-6", size === "lg" && "size-8")
@@ -1,6 +1,6 @@
1
1
  "use client";
2
- import { Alert } from "../alert/alert.mjs";
3
2
  import { useToast } from "./context.mjs";
3
+ import { Alert } from "../alert/alert.mjs";
4
4
  import { useTimeout } from "../../../hooks/timeout/index.mjs";
5
5
  import { useCallback } from "react";
6
6
  import { jsx } from "react/jsx-runtime";
@@ -1,16 +1,12 @@
1
1
  import { Option } from "../../../types/variables.mjs";
2
- import { FC } from "react";
2
+ import { FC, InputHTMLAttributes } from "react";
3
3
 
4
4
  //#region src/components/form/autocomplete/autocomplete.d.ts
5
5
  type BaseProps = {
6
6
  id: string;
7
- name?: string;
8
- describedbyId: string | undefined;
9
- isInvalid: boolean;
10
- isDisabled: boolean;
11
- isRequired: boolean;
7
+ invalid?: boolean;
12
8
  options: readonly Option[];
13
- };
9
+ } & Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'role' | 'className' | 'value' | 'onChange' | 'defaultValue' | 'children' | 'id' | 'autoComplete' | 'aria-autocomplete' | 'aria-controls' | 'aria-expanded'>;
14
10
  type ControlledProps = {
15
11
  value: string[];
16
12
  onChange: (value: string[]) => void;