@k8o/arte-odyssey 7.0.0 → 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 (139) hide show
  1. package/README.md +12 -3
  2. package/dist/components/buttons/button/button.d.mts +8 -2
  3. package/dist/components/buttons/button/button.mjs +30 -21
  4. package/dist/components/buttons/icon-button/icon-button.d.mts +13 -2
  5. package/dist/components/buttons/icon-button/icon-button.mjs +74 -14
  6. package/dist/components/data-display/accordion/accordion.mjs +4 -6
  7. package/dist/components/data-display/accordion/context.mjs +1 -1
  8. package/dist/components/data-display/avatar/avatar.d.mts +2 -2
  9. package/dist/components/data-display/avatar/avatar.mjs +6 -4
  10. package/dist/components/data-display/badge/badge.d.mts +2 -2
  11. package/dist/components/data-display/badge/badge.mjs +5 -3
  12. package/dist/components/data-display/baseline-status/baseline-status.mjs +2 -2
  13. package/dist/components/data-display/card/card.mjs +3 -2
  14. package/dist/components/data-display/card/interactive-card.mjs +3 -2
  15. package/dist/components/data-display/card/type.d.mts +3 -3
  16. package/dist/components/data-display/code/code.d.mts +4 -3
  17. package/dist/components/data-display/code/code.mjs +9 -6
  18. package/dist/components/data-display/heading/heading.d.mts +3 -4
  19. package/dist/components/data-display/heading/heading.mjs +14 -13
  20. package/dist/components/data-display/table/table.mjs +38 -54
  21. package/dist/components/feedback/alert/alert.d.mts +2 -2
  22. package/dist/components/feedback/alert/alert.mjs +23 -24
  23. package/dist/components/feedback/progress/progress.d.mts +4 -3
  24. package/dist/components/feedback/progress/progress.mjs +14 -14
  25. package/dist/components/feedback/skeleton/skeleton.d.mts +2 -2
  26. package/dist/components/feedback/skeleton/skeleton.mjs +5 -6
  27. package/dist/components/feedback/spinner/spinner.d.mts +2 -2
  28. package/dist/components/feedback/spinner/spinner.mjs +13 -14
  29. package/dist/components/feedback/toast/context.d.mts +18 -0
  30. package/dist/components/feedback/toast/context.mjs +29 -0
  31. package/dist/components/feedback/toast/index.d.mts +2 -1
  32. package/dist/components/feedback/toast/index.mjs +2 -1
  33. package/dist/components/feedback/toast/provider.d.mts +1 -7
  34. package/dist/components/feedback/toast/provider.mjs +3 -26
  35. package/dist/components/feedback/toast/toast.mjs +1 -1
  36. package/dist/components/form/autocomplete/autocomplete.d.mts +3 -7
  37. package/dist/components/form/autocomplete/autocomplete.mjs +19 -20
  38. package/dist/components/form/checkbox/checkbox.d.mts +2 -4
  39. package/dist/components/form/checkbox/checkbox.mjs +8 -8
  40. package/dist/components/form/checkbox-card/checkbox-card.d.mts +3 -6
  41. package/dist/components/form/checkbox-card/checkbox-card.mjs +12 -10
  42. package/dist/components/form/checkbox-group/checkbox-group.d.mts +5 -8
  43. package/dist/components/form/checkbox-group/checkbox-group.mjs +19 -14
  44. package/dist/components/form/checkbox-group/index.d.mts +7 -15
  45. package/dist/components/form/file-field/file-field.d.mts +14 -23
  46. package/dist/components/form/file-field/file-field.mjs +22 -22
  47. package/dist/components/form/form/form.mjs +6 -8
  48. package/dist/components/form/form-control/form-control.d.mts +8 -8
  49. package/dist/components/form/form-control/form-control.mjs +20 -18
  50. package/dist/components/form/number-field/number-field.d.mts +5 -10
  51. package/dist/components/form/number-field/number-field.mjs +15 -18
  52. package/dist/components/form/password-input/password-input.d.mts +4 -22
  53. package/dist/components/form/password-input/password-input.mjs +9 -17
  54. package/dist/components/form/radio/radio.d.mts +4 -4
  55. package/dist/components/form/radio/radio.mjs +10 -10
  56. package/dist/components/form/radio-card/radio-card.d.mts +4 -6
  57. package/dist/components/form/radio-card/radio-card.mjs +14 -11
  58. package/dist/components/form/select/select.d.mts +4 -20
  59. package/dist/components/form/select/select.mjs +5 -11
  60. package/dist/components/form/slider/slider.d.mts +3 -8
  61. package/dist/components/form/slider/slider.mjs +8 -10
  62. package/dist/components/form/switch/switch.d.mts +3 -8
  63. package/dist/components/form/switch/switch.mjs +11 -13
  64. package/dist/components/form/text-field/text-field.d.mts +4 -21
  65. package/dist/components/form/text-field/text-field.mjs +5 -13
  66. package/dist/components/form/textarea/textarea.d.mts +4 -22
  67. package/dist/components/form/textarea/textarea.mjs +8 -14
  68. package/dist/components/icons/arte-odyssey.mjs +62 -68
  69. package/dist/components/icons/base.mjs +1 -3
  70. package/dist/components/icons/github-mark.mjs +13 -19
  71. package/dist/components/icons/logo.mjs +23 -29
  72. package/dist/components/icons/lucide.mjs +199 -379
  73. package/dist/components/icons/qiita.mjs +22 -28
  74. package/dist/components/icons/twitter.mjs +14 -20
  75. package/dist/components/index.d.mts +4 -5
  76. package/dist/components/index.mjs +10 -11
  77. package/dist/components/layout/scroll-linked/scroll-linked.mjs +1 -1
  78. package/dist/components/layout/separator/separator.d.mts +4 -3
  79. package/dist/components/layout/separator/separator.mjs +3 -2
  80. package/dist/components/navigation/anchor/anchor.d.mts +13 -10
  81. package/dist/components/navigation/anchor/anchor.mjs +16 -14
  82. package/dist/components/navigation/breadcrumb/breadcrumb.mjs +18 -24
  83. package/dist/components/navigation/pagination/pagination.d.mts +1 -1
  84. package/dist/components/navigation/pagination/pagination.mjs +4 -4
  85. package/dist/components/navigation/tabs/tabs.mjs +14 -9
  86. package/dist/components/overlays/dialog/dialog.mjs +6 -4
  87. package/dist/components/overlays/drawer/drawer.mjs +2 -1
  88. package/dist/components/overlays/dropdown-menu/dropdown-menu.mjs +10 -10
  89. package/dist/components/overlays/dropdown-menu/hooks.d.mts +287 -9
  90. package/dist/components/overlays/list-box/hooks.d.mts +287 -10
  91. package/dist/components/overlays/list-box/hooks.mjs +1 -1
  92. package/dist/components/overlays/list-box/list-box.mjs +17 -17
  93. package/dist/components/overlays/modal/modal.mjs +1 -1
  94. package/dist/components/overlays/popover/hooks.d.mts +24 -33
  95. package/dist/components/overlays/popover/hooks.mjs +16 -32
  96. package/dist/components/overlays/popover/popover.d.mts +9 -7
  97. package/dist/components/overlays/popover/popover.mjs +7 -7
  98. package/dist/components/overlays/tooltip/index.d.mts +2 -2
  99. package/dist/components/overlays/tooltip/tooltip.d.mts +11 -3
  100. package/dist/components/overlays/tooltip/tooltip.mjs +32 -13
  101. package/dist/components/providers/arte-odyssey-provider.mjs +4 -6
  102. package/dist/components/providers/portal-root.mjs +5 -9
  103. package/dist/helpers/cn.mjs +1 -3
  104. package/dist/helpers/color/find-all-colors.d.mts +6 -5
  105. package/dist/helpers/color/find-all-colors.mjs +29 -29
  106. package/dist/helpers/index.mjs +2 -2
  107. package/dist/helpers/merge-refs.d.mts +6 -0
  108. package/dist/helpers/merge-refs.mjs +23 -0
  109. package/dist/helpers/number/between.mjs +1 -3
  110. package/dist/helpers/number/cast.mjs +3 -7
  111. package/dist/helpers/number/commalize.mjs +1 -1
  112. package/dist/helpers/uuid-v4.mjs +1 -1
  113. package/dist/hooks/click-away/index.mjs +2 -2
  114. package/dist/hooks/client/index.mjs +1 -3
  115. package/dist/hooks/debounced-transition/index.d.mts +1 -1
  116. package/dist/hooks/debounced-transition/index.mjs +5 -6
  117. package/dist/hooks/disclosure/index.mjs +9 -3
  118. package/dist/hooks/hash/index.mjs +5 -4
  119. package/dist/hooks/hover/index.mjs +6 -2
  120. package/dist/hooks/index.mjs +1 -1
  121. package/dist/hooks/intersection-observer/use-intersection-observer.mjs +1 -1
  122. package/dist/hooks/resize/index.mjs +2 -2
  123. package/dist/hooks/scroll-direction/index.mjs +12 -20
  124. package/dist/hooks/scroll-lock/index.mjs +14 -18
  125. package/dist/hooks/window-resize/index.mjs +1 -1
  126. package/dist/hooks/window-size/index.mjs +1 -3
  127. package/dist/index.d.mts +4 -5
  128. package/dist/index.mjs +15 -16
  129. package/docs/references/components.md +18 -4
  130. package/docs/references/interaction-design.md +5 -2
  131. package/package.json +16 -16
  132. package/dist/components/buttons/icon-link/icon-link.d.mts +0 -27
  133. package/dist/components/buttons/icon-link/icon-link.mjs +0 -24
  134. package/dist/components/buttons/icon-link/index.d.mts +0 -2
  135. package/dist/components/buttons/icon-link/index.mjs +0 -2
  136. package/dist/components/buttons/link-button/index.d.mts +0 -2
  137. package/dist/components/buttons/link-button/index.mjs +0 -2
  138. package/dist/components/buttons/link-button/link-button.d.mts +0 -35
  139. package/dist/components/buttons/link-button/link-button.mjs +0 -34
