From 18b041514f4e1efea756968faf96a45da3f02918 Mon Sep 17 00:00:00 2001 From: Abhay Mishra Date: Fri, 2 Jan 2026 09:41:14 +0530 Subject: [PATCH] refactor(ui): remove unused components and exports (#26222) Co-authored-by: Volnei Munhoz Co-authored-by: Keith Williams --- .../BookEventForm/BookingFields.test.tsx | 215 ------------------ packages/ui/components/address/index.ts | 1 - .../ui/components/badge/UpgradeOrgsBadge.tsx | 16 -- packages/ui/components/badge/index.ts | 1 - packages/ui/components/dropdown/index.ts | 4 - packages/ui/components/form/index.ts | 11 +- packages/ui/components/form/inputs/Input.tsx | 27 --- .../form/inputs/InputFieldWithSelect.tsx | 20 -- .../ui/components/form/inputs/input.test.tsx | 28 --- .../ui/components/form/slider/RangeSlider.tsx | 25 -- .../form/slider/RangeSliderPopover.tsx | 129 ----------- packages/ui/components/form/slider/index.tsx | 25 -- packages/ui/components/form/step/FormStep.tsx | 34 --- packages/ui/components/form/step/Stepper.tsx | 71 ------ packages/ui/components/form/step/index.ts | 2 - .../components/navigation/NavigationItem.tsx | 101 -------- packages/ui/components/navigation/index.ts | 1 - 17 files changed, 1 insertion(+), 710 deletions(-) delete mode 100644 packages/features/bookings/Booker/components/BookEventForm/BookingFields.test.tsx delete mode 100644 packages/ui/components/badge/UpgradeOrgsBadge.tsx delete mode 100644 packages/ui/components/form/inputs/InputFieldWithSelect.tsx delete mode 100644 packages/ui/components/form/slider/RangeSlider.tsx delete mode 100644 packages/ui/components/form/slider/RangeSliderPopover.tsx delete mode 100644 packages/ui/components/form/slider/index.tsx delete mode 100644 packages/ui/components/form/step/FormStep.tsx delete mode 100644 packages/ui/components/form/step/Stepper.tsx delete mode 100644 packages/ui/components/navigation/NavigationItem.tsx diff --git a/packages/features/bookings/Booker/components/BookEventForm/BookingFields.test.tsx b/packages/features/bookings/Booker/components/BookEventForm/BookingFields.test.tsx deleted file mode 100644 index f21af3756f..0000000000 --- a/packages/features/bookings/Booker/components/BookEventForm/BookingFields.test.tsx +++ /dev/null @@ -1,215 +0,0 @@ -import { TooltipProvider } from "@radix-ui/react-tooltip"; -import { render, fireEvent, screen } from "@testing-library/react"; -import * as React from "react"; -import type { UseFormReturn } from "react-hook-form"; -import { FormProvider, useForm } from "react-hook-form"; -import { expect, vi } from "vitest"; - -import PhoneInput from "@calcom/features/components/phone-input/PhoneInput"; - -import { getBookingFieldsWithSystemFields } from "../../../lib/getBookingFields"; -import { BookingFields } from "./BookingFields"; - -// Mock PhoneInput to avoid calling the lazy import -vi.mock("@calcom/features/components/phone-input", () => { - return { - default: PhoneInput, - }; -}); - -vi.mock("@calcom/ui/components/address", async (originalImport) => { - const { AddressInputNonLazy } = (await originalImport()) as Record; - // Dynamic imports of Components are not supported in Vitest. So, we use the non-lazy version of the components - return { - AddressInput: AddressInputNonLazy, - }; -}); - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type FormMethods = UseFormReturn; - -// Add tRPC mock before tests -vi.mock("@calcom/trpc/react", () => ({ - trpc: { - viewer: { - public: { - countryCode: { - useQuery: () => ({ - data: { countryCode: "US" }, - isLoading: false, - error: null, - }), - }, - }, - }, - }, -})); - -const renderComponent = ({ - props: props, - formDefaultValues, -}: { - props: Parameters[0]; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - formDefaultValues?: any; -}) => { - let formMethods: UseFormReturn | undefined; - const Wrapper = ({ children }: { children: React.ReactNode }) => { - const form = useForm({ - defaultValues: formDefaultValues, - }); - formMethods = form; - return ( - - {children} - - ); - }; - const result = render(, { wrapper: Wrapper }); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return { result, formMethods: formMethods! }; -}; - -describe("BookingFields", () => { - it("should correctly render with location fields", () => { - const AttendeePhoneNumberOption = { - label: "attendee_phone_number", - value: "phone", - }; - - const OrganizerLinkOption = { - label: "https://google.com", - value: "link", - }; - - const locations = [ - { - type: AttendeePhoneNumberOption.value, - }, - { - link: "https://google.com", - type: OrganizerLinkOption.value, - displayLocationPublicly: true, - }, - ]; - const { formMethods } = renderComponent({ - props: { - fields: getBookingFieldsWithSystemFields({ - disableGuests: false, - bookingFields: [], - metadata: null, - workflows: [], - customInputs: [], - }), - locations, - isDynamicGroupBooking: false, - bookingData: null, - }, - formDefaultValues: {}, - }); - - component.fillName({ value: "John Doe" }); - component.fillEmail({ value: "john.doe@example.com" }); - component.fillNotes({ value: "This is a note" }); - expectScenarios.expectNameToBe({ value: "John Doe", formMethods }); - expectScenarios.expectEmailToBe({ value: "john.doe@example.com", formMethods }); - expectScenarios.expectNotesToBe({ value: "This is a note", formMethods }); - - component.fillRadioInputLocation({ label: AttendeePhoneNumberOption.label, inputValue: "+1234567890" }); - expectScenarios.expectLocationToBe({ - formMethods, - label: AttendeePhoneNumberOption.label, - toMatch: { - formattedValue: "+1 (234) 567-890", - value: { optionValue: "+1234567890", value: AttendeePhoneNumberOption.value }, - }, - }); - - component.fillRadioInputLocation({ label: OrganizerLinkOption.label }); - expectScenarios.expectLocationToBe({ - formMethods, - label: OrganizerLinkOption.label, - toMatch: { - formattedValue: "+1 (234) 567-890", - value: { optionValue: "", value: OrganizerLinkOption.value }, - }, - }); - }); -}); - -const component = { - getName: ({ label = "your_name" }: { label?: string } = {}) => - screen.getByRole("textbox", { - name: new RegExp(label), - }) as HTMLInputElement, - getEmail: () => screen.getByRole("textbox", { name: /email/i }) as HTMLInputElement, - getLocationRadioOption: ({ label }: { label: string }) => - screen.getByRole("radio", { name: new RegExp(label) }) as HTMLInputElement, - getLocationRadioInput: ({ placeholder }: { placeholder: string }) => - screen.getByPlaceholderText(placeholder) as HTMLInputElement, - getNotes: () => screen.getByRole("textbox", { name: /additional_notes/i }) as HTMLInputElement, - getGuests: () => screen.getByLabelText("guests"), - fillName: ({ value }: { value: string }) => { - fireEvent.change(component.getName(), { target: { value } }); - }, - fillEmail: ({ value }: { value: string }) => { - fireEvent.change(component.getEmail(), { target: { value } }); - }, - fillRadioInputLocation: ({ label, inputValue }: { label: string; inputValue?: string }) => { - fireEvent.click(component.getLocationRadioOption({ label })); - - if (inputValue) { - let placeholder = label; - if (label === "attendee_phone_number") { - placeholder = "enter_phone_number"; - } else { - // radioInput doesn't have a label, so we need to identify by placeholder - throw new Error("Tell me how to identify the placeholder for this location input"); - } - fireEvent.change(component.getLocationRadioInput({ placeholder }), { - target: { value: inputValue }, - }); - } - }, - fillNotes: ({ value }: { value: string }) => { - fireEvent.change(component.getNotes(), { target: { value } }); - }, -}; - -const expectScenarios = { - expectNameToBe: ({ value, formMethods }: { value: string; formMethods: FormMethods }) => { - expect(component.getName().value).toEqual(value); - expect(formMethods.getValues("responses.name")).toEqual(value); - }, - expectEmailToBe: ({ value, formMethods }: { value: string; formMethods: FormMethods }) => { - expect(component.getEmail().value).toEqual(value); - expect(formMethods.getValues("responses.email")).toEqual(value); - }, - expectLocationToBe: ({ - formMethods, - label, - toMatch: { formattedValue, value }, - }: { - label: string; - toMatch: { - formattedValue?: string; - value: { - optionValue: string; - value: string; - }; - }; - formMethods: FormMethods; - }) => { - expect(component.getLocationRadioOption({ label }).checked).toBe(true); - if (value.optionValue) { - expect(component.getLocationRadioInput({ placeholder: "enter_phone_number" }).value).toEqual( - formattedValue - ); - } - expect(formMethods.getValues("responses.location")).toEqual(value); - }, - expectNotesToBe: ({ value, formMethods }: { value: string; formMethods: FormMethods }) => { - expect(component.getNotes().value).toEqual(value); - expect(formMethods.getValues("responses.notes")).toEqual(value); - }, -}; diff --git a/packages/ui/components/address/index.ts b/packages/ui/components/address/index.ts index 09ecbf71f8..03d621d09f 100644 --- a/packages/ui/components/address/index.ts +++ b/packages/ui/components/address/index.ts @@ -1,3 +1,2 @@ export { default as AddressInput } from "./AddressInputLazy"; export { default as MultiEmail } from "./MultiEmailLazy"; -export { default as AddressInputNonLazy } from "./AddressInput"; diff --git a/packages/ui/components/badge/UpgradeOrgsBadge.tsx b/packages/ui/components/badge/UpgradeOrgsBadge.tsx deleted file mode 100644 index 932cd82497..0000000000 --- a/packages/ui/components/badge/UpgradeOrgsBadge.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { useLocale } from "@calcom/lib/hooks/useLocale"; - -import { Tooltip } from "../tooltip"; -import { Badge } from "./Badge"; - -export const UpgradeOrgsBadge = function UpgradeOrgsBadge() { - const { t } = useLocale(); - - return ( - - - {t("upgrade")} - - - ); -}; diff --git a/packages/ui/components/badge/index.ts b/packages/ui/components/badge/index.ts index b1ee3f44ef..e46de5a423 100644 --- a/packages/ui/components/badge/index.ts +++ b/packages/ui/components/badge/index.ts @@ -1,6 +1,5 @@ export { Badge } from "./Badge"; export { UpgradeTeamsBadge } from "./UpgradeTeamsBadge"; export { CreditsBadge } from "./CreditsBadge"; -export { UpgradeOrgsBadge } from "./UpgradeOrgsBadge"; export { InfoBadge } from "./InfoBadge"; export type { BadgeProps } from "./Badge"; diff --git a/packages/ui/components/dropdown/index.ts b/packages/ui/components/dropdown/index.ts index 934ddb81c8..f7dd2fec04 100644 --- a/packages/ui/components/dropdown/index.ts +++ b/packages/ui/components/dropdown/index.ts @@ -4,13 +4,9 @@ export { DropdownItem, DropdownMenuCheckboxItem, DropdownMenuContent, - DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, - DropdownMenuRadioGroup, - DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger, - DropdownMenuTriggerItem, } from "./Dropdown"; diff --git a/packages/ui/components/form/index.ts b/packages/ui/components/form/index.ts index bdd055ee30..50ecec3624 100644 --- a/packages/ui/components/form/index.ts +++ b/packages/ui/components/form/index.ts @@ -1,12 +1,8 @@ export { Checkbox, MultiSelectCheckbox, CheckboxField } from "./checkbox"; export type { Option as MultiSelectCheckboxesOptionType } from "./checkbox"; -export { HintsOrErrors } from "./inputs/HintOrErrors"; export { EmailField, EmailInput, - FieldsetLegend, - InputGroupBox, - InputLeading, PasswordField, TextArea, TextAreaField, @@ -15,8 +11,6 @@ export { } from "./inputs/Input"; export { MultiOptionInput } from "./inputs/MultiOptionInput"; - -export { InputFieldWithSelect } from "./inputs/InputFieldWithSelect"; export type { InputFieldProps, InputProps } from "./inputs/types"; export { InputField, Input, TextField, inputStyles } from "./inputs/TextField"; export { InputError } from "./inputs/InputError"; @@ -25,12 +19,9 @@ export { Label } from "./inputs/Label"; export { Select, SelectField, SelectWithValidation, getReactSelectProps } from "./select"; export { DateRangePickerLazy as DateRangePicker } from "./date-range-picker"; -export { Slider } from "./slider"; -export { RangeSlider } from "./slider/RangeSlider"; -export { RangeSliderPopover } from "./slider/RangeSliderPopover"; export { BooleanToggleGroup, BooleanToggleGroupField, ToggleGroup } from "./toggleGroup"; export { DatePicker } from "./datepicker"; -export { FormStep, Steps, Stepper } from "./step"; +export { Steps } from "./step"; export { WizardForm } from "./wizard"; export { default as ColorPicker } from "./color-picker/colorpicker"; export { SettingsToggle, Switch } from "./switch"; diff --git a/packages/ui/components/form/inputs/Input.tsx b/packages/ui/components/form/inputs/Input.tsx index 6f217e25dd..88a5bbd734 100644 --- a/packages/ui/components/form/inputs/Input.tsx +++ b/packages/ui/components/form/inputs/Input.tsx @@ -14,15 +14,6 @@ import { Input, InputField, inputStyles } from "../inputs/TextField"; import { Label } from "./Label"; import type { InputFieldProps } from "./types"; -export function InputLeading(props: JSX.IntrinsicElements["div"]) { - return ( - - {props.children} - - ); -} - - export const PasswordField = forwardRef(function PasswordField( props, ref @@ -149,24 +140,6 @@ export const TextAreaField = forwardRef ); }); -export function FieldsetLegend(props: JSX.IntrinsicElements["legend"]) { - return ( - - {props.children} - - ); -} - -export function InputGroupBox(props: JSX.IntrinsicElements["div"]) { - return ( -
- {props.children} -
- ); -} - export const NumberInput = forwardRef(function NumberInput(props, ref) { return ( (function EmailField(props, ref) { - return ( - } - /> - ); -}); diff --git a/packages/ui/components/form/inputs/input.test.tsx b/packages/ui/components/form/inputs/input.test.tsx index fc0d6e6358..4de924b967 100644 --- a/packages/ui/components/form/inputs/input.test.tsx +++ b/packages/ui/components/form/inputs/input.test.tsx @@ -1,11 +1,8 @@ -/* eslint-disable playwright/missing-playwright-await */ import { TooltipProvider } from "@radix-ui/react-tooltip"; import { render, fireEvent } from "@testing-library/react"; import { vi } from "vitest"; -import type { UnstyledSelect } from "../../address/Select"; import { EmailField, TextAreaField, PasswordField, NumberInput, FilterSearchField } from "./Input"; -import { InputFieldWithSelect } from "./InputFieldWithSelect"; import { InputField } from "./TextField"; const onChangeMock = vi.fn(); @@ -117,31 +114,6 @@ describe("Tests for TextAreaField Component", () => { }); }); -describe("Tests for InputFieldWithSelect Component", () => { - test("Should render correctly with InputField and UnstyledSelect", () => { - const onChangeMock = vi.fn(); - - const selectProps = { - value: null, - onChange: onChangeMock, - name: "testSelect", - options: [ - { value: "Option 1", label: "Option 1" }, - { value: "Option 2", label: "Option 2" }, - { value: "Option 3", label: "Option 3" }, - ], - } as unknown as typeof UnstyledSelect; - - const { getByText } = render(); - - const inputElement = getByText("Select..."); - fireEvent.mouseDown(inputElement); - - const optionElement = getByText("Option 1"); - expect(optionElement).toBeInTheDocument(); - }); -}); - describe("Tests for NumberInput Component", () => { test("Should render correctly with input type number", () => { const { getByRole } = render(); diff --git a/packages/ui/components/form/slider/RangeSlider.tsx b/packages/ui/components/form/slider/RangeSlider.tsx deleted file mode 100644 index cbbfbb2f82..0000000000 --- a/packages/ui/components/form/slider/RangeSlider.tsx +++ /dev/null @@ -1,25 +0,0 @@ -"use client"; - -import * as SliderPrimitive from "@radix-ui/react-slider"; -import * as React from "react"; - -import classNames from "@calcom/ui/classNames"; - -const RangeSlider = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - - - - - -)); -RangeSlider.displayName = SliderPrimitive.Root.displayName; - -export { RangeSlider }; diff --git a/packages/ui/components/form/slider/RangeSliderPopover.tsx b/packages/ui/components/form/slider/RangeSliderPopover.tsx deleted file mode 100644 index 4f84dbd9e1..0000000000 --- a/packages/ui/components/form/slider/RangeSliderPopover.tsx +++ /dev/null @@ -1,129 +0,0 @@ -"use client"; - -import * as Popover from "@radix-ui/react-popover"; -import { useState } from "react"; - -import { Badge } from "../../badge/Badge"; -import { Button } from "../../button/Button"; -import { inputStyles, TextField } from "../inputs/TextField"; -import { RangeSlider } from "./RangeSlider"; - -interface RangeSliderPopoverProps { - triggerText: string; - resetBtnText?: string; - applyBtnText?: string; - value: number[]; - onChange: (value: number[]) => void; - min: number; - max: number; - step?: number; - badgeVariant?: "default" | "success" | "gray" | "warning" | "orange" | "red"; - badgeSuffix?: string; - inputSuffix?: string; - inputLeading?: string; -} - -export const RangeSliderPopover = ({ - resetBtnText = "Reset", - applyBtnText = "Apply", - triggerText, - value, - onChange, - min, - max, - step = 1, - badgeVariant = "default", - badgeSuffix, - inputSuffix, - inputLeading, -}: RangeSliderPopoverProps) => { - const [internalValue, setInternalValue] = useState(value); - const [open, setOpen] = useState(false); - - const handleReset = () => { - setInternalValue([min, max]); - }; - - const handleApply = () => { - onChange(internalValue); - setOpen(false); - }; - - return ( - - - - - - -
- -
-
- { - const newValue = parseInt(e.target.value); - if (!isNaN(newValue) && newValue >= min && newValue <= internalValue[1]) { - setInternalValue([newValue, internalValue[1]]); - } - }} - addOnLeading={inputLeading ? inputLeading : undefined} - addOnSuffix={inputSuffix ? inputSuffix : undefined} - containerClassName="w-full" - /> - { - const newValue = parseInt(e.target.value); - if (!isNaN(newValue) && newValue >= internalValue[0] && newValue <= max) { - setInternalValue([internalValue[0], newValue]); - } - }} - addOnLeading={inputLeading ? inputLeading : undefined} - addOnSuffix={inputSuffix ? inputSuffix : undefined} - containerClassName="w-full" - /> -
- -
-
-
- - -
-
-
-
-
- ); -}; diff --git a/packages/ui/components/form/slider/index.tsx b/packages/ui/components/form/slider/index.tsx deleted file mode 100644 index 254ca364af..0000000000 --- a/packages/ui/components/form/slider/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ -"use client"; - -import * as SliderPrimitive from "@radix-ui/react-slider"; -import * as React from "react"; - -import classNames from "@calcom/ui/classNames"; - -const Slider = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - - - - - -)); -Slider.displayName = SliderPrimitive.Root.displayName; - -export { Slider }; diff --git a/packages/ui/components/form/step/FormStep.tsx b/packages/ui/components/form/step/FormStep.tsx deleted file mode 100644 index b0fec7ba08..0000000000 --- a/packages/ui/components/form/step/FormStep.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from "react"; - -import classNames from "@calcom/ui/classNames"; - -type Props = { - steps: number; - currentStep: number; -}; - -// It might be worth passing this label string from outside the component so we can translate it? -function FormStep({ currentStep, steps }: Props) { - return ( -
-

