@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.
- package/README.md +12 -3
- package/dist/components/buttons/button/button.d.mts +8 -2
- package/dist/components/buttons/button/button.mjs +30 -21
- package/dist/components/buttons/icon-button/icon-button.d.mts +13 -2
- package/dist/components/buttons/icon-button/icon-button.mjs +74 -14
- package/dist/components/data-display/accordion/accordion.mjs +4 -6
- package/dist/components/data-display/accordion/context.mjs +1 -1
- package/dist/components/data-display/avatar/avatar.d.mts +2 -2
- package/dist/components/data-display/avatar/avatar.mjs +6 -4
- package/dist/components/data-display/badge/badge.d.mts +2 -2
- package/dist/components/data-display/badge/badge.mjs +5 -3
- package/dist/components/data-display/baseline-status/baseline-status.mjs +2 -2
- package/dist/components/data-display/card/card.mjs +3 -2
- package/dist/components/data-display/card/interactive-card.mjs +3 -2
- package/dist/components/data-display/card/type.d.mts +3 -3
- package/dist/components/data-display/code/code.d.mts +4 -3
- package/dist/components/data-display/code/code.mjs +9 -6
- package/dist/components/data-display/heading/heading.d.mts +3 -4
- package/dist/components/data-display/heading/heading.mjs +14 -13
- package/dist/components/data-display/table/table.mjs +38 -54
- package/dist/components/feedback/alert/alert.d.mts +2 -2
- package/dist/components/feedback/alert/alert.mjs +23 -24
- package/dist/components/feedback/progress/progress.d.mts +4 -3
- package/dist/components/feedback/progress/progress.mjs +14 -14
- package/dist/components/feedback/skeleton/skeleton.d.mts +2 -2
- package/dist/components/feedback/skeleton/skeleton.mjs +5 -6
- package/dist/components/feedback/spinner/spinner.d.mts +2 -2
- package/dist/components/feedback/spinner/spinner.mjs +13 -14
- package/dist/components/feedback/toast/context.d.mts +18 -0
- package/dist/components/feedback/toast/context.mjs +29 -0
- package/dist/components/feedback/toast/index.d.mts +2 -1
- package/dist/components/feedback/toast/index.mjs +2 -1
- package/dist/components/feedback/toast/provider.d.mts +1 -7
- package/dist/components/feedback/toast/provider.mjs +3 -26
- package/dist/components/feedback/toast/toast.mjs +1 -1
- package/dist/components/form/autocomplete/autocomplete.d.mts +3 -7
- package/dist/components/form/autocomplete/autocomplete.mjs +19 -20
- package/dist/components/form/checkbox/checkbox.d.mts +2 -4
- package/dist/components/form/checkbox/checkbox.mjs +8 -8
- package/dist/components/form/checkbox-card/checkbox-card.d.mts +3 -6
- package/dist/components/form/checkbox-card/checkbox-card.mjs +12 -10
- package/dist/components/form/checkbox-group/checkbox-group.d.mts +5 -8
- package/dist/components/form/checkbox-group/checkbox-group.mjs +19 -14
- package/dist/components/form/checkbox-group/index.d.mts +7 -15
- package/dist/components/form/file-field/file-field.d.mts +14 -23
- package/dist/components/form/file-field/file-field.mjs +22 -22
- package/dist/components/form/form/form.mjs +6 -8
- package/dist/components/form/form-control/form-control.d.mts +8 -8
- package/dist/components/form/form-control/form-control.mjs +20 -18
- package/dist/components/form/number-field/number-field.d.mts +5 -10
- package/dist/components/form/number-field/number-field.mjs +15 -18
- package/dist/components/form/password-input/password-input.d.mts +4 -22
- package/dist/components/form/password-input/password-input.mjs +9 -17
- package/dist/components/form/radio/radio.d.mts +4 -4
- package/dist/components/form/radio/radio.mjs +10 -10
- package/dist/components/form/radio-card/radio-card.d.mts +4 -6
- package/dist/components/form/radio-card/radio-card.mjs +14 -11
- package/dist/components/form/select/select.d.mts +4 -20
- package/dist/components/form/select/select.mjs +5 -11
- package/dist/components/form/slider/slider.d.mts +3 -8
- package/dist/components/form/slider/slider.mjs +8 -10
- package/dist/components/form/switch/switch.d.mts +3 -8
- package/dist/components/form/switch/switch.mjs +11 -13
- package/dist/components/form/text-field/text-field.d.mts +4 -21
- package/dist/components/form/text-field/text-field.mjs +5 -13
- package/dist/components/form/textarea/textarea.d.mts +4 -22
- package/dist/components/form/textarea/textarea.mjs +8 -14
- package/dist/components/icons/arte-odyssey.mjs +62 -68
- package/dist/components/icons/base.mjs +1 -3
- package/dist/components/icons/github-mark.mjs +13 -19
- package/dist/components/icons/logo.mjs +23 -29
- package/dist/components/icons/lucide.mjs +199 -379
- package/dist/components/icons/qiita.mjs +22 -28
- package/dist/components/icons/twitter.mjs +14 -20
- package/dist/components/index.d.mts +4 -5
- package/dist/components/index.mjs +10 -11
- package/dist/components/layout/scroll-linked/scroll-linked.mjs +1 -1
- package/dist/components/layout/separator/separator.d.mts +4 -3
- package/dist/components/layout/separator/separator.mjs +3 -2
- package/dist/components/navigation/anchor/anchor.d.mts +13 -10
- package/dist/components/navigation/anchor/anchor.mjs +16 -14
- package/dist/components/navigation/breadcrumb/breadcrumb.mjs +18 -24
- package/dist/components/navigation/pagination/pagination.d.mts +1 -1
- package/dist/components/navigation/pagination/pagination.mjs +4 -4
- package/dist/components/navigation/tabs/tabs.mjs +14 -9
- package/dist/components/overlays/dialog/dialog.mjs +6 -4
- package/dist/components/overlays/drawer/drawer.mjs +2 -1
- package/dist/components/overlays/dropdown-menu/dropdown-menu.mjs +10 -10
- package/dist/components/overlays/dropdown-menu/hooks.d.mts +287 -9
- package/dist/components/overlays/list-box/hooks.d.mts +287 -10
- package/dist/components/overlays/list-box/hooks.mjs +1 -1
- package/dist/components/overlays/list-box/list-box.mjs +17 -17
- package/dist/components/overlays/modal/modal.mjs +1 -1
- package/dist/components/overlays/popover/hooks.d.mts +24 -33
- package/dist/components/overlays/popover/hooks.mjs +16 -32
- package/dist/components/overlays/popover/popover.d.mts +9 -7
- package/dist/components/overlays/popover/popover.mjs +7 -7
- package/dist/components/overlays/tooltip/index.d.mts +2 -2
- package/dist/components/overlays/tooltip/tooltip.d.mts +11 -3
- package/dist/components/overlays/tooltip/tooltip.mjs +32 -13
- package/dist/components/providers/arte-odyssey-provider.mjs +4 -6
- package/dist/components/providers/portal-root.mjs +5 -9
- package/dist/helpers/cn.mjs +1 -3
- package/dist/helpers/color/find-all-colors.d.mts +6 -5
- package/dist/helpers/color/find-all-colors.mjs +29 -29
- package/dist/helpers/index.mjs +2 -2
- package/dist/helpers/merge-refs.d.mts +6 -0
- package/dist/helpers/merge-refs.mjs +23 -0
- package/dist/helpers/number/between.mjs +1 -3
- package/dist/helpers/number/cast.mjs +3 -7
- package/dist/helpers/number/commalize.mjs +1 -1
- package/dist/helpers/uuid-v4.mjs +1 -1
- package/dist/hooks/click-away/index.mjs +2 -2
- package/dist/hooks/client/index.mjs +1 -3
- package/dist/hooks/debounced-transition/index.d.mts +1 -1
- package/dist/hooks/debounced-transition/index.mjs +5 -6
- package/dist/hooks/disclosure/index.mjs +9 -3
- package/dist/hooks/hash/index.mjs +5 -4
- package/dist/hooks/hover/index.mjs +6 -2
- package/dist/hooks/index.mjs +1 -1
- package/dist/hooks/intersection-observer/use-intersection-observer.mjs +1 -1
- package/dist/hooks/resize/index.mjs +2 -2
- package/dist/hooks/scroll-direction/index.mjs +12 -20
- package/dist/hooks/scroll-lock/index.mjs +14 -18
- package/dist/hooks/window-resize/index.mjs +1 -1
- package/dist/hooks/window-size/index.mjs +1 -3
- package/dist/index.d.mts +4 -5
- package/dist/index.mjs +15 -16
- package/docs/references/components.md +18 -4
- package/docs/references/interaction-design.md +5 -2
- package/package.json +16 -16
- package/dist/components/buttons/icon-link/icon-link.d.mts +0 -27
- package/dist/components/buttons/icon-link/icon-link.mjs +0 -24
- package/dist/components/buttons/icon-link/index.d.mts +0 -2
- package/dist/components/buttons/icon-link/index.mjs +0 -2
- package/dist/components/buttons/link-button/index.d.mts +0 -2
- package/dist/components/buttons/link-button/index.mjs +0 -2
- package/dist/components/buttons/link-button/link-button.d.mts +0 -35
- 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
|
|
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) =>
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
"
|
|
34
|
-
"
|
|
35
|
-
|
|
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 {
|
|
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
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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 (
|
|
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 (
|
|
8
|
-
|
|
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
|
-
|
|
8
|
+
...rest,
|
|
9
|
+
className: cn(badgeClassName, className),
|
|
9
10
|
type: "button",
|
|
10
11
|
children: text
|
|
11
12
|
});
|
|
12
13
|
return /* @__PURE__ */ jsx("span", {
|
|
13
|
-
|
|
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: "
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
1
|
+
import { HTMLAttributes } from "react";
|
|
2
2
|
|
|
3
3
|
//#region src/components/data-display/card/type.d.ts
|
|
4
|
-
type CardProps =
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
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,
|
|
1
|
+
import { FC, HTMLAttributes } from "react";
|
|
2
2
|
|
|
3
3
|
//#region src/components/data-display/heading/heading.d.ts
|
|
4
|
-
type Props =
|
|
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,
|
|
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
|
-
|
|
7
|
-
|
|
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
|
-
|
|
12
|
-
|
|
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
|
-
|
|
17
|
-
|
|
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
|
-
|
|
22
|
-
|
|
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
|
-
|
|
27
|
-
|
|
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
|
-
|
|
32
|
-
|
|
32
|
+
...rest,
|
|
33
|
+
className: cn("font-bold text-xs md:text-sm", lineClampClass, className),
|
|
33
34
|
children
|
|
34
35
|
});
|
|
35
36
|
};
|