package/README.md CHANGED
@@ -58,7 +58,11 @@ import { Card } from '@k8o/arte-odyssey';
58
58
  function MyPage() {
59
59
  return (
60
60
  <Card title="Welcome to ArteOdyssey">
61
- <Button color="primary" variant="contained" onClick={() => alert('Hello!')}>
61
+ <Button
62
+ color="primary"
63
+ variant="contained"
64
+ onClick={() => alert('Hello!')}
65
+ >
62
66
  Click me
63
67
  </Button>
64
68
  </Card>
@@ -164,7 +168,9 @@ import { Button } from '@k8o/arte-odyssey';
164
168
  label="Email"
165
169
  isRequired
166
170
  errorText={error}
167
- renderInput={(props) => <TextField {...props} id="email" placeholder="Enter your email" />}
171
+ renderInput={(props) => (
172
+ <TextField {...props} id="email" placeholder="Enter your email" />
173
+ )}
168
174
  />
169
175
  <Button type="submit">Submit</Button>
170
176
  </form>;
@@ -185,7 +191,10 @@ function MyComponent() {
185
191
  <Button onClick={() => setIsOpen(true)}>Open Dialog</Button>
186
192
  {isOpen && (
187
193
  <Dialog.Root>
188
- <Dialog.Header title="Confirm Action" onClose={() => setIsOpen(false)} />
194
+ <Dialog.Header
195
+ title="Confirm Action"
196
+ onClose={() => setIsOpen(false)}
197
+ />
189
198
  <Dialog.Content>
190
199
  <p>Are you sure you want to continue?</p>
191
200
  <Button onClick={() => setIsOpen(false)}>Confirm</Button>
@@ -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,36 +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
- return /* @__PURE__ */ jsxs("button", {
24
+ const hasStartIcon = resolvedStartIcon !== void 0;
25
+ const hasEndIcon = endIcon !== void 0;
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", {
25
45
  "aria-busy": isPending || void 0,
26
- className: cn("cursor-pointer rounded-full border-2 text-center font-bold transition-colors", {
27
- "border-transparent bg-primary-bg text-fg hover:bg-primary-bg-emphasize/80 active:bg-primary-bg-emphasize": variant === "contained" && color === "primary",
28
- "border-transparent bg-secondary-bg text-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",
46
+ className: cn(baseClassName, "cursor-pointer", {
30
47
  "cursor-not-allowed opacity-35 hover:bg-primary-bg active:bg-primary-bg": isDisabled && variant === "contained" && color === "primary",
31
48
  "cursor-not-allowed opacity-35 hover:bg-secondary-bg active:bg-secondary-bg": isDisabled && variant === "contained" && color === "secondary",
32
49
  "cursor-not-allowed opacity-35 hover:bg-bg-subtle active:bg-bg-subtle": isDisabled && variant === "contained" && color === "gray",
33
- "border-primary-border bg-bg-base text-primary-fg hover:bg-bg-subtle active:bg-bg-mute": variant === "outlined" && color === "primary",
34
- "border-secondary-border bg-bg-base text-secondary-fg hover:bg-bg-subtle active:bg-bg-mute": variant === "outlined" && color === "secondary",
35
- "border-border-base bg-bg-base text-fg-base hover:bg-bg-subtle active:bg-bg-mute": variant === "outlined" && color === "gray",
36
- "cursor-not-allowed bg-bg-base opacity-35 hover:bg-bg-base active:bg-bg-base": isDisabled && variant === "outlined",
37
- "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",
38
- "cursor-not-allowed bg-transparent text-fg-mute opacity-35 hover:bg-transparent hover:text-fg-mute active:bg-transparent active:text-fg-mute": isDisabled && variant === "skeleton"
39
- }, "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", Boolean(resolvedStartIcon ?? endIcon) && "flex items-center gap-2", resolvedStartIcon && endIcon ? "justify-between" : resolvedStartIcon && variant !== "skeleton" ? "justify-center" : endIcon && "justify-between"),
50
+ "cursor-not-allowed bg-bg-base opacity-35": isDisabled && variant === "outlined",
51
+ "cursor-not-allowed bg-transparent text-fg-mute opacity-35": isDisabled && variant === "skeleton"
52
+ }),
40
53
  disabled: isDisabled,
41
54
  onClick: handleClick,
42
55
  ref,
43
- type,
56
+ type: type === "submit" ? "submit" : "button",
44
57
  ...rest,
45
- children: [
46
- resolvedStartIcon,
47
- children,
48
- endIcon
49
- ]
58
+ children: composedChildren
50
59
  });
51
60
  };
52
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,18 +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 ? 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
- ...props,
27
- children: [!props.role && /* @__PURE__ */ jsx("span", {
28
- className: "sr-only",
29
- children: label
30
- }), 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 })]
31
91
  });
