diff --git a/packages/web/app/src/components/admin/AdminStats.tsx b/packages/web/app/src/components/admin/AdminStats.tsx index 0d8e67373..72f0ba1ce 100644 --- a/packages/web/app/src/components/admin/AdminStats.tsx +++ b/packages/web/app/src/components/admin/AdminStats.tsx @@ -11,7 +11,6 @@ import ReactECharts from 'echarts-for-react'; import AutoSizer from 'react-virtualized-auto-sizer'; import { useQuery } from 'urql'; import { - Button, DataWrapper, Sortable, Stat, @@ -38,6 +37,7 @@ import { SortingState, useTableInstance, } from '@tanstack/react-table'; +import { Button } from '../ui/button'; interface Organization { name: ReactElement; diff --git a/packages/web/app/src/components/organization/billing/BillingPaymentMethod.tsx b/packages/web/app/src/components/organization/billing/BillingPaymentMethod.tsx index 2967a0fad..f2fa05fd4 100644 --- a/packages/web/app/src/components/organization/billing/BillingPaymentMethod.tsx +++ b/packages/web/app/src/components/organization/billing/BillingPaymentMethod.tsx @@ -2,7 +2,8 @@ import { ReactElement } from 'react'; import clsx from 'clsx'; import { useMutation } from 'urql'; import { Section } from '@/components/common'; -import { Button, Heading, Link } from '@/components/v2'; +import { Button } from '@/components/ui/button'; +import { Heading, Link } from '@/components/v2'; import { FragmentType, graphql, useFragment } from '@/gql'; import { BillingPlanType } from '@/gql/graphql'; import { ExternalLinkIcon } from '@radix-ui/react-icons'; diff --git a/packages/web/app/src/components/project/alerts/create-alert.tsx b/packages/web/app/src/components/project/alerts/create-alert.tsx index 825b8879e..3a0010a56 100644 --- a/packages/web/app/src/components/project/alerts/create-alert.tsx +++ b/packages/web/app/src/components/project/alerts/create-alert.tsx @@ -2,7 +2,8 @@ import { ReactElement } from 'react'; import { useFormik } from 'formik'; import { useMutation } from 'urql'; import * as Yup from 'yup'; -import { Button, Heading, Modal, Select } from '@/components/v2'; +import { Button } from '@/components/ui/button'; +import { Heading, Modal, Select } from '@/components/v2'; import { FragmentType, graphql, useFragment } from '@/gql'; import { AlertType } from '@/gql/graphql'; @@ -157,10 +158,21 @@ export const CreateAlertModal = (props: { {mutation.error &&
{mutation.error.message}
}
- -
diff --git a/packages/web/app/src/components/project/alerts/create-channel.tsx b/packages/web/app/src/components/project/alerts/create-channel.tsx index 4ab7df17e..4cf7303c0 100644 --- a/packages/web/app/src/components/project/alerts/create-channel.tsx +++ b/packages/web/app/src/components/project/alerts/create-channel.tsx @@ -2,7 +2,8 @@ import { ReactElement } from 'react'; import { useFormik } from 'formik'; import { useMutation } from 'urql'; import * as Yup from 'yup'; -import { Button, Heading, Input, Modal, Select, Tag } from '@/components/v2'; +import { Button } from '@/components/ui/button'; +import { Heading, Input, Modal, Select, Tag } from '@/components/v2'; import { graphql } from '@/gql'; import { AlertChannelType } from '@/gql/graphql'; @@ -192,10 +193,21 @@ export const CreateChannelModal = ({ )}
- -
diff --git a/packages/web/app/src/components/project/migration-toast.tsx b/packages/web/app/src/components/project/migration-toast.tsx index 01261d328..5204a24cf 100644 --- a/packages/web/app/src/components/project/migration-toast.tsx +++ b/packages/web/app/src/components/project/migration-toast.tsx @@ -1,6 +1,13 @@ -import { Button } from '@/components/v2'; +import { useRouter } from '@tanstack/react-router'; +import { Button } from '../ui/button'; export function ProjectMigrationToast({ projectId, orgId }: { projectId: string; orgId: string }) { + const router = useRouter(); + const handleOnClick = () => { + void router.navigate({ + to: `/${orgId}/${projectId}/view/settings`, + }); + }; return (
@@ -15,10 +22,9 @@ export function ProjectMigrationToast({ projectId, orgId }: { projectId: string;

-
diff --git a/packages/web/app/src/components/target/insights/Filters.tsx b/packages/web/app/src/components/target/insights/Filters.tsx index 1f45dc660..148b4c4a1 100644 --- a/packages/web/app/src/components/target/insights/Filters.tsx +++ b/packages/web/app/src/components/target/insights/Filters.tsx @@ -6,7 +6,7 @@ import { useQuery } from 'urql'; import { useDebouncedCallback } from 'use-debounce'; import { Button } from '@/components/ui/button'; import { Sheet, SheetContent, SheetHeader, SheetTitle } from '@/components/ui/sheet'; -import { Checkbox, Input, Button as LegacyButton, Spinner } from '@/components/v2'; +import { Checkbox, Input, Spinner } from '@/components/v2'; import { FragmentType, graphql, useFragment } from '@/gql'; import { DateRangeInput } from '@/gql/graphql'; import { useFormattedNumber, useToggle } from '@/lib/hooks'; @@ -133,16 +133,16 @@ function OperationsFilter({ }} />
- + + +
@@ -480,16 +480,16 @@ function ClientsFilter({ }} />
- + + +
diff --git a/packages/web/app/src/components/target/laboratory/create-collection-modal.tsx b/packages/web/app/src/components/target/laboratory/create-collection-modal.tsx index d22a570fa..7e06e64f6 100644 --- a/packages/web/app/src/components/target/laboratory/create-collection-modal.tsx +++ b/packages/web/app/src/components/target/laboratory/create-collection-modal.tsx @@ -2,7 +2,8 @@ import { ReactElement, useEffect } from 'react'; import { useFormik } from 'formik'; import { useMutation, useQuery } from 'urql'; import * as Yup from 'yup'; -import { Button, Heading, Input, Modal } from '@/components/v2'; +import { Button } from '@/components/ui/button'; +import { Heading, Input, Modal } from '@/components/v2'; import { graphql } from '@/gql'; const CollectionQuery = graphql(` @@ -237,13 +238,18 @@ export function CreateCollectionModal(props: { {error &&
{error.message}
}
- diff --git a/packages/web/app/src/components/v2/button.tsx b/packages/web/app/src/components/v2/button.tsx deleted file mode 100644 index b6809f620..000000000 --- a/packages/web/app/src/components/v2/button.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { ComponentProps, forwardRef } from 'react'; -import clsx from 'clsx'; -import * as Toolbar from '@radix-ui/react-toolbar'; - -type ButtonProps = Omit, 'size'> & { - danger?: boolean; - variant?: 'primary' | 'secondary' | 'default' | 'link'; - size?: 'large' | 'medium' | 'small'; - block?: boolean; - as?: 'a'; - href?: string; -}; - -export const Button = forwardRef( - ( - { - children, - danger = false, - variant = 'default', - size = 'medium', - block = false, - className, - as, - ...props - }, - forwardedRef, - ) => { - const TagToUse = as || Toolbar.Button; - - return ( - - - // @ts-ignore - ref={forwardedRef} // required by DropdownMenu.Trigger with asChild prop - className={clsx( - ` - transition - focus-within:ring - disabled:cursor-not-allowed - disabled:bg-gray-800 - disabled:text-[#c4c4c4] - disabled:brightness-100 - `, - block && 'w-full justify-center', - variant !== 'link' && - { - small: 'rounded-sm p-1', - medium: 'rounded-sm p-2', - large: 'rounded-md p-3', - }[size], - danger - ? 'bg-red-500 text-white hover:brightness-110 active:bg-red-600' - : { - primary: 'bg-orange-600 text-white hover:brightness-110 active:bg-orange-700', - secondary: - 'bg-gray-800 text-gray-500 hover:text-orange-600 hover:brightness-110 active:bg-gray-900', - default: - 'bg-transparent text-gray-500 hover:border-gray-800 hover:text-orange-600', - link: 'text-orange-600 hover:underline', - }[variant], - variant !== 'link' && - 'inline-flex items-center border border-transparent text-sm font-bold', - className, - )} - {...props} - > - {children} - - - ); - }, -); diff --git a/packages/web/app/src/components/v2/copy-value.tsx b/packages/web/app/src/components/v2/copy-value.tsx index c6eceb102..37262f876 100644 --- a/packages/web/app/src/components/v2/copy-value.tsx +++ b/packages/web/app/src/components/v2/copy-value.tsx @@ -1,7 +1,8 @@ import { ReactElement, useCallback, useEffect, useState } from 'react'; -import { Button, Input } from '@/components/v2'; +import { Input } from '@/components/v2'; import { CheckIcon, CopyIcon } from '@/components/v2/icon'; import { useClipboard } from '@/lib/hooks'; +import { Button } from '../ui/button'; export const CopyValue = ({ value, @@ -36,6 +37,8 @@ export const CopyValue = ({ readOnly suffix={ diff --git a/packages/web/app/src/components/v2/modals/change-permissions.tsx b/packages/web/app/src/components/v2/modals/change-permissions.tsx index ad88851a3..4bf895415 100644 --- a/packages/web/app/src/components/v2/modals/change-permissions.tsx +++ b/packages/web/app/src/components/v2/modals/change-permissions.tsx @@ -1,7 +1,8 @@ import { ReactElement } from 'react'; import { PermissionsSpace, usePermissionsManager } from '@/components/organization/Permissions'; +import { Button } from '@/components/ui/button'; import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'; -import { Button, Heading, Modal } from '@/components/v2'; +import { Heading, Modal } from '@/components/v2'; import { FragmentType, graphql, useFragment } from '@/gql'; import { scopes } from '@/lib/access/common'; @@ -79,10 +80,15 @@ export function ChangePermissionsModal({ />
- -
diff --git a/packages/web/app/src/components/v2/modals/connect-schema.tsx b/packages/web/app/src/components/v2/modals/connect-schema.tsx index fc07007f5..9d758c450 100644 --- a/packages/web/app/src/components/v2/modals/connect-schema.tsx +++ b/packages/web/app/src/components/v2/modals/connect-schema.tsx @@ -1,15 +1,7 @@ import { ReactElement, useMemo, useState } from 'react'; import { useQuery } from 'urql'; -import { - Button, - CopyValue, - DocsLink, - Heading, - Link, - Modal, - RadixSelect, - Tag, -} from '@/components/v2'; +import { Button } from '@/components/ui/button'; +import { CopyValue, DocsLink, Heading, Link, Modal, RadixSelect, Tag } from '@/components/v2'; import { graphql } from '@/gql'; import { ProjectType } from '@/gql/graphql'; import { getDocsUrl } from '@/lib/docs-url'; @@ -209,7 +201,7 @@ export const ConnectSchemaModal = (props: {
@@ -228,13 +224,18 @@ function ModalContent(props: { {mutation.error &&
{mutation.error.message}
}
-
)}
- -
diff --git a/packages/web/app/src/components/v2/modals/delete-organization.tsx b/packages/web/app/src/components/v2/modals/delete-organization.tsx index 37bf60e60..5138e0c64 100644 --- a/packages/web/app/src/components/v2/modals/delete-organization.tsx +++ b/packages/web/app/src/components/v2/modals/delete-organization.tsx @@ -1,6 +1,7 @@ import { ReactElement } from 'react'; import { useMutation } from 'urql'; -import { Button, Heading, Modal } from '@/components/v2'; +import { Button } from '@/components/ui/button'; +import { Heading, Modal } from '@/components/v2'; import { FragmentType, graphql } from '@/gql'; import { TrashIcon } from '@radix-ui/react-icons'; import { useRouter } from '@tanstack/react-router'; @@ -49,13 +50,13 @@ export const DeleteOrganizationModal = (props: {

-
@@ -131,14 +131,19 @@ export function OrganizationTransferPage(props: { organizationId: string; code:
-
diff --git a/packages/web/app/src/pages/target-checks.tsx b/packages/web/app/src/pages/target-checks.tsx index 2953c04ed..74495b67a 100644 --- a/packages/web/app/src/pages/target-checks.tsx +++ b/packages/web/app/src/pages/target-checks.tsx @@ -1,6 +1,7 @@ import { useState } from 'react'; import { useQuery } from 'urql'; import { Page, TargetLayout } from '@/components/layouts/target'; +import { Button } from '@/components/ui/button'; import { DocsLink } from '@/components/ui/docs-note'; import { EmptyList } from '@/components/ui/empty-list'; import { Label } from '@/components/ui/label'; @@ -10,7 +11,6 @@ import { QueryError } from '@/components/ui/query-error'; import { Switch } from '@/components/ui/switch'; import { TimeAgo } from '@/components/ui/time-ago'; import { Badge } from '@/components/v2/badge'; -import { Button as LegacyButton } from '@/components/v2/button'; import { graphql } from '@/gql'; import { cn } from '@/lib/utils'; import { ExternalLinkIcon } from '@radix-ui/react-icons'; @@ -149,14 +149,14 @@ const Navigation = (props: {
))} {props.isLastPage && query.data.target.schemaChecks.pageInfo.hasNextPage && ( - { props.onLoadMore(query.data?.target?.schemaChecks.pageInfo.endCursor ?? ''); }} > Load more - + )} )} diff --git a/packages/web/app/src/pages/target-history.tsx b/packages/web/app/src/pages/target-history.tsx index bf0cc62bf..70528064b 100644 --- a/packages/web/app/src/pages/target-history.tsx +++ b/packages/web/app/src/pages/target-history.tsx @@ -1,13 +1,13 @@ import { ReactElement, useEffect, useState } from 'react'; import { useQuery } from 'urql'; import { Page, TargetLayout } from '@/components/layouts/target'; +import { Button } from '@/components/ui/button'; import { noSchemaVersion } from '@/components/ui/empty-list'; import { Meta } from '@/components/ui/meta'; import { Subtitle, Title } from '@/components/ui/page'; import { QueryError } from '@/components/ui/query-error'; import { TimeAgo } from '@/components/ui/time-ago'; import { Badge } from '@/components/v2/badge'; -import { Button } from '@/components/v2/button'; import { graphql } from '@/gql'; import { cn } from '@/lib/utils'; import { ExternalLinkIcon } from '@radix-ui/react-icons'; diff --git a/packages/web/app/src/stories/button.stories.tsx b/packages/web/app/src/stories/button.stories.tsx new file mode 100644 index 000000000..aeb4d5373 --- /dev/null +++ b/packages/web/app/src/stories/button.stories.tsx @@ -0,0 +1,149 @@ +import { ArrowBigDown, ArrowDown } from 'lucide-react'; +import { Button, ButtonProps, buttonVariants } from '@/components/ui/button'; +import type { Meta, StoryObj } from '@storybook/react'; + +const meta: Meta = { + title: 'Components/Button', + component: Button, + argTypes: { + variant: { + control: { type: 'select' }, + options: Object.keys( + buttonVariants({ + variant: 'default', + size: 'default', + className: 'className', + }), + ), + }, + size: { + control: { type: 'select' }, + options: Object.keys( + buttonVariants({ + variant: 'default', + size: 'default', + className: 'className', + }), + ), + }, + asChild: { + control: { type: 'boolean' }, + }, + }, +}; + +export default meta; + +type Story = StoryObj; + +const Template = (args: ButtonProps) =>