@danielthurau/atlas-labs-codex 0.1.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 (42) hide show
  1. package/README.md +138 -0
  2. package/components/react/Badge/Badge.module.css +38 -0
  3. package/components/react/Badge/Badge.stories.tsx +79 -0
  4. package/components/react/Badge/Badge.tsx +42 -0
  5. package/components/react/Badge/index.ts +2 -0
  6. package/components/react/Button/Button.module.css +118 -0
  7. package/components/react/Button/Button.stories.tsx +108 -0
  8. package/components/react/Button/Button.tsx +73 -0
  9. package/components/react/Button/index.ts +2 -0
  10. package/components/react/Card/Card.module.css +59 -0
  11. package/components/react/Card/Card.stories.tsx +114 -0
  12. package/components/react/Card/Card.tsx +79 -0
  13. package/components/react/Card/index.ts +11 -0
  14. package/components/react/Input/Input.module.css +63 -0
  15. package/components/react/Input/Input.stories.tsx +88 -0
  16. package/components/react/Input/Input.tsx +50 -0
  17. package/components/react/Input/index.ts +2 -0
  18. package/components/react/Modal/Modal.module.css +103 -0
  19. package/components/react/Modal/Modal.stories.tsx +119 -0
  20. package/components/react/Modal/Modal.tsx +75 -0
  21. package/components/react/Modal/index.ts +2 -0
  22. package/components/react/RefreshButton/RefreshButton.module.css +202 -0
  23. package/components/react/RefreshButton/RefreshButton.stories.tsx +43 -0
  24. package/components/react/RefreshButton/RefreshButton.tsx +222 -0
  25. package/components/react/RefreshButton/index.ts +2 -0
  26. package/components/react/Tabs/Tabs.module.css +58 -0
  27. package/components/react/Tabs/Tabs.stories.tsx +101 -0
  28. package/components/react/Tabs/Tabs.tsx +62 -0
  29. package/components/react/Tabs/index.ts +2 -0
  30. package/components/react/Toast/Toast.module.css +145 -0
  31. package/components/react/Toast/Toast.stories.tsx +143 -0
  32. package/components/react/Toast/Toast.tsx +123 -0
  33. package/components/react/Toast/index.ts +2 -0
  34. package/components/react/index.ts +31 -0
  35. package/lib/index.ts +7 -0
  36. package/lib/utils.ts +32 -0
  37. package/package.json +95 -0
  38. package/public/fonts/MartianMono-OFL.txt +93 -0
  39. package/public/fonts/MartianMono-VariableFont_wdth,wght.ttf +0 -0
  40. package/themes/css/base.css +142 -0
  41. package/themes/css/theme-dark.css +48 -0
  42. package/themes/css/theme-light.css +49 -0