32
92
  };
33
93
  //#endregion
@@ -1,10 +1,8 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  //#region src/components/data-display/accordion/accordion.tsx
3
- const Accordion = ({ children }) => {
4
- return /* @__PURE__ */ jsx("div", {
5
- className: "divide-y divide-border-mute",
6
- children
7
- });
8
- };
3
+ const Accordion = ({ children }) => /* @__PURE__ */ jsx("div", {
4
+ className: "divide-border-mute divide-y",
5
+ children
6
+ });
9
7
  //#endregion
10
8
  export { Accordion };
@@ -14,7 +14,7 @@ const useToggleOpen = () => {
14
14
  };
15
15
  const useItemId = () => {
16
16
  const id = use(ItemIdContext);
17
- if (!id) throw new Error("useItemId must be used within AccordionProvider");
17
+ if (id === void 0 || id === "") throw new Error("useItemId must be used within AccordionProvider");
18
18
  return id;
19
19
  };
20
20
  const AccordionItemProvider = ({ defaultOpen = false, id, children }) => {
@@ -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 };
@@ -4,17 +4,19 @@ import { useState } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/components/data-display/avatar/avatar.tsx
6
6
  const getInitials = (name) => {
7
- if (!name) return "?";
8
- return name.trim().split(/\s+/).slice(0, 2).map((part) => part.charAt(0).toUpperCase()).join("") || "?";
7
+ if (name === void 0 || name === "") return "?";
8
+ const initials = name.trim().split(/\s+/).slice(0, 2).map((part) => part.charAt(0).toUpperCase()).join("");
9
+ return initials === "" ? "?" : initials;
9
10
  };