- Step {currentStep} of {steps} -

-
- {[...Array(steps)].map((_, j) => { - return ( -
= j ? "bg-black" : "bg-gray-400" - )} - key={j} - /> - ); - })} -
-
- ); -} - -export default FormStep; diff --git a/packages/ui/components/form/step/Stepper.tsx b/packages/ui/components/form/step/Stepper.tsx deleted file mode 100644 index fa75f40112..0000000000 --- a/packages/ui/components/form/step/Stepper.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import { useAutoAnimate } from "@formkit/auto-animate/react"; -import Link from "next/link"; - -type DefaultStep = { - title: string; -}; - -function Stepper(props: { - href: string; - step: number; - steps: T[]; - disableSteps?: boolean; - stepLabel?: (currentStep: number, totalSteps: number) => string; -}) { - const { - href, - steps, - stepLabel = (currentStep, totalSteps) => `Step ${currentStep} of ${totalSteps}`, - } = props; - const [stepperRef] = useAutoAnimate(); - return ( - <> - {steps.length > 1 && ( - - )} - - ); -} - -export default Stepper; diff --git a/packages/ui/components/form/step/index.ts b/packages/ui/components/form/step/index.ts index 14316fa07e..bcd0c54fa1 100644 --- a/packages/ui/components/form/step/index.ts +++ b/packages/ui/components/form/step/index.ts @@ -1,3 +1 @@ -export { default as FormStep } from "./FormStep"; export { Steps } from "./Steps"; -export { default as Stepper } from "./Stepper"; diff --git a/packages/ui/components/navigation/NavigationItem.tsx b/packages/ui/components/navigation/NavigationItem.tsx deleted file mode 100644 index c6c96832b5..0000000000 --- a/packages/ui/components/navigation/NavigationItem.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { cva } from "class-variance-authority"; -import { Fragment } from "react"; - -import classNames from "@calcom/ui/classNames"; - -import { ButtonOrLink } from "../dropdown"; -import { Icon } from "../icon"; -import type { IconName } from "../icon"; - -export type NavigationItemType = { - isLastChild?: boolean; - isExpanded?: boolean; - onToggle?: () => void; - name: string; - href?: string; - isLoading?: boolean; - badge?: React.ReactNode; - icon?: IconName; - child?: NavigationItemType[]; - onlyMobile?: boolean; - onlyDesktop?: boolean; - moreOnMobile?: boolean; - isCurrent?: boolean; -}; - -const navigationItemStyles = cva( - "text-default group flex items-center rounded-[10px] p-2 text-sm font-medium transition hover:bg-subtle hover:text-emphasis", - { - variants: { - isChild: { - true: "[&[aria-current='page']]:text-emphasis [&[aria-current='page']]:bg-emphasis hidden h-8 ml-16 lg:flex lg:ml-10 relative before:absolute before:left-[-24px] before:-top-2 before:h-[calc(100%+0.5rem)] before:w-0.5 before:bg-subtle before:content-[''] first:before:rounded-t-full last:before:rounded-b-full", - false: "[&[aria-current='page']]:text-emphasis mt-0.5 text-sm", - }, - hasChild: { - true: "aria-[aria-current='page']:bg-transparent! relative after:absolute after:left-[-24px] after:top-6 after:h-[calc(100%-1.5rem)] after:w-0.5 after:bg-subtle after:content-[''] first:after:rounded-t-full last:after:rounded-b-full", - false: "[&[aria-current='page']]:bg-subtle", - }, - isFirstChild: { - true: "mt-0", - false: "mt-px", - }, - }, - defaultVariants: { - isChild: false, - hasChild: false, - isFirstChild: false, - }, - } -); - -const Label = ({ children }: { children: React.ReactNode }) => { - return {children}; -}; - -const NavigationItemComponent = ({ - item, - isChild, - index, -}: { - item: NavigationItemType; - isChild?: boolean; - index?: number; -}) => { - return ( - - - {item.icon && ( - - {item.child && - item.isExpanded && - item.child.map((childItem, childIndex) => ( - - ))} - - ); -}; - -export const NavigationItem = Object.assign(NavigationItemComponent, { Label }); diff --git a/packages/ui/components/navigation/index.ts b/packages/ui/components/navigation/index.ts index aef29ad145..a304de05d8 100644 --- a/packages/ui/components/navigation/index.ts +++ b/packages/ui/components/navigation/index.ts @@ -5,4 +5,3 @@ export type { NavTabProps } from "./tabs/HorizontalTabs"; export { default as VerticalTabItem } from "./tabs/VerticalTabItem"; export type { VerticalTabItemProps } from "./tabs/VerticalTabItem"; export { default as VerticalTabs } from "./tabs/VerticalTabs"; -export { NavigationItem } from "./NavigationItem";