diff --git a/apps/gitness/src/App.tsx b/apps/gitness/src/App.tsx index ffa05844b2..d4ba512b35 100644 --- a/apps/gitness/src/App.tsx +++ b/apps/gitness/src/App.tsx @@ -37,6 +37,7 @@ import PullRequestLayout from './layouts/PullRequestLayout' import RepoLayoutV1 from './layouts/RepoLayout' import SandboxPullRequestListPage from './pages-v2/pull-request/pull-request-list' import { RepoCode } from './pages-v2/repo/repo-code' +import { CreateRepo } from './pages-v2/repo/repo-create-page' import RepoLayout from './pages-v2/repo/repo-layout' import ReposListPage from './pages-v2/repo/repo-list' import { RepoSidebar } from './pages-v2/repo/repo-sidebar' @@ -68,7 +69,7 @@ import PullRequestListPage from './pages/pull-request/pull-request-list-page' import { RepoBranchesListPage } from './pages/repo/repo-branch-list' import { RepoBranchSettingsRulesPageContainer } from './pages/repo/repo-branch-rules-container' import RepoCommitsPage from './pages/repo/repo-commits' -import { CreateRepo } from './pages/repo/repo-create-page' +import { CreateRepoV1 } from './pages/repo/repo-create-page' import { RepoFiles } from './pages/repo/repo-files' import { RepoHeader } from './pages/repo/repo-header' import { RepoImportContainer } from './pages/repo/repo-import-container' @@ -200,6 +201,14 @@ export default function App() { } ] }, + { + path: ':spaceId/repos/create', + element: + }, + { + path: ':spaceId/repos/import', + element: + }, { path: 'theme', element: @@ -464,7 +473,7 @@ export default function App() { }, { path: ':spaceId/repos/create', - element: + element: }, { path: ':spaceId/repos/import', diff --git a/apps/gitness/src/pages-v2/repo/repo-create-page.tsx b/apps/gitness/src/pages-v2/repo/repo-create-page.tsx new file mode 100644 index 0000000000..73601f6c7b --- /dev/null +++ b/apps/gitness/src/pages-v2/repo/repo-create-page.tsx @@ -0,0 +1,73 @@ +import { useNavigate } from 'react-router-dom' + +import { + CreateRepositoryErrorResponse, + OpenapiCreateRepositoryRequest, + useCreateRepositoryMutation, + useListGitignoreQuery, + useListLicensesQuery +} from '@harnessio/code-service-client' +import { toast, Toaster } from '@harnessio/ui/components' +import { FormFields, RepoCreatePage as RepoCreatePageView } from '@harnessio/ui/views' + +import { useGetSpaceURLParam } from '../../framework/hooks/useGetSpaceParam' + +export const CreateRepo = () => { + const createRepositoryMutation = useCreateRepositoryMutation({}) + const spaceId = useGetSpaceURLParam() + const navigate = useNavigate() + + const onSubmit = (data: FormFields) => { + const repositoryRequest: OpenapiCreateRepositoryRequest = { + default_branch: 'main', + parent_ref: spaceId, + description: data.description, + git_ignore: data.gitignore, + license: data.license, + is_public: data.access === '1', + readme: true, + identifier: data.name + } + + createRepositoryMutation.mutate( + { + queryParams: {}, + body: repositoryRequest + }, + { + onSuccess: ({ body: data }) => { + navigate(`/${spaceId}/repos/${data?.identifier}`) + }, + onError: (error: CreateRepositoryErrorResponse) => { + const message = error.message || 'An unknown error occurred.' + toast({ + title: message, + variant: 'destructive' + }) + } + } + ) + } + + const { data: { body: gitIgnoreOptions } = {} } = useListGitignoreQuery({}) + + const { data: { body: licenseOptions } = {} } = useListLicensesQuery({}) + + const onCancel = () => { + navigate(`/${spaceId}/repos`) + } + + return ( + <> + + + + ) +} diff --git a/apps/gitness/src/pages/repo/repo-create-page.tsx b/apps/gitness/src/pages/repo/repo-create-page.tsx index 9f6e71a196..55e29160b9 100644 --- a/apps/gitness/src/pages/repo/repo-create-page.tsx +++ b/apps/gitness/src/pages/repo/repo-create-page.tsx @@ -12,7 +12,7 @@ import { FormFields, RepoCreatePageForm } from '@harnessio/views' import { useGetSpaceURLParam } from '../../framework/hooks/useGetSpaceParam' -export const CreateRepo = () => { +export const CreateRepoV1 = () => { const createRepositoryMutation = useCreateRepositoryMutation({}) const spaceId = useGetSpaceURLParam() const navigate = useNavigate() diff --git a/packages/canary/src/components/toast.tsx b/packages/canary/src/components/toast.tsx deleted file mode 100644 index 097c6eaa70..0000000000 --- a/packages/canary/src/components/toast.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import * as React from 'react' - -import { cn } from '@/lib/utils' -import { Cross2Icon } from '@radix-ui/react-icons' -import * as ToastPrimitives from '@radix-ui/react-toast' -import { cva, type VariantProps } from 'class-variance-authority' - -const ToastProvider = ToastPrimitives.Provider - -const ToastViewport = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -ToastViewport.displayName = ToastPrimitives.Viewport.displayName - -const toastVariants = cva( - 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none', - { - variants: { - variant: { - default: 'bg-background text-foreground border', - destructive: 'destructive border-destructive bg-destructive text-destructive-foreground group' - } - }, - defaultVariants: { - variant: 'default' - } - } -) - -const Toast = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & VariantProps ->(({ className, variant, ...props }, ref) => { - return -}) -Toast.displayName = ToastPrimitives.Root.displayName - -const ToastAction = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -ToastAction.displayName = ToastPrimitives.Action.displayName - -const ToastClose = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - -)) -ToastClose.displayName = ToastPrimitives.Close.displayName - -const ToastTitle = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -ToastTitle.displayName = ToastPrimitives.Title.displayName - -const ToastDescription = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)) -ToastDescription.displayName = ToastPrimitives.Description.displayName - -type ToastProps = React.ComponentPropsWithoutRef - -type ToastActionElement = React.ReactElement - -export { - type ToastProps, - type ToastActionElement, - ToastProvider, - ToastViewport, - Toast, - ToastTitle, - ToastDescription, - ToastClose, - ToastAction -} diff --git a/packages/canary/src/index.ts b/packages/canary/src/index.ts index c9afd6a081..be494c8fb6 100644 --- a/packages/canary/src/index.ts +++ b/packages/canary/src/index.ts @@ -38,12 +38,9 @@ export * from './components/switch' export * from './components/table' export * from './components/tabs' export * from './components/text' -export * from './components/toast' -// export * from './components/toaster' Duplicate with sooner! Use sooner's Toaster instead export * from './components/toggle-group' export * from './components/toggle' export * from './components/tooltip' -export * from './components/use-toast' export * from './lib/utils' export * from './lib/CanaryOutletFactory' export * from './components/treeview' diff --git a/packages/ui/src/components/badge.tsx b/packages/ui/src/components/badge.tsx index a4cc554ea6..7530f38bf7 100644 --- a/packages/ui/src/components/badge.tsx +++ b/packages/ui/src/components/badge.tsx @@ -17,24 +17,24 @@ enum BadgesHoverStates { } const badgeVariants = cva( - 'focus:ring-ring inline-flex items-center rounded-md border transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2', + 'inline-flex items-center rounded-md border transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', { variants: { variant: { - default: 'bg-primary text-primary-foreground hover:bg-primary/80 border-transparent shadow', - secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80 border-transparent', - destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/80 border-transparent shadow', + default: 'border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80', + secondary: 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80', + destructive: 'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80', outline: 'text-foreground' }, size: { default: 'px-2.5 py-0.5 text-xs font-semibold', lg: 'px-3 py-1 text-xs font-normal', - sm: 'text-12 h-5 px-1 leading-none', - xs: 'text-11 px-1.5 py-0 font-light', + sm: 'h-5 px-1 text-12 leading-none', + xs: 'px-1.5 py-0 text-11 font-light', // TODO: Consider switching size variants to numeric values // Numeric size variants (like '18') provide clearer context about actual dimensions // compared to abstract sizes (xs, sm, lg). - '18': 'text-12 h-[18px] px-2' + '18': 'h-[18px] px-2 text-12' }, borderRadius: { default: '', diff --git a/packages/ui/src/components/button-group.tsx b/packages/ui/src/components/button-group.tsx index 25441832b3..dffe1edda9 100644 --- a/packages/ui/src/components/button-group.tsx +++ b/packages/ui/src/components/button-group.tsx @@ -1,16 +1,22 @@ -import React from 'react' +import { ReactNode } from 'react' import { cn } from '@utils/cn' interface ButtonGroupProps { - children: React.ReactNode + children: ReactNode direction?: 'horizontal' | 'vertical' className?: string spacing?: string verticalAlign?: string } -function Root({ children, direction = 'horizontal', className, spacing = '4', verticalAlign }: ButtonGroupProps) { +export function ButtonGroup({ + children, + direction = 'horizontal', + className, + spacing = '4', + verticalAlign +}: ButtonGroupProps) { const gapClass = `gap-${spacing}` const verticalAlignClass = verticalAlign ? `items-${verticalAlign}` : '' @@ -20,5 +26,3 @@ function Root({ children, direction = 'horizontal', className, spacing = '4', ve ) } - -export { Root } diff --git a/packages/ui/src/components/button.tsx b/packages/ui/src/components/button.tsx index 3622530848..cacb86d8ce 100644 --- a/packages/ui/src/components/button.tsx +++ b/packages/ui/src/components/button.tsx @@ -1,4 +1,4 @@ -import * as React from 'react' +import { ButtonHTMLAttributes, forwardRef, ReactNode } from 'react' import { Slot } from '@radix-ui/react-slot' import { CanaryOutletFactory, CanaryOutletName } from '@utils/CanaryOutletFactory' @@ -6,15 +6,17 @@ import { cn } from '@utils/cn' import { cva, type VariantProps } from 'class-variance-authority' const buttonVariants = cva( - 'inline-flex items-center justify-center whitespace-nowrap rounded text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50', + 'inline-flex items-center justify-center whitespace-nowrap rounded text-sm font-medium transition-colors disabled:cursor-not-allowed', { variants: { variant: { - default: 'bg-primary text-primary-foreground hover:bg-primary/90 shadow', - destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90 shadow-sm', - outline: 'border-borders-2 bg-transparent hover:bg-accent hover:text-accent-foreground border shadow-sm', - secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80 shadow-sm', - tertiary: 'bg-tertiary text-secondary-foreground hover:bg-tertiary/80 shadow-sm', + default: + 'bg-background-5 text-foreground-6 hover:bg-background-10 disabled:bg-background-6 disabled:text-foreground-9', + destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90', + outline: + 'border border-borders-2 bg-transparent text-foreground-2 hover:border-borders-6 hover:text-foreground-8', + secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80', + tertiary: 'bg-tertiary text-secondary-foreground shadow-sm hover:bg-tertiary/80', ghost: 'hover:bg-background-12 hover:text-accent-foreground', link: 'text-primary underline-offset-4 hover:underline', link_accent: 'text-foreground-accent underline-offset-4 hover:underline', @@ -64,17 +66,15 @@ const buttonVariants = cva( } ) -export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { +export interface ButtonProps extends ButtonHTMLAttributes, VariantProps { asChild?: boolean loading?: boolean - spinner?: React.ReactNode - dropdown?: React.ReactNode + spinner?: ReactNode + dropdown?: ReactNode gradientType?: string } -const Button = React.forwardRef( +const Button = forwardRef( ( { className, diff --git a/packages/ui/src/components/card.tsx b/packages/ui/src/components/card.tsx index 758e35e3bd..10db6b8cf8 100644 --- a/packages/ui/src/components/card.tsx +++ b/packages/ui/src/components/card.tsx @@ -3,7 +3,7 @@ import { forwardRef, HTMLAttributes } from 'react' import { cn } from '@utils/cn' import { cva, type VariantProps } from 'class-variance-authority' -const cardVariants = cva('bg-card text-card-foreground rounded-lg border shadow', { +const cardVariants = cva('rounded-lg border bg-card text-card-foreground shadow', { variants: { variant: { default: '', diff --git a/packages/ui/src/components/dialog.tsx b/packages/ui/src/components/dialog.tsx index f309c51baf..3a05a899cd 100644 --- a/packages/ui/src/components/dialog.tsx +++ b/packages/ui/src/components/dialog.tsx @@ -42,7 +42,7 @@ const DialogContent = React.forwardRef< {...props} > {children} - + Close diff --git a/packages/ui/src/components/dropdown-menu.tsx b/packages/ui/src/components/dropdown-menu.tsx index ef079416fd..f650662b78 100644 --- a/packages/ui/src/components/dropdown-menu.tsx +++ b/packages/ui/src/components/dropdown-menu.tsx @@ -126,9 +126,9 @@ const DropdownMenuCheckboxItem = React.forwardRef< checked={checked} {...props} > - - - + + + {children} diff --git a/packages/ui/src/components/filters/filter-trigger.tsx b/packages/ui/src/components/filters/filter-trigger.tsx index eb6d84b756..3a83d83600 100644 --- a/packages/ui/src/components/filters/filter-trigger.tsx +++ b/packages/ui/src/components/filters/filter-trigger.tsx @@ -1,6 +1,6 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@components/dropdown-menu' +import { Input } from '@components/form' import { Icon } from '@components/icon' -import { Input } from '@components/input' import { TFunction } from 'i18next' import { FilterOption, SortOption } from './types' diff --git a/packages/ui/src/components/filters/filters-bar/filter-variants/calendar.tsx b/packages/ui/src/components/filters/filters-bar/filter-variants/calendar.tsx index 790b6b29b1..432027cc13 100644 --- a/packages/ui/src/components/filters/filters-bar/filter-variants/calendar.tsx +++ b/packages/ui/src/components/filters/filters-bar/filter-variants/calendar.tsx @@ -1,7 +1,7 @@ import { useState } from 'react' import { Calendar as UICalendar, type CalendarDateRange } from '@components/calendar' -import { Input } from '@components/input' +import { Input } from '@components/form' import { cn } from '@utils/cn' import { FilterValue } from '../../types' diff --git a/packages/ui/src/components/filters/filters-bar/filter-variants/checkbox.tsx b/packages/ui/src/components/filters/filters-bar/filter-variants/checkbox.tsx index 8b5050ba94..0b3cb9be89 100644 --- a/packages/ui/src/components/filters/filters-bar/filter-variants/checkbox.tsx +++ b/packages/ui/src/components/filters/filters-bar/filter-variants/checkbox.tsx @@ -1,6 +1,6 @@ import { DropdownMenuCheckboxItem } from '@components/dropdown-menu' +import { Input } from '@components/form' import { Icon } from '@components/icon' -import { Input } from '@components/input' import { CheckboxFilterOption, FilterValue } from '../../types' import { UseFiltersReturn } from '../../use-filters' diff --git a/packages/ui/src/components/filters/filters-bar/filter-variants/number.tsx b/packages/ui/src/components/filters/filters-bar/filter-variants/number.tsx index 85a21bed29..9a7ba013c1 100644 --- a/packages/ui/src/components/filters/filters-bar/filter-variants/number.tsx +++ b/packages/ui/src/components/filters/filters-bar/filter-variants/number.tsx @@ -1,7 +1,7 @@ import { useState } from 'react' +import { Input } from '@components/form' import { Icon } from '@components/icon' -import { Input } from '@components/input' import { FilterValue } from '../../types' import { UseFiltersReturn } from '../../use-filters' diff --git a/packages/ui/src/components/filters/filters-bar/filter-variants/text.tsx b/packages/ui/src/components/filters/filters-bar/filter-variants/text.tsx index e877f2f642..0b7a0d14cc 100644 --- a/packages/ui/src/components/filters/filters-bar/filter-variants/text.tsx +++ b/packages/ui/src/components/filters/filters-bar/filter-variants/text.tsx @@ -1,8 +1,8 @@ import { useState } from 'react' import { DropdownMenuItem } from '@components/dropdown-menu' +import { Input } from '@components/form' import { Icon } from '@components/icon' -import { Input } from '@components/input' import { FilterValue } from '../../types' import { UseFiltersReturn } from '../../use-filters' diff --git a/packages/ui/src/components/filters/filters-bar/filters.tsx b/packages/ui/src/components/filters/filters-bar/filters.tsx index a1063bc0e2..7aed6d7b48 100644 --- a/packages/ui/src/components/filters/filters-bar/filters.tsx +++ b/packages/ui/src/components/filters/filters-bar/filters.tsx @@ -84,8 +84,8 @@ const Filters = ({ return ( - -
+ +
{filterOption.label} {!!filter.selectedValues.length && ': '} @@ -107,7 +107,7 @@ const Filters = ({ {filterOption.label} - + {filterOption.conditions?.find(c => c.value === filter.condition)?.label} @@ -127,17 +127,17 @@ const Filters = ({ handleRemoveFilter?.(filter.type)} > - @@ -153,7 +153,7 @@ const Filters = ({ {filterOption.type === 'checkbox' && getFilteredOptions(filterOption, filter, searchQueries).length === 0 && (
- No results + No results
)}
diff --git a/packages/ui/src/components/filters/filters-bar/sorts.tsx b/packages/ui/src/components/filters/filters-bar/sorts.tsx index ebc53f38ae..c9cda74c13 100644 --- a/packages/ui/src/components/filters/filters-bar/sorts.tsx +++ b/packages/ui/src/components/filters/filters-bar/sorts.tsx @@ -1,8 +1,8 @@ import { useEffect, useState } from 'react' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@components/dropdown-menu' +import { Input } from '@components/form' import { Icon } from '@components/icon' -import { Input } from '@components/input' import { closestCenter, DndContext } from '@dnd-kit/core' import { SortableContext, useSortable, verticalListSortingStrategy } from '@dnd-kit/sortable' import { CSS } from '@dnd-kit/utilities' @@ -47,7 +47,7 @@ const SortableItem = ({
@@ -55,7 +55,7 @@ const SortableItem = ({
- + {sortOptions.find(opt => opt.value === sort.type)?.label} @@ -72,7 +72,7 @@ const SortableItem = ({ - + {sortDirections.find(dir => dir.value === sort.direction)?.label} @@ -90,7 +90,7 @@ const SortableItem = ({
@@ -248,10 +248,10 @@ const Sorts = ({ )} - diff --git a/packages/ui/src/components/form-error-message.tsx b/packages/ui/src/components/form-error-message.tsx deleted file mode 100644 index a76f89c1ed..0000000000 --- a/packages/ui/src/components/form-error-message.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { HTMLAttributes } from 'react' - -import { cn } from '@utils/cn' - -import { Text } from './text' - -export enum ErrorMessageTheme { - SUCCESS = 'success', - WARNING = 'warning', - ERROR = 'error', - DEFAULT = 'default' -} - -interface FormErrorMessageProps extends HTMLAttributes { - theme: ErrorMessageTheme -} - -const themeClassMap: Record = { - [ErrorMessageTheme.SUCCESS]: 'text-success', - [ErrorMessageTheme.WARNING]: 'text-warning', - [ErrorMessageTheme.ERROR]: 'text-foreground-danger', - [ErrorMessageTheme.DEFAULT]: 'text-tertiary-background' -} - -export function FormErrorMessage({ children, theme, className }: FormErrorMessageProps) { - const textClass = themeClassMap[theme] - const role = theme === ErrorMessageTheme.ERROR ? 'alert' : 'status' - const ariaLive = theme === ErrorMessageTheme.ERROR ? 'assertive' : 'polite' - - return ( -
- - {children} - -
- ) -} diff --git a/packages/ui/src/components/form-field-set.tsx b/packages/ui/src/components/form-field-set.tsx deleted file mode 100644 index cd467d8a06..0000000000 --- a/packages/ui/src/components/form-field-set.tsx +++ /dev/null @@ -1,188 +0,0 @@ -import { cn } from '@utils/cn' - -import Checkbox from './filters/filters-bar/filter-variants/checkbox' -import { RadioGroupItem } from './radio-group' -import { Text } from './text' - -interface CompProps { - children: React.ReactNode - className?: string -} - -interface RootProps { - children: React.ReactNode - box?: boolean - shaded?: boolean - className?: string -} - -enum MessageTheme { - SUCCESS = 'success', - WARNING = 'warning', - ERROR = 'error', - DEFAULT = 'default' -} - -interface MessageProps { - children: React.ReactNode - className?: string - theme: MessageTheme -} - -interface ControlProps { - children: React.ReactNode - type?: 'button' - className?: string -} - -type ControlType = React.ReactElement | React.ReactElement - -interface OptionProps { - control: ControlType - id: string - label?: string - description?: string - className?: string -} - -interface LabelProps { - children: React.ReactNode - htmlFor?: string - required?: boolean - className?: string -} - -interface SeparatorProps { - className?: string - dashed?: boolean - dotted?: boolean -} - -interface SpacerProps { - className?: string -} - -const themeClassMap: Record = { - [MessageTheme.SUCCESS]: 'text-success', - [MessageTheme.WARNING]: 'text-warning', - [MessageTheme.ERROR]: 'text-destructive', - [MessageTheme.DEFAULT]: 'text-tertiary-background' -} - -function Root({ children, box, shaded, className }: RootProps) { - return ( -
- {children} -
- ) -} - -function Legend({ children, className }: CompProps) { - return ( - - {children} - - ) -} - -function SubLegend({ children, className }: CompProps) { - return ( - - {children} - - ) -} - -function Item({ children, className }: CompProps) { - return ( -
- {children} -
- ) -} - -function Label({ htmlFor, required, children, className }: LabelProps) { - return ( - - ) -} - -function ControlGroup({ children, type, className }: ControlProps) { - return ( -
- {children} -
- ) -} - -function Caption({ children, className }: CompProps) { - return ( - - {children} - - ) -} - -function Message({ children, theme, className }: MessageProps) { - const textClass = themeClassMap[theme] - const role = theme === MessageTheme.ERROR ? 'alert' : 'status' - const ariaLive = theme === MessageTheme.ERROR ? 'assertive' : 'polite' - - return ( -
- - {children} - -
- ) -} - -function Option({ control, id, label, description, className }: OptionProps) { - return ( - // eslint-disable-next-line jsx-a11y/role-has-required-aria-props -
-
{control}
-
- - {description && ( - - {description} - - )} -
-
- ) -} - -function Separator({ dashed, dotted, className }: SeparatorProps) { - return ( -
- ) -} - -function Spacer({ className }: SpacerProps) { - return