@@ -0,0 +1,114 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { Card, CardHeader, CardContent, CardFooter } from "./Card";
3
+ import { Button } from "../Button";
4
+
5
+ const meta: Meta<typeof Card> = {
6
+ title: "Components/Card",
7
+ component: Card,
8
+ parameters: {
9
+ layout: "centered",
10
+ },
11
+ tags: ["autodocs"],
12
+ decorators: [
13
+ (Story) => (
14
+ <div style={{ width: "400px" }}>
15
+ <Story />
16
+ </div>
17
+ ),
18
+ ],
19
+ };
20
+
21
+ export default meta;
22
+ type Story = StoryObj<typeof meta>;
23
+
24
+ export const Default: Story = {
25
+ args: {
26
+ children: (
27
+ <p>
28
+ This is a basic card with some content. Cards are used to group related
29
+ content together.
30
+ </p>
31
+ ),
32
+ },
33
+ };
34
+
35
+ export const Elevated: Story = {
36
+ args: {
37
+ elevated: true,
38
+ children: (
39
+ <p>
40
+ This card has elevation (shadow) for a more prominent appearance.
41
+ </p>
42
+ ),
43
+ },
44
+ };
45
+
46
+ export const WithHeader: Story = {
47
+ render: () => (
48
+ <Card>
49
+ <CardHeader>
50
+ <h3>Card Title</h3>
51
+ </CardHeader>
52
+ <CardContent>
53
+ <p>This card has a header section separated from the content.</p>
54
+ </CardContent>
55
+ </Card>
56
+ ),
57
+ };
58
+
59
+ export const WithFooter: Story = {
60
+ render: () => (
61
+ <Card>
62
+ <CardContent>
63
+ <p>This card has content and a footer with actions.</p>
64
+ </CardContent>
65
+ <CardFooter>
66
+ <div style={{ display: "flex", gap: "8px", justifyContent: "flex-end" }}>
67
+ <Button variant="secondary">Cancel</Button>
68
+ <Button variant="primary">Save</Button>
69
+ </div>
70
+ </CardFooter>
71
+ </Card>
72
+ ),
73
+ };
74
+
75
+ export const Complete: Story = {
76
+ render: () => (
77
+ <Card>
78
+ <CardHeader>
79
+ <h3>Project Settings</h3>
80
+ </CardHeader>
81
+ <CardContent>
82
+ <p style={{ marginBottom: "16px" }}>
83
+ Configure your project settings here. Changes will be saved automatically.
84
+ </p>
85
+ <p>
86
+ Last updated: January 1, 2024
87
+ </p>
88
+ </CardContent>
89
+ <CardFooter>
90
+ <div style={{ display: "flex", gap: "8px", justifyContent: "flex-end" }}>
91
+ <Button variant="secondary">Reset</Button>
92
+ <Button variant="primary">Save Changes</Button>
93
+ </div>
94
+ </CardFooter>
95
+ </Card>
96
+ ),
97
+ };
98
+
99
+ export const PaddingVariants: Story = {
100
+ render: () => (
101
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
102
+ <Card padding="sm">
103
+ <p>Small padding</p>
104
+ </Card>
105
+ <Card padding="md">
106
+ <p>Medium padding (default)</p>
107
+ </Card>
108
+ <Card padding="lg">
109
+ <p>Large padding</p>
110
+ </Card>
111
+ </div>
112
+ ),
113
+ };
114
+
@@ -0,0 +1,79 @@
1
+ import { forwardRef, type HTMLAttributes, type ReactNode } from "react";
2
+ import { clsx } from "clsx";
3
+ import styles from "./Card.module.css";
4
+
5
+ export interface CardProps extends HTMLAttributes<HTMLDivElement> {
6
+ children: ReactNode;
7
+ padding?: "none" | "sm" | "md" | "lg";
8
+ elevated?: boolean;
9
+ }
10
+
11
+ export const Card = forwardRef<HTMLDivElement, CardProps>(
12
+ ({ className, children, padding = "md", elevated = false, ...props }, ref) => {
13
+ return (
14
+ <div
15
+ ref={ref}
16
+ className={clsx(
17
+ styles.card,
18
+ styles[`padding-${padding}`],
19
+ elevated && styles.elevated,
20
+ className
21
+ )}
22
+ {...props}
23
+ >
24
+ {children}
25
+ </div>
26
+ );
27
+ }
28
+ );
29
+
30
+ Card.displayName = "Card";
31
+
32
+ export interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {
33
+ children: ReactNode;
34
+ }
35
+
36
+ export const CardHeader = forwardRef<HTMLDivElement, CardHeaderProps>(
37
+ ({ className, children, ...props }, ref) => {
38
+ return (
39
+ <div ref={ref} className={clsx(styles.header, className)} {...props}>
40
+ {children}
41
+ </div>
42
+ );
43
+ }
44
+ );
45
+
46
+ CardHeader.displayName = "CardHeader";
47
+
48
+ export interface CardContentProps extends HTMLAttributes<HTMLDivElement> {
49
+ children: ReactNode;
50
+ }
51
+
52
+ export const CardContent = forwardRef<HTMLDivElement, CardContentProps>(
53
+ ({ className, children, ...props }, ref) => {
54
+ return (
55
+ <div ref={ref} className={clsx(styles.content, className)} {...props}>
56
+ {children}
57
+ </div>
58
+ );
59
+ }
60
+ );
61
+
62
+ CardContent.displayName = "CardContent";
63
+
64
+ export interface CardFooterProps extends HTMLAttributes<HTMLDivElement> {
65
+ children: ReactNode;
66
+ }
67
+
68
+ export const CardFooter = forwardRef<HTMLDivElement, CardFooterProps>(
69
+ ({ className, children, ...props }, ref) => {
70
+ return (
71
+ <div ref={ref} className={clsx(styles.footer, className)} {...props}>
72
+ {children}
73
+ </div>
74
+ );
75
+ }
76
+ );
77
+
78
+ CardFooter.displayName = "CardFooter";
79
+
@@ -0,0 +1,11 @@
1
+ export {
2
+ Card,
3
+ CardHeader,
4
+ CardContent,
5
+ CardFooter,
6
+ type CardProps,
7
+ type CardHeaderProps,
8
+ type CardContentProps,
9
+ type CardFooterProps,
10
+ } from "./Card";
11
+
@@ -0,0 +1,63 @@
1
+ .field {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: var(--space-1);
5
+ }
6
+
7
+ .label {
8
+ font-size: var(--text-sm);
9
+ font-weight: var(--font-medium);
10
+ color: var(--color-text-primary);
11
+ }
12
+
13
+ .input {
14
+ height: var(--input-height);
15
+ padding: var(--input-padding-y) var(--input-padding-x);
16
+ font-size: var(--text-base);
17
+ border: 1px solid var(--color-border-default);
18
+ border-radius: var(--input-radius);
19
+ background-color: var(--color-bg-surface);
20
+ color: var(--color-text-primary);
21
+ transition: border-color 150ms ease, box-shadow 150ms ease;
22
+ }
23
+
24
+ .input::placeholder {
25
+ color: var(--color-text-muted);
26
+ }
27
+
28
+ .input:hover:not(:disabled) {
29
+ border-color: var(--color-border-strong);
30
+ }
31
+
32
+ .input:focus {
33
+ outline: none;
34
+ border-color: var(--color-intent-primary);
35
+ box-shadow: 0 0 0 3px var(--color-intent-primary-bg);
36
+ }
37
+
38
+ .input:disabled {
39
+ background-color: var(--color-bg-muted);
40
+ color: var(--color-text-muted);
41
+ cursor: not-allowed;
42
+ }
43
+
44
+ /* Error State */
45
+ .hasError .input {
46
+ border-color: var(--color-intent-danger);
47
+ }
48
+
49
+ .hasError .input:focus {
50
+ border-color: var(--color-intent-danger);
51
+ box-shadow: 0 0 0 3px var(--color-intent-danger-bg);
52
+ }
53
+
54
+ .error {
55
+ font-size: var(--text-sm);
56
+ color: var(--color-intent-danger);
57
+ }
58
+
59
+ .helper {
60
+ font-size: var(--text-sm);
61
+ color: var(--color-text-secondary);
62
+ }
63
+
@@ -0,0 +1,88 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { Input } from "./Input";
3
+
4
+ const meta: Meta<typeof Input> = {
5
+ title: "Components/Input",
6
+ component: Input,
7
+ parameters: {
8
+ layout: "centered",
9
+ },
10
+ tags: ["autodocs"],
11
+ decorators: [
12
+ (Story) => (
13
+ <div style={{ width: "320px" }}>
14
+ <Story />
15
+ </div>
16
+ ),
17
+ ],
18
+ };
19
+
20
+ export default meta;
21
+ type Story = StoryObj<typeof meta>;
22
+
23
+ export const Default: Story = {
24
+ args: {
25
+ label: "Email",
26
+ placeholder: "you@example.com",
27
+ },
28
+ };
29
+
30
+ export const WithHelperText: Story = {
31
+ args: {
32
+ label: "Username",
33
+ placeholder: "Enter username",
34
+ helperText: "Choose a unique username",
35
+ },
36
+ };
37
+
38
+ export const WithError: Story = {
39
+ args: {
40
+ label: "Email",
41
+ placeholder: "you@example.com",
42
+ error: "Please enter a valid email address",
43
+ defaultValue: "invalid-email",
44
+ },
45
+ };
46
+
47
+ export const Disabled: Story = {
48
+ args: {
49
+ label: "Email",
50
+ placeholder: "you@example.com",
51
+ disabled: true,
52
+ },
53
+ };
54
+
55
+ export const Password: Story = {
56
+ args: {
57
+ label: "Password",
58
+ type: "password",
59
+ placeholder: "Enter password",
60
+ },
61
+ };
62
+
63
+ export const WithoutLabel: Story = {
64
+ args: {
65
+ placeholder: "Search...",
66
+ "aria-label": "Search",
67
+ },
68
+ };
69
+
70
+ export const AllStates: Story = {
71
+ render: () => (
72
+ <div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
73
+ <Input label="Default" placeholder="Enter text" />
74
+ <Input
75
+ label="With Helper"
76
+ placeholder="Enter text"
77
+ helperText="This is helper text"
78
+ />
79
+ <Input
80
+ label="With Error"
81
+ placeholder="Enter text"
82
+ error="This field is required"
83
+ />
84
+ <Input label="Disabled" placeholder="Enter text" disabled />
85
+ </div>
86
+ ),
87
+ };
88
+
@@ -0,0 +1,50 @@
1
+ import { forwardRef, type InputHTMLAttributes, useId } from "react";
2
+ import { clsx } from "clsx";
3
+ import styles from "./Input.module.css";
4
+
5
+ export interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
6
+ label?: string;
7
+ helperText?: string;
8
+ error?: string;
9
+ }
10
+
11
+ export const Input = forwardRef<HTMLInputElement, InputProps>(
12
+ ({ className, label, helperText, error, id, disabled, ...props }, ref) => {
13
+ const generatedId = useId();
14
+ const inputId = id || generatedId;
15
+ const helperId = `${inputId}-helper`;
16
+ const errorId = `${inputId}-error`;
17
+
18
+ return (
19
+ <div className={clsx(styles.field, error && styles.hasError)}>
20
+ {label && (
21
+ <label htmlFor={inputId} className={styles.label}>
22
+ {label}
23
+ </label>
24
+ )}
25
+ <input
26
+ ref={ref}
27
+ id={inputId}
28
+ className={clsx(styles.input, className)}
29
+ disabled={disabled}
30
+ aria-invalid={!!error}
31
+ aria-describedby={error ? errorId : helperText ? helperId : undefined}
32
+ {...props}
33
+ />
34
+ {error && (
35
+ <span id={errorId} className={styles.error} role="alert">
36
+ {error}
37
+ </span>
38
+ )}
39
+ {helperText && !error && (
40
+ <span id={helperId} className={styles.helper}>
41
+ {helperText}
42
+ </span>
43
+ )}
44
+ </div>
45
+ );
46
+ }
47
+ );
48
+
49
+ Input.displayName = "Input";
50
+
@@ -0,0 +1,2 @@
1
+ export { Input, type InputProps } from "./Input";
2
+
@@ -0,0 +1,103 @@
1
+ .overlay {
2
+ background-color: rgba(0, 0, 0, 0.5);
3
+ position: fixed;
4
+ inset: 0;
5
+ animation: fadeIn 150ms ease-out;
6
+ }
7
+
8
+ .content {
9
+ background-color: var(--color-bg-elevated);
10
+ border-radius: var(--modal-radius);
11
+ box-shadow: var(--shadow-xl);
12
+ position: fixed;
13
+ top: 50%;
14
+ left: 50%;
15
+ transform: translate(-50%, -50%);
16
+ padding: var(--modal-padding);
17
+ animation: slideUp 150ms ease-out;
18
+ max-height: 85vh;
19
+ overflow-y: auto;
20
+ }
21
+
22
+ .content:focus {
23
+ outline: none;
24
+ }
25
+
26
+ /* Sizes */
27
+ .sm {
28
+ width: 90vw;
29
+ max-width: 400px;
30
+ }
31
+
32
+ .md {
33
+ width: 90vw;
34
+ max-width: 500px;
35
+ }
36
+
37
+ .lg {
38
+ width: 90vw;
39
+ max-width: 640px;
40
+ }
41
+
42
+ .title {
43
+ font-size: var(--text-lg);
44
+ font-weight: var(--font-semibold);
45
+ color: var(--color-text-primary);
46
+ margin: 0 0 var(--space-2) 0;
47
+ padding-right: var(--space-8);
48
+ }
49
+
50
+ .description {
51
+ font-size: var(--text-sm);
52
+ color: var(--color-text-secondary);
53
+ margin: 0 0 var(--space-4) 0;
54
+ line-height: var(--leading-base);
55
+ }
56
+
57
+ .close {
58
+ position: absolute;
59
+ top: var(--space-4);
60
+ right: var(--space-4);
61
+ width: 32px;
62
+ height: 32px;
63
+ display: flex;
64
+ align-items: center;
65
+ justify-content: center;
66
+ border-radius: var(--radius-sm);
67
+ color: var(--color-text-secondary);
68
+ background: transparent;
69
+ border: none;
70
+ cursor: pointer;
71
+ transition: background-color 150ms ease, color 150ms ease;
72
+ }
73
+
74
+ .close:hover {
75
+ background-color: var(--color-bg-subtle);
76
+ color: var(--color-text-primary);
77
+ }
78
+
79
+ .close:focus-visible {
80
+ outline: none;
81
+ box-shadow: var(--focus-ring);
82
+ }
83
+
84
+ @keyframes fadeIn {
85
+ from {
86
+ opacity: 0;
87
+ }
88
+ to {
89
+ opacity: 1;
90
+ }
91
+ }
92
+
93
+ @keyframes slideUp {
94
+ from {
95
+ opacity: 0;
96
+ transform: translate(-50%, -48%) scale(0.96);
97
+ }
98
+ to {
99
+ opacity: 1;
100
+ transform: translate(-50%, -50%) scale(1);
101
+ }
102
+ }
103
+
@@ -0,0 +1,119 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { useState } from "react";
3
+ import { Modal } from "./Modal";
4
+ import { Button } from "../Button";
5
+ import { Input } from "../Input";
6
+
7
+ const meta: Meta<typeof Modal> = {
8
+ title: "Components/Modal",
9
+ component: Modal,
10
+ parameters: {
11
+ layout: "centered",
12
+ },
13
+ tags: ["autodocs"],
14
+ };
15
+
16
+ export default meta;
17
+ type Story = StoryObj<typeof meta>;
18
+
19
+ export const Default: Story = {
20
+ args: {
21
+ trigger: <Button>Open Modal</Button>,
22
+ title: "Modal Title",
23
+ description: "This is a description of the modal content.",
24
+ children: (
25
+ <div style={{ display: "flex", gap: "8px", justifyContent: "flex-end", marginTop: "16px" }}>
26
+ <Button variant="secondary">Cancel</Button>
27
+ <Button variant="primary">Confirm</Button>
28
+ </div>
29
+ ),
30
+ },
31
+ };
32
+
33
+ export const WithForm: Story = {
34
+ args: {
35
+ trigger: <Button>Add User</Button>,
36
+ title: "Add Team Member",
37
+ children: (
38
+ <div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
39
+ <Input label="Email address" placeholder="user@example.com" />
40
+ <Input label="Role" placeholder="Developer" />
41
+ <div style={{ display: "flex", gap: "8px", justifyContent: "flex-end" }}>
42
+ <Button variant="secondary">Cancel</Button>
43
+ <Button variant="primary">Add Member</Button>
44
+ </div>
45
+ </div>
46
+ ),
47
+ },
48
+ };
49
+
50
+ export const Confirmation: Story = {
51
+ args: {
52
+ trigger: <Button variant="danger">Delete Project</Button>,
53
+ title: "Delete project?",
54
+ description:
55
+ 'This will permanently delete "My Project" and all its contents. This action cannot be undone.',
56
+ children: (
57
+ <div style={{ display: "flex", gap: "8px", justifyContent: "flex-end" }}>
58
+ <Button variant="secondary">Cancel</Button>
59
+ <Button variant="danger">Delete</Button>
60
+ </div>
61
+ ),
62
+ size: "sm",
63
+ },
64
+ };
65
+
66
+ export const LargeModal: Story = {
67
+ args: {
68
+ trigger: <Button>Open Large Modal</Button>,
69
+ title: "Large Modal",
70
+ description: "This modal uses the large size variant.",
71
+ children: (
72
+ <div>
73
+ <p style={{ marginBottom: "16px" }}>
74
+ Large modals are suitable for complex content that needs more space,
75
+ such as detailed forms or previews.
76
+ </p>
77
+ <p style={{ marginBottom: "16px" }}>
78
+ However, if your modal content is very complex, consider using a
79
+ dedicated page instead.
80
+ </p>
81
+ <div style={{ display: "flex", gap: "8px", justifyContent: "flex-end" }}>
82
+ <Button variant="secondary">Cancel</Button>
83
+ <Button variant="primary">Confirm</Button>
84
+ </div>
85
+ </div>
86
+ ),
87
+ size: "lg",
88
+ },
89
+ };
90
+
91
+ const ControlledExample = () => {
92
+ const [open, setOpen] = useState(false);
93
+
94
+ return (
95
+ <>
96
+ <Button onClick={() => setOpen(true)}>Open Controlled Modal</Button>
97
+ <Modal
98
+ open={open}
99
+ onOpenChange={setOpen}
100
+ title="Controlled Modal"
101
+ description="This modal is controlled via state."
102
+ >
103
+ <p style={{ marginBottom: "16px" }}>
104
+ This modal's open state is controlled by the parent component.
105
+ </p>
106
+ <div style={{ display: "flex", gap: "8px", justifyContent: "flex-end" }}>
107
+ <Button variant="secondary" onClick={() => setOpen(false)}>
108
+ Close
109
+ </Button>
110
+ </div>
111
+ </Modal>
112
+ </>
113
+ );
114
+ };
115
+
116
+ export const Controlled: Story = {
117
+ render: () => <ControlledExample />,
118
+ };
119
+
@@ -0,0 +1,75 @@
1
+ "use client";
2
+
3
+ import { forwardRef, type ReactNode } from "react";
4
+ import * as Dialog from "@radix-ui/react-dialog";
5
+ import { clsx } from "clsx";
6
+ import styles from "./Modal.module.css";
7
+
8
+ export interface ModalProps {
9
+ open?: boolean;
10
+ onOpenChange?: (open: boolean) => void;
11
+ trigger?: ReactNode;
12
+ title?: string;
13
+ description?: string;
14
+ children: ReactNode;
15
+ size?: "sm" | "md" | "lg";
16
+ }
17
+
18
+ export const Modal = forwardRef<HTMLDivElement, ModalProps>(
19
+ (
20
+ {
21
+ open,
22
+ onOpenChange,
23
+ trigger,
24
+ title,
25
+ description,
26
+ children,
27
+ size = "md",
28
+ },
29
+ ref
30
+ ) => {
31
+ return (
32
+ <Dialog.Root open={open} onOpenChange={onOpenChange}>
33
+ {trigger && <Dialog.Trigger asChild>{trigger}</Dialog.Trigger>}
34
+ <Dialog.Portal>
35
+ <Dialog.Overlay className={styles.overlay} />
36
+ <Dialog.Content
37
+ ref={ref}
38
+ className={clsx(styles.content, styles[size])}
39
+ >
40
+ {title && (
41
+ <Dialog.Title className={styles.title}>{title}</Dialog.Title>
42
+ )}
43
+ {description && (
44
+ <Dialog.Description className={styles.description}>
45
+ {description}
46
+ </Dialog.Description>
47
+ )}
48
+ {children}
49
+ <Dialog.Close asChild>
50
+ <button className={styles.close} aria-label="Close">
51
+ <svg
52
+ width="15"
53
+ height="15"
54
+ viewBox="0 0 15 15"
55
+ fill="none"
56
+ xmlns="http://www.w3.org/2000/svg"
57
+ >
58
+ <path
59
+ d="M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z"
60
+ fill="currentColor"
61
+ fillRule="evenodd"
62
+ clipRule="evenodd"
63
+ />
64
+ </svg>
65
+ </button>
66
+ </Dialog.Close>
67
+ </Dialog.Content>
68
+ </Dialog.Portal>
69
+ </Dialog.Root>
70
+ );
71
+ }
72
+ );
73
+
74
+ Modal.displayName = "Modal";
75
+