10
- const Avatar = ({ alt, fallback, name, size = "md", src }) => {
11
+ const Avatar = ({ alt, fallback, name, size = "md", src, className, ...rest }) => {
11
12
  const [failedSrc, setFailedSrc] = useState(null);
12
13
  const showImage = Boolean(src) && failedSrc !== src;
13
14
  const label = alt ?? name ?? "Avatar";
14
15
  const imageSize = size === "sm" ? 32 : size === "md" ? 40 : 56;
15
16
  return /* @__PURE__ */ jsx("span", {
17
+ ...rest,
16
18
  "aria-label": label,
17
- 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),
18
20
  role: "img",
19
21
  children: showImage ? /* @__PURE__ */ jsx("img", {
20
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
  };
@@ -10,11 +10,11 @@ const loadBaselineStatus = () => {
10
10
  const BaselineStatusResolved = ({ featureId }) => {
11
11
  use(loadBaselineStatus());
12
12
  return /* @__PURE__ */ jsx("baseline-status", {
13
- className: "wrap-normal max-w-full rounded-lg border border-border-base bg-bg-base p-4",
13
+ className: "border-border-base bg-bg-base max-w-full rounded-lg border p-4 wrap-normal",
14
14
  featureId
15
15
  });
16
16
  };
17
- const BaselineStatusSkeleton = () => /* @__PURE__ */ jsx("div", { className: "h-58 max-w-full animate-pulse rounded-lg border border-border-base bg-bg-base p-4 sm:h-40 md:h-30" });
17
+ const BaselineStatusSkeleton = () => /* @__PURE__ */ jsx("div", { className: "border-border-base bg-bg-base h-58 max-w-full animate-pulse rounded-lg border p-4 sm:h-40 md:h-30" });
18
18
  const BaselineStatus = ({ featureId }) => /* @__PURE__ */ jsx(Suspense, {
19
19
  fallback: /* @__PURE__ */ jsx(BaselineStatusSkeleton, {}),
20
20
  children: /* @__PURE__ */ jsx(BaselineStatusResolved, { featureId })
@@ -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,28 +1,31 @@
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: "m-0.5 rounded-md bg-bg-mute 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 = [];
12
14
  let lastIndex = 0;
13
- colors.forEach((colorInfo, index) => {
15
+ for (const [index, colorInfo] of colors.entries()) {
14
16
  if (colorInfo.start > lastIndex) parts.push(children.slice(lastIndex, colorInfo.start));
15
17
  parts.push(/* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
16
18
  "aria-label": `Color: ${colorInfo.color}`,
17
- className: "inline-block h-3 w-3 shrink-0 rounded-sm border border-border-base",
19
+ className: "border-border-base inline-block size-3 shrink-0 rounded-sm border",
18
20
  role: "img",
19
21
  style: { backgroundColor: colorInfo.color }
20
22
  }), children.slice(colorInfo.start, colorInfo.end)] }, `color-${String(index)}`));
21
23
  lastIndex = colorInfo.end;
22
- });
24
+ }
23
25
  if (lastIndex < children.length) parts.push(children.slice(lastIndex));
24
26
  return /* @__PURE__ */ jsx("code", {
25
- className: "m-0.5 inline-flex items-center gap-1 rounded-md bg-bg-mute 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
  };