diff --git a/package.json b/package.json index 94a0153..e86b5ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@internxt/ui", - "version": "0.1.12", + "version": "0.1.13", "description": "Library of Internxt components", "repository": { "type": "git", diff --git a/src/components/checkbox/__test__/Checkbox.test.tsx b/src/components/checkbox/__test__/Checkbox.test.tsx deleted file mode 100644 index 456a68a..0000000 --- a/src/components/checkbox/__test__/Checkbox.test.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React from 'react'; -import { describe, expect, it, vi } from 'vitest'; -import { Checkbox } from '../'; -import { render, fireEvent } from '@testing-library/react'; - -describe('Checkbox component', () => { - it('Checkbox disabled and not checked should render correctly', () => { - const button = render(); - expect(button).toMatchSnapshot(); - }); - - it('Checkbox enabled and not checked should render correctly', () => { - const button = render(); - expect(button).toMatchSnapshot(); - }); - - it('Checkbox checked should render correctly', () => { - const button = render(); - expect(button).toMatchSnapshot(); - }); - - it('Checkbox disabled and checked should render correctly', () => { - const button = render(); - expect(button).toMatchSnapshot(); - }); - - it('Checkbox enabled and indetermiante should render correctly', () => { - const button = render(); - expect(button).toMatchSnapshot(); - }); - - it('Checkbox disabled and indetermiante should render correctly', () => { - const button = render(); - expect(button).toMatchSnapshot(); - }); - - it('calls onClick when label is clicked and not disabled', () => { - const handleClick = vi.fn(); - const { container } = render(); - const label = container.querySelector('label'); - fireEvent.click(label!); - expect(handleClick).toHaveBeenCalled(); - }); - - it('does not call onClick when disabled', () => { - const handleClick = vi.fn(); - const { container } = render(); - const label = container.querySelector('label'); - fireEvent.click(label!); - expect(handleClick).not.toHaveBeenCalled(); - }); - - it('prevents default on inner div click', () => { - const { container } = render(); - const div = container.querySelector('div'); - - const event = new MouseEvent('click', { bubbles: true, cancelable: true }); - event.preventDefault = vi.fn(); - fireEvent(div!, event); - expect(event.preventDefault).toHaveBeenCalled(); - }); - - it('triggers onKeyDown handlers without errors', () => { - const { container } = render(); - const label = container.querySelector('label'); - const div = container.querySelector('div'); - fireEvent.keyDown(label!, { key: 'Enter' }); - fireEvent.keyDown(div!, { key: 'Enter' }); - }); -}); diff --git a/src/components/avatar/Avatar.tsx b/src/components/data-display/avatar/Avatar.tsx similarity index 100% rename from src/components/avatar/Avatar.tsx rename to src/components/data-display/avatar/Avatar.tsx diff --git a/src/components/avatar/__test__/Avatar.test.tsx b/src/components/data-display/avatar/__test__/Avatar.test.tsx similarity index 50% rename from src/components/avatar/__test__/Avatar.test.tsx rename to src/components/data-display/avatar/__test__/Avatar.test.tsx index f0accdb..1bd8722 100644 --- a/src/components/avatar/__test__/Avatar.test.tsx +++ b/src/components/data-display/avatar/__test__/Avatar.test.tsx @@ -1,72 +1,50 @@ import { render } from '@testing-library/react'; -import { describe, expect, it, test } from 'vitest'; +import { describe, expect, it } from 'vitest'; import { Avatar } from '../'; -import DefaultAvatar from '../components/DefaultAvatar'; -import PictureAvatar from '../components/PictureAvatar'; const FULL_NAME = 'My Internxt'; const IMAGE_SRC = 'https://internxt.com/favicon.ico'; describe('Avatar component', () => { - test('Avatar with full name (first letters) should render correctly', () => { + it('Avatar with full name (first letters) should render correctly', () => { const avatarComponent = render(); expect(avatarComponent).toMatchSnapshot(); }); - test('Avatar with single word name should render correctly', () => { - const avatarComponent = render(); - expect(avatarComponent).toMatchSnapshot(); - }); - - test('Avatar with empty spaces name should return empty content', () => { - const avatarComponent = render(); - expect(avatarComponent).toMatchSnapshot(); - }); - - test('Avatar with fullname as null should render correctly with empty letters', () => { + it('Avatar with fullname as null should render correctly with empty letters', () => { const avatarComponent = render(); expect(avatarComponent).toMatchSnapshot(); }); - test('Avatar with avatar (user image profile) should render correctly', () => { + it('Avatar with avatar (user image profile) should render correctly', () => { const avatarComponent = render(); expect(avatarComponent).toMatchSnapshot(); }); - test('XXS Avatar should render correctly', () => { + it('XXS Avatar should render correctly', () => { const avatarComponent = render(); expect(avatarComponent).toMatchSnapshot(); }); - test('XS Avatar should render correctly', () => { + it('XS Avatar should render correctly', () => { const avatarComponent = render(); expect(avatarComponent).toMatchSnapshot(); }); - test('SM Avatar should render correctly', () => { + it('SM Avatar should render correctly', () => { const avatarComponent = render(); expect(avatarComponent).toMatchSnapshot(); }); - test('Base Avatar should render correctly', () => { + it('Base Avatar should render correctly', () => { const avatarComponent = render(); expect(avatarComponent).toMatchSnapshot(); }); - test('LG Avatar should render correctly', () => { + it('LG Avatar should render correctly', () => { const avatarComponent = render(); expect(avatarComponent).toMatchSnapshot(); }); - test('XL Avatar should render correctly', () => { + it('XL Avatar should render correctly', () => { const avatarComponent = render(); expect(avatarComponent).toMatchSnapshot(); }); - - test('DefaultAvatar handles default parameters', () => { - const avatarComponent = render(); - expect(avatarComponent).toMatchSnapshot(); - }); - - test('PictureAvatar handles default parameters', () => { - const avatarComponent = render(); - expect(avatarComponent).toMatchSnapshot(); - }); }); diff --git a/src/components/avatar/__test__/__snapshots__/Avatar.test.tsx.snap b/src/components/data-display/avatar/__test__/__snapshots__/Avatar.test.tsx.snap similarity index 68% rename from src/components/avatar/__test__/__snapshots__/Avatar.test.tsx.snap rename to src/components/data-display/avatar/__test__/__snapshots__/Avatar.test.tsx.snap index ede2e30..876ffa2 100644 --- a/src/components/avatar/__test__/__snapshots__/Avatar.test.tsx.snap +++ b/src/components/data-display/avatar/__test__/__snapshots__/Avatar.test.tsx.snap @@ -75,81 +75,6 @@ exports[`Avatar component > Avatar with avatar (user image profile) should rende } `; -exports[`Avatar component > Avatar with empty spaces name should return empty content 1`] = ` -{ - "asFragment": [Function], - "baseElement": -
-
-

-

-
- , - "container":
-
-

-

-
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - exports[`Avatar component > Avatar with full name (first letters) should render correctly 1`] = ` { "asFragment": [Function], @@ -304,85 +229,6 @@ exports[`Avatar component > Avatar with fullname as null should render correctly } `; -exports[`Avatar component > Avatar with single word name should render correctly 1`] = ` -{ - "asFragment": [Function], - "baseElement": -
-
-

- J -

-
-
- , - "container":
-
-

- J -

-
-
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - exports[`Avatar component > Base Avatar should render correctly 1`] = ` { "asFragment": [Function], @@ -458,85 +304,6 @@ exports[`Avatar component > Base Avatar should render correctly 1`] = ` } `; -exports[`Avatar component > DefaultAvatar handles default parameters 1`] = ` -{ - "asFragment": [Function], - "baseElement": -
-
-

- JD -

-
-
- , - "container":
-
-

- JD -

-
-
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - exports[`Avatar component > LG Avatar should render correctly 1`] = ` { "asFragment": [Function], @@ -612,81 +379,6 @@ exports[`Avatar component > LG Avatar should render correctly 1`] = ` } `; -exports[`Avatar component > PictureAvatar handles default parameters 1`] = ` -{ - "asFragment": [Function], - "baseElement": -
- -
- , - "container":
- -
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - exports[`Avatar component > SM Avatar should render correctly 1`] = ` { "asFragment": [Function], diff --git a/src/components/avatar/components/DefaultAvatar.tsx b/src/components/data-display/avatar/components/DefaultAvatar.tsx similarity index 100% rename from src/components/avatar/components/DefaultAvatar.tsx rename to src/components/data-display/avatar/components/DefaultAvatar.tsx diff --git a/src/components/avatar/components/PictureAvatar.tsx b/src/components/data-display/avatar/components/PictureAvatar.tsx similarity index 100% rename from src/components/avatar/components/PictureAvatar.tsx rename to src/components/data-display/avatar/components/PictureAvatar.tsx diff --git a/src/components/avatar/index.ts b/src/components/data-display/avatar/index.ts similarity index 100% rename from src/components/avatar/index.ts rename to src/components/data-display/avatar/index.ts diff --git a/src/components/card/Card.tsx b/src/components/data-display/card/Card.tsx similarity index 100% rename from src/components/card/Card.tsx rename to src/components/data-display/card/Card.tsx diff --git a/src/components/card/__test__/Card.test.tsx b/src/components/data-display/card/__test__/Card.test.tsx similarity index 100% rename from src/components/card/__test__/Card.test.tsx rename to src/components/data-display/card/__test__/Card.test.tsx diff --git a/src/components/card/__test__/__snapshots__/Card.test.tsx.snap b/src/components/data-display/card/__test__/__snapshots__/Card.test.tsx.snap similarity index 100% rename from src/components/card/__test__/__snapshots__/Card.test.tsx.snap rename to src/components/data-display/card/__test__/__snapshots__/Card.test.tsx.snap diff --git a/src/components/card/index.ts b/src/components/data-display/card/index.ts similarity index 100% rename from src/components/card/index.ts rename to src/components/data-display/card/index.ts diff --git a/src/components/list/List.tsx b/src/components/data-display/list/List.tsx similarity index 98% rename from src/components/list/List.tsx rename to src/components/data-display/list/List.tsx index 8f4d15d..d6c70e4 100644 --- a/src/components/list/List.tsx +++ b/src/components/data-display/list/List.tsx @@ -2,10 +2,10 @@ import _ from 'lodash'; import React, { ReactNode, useEffect, useRef, useState } from 'react'; import ListItem from './ListItem'; import ListHeader, { HeaderProps } from './ListHeader'; -import useHotkeys from '../../hooks/useHotKeys'; -import { SkeletonLoader } from '../skeletonLoader'; -import { InfiniteScroll } from '../infiniteScroll'; -import { MenuItemsType } from '../menu/Menu'; +import useHotkeys from '../../../hooks/useHotKeys'; +import { SkeletonLoader } from '../../feedback/skeletonLoader'; +import { InfiniteScroll } from '../../layout/infiniteScroll'; +import { MenuItemsType } from '../../navigation/menu/Menu'; export interface ListProps { header: HeaderProps[]; diff --git a/src/components/list/ListHeader.tsx b/src/components/data-display/list/ListHeader.tsx similarity index 96% rename from src/components/list/ListHeader.tsx rename to src/components/data-display/list/ListHeader.tsx index 8a5680b..446536b 100644 --- a/src/components/list/ListHeader.tsx +++ b/src/components/data-display/list/ListHeader.tsx @@ -1,6 +1,6 @@ import { ArrowDown, ArrowUp } from '@phosphor-icons/react'; -import Checkbox from '../checkbox/Checkbox'; -import { MenuItemsType } from '../menu/Menu'; +import Checkbox from '../../input/checkbox/Checkbox'; +import { MenuItemsType } from '../../navigation/menu/Menu'; export type HeaderProps = { label: string; diff --git a/src/components/list/ListItem.tsx b/src/components/data-display/list/ListItem.tsx similarity index 96% rename from src/components/list/ListItem.tsx rename to src/components/data-display/list/ListItem.tsx index fd86c07..17257bc 100644 --- a/src/components/list/ListItem.tsx +++ b/src/components/data-display/list/ListItem.tsx @@ -1,9 +1,9 @@ import { LegacyRef, useEffect, useRef, useState } from 'react'; import { DotsThree } from '@phosphor-icons/react'; -import ContextMenu from '../contextMenu/ContextMenu'; -import useHotkeys from '../../hooks/useHotKeys'; -import Checkbox from '../checkbox/Checkbox'; -import { MenuItemsType } from '../menu/Menu'; +import ContextMenu from '../../overlay/contextMenu/ContextMenu'; +import useHotkeys from '../../../hooks/useHotKeys'; +import Checkbox from '../../input/checkbox/Checkbox'; +import { MenuItemsType } from '../../navigation/menu/Menu'; interface ListItemProps { item: T; diff --git a/src/components/list/__test__/List.test.tsx b/src/components/data-display/list/__test__/List.test.tsx similarity index 97% rename from src/components/list/__test__/List.test.tsx rename to src/components/data-display/list/__test__/List.test.tsx index d155910..c1f4f61 100644 --- a/src/components/list/__test__/List.test.tsx +++ b/src/components/data-display/list/__test__/List.test.tsx @@ -306,15 +306,6 @@ describe('List component', () => { expect(mockOnSelectedItemsChanged).toHaveBeenCalled(); }); - it('closes the item context menu when clicking outside the list container', () => { - const { getByText } = renderList(); - - const itemElement = getByText('Item 2'); - fireEvent.contextMenu(itemElement); - - fireEvent.mouseDown(document.body); - }); - it('should toggle selection when Ctrl or Meta key is pressed', () => { const { getByText } = renderList(); diff --git a/src/components/list/__test__/ListHeader.test.tsx b/src/components/data-display/list/__test__/ListHeader.test.tsx similarity index 64% rename from src/components/list/__test__/ListHeader.test.tsx rename to src/components/data-display/list/__test__/ListHeader.test.tsx index 2a6c3c1..9162b26 100644 --- a/src/components/list/__test__/ListHeader.test.tsx +++ b/src/components/data-display/list/__test__/ListHeader.test.tsx @@ -85,43 +85,4 @@ describe('ListHeader', () => { expect(mockOnOrderableColumnClicked).not.toHaveBeenCalled(); }); - - it('renders ArrowDown when orderBy direction is DESC', () => { - const { container } = renderListHeader({ - orderBy: { field: 'id', direction: 'DESC' }, - }); - expect(container.querySelector('svg')).toBeInTheDocument(); - }); - - it('renders ArrowUp when orderBy direction is ASC', () => { - const { container } = renderListHeader({ - orderBy: { field: 'id', direction: 'ASC' }, - }); - expect(container.querySelector('svg')).toBeInTheDocument(); - }); - - it('renders columns with buttonDataCy and textDataCy attributes', () => { - const { container } = render( - , - ); - expect(container.querySelector('[data-cy="btn-data-cy"]')).toBeInTheDocument(); - expect(container.querySelector('[data-cy="text-data-cy"]')).toBeInTheDocument(); - }); }); diff --git a/src/components/list/__test__/ListItem.test.tsx b/src/components/data-display/list/__test__/ListItem.test.tsx similarity index 75% rename from src/components/list/__test__/ListItem.test.tsx rename to src/components/data-display/list/__test__/ListItem.test.tsx index aa37cfa..6b7a425 100644 --- a/src/components/list/__test__/ListItem.test.tsx +++ b/src/components/data-display/list/__test__/ListItem.test.tsx @@ -66,31 +66,6 @@ describe('ListItem', () => { expect(mockOnClickContextMenu).toHaveBeenCalled(); }); - it('updates dimensions when menuItemsRef size changes', () => { - const originalOffsetWidth = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'offsetWidth'); - const originalOffsetHeight = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'offsetHeight'); - - Object.defineProperty(HTMLElement.prototype, 'offsetWidth', { configurable: true, value: 100 }); - Object.defineProperty(HTMLElement.prototype, 'offsetHeight', { configurable: true, value: 100 }); - - renderListItem({ isOpen: true, selected: true }); - - if (originalOffsetWidth) Object.defineProperty(HTMLElement.prototype, 'offsetWidth', originalOffsetWidth); - if (originalOffsetHeight) Object.defineProperty(HTMLElement.prototype, 'offsetHeight', originalOffsetHeight); - }); - - it('handles contextMenu positioning near screen edges', () => { - renderListItem({ isOpen: true, selected: true }); - const listItem = screen.getByText('1').closest('div'); - - fireEvent.contextMenu(listItem!, { - clientX: window.innerWidth + 300, - clientY: Math.max(window.innerHeight, 500) + 300 - }); - - expect(mockOnClickContextMenu).toHaveBeenCalled(); - }); - it('closes the context menu when onClose is called', () => { renderListItem({ isOpen: true }); mockOnClose(); diff --git a/src/components/list/__test__/__snapshots__/List.test.tsx.snap b/src/components/data-display/list/__test__/__snapshots__/List.test.tsx.snap similarity index 100% rename from src/components/list/__test__/__snapshots__/List.test.tsx.snap rename to src/components/data-display/list/__test__/__snapshots__/List.test.tsx.snap diff --git a/src/components/list/__test__/__snapshots__/ListHeader.test.tsx.snap b/src/components/data-display/list/__test__/__snapshots__/ListHeader.test.tsx.snap similarity index 100% rename from src/components/list/__test__/__snapshots__/ListHeader.test.tsx.snap rename to src/components/data-display/list/__test__/__snapshots__/ListHeader.test.tsx.snap diff --git a/src/components/list/__test__/__snapshots__/ListItem.test.tsx.snap b/src/components/data-display/list/__test__/__snapshots__/ListItem.test.tsx.snap similarity index 100% rename from src/components/list/__test__/__snapshots__/ListItem.test.tsx.snap rename to src/components/data-display/list/__test__/__snapshots__/ListItem.test.tsx.snap diff --git a/src/components/list/index.ts b/src/components/data-display/list/index.ts similarity index 100% rename from src/components/list/index.ts rename to src/components/data-display/list/index.ts diff --git a/src/components/table/Table.tsx b/src/components/data-display/table/Table.tsx similarity index 100% rename from src/components/table/Table.tsx rename to src/components/data-display/table/Table.tsx diff --git a/src/components/table/__test__/Table.test.tsx b/src/components/data-display/table/__test__/Table.test.tsx similarity index 100% rename from src/components/table/__test__/Table.test.tsx rename to src/components/data-display/table/__test__/Table.test.tsx diff --git a/src/components/table/__test__/__snapshots__/Table.test.tsx.snap b/src/components/data-display/table/__test__/__snapshots__/Table.test.tsx.snap similarity index 100% rename from src/components/table/__test__/__snapshots__/Table.test.tsx.snap rename to src/components/data-display/table/__test__/__snapshots__/Table.test.tsx.snap diff --git a/src/components/table/index.ts b/src/components/data-display/table/index.ts similarity index 100% rename from src/components/table/index.ts rename to src/components/data-display/table/index.ts diff --git a/src/components/empty/Empty.tsx b/src/components/feedback/empty/Empty.tsx similarity index 97% rename from src/components/empty/Empty.tsx rename to src/components/feedback/empty/Empty.tsx index e526ca6..d7c25f0 100644 --- a/src/components/empty/Empty.tsx +++ b/src/components/feedback/empty/Empty.tsx @@ -1,6 +1,6 @@ import { Upload } from '@phosphor-icons/react'; import { ReactNode } from 'react'; -import { Button } from '../button'; +import { Button } from '../../input/button'; export interface EmptyProps { icon: JSX.Element; diff --git a/src/components/empty/__test__/Empty.test.tsx b/src/components/feedback/empty/__test__/Empty.test.tsx similarity index 100% rename from src/components/empty/__test__/Empty.test.tsx rename to src/components/feedback/empty/__test__/Empty.test.tsx diff --git a/src/components/empty/__test__/__snapshots__/Empty.test.tsx.snap b/src/components/feedback/empty/__test__/__snapshots__/Empty.test.tsx.snap similarity index 100% rename from src/components/empty/__test__/__snapshots__/Empty.test.tsx.snap rename to src/components/feedback/empty/__test__/__snapshots__/Empty.test.tsx.snap diff --git a/src/components/empty/index.ts b/src/components/feedback/empty/index.ts similarity index 100% rename from src/components/empty/index.ts rename to src/components/feedback/empty/index.ts diff --git a/src/components/loader/Loader.tsx b/src/components/feedback/loader/Loader.tsx similarity index 98% rename from src/components/loader/Loader.tsx rename to src/components/feedback/loader/Loader.tsx index daf1930..e844c86 100644 --- a/src/components/loader/Loader.tsx +++ b/src/components/feedback/loader/Loader.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import '../../styles/Loader.css'; +import '../../../styles/Loader.css'; export interface LoaderProps { classNameContainer?: string; diff --git a/src/components/loader/__test__/Loader.test.tsx b/src/components/feedback/loader/__test__/Loader.test.tsx similarity index 100% rename from src/components/loader/__test__/Loader.test.tsx rename to src/components/feedback/loader/__test__/Loader.test.tsx diff --git a/src/components/loader/__test__/__snapshots__/Loader.test.tsx.snap b/src/components/feedback/loader/__test__/__snapshots__/Loader.test.tsx.snap similarity index 100% rename from src/components/loader/__test__/__snapshots__/Loader.test.tsx.snap rename to src/components/feedback/loader/__test__/__snapshots__/Loader.test.tsx.snap diff --git a/src/components/loader/index.ts b/src/components/feedback/loader/index.ts similarity index 100% rename from src/components/loader/index.ts rename to src/components/feedback/loader/index.ts diff --git a/src/components/skeletonLoader/SkeletonLoader.tsx b/src/components/feedback/skeletonLoader/SkeletonLoader.tsx similarity index 100% rename from src/components/skeletonLoader/SkeletonLoader.tsx rename to src/components/feedback/skeletonLoader/SkeletonLoader.tsx diff --git a/src/components/skeletonLoader/__test__/SkeletonLoader.test.tsx b/src/components/feedback/skeletonLoader/__test__/SkeletonLoader.test.tsx similarity index 96% rename from src/components/skeletonLoader/__test__/SkeletonLoader.test.tsx rename to src/components/feedback/skeletonLoader/__test__/SkeletonLoader.test.tsx index a9fc467..a52d8b9 100644 --- a/src/components/skeletonLoader/__test__/SkeletonLoader.test.tsx +++ b/src/components/feedback/skeletonLoader/__test__/SkeletonLoader.test.tsx @@ -1,7 +1,7 @@ import React from 'react'; import '@testing-library/jest-dom'; import { render, screen } from '@testing-library/react'; -import { SkeletonLoader } from '../../../components/skeletonLoader/'; +import { SkeletonLoader } from '../'; import { expect, describe, it } from 'vitest'; describe('SkeletonLoader', () => { diff --git a/src/components/skeletonLoader/__test__/__snapshots__/SkeletonLoader.test.tsx.snap b/src/components/feedback/skeletonLoader/__test__/__snapshots__/SkeletonLoader.test.tsx.snap similarity index 100% rename from src/components/skeletonLoader/__test__/__snapshots__/SkeletonLoader.test.tsx.snap rename to src/components/feedback/skeletonLoader/__test__/__snapshots__/SkeletonLoader.test.tsx.snap diff --git a/src/components/skeletonLoader/index.ts b/src/components/feedback/skeletonLoader/index.ts similarity index 100% rename from src/components/skeletonLoader/index.ts rename to src/components/feedback/skeletonLoader/index.ts diff --git a/src/components/grid/Grid.tsx b/src/components/grid/Grid.tsx deleted file mode 100644 index 14c6c6d..0000000 --- a/src/components/grid/Grid.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { ReactNode } from 'react'; - -export interface GridProps { - children?: ReactNode; - className?: string; - id?: string; - dataCy?: string; -} - -/** - * Grid component - * - * A responsive grid container that automatically adjusts columns from 2 (mobile) up to 6 (extra large screens). - * - * @param {GridProps} props - The properties of the component. - * - * @property {ReactNode} [children] - * - The child components or elements to be rendered inside the grid container. - * - * @property {string} [className] - * - Optional custom CSS classes for additional styling or layout adjustments overriding default tailwind classes. - * - * @property {string} [id] - * - Optional ID for the grid container element. - * - * @property {string} [dataCy] - * - Custom data attribute used for e2e Cypress test targeting. - * - * @returns {JSX.Element} - * - A JSX element containing the children formatted inside a grid. - */ -const Grid = ({ children, className = '', id, dataCy }: Readonly): JSX.Element => { - return ( -
- {children} -
- ); -}; - -export default Grid; diff --git a/src/components/grid/__test__/Grid.test.tsx b/src/components/grid/__test__/Grid.test.tsx deleted file mode 100644 index bea26fb..0000000 --- a/src/components/grid/__test__/Grid.test.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from 'react'; -import { render } from '@testing-library/react'; -import { describe, it, expect } from 'vitest'; -import '@testing-library/jest-dom'; -import { Grid } from '../'; - -describe('Grid component', () => { - it('should match snapshot', () => { - const { container } = render(Snapshot Test); - expect(container).toMatchSnapshot(); - }); - - it('should render children correctly', () => { - const { getByText } = render( - -
Item 1
-
Item 2
-
- ); - - expect(getByText('Item 1')).toBeInTheDocument(); - expect(getByText('Item 2')).toBeInTheDocument(); - }); - - it('should apply the default grid classes', () => { - const { container } = render(Test); - const gridDiv = container.firstChild as HTMLElement; - - expect(gridDiv).toHaveClass('grid'); - expect(gridDiv).toHaveClass('min-w-full'); - expect(gridDiv).toHaveClass('auto-rows-min'); - expect(gridDiv).toHaveClass('grid-cols-2'); - }); - - it('should append custom className to the wrapper', () => { - const { container } = render(Test); - const gridDiv = container.firstChild as HTMLElement; - - expect(gridDiv).toHaveClass('custom-class'); - expect(gridDiv).toHaveClass('grid'); - }); - - it('should assign id and data-cy correctly', () => { - const { container } = render(Test); - const gridDiv = container.firstChild as HTMLElement; - - expect(gridDiv).toHaveAttribute('id', 'grid-id'); - expect(gridDiv).toHaveAttribute('data-cy', 'grid-data-cy'); - }); -}); diff --git a/src/components/grid/__test__/__snapshots__/Grid.test.tsx.snap b/src/components/grid/__test__/__snapshots__/Grid.test.tsx.snap deleted file mode 100644 index b5603e4..0000000 --- a/src/components/grid/__test__/__snapshots__/Grid.test.tsx.snap +++ /dev/null @@ -1,11 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`Grid component > should match snapshot 1`] = ` -
-
- Snapshot Test -
-
-`; diff --git a/src/components/grid/index.ts b/src/components/grid/index.ts deleted file mode 100644 index 81203f7..0000000 --- a/src/components/grid/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as Grid } from './Grid'; -export * from './Grid'; diff --git a/src/components/index.ts b/src/components/index.ts index d4df12e..f59d5b1 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,32 +1,44 @@ -export * from './avatar'; -export * from './baseDialog'; -export * from './breadcrumbs'; -export * from './button'; -export * from './buttonCircle'; -export * from './card'; -export * from './checkbox'; -export * from './contextMenu'; -export * from './copyable'; -export * from './dialog'; -export * from './dropdown'; -export * from './empty'; -export * from './header'; -export * from './infiniteScroll'; -export * from './input'; -export * from './list'; -export * from './loader'; -export * from './menu'; -export * from './modal'; -export * from './modalTransparent'; -export * from './popover'; -export * from './radioButton'; -export * from './skeletonLoader'; -export * from './slider'; -export * from './suiteLauncher'; -export * from './switch'; -export * from './table/Table'; -export * from './textArea'; -export * from './tooltip'; -export * from './sidenav'; +// data-display +export * from './data-display/avatar'; +export * from './data-display/card'; +export * from './data-display/list'; +export * from './data-display/table/Table'; + +// feedback +export * from './feedback/empty'; +export * from './feedback/loader'; +export * from './feedback/skeletonLoader'; + +// input +export * from './input/button'; +export * from './input/buttonCircle'; +export * from './input/checkbox'; +export * from './input/copyable'; +export * from './input/input'; +export * from './input/radioButton'; +export * from './input/slider'; +export * from './input/switch'; +export * from './input/textArea'; + +// layout +export * from './layout/header'; +export * from './layout/infiniteScroll'; + +// navigation +export * from './navigation/breadcrumbs'; +export * from './navigation/dropdown'; +export * from './navigation/menu'; +export * from './navigation/sidenav'; +export * from './navigation/suiteLauncher'; + +// overlay +export * from './overlay/baseDialog'; +export * from './overlay/contextMenu'; +export * from './overlay/dialog'; +export * from './overlay/modal'; +export * from './overlay/modalTransparent'; +export * from './overlay/popover'; +export * from './overlay/tooltip'; + +// mail export * from './mail'; -export * from './grid'; diff --git a/src/components/button/Button.tsx b/src/components/input/button/Button.tsx similarity index 99% rename from src/components/button/Button.tsx rename to src/components/input/button/Button.tsx index ff5e77d..725df47 100644 --- a/src/components/button/Button.tsx +++ b/src/components/input/button/Button.tsx @@ -1,5 +1,5 @@ import { ReactNode } from 'react'; -import Loader from '../loader/Loader'; +import Loader from '../../feedback/loader/Loader'; export interface ButtonProps { id?: string; diff --git a/src/components/button/__test__/Button.test.tsx b/src/components/input/button/__test__/Button.test.tsx similarity index 75% rename from src/components/button/__test__/Button.test.tsx rename to src/components/input/button/__test__/Button.test.tsx index 2675a40..cf4b8e7 100644 --- a/src/components/button/__test__/Button.test.tsx +++ b/src/components/input/button/__test__/Button.test.tsx @@ -20,13 +20,6 @@ describe('Button component', () => { expect(keydown).toHaveBeenCalledOnce(); }); - it('Button should handle default onClick and onKeyDown without crashing', () => { - const { getByRole } = render(); expect(button).toMatchSnapshot(); @@ -101,31 +94,4 @@ describe('Button component', () => { const button = render(, - ); - expect(button).toMatchSnapshot(); - }); - - it('Button with unknown variant should render default styles', () => { - // @ts-expect-error testing invalid variant - const button = render(); - expect(button).toMatchSnapshot(); - }); }); diff --git a/src/components/button/__test__/__snapshots__/Button.test.tsx.snap b/src/components/input/button/__test__/__snapshots__/Button.test.tsx.snap similarity index 82% rename from src/components/button/__test__/__snapshots__/Button.test.tsx.snap rename to src/components/input/button/__test__/__snapshots__/Button.test.tsx.snap index 1550901..2e7bfc0 100644 --- a/src/components/button/__test__/__snapshots__/Button.test.tsx.snap +++ b/src/components/input/button/__test__/__snapshots__/Button.test.tsx.snap @@ -1,191 +1,5 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Button component > Button with id, dataTest, autofocus, buttonDataCy and buttonChildrenDataCy renders correctly 1`] = ` -{ - "asFragment": [Function], - "baseElement": -
- -
- , - "container":
- -
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - -exports[`Button component > Button with unknown variant should render default styles 1`] = ` -{ - "asFragment": [Function], - "baseElement": -
- -
- , - "container":
- -
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - exports[`Button component > Destructive button should render correctly 1`] = ` { "asFragment": [Function], @@ -362,145 +176,6 @@ exports[`Button component > Destructive disabled button should render correctly } `; -exports[`Button component > Destructive loading button should render correctly 1`] = ` -{ - "asFragment": [Function], - "baseElement": -
- -
- , - "container":
- -
, - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - exports[`Button component > Ghost button should render correctly 1`] = ` { "asFragment": [Function], diff --git a/src/components/button/index.ts b/src/components/input/button/index.ts similarity index 100% rename from src/components/button/index.ts rename to src/components/input/button/index.ts diff --git a/src/components/buttonCircle/CircleButton.tsx b/src/components/input/buttonCircle/CircleButton.tsx similarity index 100% rename from src/components/buttonCircle/CircleButton.tsx rename to src/components/input/buttonCircle/CircleButton.tsx diff --git a/src/components/buttonCircle/__test__/CircleButton.test.tsx b/src/components/input/buttonCircle/__test__/CircleButton.test.tsx similarity index 73% rename from src/components/buttonCircle/__test__/CircleButton.test.tsx rename to src/components/input/buttonCircle/__test__/CircleButton.test.tsx index a30ecc5..998b205 100644 --- a/src/components/buttonCircle/__test__/CircleButton.test.tsx +++ b/src/components/input/buttonCircle/__test__/CircleButton.test.tsx @@ -134,54 +134,4 @@ describe('CircleButton component', () => { const button = render(); expect(button).toMatchSnapshot(); }); - - it('should close dropdown when toggle is clicked while open', () => { - const TestComponent = () => { - const [isOpen, setIsOpen] = useState(false); - return ( - Dropdown Content} - isOpen={isOpen} - handleClose={() => setIsOpen(false)} - handleOpen={() => setIsOpen(true)} - /> - ); - }; - render(); - const toggleButton = screen.getAllByRole('button')[1]; - - fireEvent.click(toggleButton); - expect(screen.getByText('Dropdown Content')).toBeInTheDocument(); - - fireEvent.click(toggleButton); - expect(screen.queryByText('Dropdown Content')).not.toBeInTheDocument(); - }); - - it('should render indicator without className correctly', () => { - const indicator = { icon: }; - render(); - expect(screen.getByTestId('indicator-icon')).toBeInTheDocument(); - }); - - it('should not close dropdown when clicking inside the circle button while open', () => { - const TestComponent = () => { - const [isOpen, setIsOpen] = useState(false); - return ( - Dropdown Content} - isOpen={isOpen} - handleClose={() => setIsOpen(false)} - handleOpen={() => setIsOpen(true)} - /> - ); - }; - render(); - const [mainButton, toggleButton] = screen.getAllByRole('button'); - - fireEvent.click(toggleButton); - expect(screen.getByText('Dropdown Content')).toBeInTheDocument(); - - fireEvent.click(mainButton); - expect(screen.getByText('Dropdown Content')).toBeInTheDocument(); - }); }); diff --git a/src/components/buttonCircle/__test__/__snapshots__/CircleButton.test.tsx.snap b/src/components/input/buttonCircle/__test__/__snapshots__/CircleButton.test.tsx.snap similarity index 100% rename from src/components/buttonCircle/__test__/__snapshots__/CircleButton.test.tsx.snap rename to src/components/input/buttonCircle/__test__/__snapshots__/CircleButton.test.tsx.snap diff --git a/src/components/buttonCircle/index.ts b/src/components/input/buttonCircle/index.ts similarity index 100% rename from src/components/buttonCircle/index.ts rename to src/components/input/buttonCircle/index.ts diff --git a/src/components/checkbox/Checkbox.tsx b/src/components/input/checkbox/Checkbox.tsx similarity index 96% rename from src/components/checkbox/Checkbox.tsx rename to src/components/input/checkbox/Checkbox.tsx index 8edcbfa..19aab8e 100644 --- a/src/components/checkbox/Checkbox.tsx +++ b/src/components/input/checkbox/Checkbox.tsx @@ -1,6 +1,6 @@ /// -import Check from '../../assets/icons/check.svg?react'; -import Minus from '../../assets/icons/minus.svg?react'; +import Check from '../../../assets/icons/check.svg?react'; +import Minus from '../../../assets/icons/minus.svg?react'; export interface CheckboxProps { id?: string; diff --git a/src/components/input/checkbox/__test__/Checkbox.test.tsx b/src/components/input/checkbox/__test__/Checkbox.test.tsx new file mode 100644 index 0000000..fa908c4 --- /dev/null +++ b/src/components/input/checkbox/__test__/Checkbox.test.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { describe, expect, it } from 'vitest'; +import { Checkbox } from '../'; +import { render } from '@testing-library/react'; + +describe('Checkbox component', () => { + it('Checkbox disabled and not checked should render correctly', () => { + const button = render(); + expect(button).toMatchSnapshot(); + }); + + it('Checkbox enabled and not checked should render correctly', () => { + const button = render(); + expect(button).toMatchSnapshot(); + }); + + it('Checkbox checked should render correctly', () => { + const button = render(); + expect(button).toMatchSnapshot(); + }); + + it('Checkbox disabled and checked should render correctly', () => { + const button = render(); + expect(button).toMatchSnapshot(); + }); + + it('Checkbox enabled and indetermiante should render correctly', () => { + const button = render(); + expect(button).toMatchSnapshot(); + }); + + it('Checkbox disabled and indetermiante should render correctly', () => { + const button = render(); + expect(button).toMatchSnapshot(); + }); +}); diff --git a/src/components/checkbox/__test__/__snapshots__/Checkbox.test.tsx.snap b/src/components/input/checkbox/__test__/__snapshots__/Checkbox.test.tsx.snap similarity index 100% rename from src/components/checkbox/__test__/__snapshots__/Checkbox.test.tsx.snap rename to src/components/input/checkbox/__test__/__snapshots__/Checkbox.test.tsx.snap diff --git a/src/components/checkbox/index.ts b/src/components/input/checkbox/index.ts similarity index 100% rename from src/components/checkbox/index.ts rename to src/components/input/checkbox/index.ts diff --git a/src/components/copyable/Copyable.tsx b/src/components/input/copyable/Copyable.tsx similarity index 97% rename from src/components/copyable/Copyable.tsx rename to src/components/input/copyable/Copyable.tsx index 578c55b..70289db 100644 --- a/src/components/copyable/Copyable.tsx +++ b/src/components/input/copyable/Copyable.tsx @@ -1,6 +1,6 @@ import { Copy } from '@phosphor-icons/react'; import { useState } from 'react'; -import Tooltip from '../tooltip/Tooltip'; +import Tooltip from '../../overlay/tooltip/Tooltip'; export interface CopyableProps { className?: string; diff --git a/src/components/copyable/__test__/Copyable.test.tsx b/src/components/input/copyable/__test__/Copyable.test.tsx similarity index 100% rename from src/components/copyable/__test__/Copyable.test.tsx rename to src/components/input/copyable/__test__/Copyable.test.tsx diff --git a/src/components/copyable/__test__/__snapshots__/Copyable.test.tsx.snap b/src/components/input/copyable/__test__/__snapshots__/Copyable.test.tsx.snap similarity index 100% rename from src/components/copyable/__test__/__snapshots__/Copyable.test.tsx.snap rename to src/components/input/copyable/__test__/__snapshots__/Copyable.test.tsx.snap diff --git a/src/components/copyable/index.ts b/src/components/input/copyable/index.ts similarity index 100% rename from src/components/copyable/index.ts rename to src/components/input/copyable/index.ts diff --git a/src/components/input/Input.tsx b/src/components/input/input/Input.tsx similarity index 100% rename from src/components/input/Input.tsx rename to src/components/input/input/Input.tsx diff --git a/src/components/input/__test__/Input.test.tsx b/src/components/input/input/__test__/Input.test.tsx similarity index 95% rename from src/components/input/__test__/Input.test.tsx rename to src/components/input/input/__test__/Input.test.tsx index b1a4877..b459a81 100644 --- a/src/components/input/__test__/Input.test.tsx +++ b/src/components/input/input/__test__/Input.test.tsx @@ -209,14 +209,4 @@ describe('Input component', () => { const { getByText } = renderInput({ disabled: true }); expect(getByText('Test Label')).toHaveClass('text-gray-40'); }); - - it('should focus email input without setting selectionStart/End', () => { - const { getByRole } = renderInput({ variant: 'email', autofocus: true }); - expect(getByRole('textbox')).toHaveFocus(); - }); - - it('should show 0 count when maxLength is set and value is undefined', () => { - const { getByText } = renderInput({ maxLength: 20, value: undefined }); - expect(getByText('0/20')).toBeInTheDocument(); - }); }); diff --git a/src/components/input/__test__/__snapshots__/Input.test.tsx.snap b/src/components/input/input/__test__/__snapshots__/Input.test.tsx.snap similarity index 100% rename from src/components/input/__test__/__snapshots__/Input.test.tsx.snap rename to src/components/input/input/__test__/__snapshots__/Input.test.tsx.snap diff --git a/src/components/input/index.ts b/src/components/input/input/index.ts similarity index 100% rename from src/components/input/index.ts rename to src/components/input/input/index.ts diff --git a/src/components/radioButton/RadioButton.tsx b/src/components/input/radioButton/RadioButton.tsx similarity index 100% rename from src/components/radioButton/RadioButton.tsx rename to src/components/input/radioButton/RadioButton.tsx diff --git a/src/components/radioButton/__test__/RadioButton.test.tsx b/src/components/input/radioButton/__test__/RadioButton.test.tsx similarity index 100% rename from src/components/radioButton/__test__/RadioButton.test.tsx rename to src/components/input/radioButton/__test__/RadioButton.test.tsx diff --git a/src/components/radioButton/__test__/__snapshots__/RadioButton.test.tsx.snap b/src/components/input/radioButton/__test__/__snapshots__/RadioButton.test.tsx.snap similarity index 100% rename from src/components/radioButton/__test__/__snapshots__/RadioButton.test.tsx.snap rename to src/components/input/radioButton/__test__/__snapshots__/RadioButton.test.tsx.snap diff --git a/src/components/radioButton/index.ts b/src/components/input/radioButton/index.ts similarity index 100% rename from src/components/radioButton/index.ts rename to src/components/input/radioButton/index.ts diff --git a/src/components/slider/RangeSlider.tsx b/src/components/input/slider/RangeSlider.tsx similarity index 98% rename from src/components/slider/RangeSlider.tsx rename to src/components/input/slider/RangeSlider.tsx index b294713..c05ca41 100644 --- a/src/components/slider/RangeSlider.tsx +++ b/src/components/input/slider/RangeSlider.tsx @@ -1,5 +1,5 @@ import { ChangeEvent } from 'react'; -import '../../styles/RangeSlider.css'; +import '../../../styles/RangeSlider.css'; export interface RangeSliderProps { value: number; diff --git a/src/components/slider/__test__/RangeSlider.test.tsx b/src/components/input/slider/__test__/RangeSlider.test.tsx similarity index 100% rename from src/components/slider/__test__/RangeSlider.test.tsx rename to src/components/input/slider/__test__/RangeSlider.test.tsx diff --git a/src/components/slider/__test__/__snapshots__/RangeSlider.test.tsx.snap b/src/components/input/slider/__test__/__snapshots__/RangeSlider.test.tsx.snap similarity index 100% rename from src/components/slider/__test__/__snapshots__/RangeSlider.test.tsx.snap rename to src/components/input/slider/__test__/__snapshots__/RangeSlider.test.tsx.snap diff --git a/src/components/slider/index.ts b/src/components/input/slider/index.ts similarity index 100% rename from src/components/slider/index.ts rename to src/components/input/slider/index.ts diff --git a/src/components/switch/Switch.tsx b/src/components/input/switch/Switch.tsx similarity index 100% rename from src/components/switch/Switch.tsx rename to src/components/input/switch/Switch.tsx diff --git a/src/components/switch/__test__/Switch.test.tsx b/src/components/input/switch/__test__/Switch.test.tsx similarity index 100% rename from src/components/switch/__test__/Switch.test.tsx rename to src/components/input/switch/__test__/Switch.test.tsx diff --git a/src/components/switch/__test__/__snapshots__/Switch.test.tsx.snap b/src/components/input/switch/__test__/__snapshots__/Switch.test.tsx.snap similarity index 100% rename from src/components/switch/__test__/__snapshots__/Switch.test.tsx.snap rename to src/components/input/switch/__test__/__snapshots__/Switch.test.tsx.snap diff --git a/src/components/switch/index.ts b/src/components/input/switch/index.ts similarity index 100% rename from src/components/switch/index.ts rename to src/components/input/switch/index.ts diff --git a/src/components/textArea/TextArea.tsx b/src/components/input/textArea/TextArea.tsx similarity index 100% rename from src/components/textArea/TextArea.tsx rename to src/components/input/textArea/TextArea.tsx diff --git a/src/components/textArea/__test__/TextArea.test.tsx b/src/components/input/textArea/__test__/TextArea.test.tsx similarity index 100% rename from src/components/textArea/__test__/TextArea.test.tsx rename to src/components/input/textArea/__test__/TextArea.test.tsx diff --git a/src/components/textArea/__test__/__snapshots__/TextArea.test.tsx.snap b/src/components/input/textArea/__test__/__snapshots__/TextArea.test.tsx.snap similarity index 100% rename from src/components/textArea/__test__/__snapshots__/TextArea.test.tsx.snap rename to src/components/input/textArea/__test__/__snapshots__/TextArea.test.tsx.snap diff --git a/src/components/textArea/index.ts b/src/components/input/textArea/index.ts similarity index 100% rename from src/components/textArea/index.ts rename to src/components/input/textArea/index.ts diff --git a/src/components/header/Header.tsx b/src/components/layout/header/Header.tsx similarity index 100% rename from src/components/header/Header.tsx rename to src/components/layout/header/Header.tsx diff --git a/src/components/header/__test__/Header.test.tsx b/src/components/layout/header/__test__/Header.test.tsx similarity index 100% rename from src/components/header/__test__/Header.test.tsx rename to src/components/layout/header/__test__/Header.test.tsx diff --git a/src/components/header/__test__/__snapshots__/Header.test.tsx.snap b/src/components/layout/header/__test__/__snapshots__/Header.test.tsx.snap similarity index 100% rename from src/components/header/__test__/__snapshots__/Header.test.tsx.snap rename to src/components/layout/header/__test__/__snapshots__/Header.test.tsx.snap diff --git a/src/components/header/index.ts b/src/components/layout/header/index.ts similarity index 100% rename from src/components/header/index.ts rename to src/components/layout/header/index.ts diff --git a/src/components/infiniteScroll/InfiniteScroll.tsx b/src/components/layout/infiniteScroll/InfiniteScroll.tsx similarity index 98% rename from src/components/infiniteScroll/InfiniteScroll.tsx rename to src/components/layout/infiniteScroll/InfiniteScroll.tsx index 6c75f6f..b474a92 100644 --- a/src/components/infiniteScroll/InfiniteScroll.tsx +++ b/src/components/layout/infiniteScroll/InfiniteScroll.tsx @@ -66,6 +66,8 @@ const InfiniteScroll = ({ if (hasMoreItems) { handleNextPage(); setShowLoader(true); + } else { + setShowLoader(false); } } }, diff --git a/src/components/infiniteScroll/__test__/InfiniteScroll.test.tsx b/src/components/layout/infiniteScroll/__test__/InfiniteScroll.test.tsx similarity index 83% rename from src/components/infiniteScroll/__test__/InfiniteScroll.test.tsx rename to src/components/layout/infiniteScroll/__test__/InfiniteScroll.test.tsx index 8389998..601982e 100644 --- a/src/components/infiniteScroll/__test__/InfiniteScroll.test.tsx +++ b/src/components/layout/infiniteScroll/__test__/InfiniteScroll.test.tsx @@ -76,27 +76,6 @@ describe('InfiniteScroll Component', () => { await waitFor(() => expect(screen.queryByTestId('loader')).not.toBeInTheDocument()); }); - it('does not show loader when isIntersecting is true but hasMoreItems is false', async () => { - vi.stubGlobal( - 'IntersectionObserver', - vi.fn((callback) => ({ - observe: () => { - callback([{ isIntersecting: true }]); - }, - unobserve: vi.fn(), - disconnect: vi.fn(), - })), - ); - - render( - -
Item 1
-
- ); - - await waitFor(() => expect(screen.queryByTestId('loader')).not.toBeInTheDocument()); - }); - it('should call handleNextPage when scrolled to the bottom', async () => { renderInfiniteScroll(); diff --git a/src/components/infiniteScroll/__test__/__snapshots__/InfiniteScroll.test.tsx.snap b/src/components/layout/infiniteScroll/__test__/__snapshots__/InfiniteScroll.test.tsx.snap similarity index 100% rename from src/components/infiniteScroll/__test__/__snapshots__/InfiniteScroll.test.tsx.snap rename to src/components/layout/infiniteScroll/__test__/__snapshots__/InfiniteScroll.test.tsx.snap diff --git a/src/components/infiniteScroll/index.ts b/src/components/layout/infiniteScroll/index.ts similarity index 100% rename from src/components/infiniteScroll/index.ts rename to src/components/layout/infiniteScroll/index.ts diff --git a/src/components/mail/tray/__test__/TrayList.test.tsx b/src/components/mail/tray/__test__/TrayList.test.tsx index 439fc3c..5396a82 100644 --- a/src/components/mail/tray/__test__/TrayList.test.tsx +++ b/src/components/mail/tray/__test__/TrayList.test.tsx @@ -182,18 +182,4 @@ describe('TrayList', () => { expect(screen.getByText('John Doe')).toBeInTheDocument(); }); - - it('should render without onLoadMore and onMailSelected (using defaults)', () => { - render(); - expect(screen.getByText('John Doe')).toBeInTheDocument(); - }); - - it('calls default onMailSelected and onLoadMore functions safely', () => { - const { getAllByRole } = render( - - ); - - const emailButtons = getAllByRole('button'); - expect(() => fireEvent.click(emailButtons[0])).not.toThrow(); - }); }); diff --git a/src/components/breadcrumbs/Breadcrumbs.tsx b/src/components/navigation/breadcrumbs/Breadcrumbs.tsx similarity index 100% rename from src/components/breadcrumbs/Breadcrumbs.tsx rename to src/components/navigation/breadcrumbs/Breadcrumbs.tsx diff --git a/src/components/breadcrumbs/BreadcrumbsItem.tsx b/src/components/navigation/breadcrumbs/BreadcrumbsItem.tsx similarity index 100% rename from src/components/breadcrumbs/BreadcrumbsItem.tsx rename to src/components/navigation/breadcrumbs/BreadcrumbsItem.tsx diff --git a/src/components/breadcrumbs/__test__/Breadcrumbs.test.tsx b/src/components/navigation/breadcrumbs/__test__/Breadcrumbs.test.tsx similarity index 78% rename from src/components/breadcrumbs/__test__/Breadcrumbs.test.tsx rename to src/components/navigation/breadcrumbs/__test__/Breadcrumbs.test.tsx index fb40cca..8963d9c 100644 --- a/src/components/breadcrumbs/__test__/Breadcrumbs.test.tsx +++ b/src/components/navigation/breadcrumbs/__test__/Breadcrumbs.test.tsx @@ -85,29 +85,13 @@ describe('Breadcrumbs Component', () => { expect(separators).toHaveLength(3); }); - it('renders a dropdown menu with functionally hidden items for lists larger than 3 components', async () => { - const fiveItemsProps = { - ...mockProps, - items: [ - ...mockProps.items, - { uuid: '5', label: 'Details', icon: null, active: true }, - ], - }; - - const { getByRole, getByText } = render( - - - - ); - + it('opens the dropdown menu when clicked', async () => { + const { getByRole, getByText } = renderBreadcrumbs(); const dropdownButton = getByRole('button'); await act(async () => { userEvent.click(dropdownButton); }); - - const hiddenItemCategory = getByText('Category'); - const hiddenItemSubcategory = getByText('Subcategory'); - expect(hiddenItemCategory).toBeInTheDocument(); - expect(hiddenItemSubcategory).toBeInTheDocument(); + const hiddenItem = getByText('Subcategory'); + expect(hiddenItem).toBeInTheDocument(); }); }); diff --git a/src/components/breadcrumbs/__test__/BreadcrumbsItem.test.tsx b/src/components/navigation/breadcrumbs/__test__/BreadcrumbsItem.test.tsx similarity index 89% rename from src/components/breadcrumbs/__test__/BreadcrumbsItem.test.tsx rename to src/components/navigation/breadcrumbs/__test__/BreadcrumbsItem.test.tsx index eff10dc..ea3fc5c 100644 --- a/src/components/breadcrumbs/__test__/BreadcrumbsItem.test.tsx +++ b/src/components/navigation/breadcrumbs/__test__/BreadcrumbsItem.test.tsx @@ -129,16 +129,4 @@ describe('BreadcrumbsItem Component', () => { const { getByTestId } = renderBreadcrumbsItem({ itemComponent: ItemComponentMock }); expect(getByTestId('custom-icon')).toBeInTheDocument(); }); - - it('applies first path styling when isFirstPath is true', () => { - const firstPathItem = { ...breadcrumbItem, isFirstPath: true }; - const { getByText } = renderBreadcrumbsItem({ item: firstPathItem, totalBreadcrumbsLength: 1 }); - expect(getByText('Item 1').parentElement).toHaveClass('shrink-0 pr-1'); - }); - - it('renders gracefully when label is not provided', () => { - const noLabelItem = { ...breadcrumbItem, label: '' }; - const { container } = renderBreadcrumbsItem({ item: noLabelItem }); - expect(container).toBeInTheDocument(); - }); }); diff --git a/src/components/breadcrumbs/__test__/__snapshots__/Breadcrumbs.test.tsx.snap b/src/components/navigation/breadcrumbs/__test__/__snapshots__/Breadcrumbs.test.tsx.snap similarity index 100% rename from src/components/breadcrumbs/__test__/__snapshots__/Breadcrumbs.test.tsx.snap rename to src/components/navigation/breadcrumbs/__test__/__snapshots__/Breadcrumbs.test.tsx.snap diff --git a/src/components/breadcrumbs/__test__/__snapshots__/BreadcrumbsItem.test.tsx.snap b/src/components/navigation/breadcrumbs/__test__/__snapshots__/BreadcrumbsItem.test.tsx.snap similarity index 100% rename from src/components/breadcrumbs/__test__/__snapshots__/BreadcrumbsItem.test.tsx.snap rename to src/components/navigation/breadcrumbs/__test__/__snapshots__/BreadcrumbsItem.test.tsx.snap diff --git a/src/components/breadcrumbs/index.ts b/src/components/navigation/breadcrumbs/index.ts similarity index 100% rename from src/components/breadcrumbs/index.ts rename to src/components/navigation/breadcrumbs/index.ts diff --git a/src/components/dropdown/Dropdown.tsx b/src/components/navigation/dropdown/Dropdown.tsx similarity index 98% rename from src/components/dropdown/Dropdown.tsx rename to src/components/navigation/dropdown/Dropdown.tsx index 9e45483..250d910 100644 --- a/src/components/dropdown/Dropdown.tsx +++ b/src/components/navigation/dropdown/Dropdown.tsx @@ -1,5 +1,5 @@ import { useState, ReactNode, useEffect, useRef } from 'react'; -import { Menu, MenuItemType } from '../'; +import { Menu, MenuItemType } from '../menu'; export type DropdownProps = { children: ReactNode | ((obj: { open: boolean }) => JSX.Element); diff --git a/src/components/dropdown/__test__/Dropdown.test.tsx b/src/components/navigation/dropdown/__test__/Dropdown.test.tsx similarity index 64% rename from src/components/dropdown/__test__/Dropdown.test.tsx rename to src/components/navigation/dropdown/__test__/Dropdown.test.tsx index f8ad83c..bfb64ad 100644 --- a/src/components/dropdown/__test__/Dropdown.test.tsx +++ b/src/components/navigation/dropdown/__test__/Dropdown.test.tsx @@ -155,85 +155,4 @@ describe('Dropdown component', () => { const menu = getByTestId('menu-dropdown'); expect(menu).toHaveClass('scale-95 opacity-0'); }); - - it('should extract padding values and open to the right', () => { - const { getByTestId } = render( - - Dropdown - , - ); - const menu = getByTestId('menu-dropdown'); - expect(menu).toHaveClass('right-0'); - }); - - it('should handle undefined options and dropdownActionsContext, and render menuItems', () => { - const { getByRole, getByText } = render( - Custom Item]}> - Dropdown - , - ); - - fireEvent.click(getByRole('button')); - expect(getByText('Custom Item')).toBeInTheDocument(); - }); - - it('should handle children as a function', () => { - const { getByRole, getByText } = render( - - {({ open }) => {open ? 'Close' : 'Open'}} - , - ); - - expect(getByText('Open')).toBeInTheDocument(); - fireEvent.click(getByRole('button')); - expect(getByText('Close')).toBeInTheDocument(); - }); - - it('should close when clicking outside', () => { - const { getByRole, getByTestId } = renderDropdown(); - const button = getByRole('button'); - const menu = getByTestId('menu-dropdown'); - - fireEvent.click(button); - expect(menu).toHaveClass('opacity-100'); - - fireEvent.mouseDown(document.body); - expect(menu).toHaveClass('opacity-0'); - }); - - it('should not close when mousedown fires inside the dropdown container', () => { - const { getByRole, getByTestId } = renderDropdown(); - const button = getByRole('button'); - const menu = getByTestId('menu-dropdown'); - - fireEvent.click(button); - expect(menu).toHaveClass('opacity-100'); - - fireEvent.mouseDown(button); - expect(menu).toHaveClass('opacity-100'); - }); - - it('should close when right-clicking outside the dropdown', async () => { - const { getByRole, getByTestId } = renderDropdown(); - const button = getByRole('button'); - const menu = getByTestId('menu-dropdown'); - - fireEvent.click(button); - expect(menu).toHaveClass('opacity-100'); - - fireEvent.contextMenu(document.body); - await waitFor(() => expect(menu).toHaveClass('opacity-0')); - }); - - it('should render correctly when options, menuItems, and dropdownActionsContext are all undefined', () => { - const { getByRole, getByTestId } = render( - - Dropdown - , - ); - - fireEvent.click(getByRole('button')); - const menu = getByTestId('menu-dropdown'); - expect(menu).toHaveClass('scale-100'); - }); }); diff --git a/src/components/dropdown/__test__/__snapshots__/Dropdown.test.tsx.snap b/src/components/navigation/dropdown/__test__/__snapshots__/Dropdown.test.tsx.snap similarity index 100% rename from src/components/dropdown/__test__/__snapshots__/Dropdown.test.tsx.snap rename to src/components/navigation/dropdown/__test__/__snapshots__/Dropdown.test.tsx.snap diff --git a/src/components/dropdown/index.ts b/src/components/navigation/dropdown/index.ts similarity index 100% rename from src/components/dropdown/index.ts rename to src/components/navigation/dropdown/index.ts diff --git a/src/components/menu/Menu.tsx b/src/components/navigation/menu/Menu.tsx similarity index 99% rename from src/components/menu/Menu.tsx rename to src/components/navigation/menu/Menu.tsx index 7444507..97f0e67 100644 --- a/src/components/menu/Menu.tsx +++ b/src/components/navigation/menu/Menu.tsx @@ -1,5 +1,5 @@ import { isValidElement, ReactNode, useEffect, useState } from 'react'; -import useHotkeys from '../../hooks/useHotKeys'; +import useHotkeys from '../../../hooks/useHotKeys'; export type MenuItemType = | { separator: true } diff --git a/src/components/menu/__test__/Menu.test.tsx b/src/components/navigation/menu/__test__/Menu.test.tsx similarity index 54% rename from src/components/menu/__test__/Menu.test.tsx rename to src/components/navigation/menu/__test__/Menu.test.tsx index 8c62fc3..3297be0 100644 --- a/src/components/menu/__test__/Menu.test.tsx +++ b/src/components/navigation/menu/__test__/Menu.test.tsx @@ -126,99 +126,4 @@ describe('Menu Component', () => { expect(option1).toHaveClass('bg-gray-5'); }); - - it('triggers onClick on node item when Enter is pressed', () => { - const nodeClick = vi.fn(); - const menuWithNode: Array> = [ - { node: }, - ]; - render(); - fireEvent.keyDown(document, { key: 'ArrowDown' }); - fireEvent.keyDown(document, { key: 'Enter' }); - expect(nodeClick).toHaveBeenCalled(); - }); - - it('handles node item without onClick on Enter press without errors', () => { - const menuWithNode: Array> = [ - { node: No Click Node }, - ]; - render(); - fireEvent.keyDown(document, { key: 'ArrowDown' }); - fireEvent.keyDown(document, { key: 'Enter' }); - expect(handleMenuClose).toHaveBeenCalled(); - }); - - it('calls onClick handler on item click when defined', () => { - const onClickHandler = vi.fn(); - const menuWithOnClick: Array> = [ - { name: 'Clickable', onClick: onClickHandler }, - ]; - const { getByText } = render(); - fireEvent.click(getByText('Clickable')); - expect(onClickHandler).toHaveBeenCalled(); - }); - - it('renders keyboard shortcut icon when provided', () => { - const menuWithShortcutIcon: Array> = [ - { - name: 'With Icon Shortcut', - action: vi.fn(), - keyboardShortcutOptions: { - keyboardShortcutIcon: MockIcon, - keyboardShortcutText: 'Ctrl+S', - }, - }, - ]; - const { getByText, getAllByTestId } = render(); - expect(getByText('Ctrl+S')).toBeInTheDocument(); - expect(getAllByTestId('mock-icon').length).toBeGreaterThan(0); - }); - - it('renders keyboard shortcut options without text', () => { - const menuWithIconOnly: Array> = [ - { - name: 'Icon Only Shortcut', - action: vi.fn(), - keyboardShortcutOptions: { - keyboardShortcutIcon: MockIcon, - }, - }, - ]; - const { getByText } = render(); - expect(getByText('Icon Only Shortcut')).toBeInTheDocument(); - }); - - it('handles Enter with no selection and no genericEnterKey without errors', () => { - const menuWithItem: Array> = [ - { name: 'Item', action: vi.fn() }, - ]; - render( - , - ); - fireEvent.keyDown(document, { key: 'Enter' }); - expect(handleMenuClose).toHaveBeenCalled(); - }); - - it('returns null from ArrowUp when all items are unclickable', () => { - const allDisabledMenu: Array> = [ - { separator: true }, - { name: 'Disabled', disabled: () => true }, - ]; - render(); - fireEvent.keyDown(document, { key: 'ArrowUp' }); - }); - - it('returns null from ArrowDown when all items are unclickable', () => { - const allDisabledMenu: Array> = [ - { separator: true }, - { name: 'Disabled', disabled: () => true }, - ]; - render(); - fireEvent.keyDown(document, { key: 'ArrowDown' }); - }); }); diff --git a/src/components/menu/__test__/__snapshots__/Menu.test.tsx.snap b/src/components/navigation/menu/__test__/__snapshots__/Menu.test.tsx.snap similarity index 100% rename from src/components/menu/__test__/__snapshots__/Menu.test.tsx.snap rename to src/components/navigation/menu/__test__/__snapshots__/Menu.test.tsx.snap diff --git a/src/components/menu/index.ts b/src/components/navigation/menu/index.ts similarity index 100% rename from src/components/menu/index.ts rename to src/components/navigation/menu/index.ts diff --git a/src/components/sidenav/Sidenav.tsx b/src/components/navigation/sidenav/Sidenav.tsx similarity index 100% rename from src/components/sidenav/Sidenav.tsx rename to src/components/navigation/sidenav/Sidenav.tsx diff --git a/src/components/sidenav/SidenavHeader.tsx b/src/components/navigation/sidenav/SidenavHeader.tsx similarity index 100% rename from src/components/sidenav/SidenavHeader.tsx rename to src/components/navigation/sidenav/SidenavHeader.tsx diff --git a/src/components/sidenav/SidenavItem.tsx b/src/components/navigation/sidenav/SidenavItem.tsx similarity index 100% rename from src/components/sidenav/SidenavItem.tsx rename to src/components/navigation/sidenav/SidenavItem.tsx diff --git a/src/components/sidenav/SidenavOptions.tsx b/src/components/navigation/sidenav/SidenavOptions.tsx similarity index 100% rename from src/components/sidenav/SidenavOptions.tsx rename to src/components/navigation/sidenav/SidenavOptions.tsx diff --git a/src/components/sidenav/SidenavStorage.tsx b/src/components/navigation/sidenav/SidenavStorage.tsx similarity index 100% rename from src/components/sidenav/SidenavStorage.tsx rename to src/components/navigation/sidenav/SidenavStorage.tsx diff --git a/src/components/sidenav/__test__/Sidenav.test.tsx b/src/components/navigation/sidenav/__test__/Sidenav.test.tsx similarity index 88% rename from src/components/sidenav/__test__/Sidenav.test.tsx rename to src/components/navigation/sidenav/__test__/Sidenav.test.tsx index f7c759e..0c6e7e4 100644 --- a/src/components/sidenav/__test__/Sidenav.test.tsx +++ b/src/components/navigation/sidenav/__test__/Sidenav.test.tsx @@ -287,45 +287,4 @@ describe('Sidenav Component', () => { expect(onToggleCollapse).toHaveBeenCalled(); }); }); - - it('renders storage without upgradeLabel', () => { - const { queryByText } = renderSidenav({ - storage: { - usage: '1 GB', - limit: '5 GB', - percentage: 20, - onUpgradeClick: vi.fn(), - isLoading: false, - }, - }); - expect(queryByText('1 GB')).toBeInTheDocument(); - expect(queryByText('Upgrade')).not.toBeInTheDocument(); - }); - - it('renders storage with default isLoading (shows skeleton)', () => { - const { container, queryByText } = renderSidenav({ - storage: { - usage: '1 GB', - limit: '5 GB', - percentage: 20, - onUpgradeClick: vi.fn(), - }, - }); - expect(queryByText('1 GB')).not.toBeInTheDocument(); - const skeletons = container.querySelectorAll('.animate-pulse'); - expect(skeletons.length).toBeGreaterThan(0); - }); - - it('renders header with suiteLauncher', () => { - const MockIcon = React.forwardRef(({ size = 20 }, ref) => ( - - )); - const { getByTestId } = renderSidenav({ - suiteLauncher: { - suiteArray: [{ icon: , title: 'Drive', onClick: vi.fn() }], - soonText: 'Soon', - }, - }); - expect(getByTestId('popover-button')).toBeInTheDocument(); - }); }); diff --git a/src/components/sidenav/__test__/__snapshots__/Sidenav.test.tsx.snap b/src/components/navigation/sidenav/__test__/__snapshots__/Sidenav.test.tsx.snap similarity index 100% rename from src/components/sidenav/__test__/__snapshots__/Sidenav.test.tsx.snap rename to src/components/navigation/sidenav/__test__/__snapshots__/Sidenav.test.tsx.snap diff --git a/src/components/sidenav/index.ts b/src/components/navigation/sidenav/index.ts similarity index 100% rename from src/components/sidenav/index.ts rename to src/components/navigation/sidenav/index.ts diff --git a/src/components/suiteLauncher/SuiteLauncher.tsx b/src/components/navigation/suiteLauncher/SuiteLauncher.tsx similarity index 98% rename from src/components/suiteLauncher/SuiteLauncher.tsx rename to src/components/navigation/suiteLauncher/SuiteLauncher.tsx index 22e84aa..fbf5888 100644 --- a/src/components/suiteLauncher/SuiteLauncher.tsx +++ b/src/components/navigation/suiteLauncher/SuiteLauncher.tsx @@ -1,6 +1,6 @@ import { DotsNineIcon, LockIcon } from '@phosphor-icons/react'; import { cloneElement, isValidElement } from 'react'; -import { Popover } from '../popover'; +import { Popover } from '../../overlay/popover'; export interface SuiteLauncherProps { className?: string; diff --git a/src/components/suiteLauncher/__test__/SuiteLauncher.test.tsx b/src/components/navigation/suiteLauncher/__test__/SuiteLauncher.test.tsx similarity index 72% rename from src/components/suiteLauncher/__test__/SuiteLauncher.test.tsx rename to src/components/navigation/suiteLauncher/__test__/SuiteLauncher.test.tsx index 433d62c..1c4d986 100644 --- a/src/components/suiteLauncher/__test__/SuiteLauncher.test.tsx +++ b/src/components/navigation/suiteLauncher/__test__/SuiteLauncher.test.tsx @@ -59,27 +59,4 @@ describe('SuiteLauncher', () => { fireEvent.click(screen.getByText('App 3')); expect(onClick3).toHaveBeenCalled(); }); - - it('shows default "Soon" text when soonText is not provided', () => { - const suiteArray = [ - { icon: , title: 'App Soon', onClick: vi.fn(), availableSoon: true }, - ]; - render(); - fireEvent.click(screen.getByTestId('popover-button')); - expect(screen.getByText('Soon')).toBeInTheDocument(); - }); - - it('renders non-JSX icon as-is when it is not a valid React element', () => { - const suiteArray = [ - { icon: 'not-an-element' as any, title: 'App Raw', onClick: vi.fn() }, - ]; - render(); - fireEvent.click(screen.getByTestId('popover-button')); - expect(screen.getByText('App Raw')).toBeInTheDocument(); - }); - - it('renders with align left', () => { - render(); - expect(screen.getByTestId('popover-button')).toBeInTheDocument(); - }); }); diff --git a/src/components/suiteLauncher/__test__/__snapshots__/SuiteLauncher.test.tsx.snap b/src/components/navigation/suiteLauncher/__test__/__snapshots__/SuiteLauncher.test.tsx.snap similarity index 100% rename from src/components/suiteLauncher/__test__/__snapshots__/SuiteLauncher.test.tsx.snap rename to src/components/navigation/suiteLauncher/__test__/__snapshots__/SuiteLauncher.test.tsx.snap diff --git a/src/components/suiteLauncher/index.ts b/src/components/navigation/suiteLauncher/index.ts similarity index 100% rename from src/components/suiteLauncher/index.ts rename to src/components/navigation/suiteLauncher/index.ts diff --git a/src/components/baseDialog/BaseDialog.tsx b/src/components/overlay/baseDialog/BaseDialog.tsx similarity index 92% rename from src/components/baseDialog/BaseDialog.tsx rename to src/components/overlay/baseDialog/BaseDialog.tsx index 0b44855..c75349f 100644 --- a/src/components/baseDialog/BaseDialog.tsx +++ b/src/components/overlay/baseDialog/BaseDialog.tsx @@ -79,15 +79,17 @@ const BaseDialog = ({ return (
-
+
{title ? (
diff --git a/src/components/baseDialog/__test__/BaseDialog.test.tsx b/src/components/overlay/baseDialog/__test__/BaseDialog.test.tsx similarity index 100% rename from src/components/baseDialog/__test__/BaseDialog.test.tsx rename to src/components/overlay/baseDialog/__test__/BaseDialog.test.tsx diff --git a/src/components/baseDialog/__test__/__snapshots__/BaseDialog.test.tsx.snap b/src/components/overlay/baseDialog/__test__/__snapshots__/BaseDialog.test.tsx.snap similarity index 100% rename from src/components/baseDialog/__test__/__snapshots__/BaseDialog.test.tsx.snap rename to src/components/overlay/baseDialog/__test__/__snapshots__/BaseDialog.test.tsx.snap diff --git a/src/components/baseDialog/index.ts b/src/components/overlay/baseDialog/index.ts similarity index 100% rename from src/components/baseDialog/index.ts rename to src/components/overlay/baseDialog/index.ts diff --git a/src/components/contextMenu/ContextMenu.tsx b/src/components/overlay/contextMenu/ContextMenu.tsx similarity index 97% rename from src/components/contextMenu/ContextMenu.tsx rename to src/components/overlay/contextMenu/ContextMenu.tsx index 774474f..9fa8ead 100644 --- a/src/components/contextMenu/ContextMenu.tsx +++ b/src/components/overlay/contextMenu/ContextMenu.tsx @@ -1,4 +1,4 @@ -import Menu, { MenuItemsType } from '../menu/Menu'; +import Menu, { MenuItemsType } from '../../navigation/menu/Menu'; const MENU_BUTTON_HEIGHT = 40; diff --git a/src/components/contextMenu/__test__/ContextMenu.test.tsx b/src/components/overlay/contextMenu/__test__/ContextMenu.test.tsx similarity index 82% rename from src/components/contextMenu/__test__/ContextMenu.test.tsx rename to src/components/overlay/contextMenu/__test__/ContextMenu.test.tsx index b485503..03f0524 100644 --- a/src/components/contextMenu/__test__/ContextMenu.test.tsx +++ b/src/components/overlay/contextMenu/__test__/ContextMenu.test.tsx @@ -96,22 +96,4 @@ describe('ContextMenu Component', () => { if (menuItem && 'action' in menuItem) expect(menuItem?.action).toHaveBeenCalledWith(props.item); expect(props.handleMenuClose).toHaveBeenCalled(); }); - - it('positions menu at bottom when isContextMenuCutOff is true and not from right click', () => { - const { container } = render( - , - ); - const outerDiv = container.firstChild as HTMLElement; - expect(outerDiv.style.bottom).toBe('40px'); - expect(outerDiv.style.top).toBe(''); - }); - - it('positions menu at top when isContextMenuCutOff is false and not from right click', () => { - const { container } = render( - , - ); - const outerDiv = container.firstChild as HTMLElement; - expect(outerDiv.style.top).toBe('40px'); - expect(outerDiv.style.bottom).toBe(''); - }); }); diff --git a/src/components/contextMenu/__test__/__snapshots__/ContextMenu.test.tsx.snap b/src/components/overlay/contextMenu/__test__/__snapshots__/ContextMenu.test.tsx.snap similarity index 100% rename from src/components/contextMenu/__test__/__snapshots__/ContextMenu.test.tsx.snap rename to src/components/overlay/contextMenu/__test__/__snapshots__/ContextMenu.test.tsx.snap diff --git a/src/components/contextMenu/index.ts b/src/components/overlay/contextMenu/index.ts similarity index 100% rename from src/components/contextMenu/index.ts rename to src/components/overlay/contextMenu/index.ts diff --git a/src/components/dialog/Dialog.tsx b/src/components/overlay/dialog/Dialog.tsx similarity index 99% rename from src/components/dialog/Dialog.tsx rename to src/components/overlay/dialog/Dialog.tsx index 658f499..0847619 100644 --- a/src/components/dialog/Dialog.tsx +++ b/src/components/overlay/dialog/Dialog.tsx @@ -1,6 +1,6 @@ import { useEffect } from 'react'; import { useState } from 'react'; -import { Button } from '../'; +import { Button } from '../../input/button'; export interface DialogProps { isOpen: boolean; diff --git a/src/components/dialog/__test__/Dialog.test.tsx b/src/components/overlay/dialog/__test__/Dialog.test.tsx similarity index 82% rename from src/components/dialog/__test__/Dialog.test.tsx rename to src/components/overlay/dialog/__test__/Dialog.test.tsx index 0901048..29a017c 100644 --- a/src/components/dialog/__test__/Dialog.test.tsx +++ b/src/components/overlay/dialog/__test__/Dialog.test.tsx @@ -51,27 +51,6 @@ describe('Dialog', () => { expect(defaultProps.onClose).toHaveBeenCalled(); }); - it('does not call onClose when pressing other keys', () => { - renderDialog(); - fireEvent.keyDown(window, { key: 'Enter' }); - expect(defaultProps.onClose).not.toHaveBeenCalled(); - }); - - it('handles timeouts correctly on active transition states', () => { - vi.useFakeTimers(); - const { rerender } = renderDialog({ isOpen: false }); - - vi.runAllTimers(); - - rerender(); - vi.runAllTimers(); - - rerender(); - vi.runAllTimers(); - - vi.useRealTimers(); - }); - it('calls onPrimaryAction when clicking the primary button', () => { const { getByText } = renderDialog(); fireEvent.click(getByText(defaultProps.primaryAction)); diff --git a/src/components/dialog/__test__/__snapshots__/Dialog.test.tsx.snap b/src/components/overlay/dialog/__test__/__snapshots__/Dialog.test.tsx.snap similarity index 100% rename from src/components/dialog/__test__/__snapshots__/Dialog.test.tsx.snap rename to src/components/overlay/dialog/__test__/__snapshots__/Dialog.test.tsx.snap diff --git a/src/components/dialog/index.ts b/src/components/overlay/dialog/index.ts similarity index 100% rename from src/components/dialog/index.ts rename to src/components/overlay/dialog/index.ts diff --git a/src/components/modal/Modal.tsx b/src/components/overlay/modal/Modal.tsx similarity index 100% rename from src/components/modal/Modal.tsx rename to src/components/overlay/modal/Modal.tsx diff --git a/src/components/modal/__test__/Modal.test.tsx b/src/components/overlay/modal/__test__/Modal.test.tsx similarity index 100% rename from src/components/modal/__test__/Modal.test.tsx rename to src/components/overlay/modal/__test__/Modal.test.tsx diff --git a/src/components/modal/__test__/__snapshots__/Modal.test.tsx.snap b/src/components/overlay/modal/__test__/__snapshots__/Modal.test.tsx.snap similarity index 100% rename from src/components/modal/__test__/__snapshots__/Modal.test.tsx.snap rename to src/components/overlay/modal/__test__/__snapshots__/Modal.test.tsx.snap diff --git a/src/components/modal/index.ts b/src/components/overlay/modal/index.ts similarity index 100% rename from src/components/modal/index.ts rename to src/components/overlay/modal/index.ts diff --git a/src/components/modalTransparent/TransparentModal.tsx b/src/components/overlay/modalTransparent/TransparentModal.tsx similarity index 100% rename from src/components/modalTransparent/TransparentModal.tsx rename to src/components/overlay/modalTransparent/TransparentModal.tsx diff --git a/src/components/modalTransparent/__test__/TransparentModal.test.tsx b/src/components/overlay/modalTransparent/__test__/TransparentModal.test.tsx similarity index 94% rename from src/components/modalTransparent/__test__/TransparentModal.test.tsx rename to src/components/overlay/modalTransparent/__test__/TransparentModal.test.tsx index 1d277f3..246e801 100644 --- a/src/components/modalTransparent/__test__/TransparentModal.test.tsx +++ b/src/components/overlay/modalTransparent/__test__/TransparentModal.test.tsx @@ -130,11 +130,4 @@ describe('TransparentModal Component', () => { const container = document.querySelector('.fixed.inset-0.z-50'); expect(container).toHaveClass('pointer-events-none'); }); - - it('should not call onClose when clicking inside the modal content', () => { - renderTransparentModal(); - const modalContent = screen.getByText('Modal Content'); - fireEvent.mouseDown(modalContent); - expect(onCloseMock).not.toHaveBeenCalled(); - }); }); diff --git a/src/components/modalTransparent/__test__/__snapshots__/TransparentModal.test.tsx.snap b/src/components/overlay/modalTransparent/__test__/__snapshots__/TransparentModal.test.tsx.snap similarity index 100% rename from src/components/modalTransparent/__test__/__snapshots__/TransparentModal.test.tsx.snap rename to src/components/overlay/modalTransparent/__test__/__snapshots__/TransparentModal.test.tsx.snap diff --git a/src/components/modalTransparent/index.ts b/src/components/overlay/modalTransparent/index.ts similarity index 100% rename from src/components/modalTransparent/index.ts rename to src/components/overlay/modalTransparent/index.ts diff --git a/src/components/popover/Popover.tsx b/src/components/overlay/popover/Popover.tsx similarity index 78% rename from src/components/popover/Popover.tsx rename to src/components/overlay/popover/Popover.tsx index ff95e2c..c9879a8 100644 --- a/src/components/popover/Popover.tsx +++ b/src/components/overlay/popover/Popover.tsx @@ -7,13 +7,8 @@ export interface PopoverProps { className?: string; classButton?: string; align?: 'left' | 'right'; - direction?: 'up' | 'down'; } -const originMap: Record<'up' | 'down', Record<'left' | 'right', string>> = { - up: { left: 'origin-bottom-right', right: 'origin-bottom-left' }, - down: { left: 'origin-top-right', right: 'origin-top-left' }, -}; /** * Popover component * @@ -30,19 +25,12 @@ const originMap: Record<'up' | 'down', Record<'left' | 'right', string>> = { * * @property {string} [classButton] * - Custom classes for the trigger button. - * - * @property {'left' | 'right'} [align='right'] - * - The alignment of the popover panel relative to the trigger button. - * - * @property {'up' | 'down'} [direction='down'] - * - The direction of the popover panel relative to the trigger button. - * + * * @returns {JSX.Element} * - The rendered Popover component. - * */ -const Popover = ({ childrenButton, panel, className, classButton, align = 'right', direction = 'down' }: PopoverProps): JSX.Element => { +const Popover = ({ childrenButton, panel, className, classButton, align = 'right' }: PopoverProps): JSX.Element => { const [isOpen, setIsOpen] = useState(false); const panelRef = useRef(null); const [showContent, setShowContent] = useState(isOpen); @@ -100,10 +88,8 @@ const Popover = ({ childrenButton, panel, className, classButton, align = 'right
diff --git a/src/components/popover/__test__/Popover.test.tsx b/src/components/overlay/popover/__test__/Popover.test.tsx similarity index 80% rename from src/components/popover/__test__/Popover.test.tsx rename to src/components/overlay/popover/__test__/Popover.test.tsx index eecf5c0..09d1dad 100644 --- a/src/components/popover/__test__/Popover.test.tsx +++ b/src/components/overlay/popover/__test__/Popover.test.tsx @@ -123,22 +123,6 @@ describe('Popover', () => { await waitFor(() => expect(getByText('Popover Content')).toBeInTheDocument()); }); - it('applies the correct classes for left alignment', () => { - const { getByText, queryByText } = renderPopover({ align: 'left' }); - fireEvent.click(getByText('Open Popover')); - const leftPanel = queryByText('Popover Content')?.parentElement?.parentElement; - expect(leftPanel).toHaveClass('right-0'); - expect(leftPanel).toHaveClass('origin-top-right'); - }); - - it('applies the correct classes for right alignment', () => { - const { getByText, queryByText } = renderPopover({ align: 'right' }); - fireEvent.click(getByText('Open Popover')); - const rightPanel = queryByText('Popover Content')?.parentElement?.parentElement; - expect(rightPanel).toHaveClass('left-0'); - expect(rightPanel).toHaveClass('origin-top-left'); - }); - it('should call onMouseDown stopPropagation when the button is clicked', () => { const stopPropagationSpy = vi.fn(); const { getByText } = renderPopover(); @@ -151,12 +135,4 @@ describe('Popover', () => { fireEvent.mouseDown(button); expect(stopPropagationSpy).toHaveBeenCalled(); }); - - it('aligns panel to the left when align is left', async () => { - const { getByText, container } = renderPopover({ align: 'left' }); - fireEvent.click(getByText('Open Popover')); - await waitFor(() => expect(getByText('Popover Content')).toBeInTheDocument()); - const panel = container.querySelector('.left-0.origin-top-left'); - expect(panel).toBeInTheDocument(); - }); }); diff --git a/src/components/popover/__test__/__snapshots__/Popover.test.tsx.snap b/src/components/overlay/popover/__test__/__snapshots__/Popover.test.tsx.snap similarity index 100% rename from src/components/popover/__test__/__snapshots__/Popover.test.tsx.snap rename to src/components/overlay/popover/__test__/__snapshots__/Popover.test.tsx.snap diff --git a/src/components/popover/index.ts b/src/components/overlay/popover/index.ts similarity index 100% rename from src/components/popover/index.ts rename to src/components/overlay/popover/index.ts diff --git a/src/components/tooltip/Tooltip.tsx b/src/components/overlay/tooltip/Tooltip.tsx similarity index 100% rename from src/components/tooltip/Tooltip.tsx rename to src/components/overlay/tooltip/Tooltip.tsx diff --git a/src/components/tooltip/__test__/Tooltip.test.tsx b/src/components/overlay/tooltip/__test__/Tooltip.test.tsx similarity index 100% rename from src/components/tooltip/__test__/Tooltip.test.tsx rename to src/components/overlay/tooltip/__test__/Tooltip.test.tsx diff --git a/src/components/tooltip/__test__/__snapshots__/Tooltip.test.tsx.snap b/src/components/overlay/tooltip/__test__/__snapshots__/Tooltip.test.tsx.snap similarity index 100% rename from src/components/tooltip/__test__/__snapshots__/Tooltip.test.tsx.snap rename to src/components/overlay/tooltip/__test__/__snapshots__/Tooltip.test.tsx.snap diff --git a/src/components/tooltip/index.ts b/src/components/overlay/tooltip/index.ts similarity index 100% rename from src/components/tooltip/index.ts rename to src/components/overlay/tooltip/index.ts diff --git a/src/components/sidenav/__test__/SidenavItem.test.tsx b/src/components/sidenav/__test__/SidenavItem.test.tsx deleted file mode 100644 index 70919ad..0000000 --- a/src/components/sidenav/__test__/SidenavItem.test.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import React from 'react'; -import { render } from '@testing-library/react'; -import { describe, it, expect } from 'vitest'; -import SidenavItem from '../SidenavItem'; - -const MockIcon = React.forwardRef(({ size = 20 }, ref) => ( - -)); -MockIcon.displayName = 'MockIcon'; - -describe('SidenavItem Component', () => { - it('renders correctly with default optional props', () => { - const { getByText, getByTestId } = render(); - - expect(getByText('Dashboard')).toBeInTheDocument(); - expect(getByTestId('mock-icon')).toBeInTheDocument(); - - // Default inactive state includes text-gray-80 - expect(getByText('Dashboard').parentElement).toHaveClass('text-gray-80'); - }); - - it('renders subsection with correct styling', () => { - const { getByRole } = render(); - const button = getByRole('button'); - expect(button).toHaveClass('pl-5'); - }); -}); diff --git a/src/hooks/__test__/useHotKeys.test.ts b/src/hooks/__test__/useHotKeys.test.ts index aa30149..f7e977e 100644 --- a/src/hooks/__test__/useHotKeys.test.ts +++ b/src/hooks/__test__/useHotKeys.test.ts @@ -69,58 +69,4 @@ describe('useHotkeys', () => { unmount(); expect(removeEventListenerSpy).toHaveBeenCalledWith('keydown', expect.any(Function)); }); - - it('should not call handler when key is pressed in an input element', () => { - const callback = vi.fn(); - renderHook(() => useHotkeys({ a: callback })); - - const input = document.createElement('input'); - document.body.appendChild(input); - input.focus(); - - fireKeyDown('a'); - expect(callback).not.toHaveBeenCalled(); - - document.body.removeChild(input); - }); - - it('should call handler for Escape even when focus is in an input element', () => { - const escapeCallback = vi.fn(); - renderHook(() => useHotkeys({ escape: escapeCallback })); - - const input = document.createElement('input'); - document.body.appendChild(input); - input.focus(); - - fireKeyDown('Escape'); - expect(escapeCallback).toHaveBeenCalledOnce(); - - document.body.removeChild(input); - }); - - it('should not call handler when key is pressed in a textarea element', () => { - const callback = vi.fn(); - renderHook(() => useHotkeys({ r: callback })); - - const textarea = document.createElement('textarea'); - document.body.appendChild(textarea); - textarea.focus(); - - fireKeyDown('r'); - expect(callback).not.toHaveBeenCalled(); - - document.body.removeChild(textarea); - }); - - it('should handle null activeElement gracefully and still trigger handler', () => { - const callback = vi.fn(); - renderHook(() => useHotkeys({ a: callback })); - - const activeElementSpy = vi.spyOn(document, 'activeElement', 'get').mockReturnValue(null); - - fireKeyDown('a'); - expect(callback).toHaveBeenCalledOnce(); - - activeElementSpy.mockRestore(); - }); }); diff --git a/src/stories/components/avatar/Avatar.stories.ts b/src/stories/components/avatar/Avatar.stories.ts index b385e8e..6b771df 100644 --- a/src/stories/components/avatar/Avatar.stories.ts +++ b/src/stories/components/avatar/Avatar.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import { Avatar } from '@/components/avatar'; const meta: Meta = { - title: 'Components/Avatar', + title: 'Data Display/Avatar', component: Avatar, parameters: { layout: 'centered', diff --git a/src/stories/components/baseDialog/BaseDialog.stories.tsx b/src/stories/components/baseDialog/BaseDialog.stories.tsx index 0e966e7..2fab33f 100644 --- a/src/stories/components/baseDialog/BaseDialog.stories.tsx +++ b/src/stories/components/baseDialog/BaseDialog.stories.tsx @@ -9,7 +9,7 @@ const overlay: Decorator = (Story) => ( ); const meta: Meta = { - title: 'Components/BaseDialog', + title: 'Overlay/BaseDialog', component: BaseDialog, parameters: { layout: 'centered', diff --git a/src/stories/components/breadcrumbs/breadcrumbs.stories.tsx b/src/stories/components/breadcrumbs/breadcrumbs.stories.tsx index bbe2bf2..6f54c6a 100644 --- a/src/stories/components/breadcrumbs/breadcrumbs.stories.tsx +++ b/src/stories/components/breadcrumbs/breadcrumbs.stories.tsx @@ -101,7 +101,7 @@ const defaultBreadcrumbsProps: BreadcrumbsProps = { }; const meta: Meta = { - title: 'Components/Breadcrumbs', + title: 'Navigation/Breadcrumbs', component: Breadcrumbs, parameters: { layout: 'centered', diff --git a/src/stories/components/button/Button.stories.tsx b/src/stories/components/button/Button.stories.tsx index 5f19da2..20d1ede 100644 --- a/src/stories/components/button/Button.stories.tsx +++ b/src/stories/components/button/Button.stories.tsx @@ -3,7 +3,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import { fn } from 'storybook/test'; const meta: Meta = { - title: 'Components/Button', + title: 'Input/Button', component: Button, parameters: { layout: 'centered', diff --git a/src/stories/components/buttonCircle/ButtonCircle.stories.tsx b/src/stories/components/buttonCircle/ButtonCircle.stories.tsx index d0b4412..c17c9f0 100644 --- a/src/stories/components/buttonCircle/ButtonCircle.stories.tsx +++ b/src/stories/components/buttonCircle/ButtonCircle.stories.tsx @@ -4,7 +4,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import { useState } from 'react'; const meta = { - title: 'Components/CircleButton', + title: 'Input/CircleButton', component: CircleButton, parameters: { layout: 'centered', diff --git a/src/stories/components/card/Card.stories.tsx b/src/stories/components/card/Card.stories.tsx index 3303f94..aeccdb2 100644 --- a/src/stories/components/card/Card.stories.tsx +++ b/src/stories/components/card/Card.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import { Card } from '@/components/card'; const meta: Meta = { - title: 'Components/Card', + title: 'Data Display/Card', component: Card, tags: ['autodocs'], parameters: { diff --git a/src/stories/components/checkbox/Checkbox.stories.tsx b/src/stories/components/checkbox/Checkbox.stories.tsx index 042d4a8..8fef1d7 100644 --- a/src/stories/components/checkbox/Checkbox.stories.tsx +++ b/src/stories/components/checkbox/Checkbox.stories.tsx @@ -15,7 +15,7 @@ const onClick: Decorator = (Story, context) => { }; const meta: Meta = { - title: 'Components/Checkbox', + title: 'Input/Checkbox', component: Checkbox, parameters: { layout: 'centered', diff --git a/src/stories/components/contextMenu/ContextMenu.stories.tsx b/src/stories/components/contextMenu/ContextMenu.stories.tsx index c0bbeb9..e373e74 100644 --- a/src/stories/components/contextMenu/ContextMenu.stories.tsx +++ b/src/stories/components/contextMenu/ContextMenu.stories.tsx @@ -89,7 +89,7 @@ const onOpenDecorator: Decorator = (Story, context) => { }; const meta: Meta = { - title: 'Components/ContextMenu', + title: 'Overlay/ContextMenu', component: ContextMenuWithNotifications, decorators: [onOpenDecorator], tags: ['autodocs'], diff --git a/src/stories/components/copyable/Copyable.stories.tsx b/src/stories/components/copyable/Copyable.stories.tsx index 2645792..819ca03 100644 --- a/src/stories/components/copyable/Copyable.stories.tsx +++ b/src/stories/components/copyable/Copyable.stories.tsx @@ -2,7 +2,7 @@ import { Meta, StoryObj } from '@storybook/react-vite'; import { Copyable } from '@/components/copyable'; const meta: Meta = { - title: 'Components/Copyable', + title: 'Input/Copyable', component: Copyable, parameters: { layout: 'centered', diff --git a/src/stories/components/dialog/Dialog.stories.tsx b/src/stories/components/dialog/Dialog.stories.tsx index b54be30..6d92a4f 100644 --- a/src/stories/components/dialog/Dialog.stories.tsx +++ b/src/stories/components/dialog/Dialog.stories.tsx @@ -24,7 +24,7 @@ const onCloseDecorator: Decorator = (Story, context) => { }; const meta: Meta = { - title: 'Components/Dialog', + title: 'Overlay/Dialog', component: Dialog, decorators: [onCloseDecorator], tags: ['autodocs'], diff --git a/src/stories/components/dropdown/Dropdown.stories.tsx b/src/stories/components/dropdown/Dropdown.stories.tsx index 6ac853c..45cda39 100644 --- a/src/stories/components/dropdown/Dropdown.stories.tsx +++ b/src/stories/components/dropdown/Dropdown.stories.tsx @@ -3,7 +3,7 @@ import { Dropdown, DropdownProps } from '@/components/dropdown'; import { DotsThree } from '@phosphor-icons/react'; const meta: Meta = { - title: 'Components/Dropdown', + title: 'Navigation/Dropdown', component: Dropdown, parameters: { layout: 'centered', diff --git a/src/stories/components/empty/Empty.stories.tsx b/src/stories/components/empty/Empty.stories.tsx index 66ae76c..db74ec2 100644 --- a/src/stories/components/empty/Empty.stories.tsx +++ b/src/stories/components/empty/Empty.stories.tsx @@ -3,7 +3,7 @@ import { Upload } from '@phosphor-icons/react'; import { Empty } from '@/components/empty'; const meta: Meta = { - title: 'Components/Empty', + title: 'Feedback/Empty', component: Empty, argTypes: { action: { diff --git a/src/stories/components/grid/Grid.stories.tsx b/src/stories/components/grid/Grid.stories.tsx deleted file mode 100644 index 8d0a089..0000000 --- a/src/stories/components/grid/Grid.stories.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { Meta, StoryObj } from '@storybook/react-vite'; -import { Grid } from '@/components/grid'; - -const meta: Meta = { - title: 'Components/Grid', - component: Grid, - parameters: { - layout: 'padded', - }, - tags: ['autodocs'], - argTypes: { - className: { - control: 'text', - description: 'Custom CSS classes for the Grid container', - }, - }, -}; - -export default meta; - -type Story = StoryObj; - -export const Default: Story = { - render: (args) => ( - - {Array.from({ length: 12 }).map((_, index) => ( -
- Grid Item {index + 1} -
- ))} -
- ), -}; diff --git a/src/stories/components/header/Header.stories.tsx b/src/stories/components/header/Header.stories.tsx index b2713ee..161977f 100644 --- a/src/stories/components/header/Header.stories.tsx +++ b/src/stories/components/header/Header.stories.tsx @@ -4,7 +4,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; const IMAGE_SRC = 'https://internxt.com/favicon.ico'; const meta: Meta = { - title: 'Components/Header', + title: 'Layout/Header', component: Header, tags: ['autodocs'], parameters: { diff --git a/src/stories/components/infiniteScroll/InfiniteScroll.stories.tsx b/src/stories/components/infiniteScroll/InfiniteScroll.stories.tsx index e0ae014..7f0eeb9 100644 --- a/src/stories/components/infiniteScroll/InfiniteScroll.stories.tsx +++ b/src/stories/components/infiniteScroll/InfiniteScroll.stories.tsx @@ -3,7 +3,7 @@ import { InfiniteScroll } from '@/components/infiniteScroll'; import { useState } from 'react'; const meta: Meta = { - title: 'Components/InfiniteScroll', + title: 'Layout/InfiniteScroll', component: InfiniteScroll, parameters: { layout: 'centered', diff --git a/src/stories/components/input/Input.stories.ts b/src/stories/components/input/Input.stories.ts index 908624b..fff0472 100644 --- a/src/stories/components/input/Input.stories.ts +++ b/src/stories/components/input/Input.stories.ts @@ -23,7 +23,7 @@ const onChange: Decorator = (Story, context) => { }; const meta: Meta = { - title: 'Components/Input', + title: 'Input/Input', component: Input, parameters: { layout: 'centered', diff --git a/src/stories/components/list/List.stories.tsx b/src/stories/components/list/List.stories.tsx index d0b50bf..2660c54 100644 --- a/src/stories/components/list/List.stories.tsx +++ b/src/stories/components/list/List.stories.tsx @@ -65,7 +65,7 @@ const ListWrapper = (props: ListWrapperProps) => { }; const meta: Meta> = { - title: 'Components/List', + title: 'Data Display/List', component: List, parameters: { layout: 'fullscreen', diff --git a/src/stories/components/loader/Loader.stories.tsx b/src/stories/components/loader/Loader.stories.tsx index d747ab4..ced1a7a 100644 --- a/src/stories/components/loader/Loader.stories.tsx +++ b/src/stories/components/loader/Loader.stories.tsx @@ -8,7 +8,7 @@ const overlay: Decorator = (Story) => ( ); const meta: Meta = { - title: 'Components/Loader', + title: 'Feedback/Loader', component: Loader, parameters: { layout: 'fullscreen', diff --git a/src/stories/components/menu/Menu.stories.tsx b/src/stories/components/menu/Menu.stories.tsx index 15271c7..a8b83f3 100644 --- a/src/stories/components/menu/Menu.stories.tsx +++ b/src/stories/components/menu/Menu.stories.tsx @@ -16,7 +16,7 @@ const withCloseHandler: Decorator = (Story, context) => { }; const meta: Meta = { - title: 'Components/Menu', + title: 'Navigation/Menu', component: Menu, parameters: { layout: 'centered', diff --git a/src/stories/components/modal/Modal.stories.tsx b/src/stories/components/modal/Modal.stories.tsx index a20ae6e..d89a75f 100644 --- a/src/stories/components/modal/Modal.stories.tsx +++ b/src/stories/components/modal/Modal.stories.tsx @@ -24,7 +24,7 @@ const onCloseDecorator: Decorator = (Story, context) => { }; const meta: Meta = { - title: 'Components/Modal', + title: 'Overlay/Modal', component: Modal, decorators: [onCloseDecorator], tags: ['autodocs'], diff --git a/src/stories/components/modalTransparent/TransparentModal.stories.tsx b/src/stories/components/modalTransparent/TransparentModal.stories.tsx index e8d312a..a4dfcb4 100644 --- a/src/stories/components/modalTransparent/TransparentModal.stories.tsx +++ b/src/stories/components/modalTransparent/TransparentModal.stories.tsx @@ -26,7 +26,7 @@ const baseModalStyles = { }; const meta: Meta = { - title: 'Components/TransparentModal', + title: 'Overlay/TransparentModal', component: TransparentModal, decorators: [onCloseDecorator], tags: ['autodocs'], diff --git a/src/stories/components/popover/Popover.stories.tsx b/src/stories/components/popover/Popover.stories.tsx index da5b384..0150ce3 100644 --- a/src/stories/components/popover/Popover.stories.tsx +++ b/src/stories/components/popover/Popover.stories.tsx @@ -4,7 +4,7 @@ import { Button } from '@/components/button'; import { UserCircle } from '@phosphor-icons/react'; const meta: Meta = { - title: 'Components/Popover', + title: 'Overlay/Popover', component: Popover, parameters: { layout: 'centered', diff --git a/src/stories/components/radioButton/RadioButton.stories.ts b/src/stories/components/radioButton/RadioButton.stories.ts index 7914373..411fdb6 100644 --- a/src/stories/components/radioButton/RadioButton.stories.ts +++ b/src/stories/components/radioButton/RadioButton.stories.ts @@ -16,7 +16,7 @@ const onClick: Decorator = (Story, context) => { }; const meta: Meta = { - title: 'Components/Radio Button', + title: 'Input/Radio Button', component: RadioButton, parameters: { layout: 'centered', diff --git a/src/stories/components/sidenav/Sidenav.stories.tsx b/src/stories/components/sidenav/Sidenav.stories.tsx index 2899ce1..643002b 100644 --- a/src/stories/components/sidenav/Sidenav.stories.tsx +++ b/src/stories/components/sidenav/Sidenav.stories.tsx @@ -44,7 +44,7 @@ const SUITE_ARRAY = [ ]; const meta: Meta = { - title: 'Components/Sidenav', + title: 'Navigation/Sidenav', component: Sidenav, parameters: { layout: 'fullscreen', diff --git a/src/stories/components/skeletonLoader/SkeletonLoader.stories.tsx b/src/stories/components/skeletonLoader/SkeletonLoader.stories.tsx index 7d07f02..d11d108 100644 --- a/src/stories/components/skeletonLoader/SkeletonLoader.stories.tsx +++ b/src/stories/components/skeletonLoader/SkeletonLoader.stories.tsx @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import { SkeletonLoader } from '@/components/skeletonLoader'; const meta: Meta = { - title: 'Components/SkeletonLoader', + title: 'Feedback/SkeletonLoader', component: SkeletonLoader, parameters: { layout: 'centered', diff --git a/src/stories/components/slider/RangeSlider.stories.ts b/src/stories/components/slider/RangeSlider.stories.ts index 71d8513..3a193a7 100644 --- a/src/stories/components/slider/RangeSlider.stories.ts +++ b/src/stories/components/slider/RangeSlider.stories.ts @@ -15,7 +15,7 @@ const onChangeDecorator: Decorator = (Story, context) => { }; const meta: Meta = { - title: 'Components/RangeSlider', + title: 'Input/RangeSlider', component: RangeSlider, parameters: { layout: 'centered', diff --git a/src/stories/components/switch/Switch.stories.ts b/src/stories/components/switch/Switch.stories.ts index d995e19..ab0e191 100644 --- a/src/stories/components/switch/Switch.stories.ts +++ b/src/stories/components/switch/Switch.stories.ts @@ -2,7 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import { SwitchComponent } from '@/components/switch'; const meta: Meta = { - title: 'Components/Switch', + title: 'Input/Switch', component: SwitchComponent, parameters: { layout: 'centered', diff --git a/src/stories/components/table/Table.stories.tsx b/src/stories/components/table/Table.stories.tsx index 6d846fc..9c94441 100644 --- a/src/stories/components/table/Table.stories.tsx +++ b/src/stories/components/table/Table.stories.tsx @@ -1,5 +1,5 @@ import { Meta, StoryObj } from '@storybook/react-vite'; -import { Table, TableHeader, TableRow, TableCell, TableBody } from '../../../components/table/Table'; +import { Table, TableHeader, TableRow, TableCell, TableBody } from '../../../components/data-display/table/Table'; interface ActivityRow { date: string; @@ -38,7 +38,7 @@ const mockData: ActivityRow[] = [ ]; const meta: Meta = { - title: 'Components/Table', + title: 'Data Display/Table', component: Table, }; diff --git a/src/stories/components/textArea/TextArea.stories.tsx b/src/stories/components/textArea/TextArea.stories.tsx index 853bd4e..314ebcc 100644 --- a/src/stories/components/textArea/TextArea.stories.tsx +++ b/src/stories/components/textArea/TextArea.stories.tsx @@ -15,7 +15,7 @@ const onChange: Decorator = (Story, context) => { }; const meta: Meta = { - title: 'Components/TextArea', + title: 'Input/TextArea', component: TextArea, parameters: { layout: 'centered', diff --git a/src/stories/components/tooltip/Tooltip.stories.tsx b/src/stories/components/tooltip/Tooltip.stories.tsx index df0bc8d..cf18fb9 100644 --- a/src/stories/components/tooltip/Tooltip.stories.tsx +++ b/src/stories/components/tooltip/Tooltip.stories.tsx @@ -3,7 +3,7 @@ import { Tooltip } from '@/components/tooltip'; import { Button } from '@/components/button'; const meta: Meta = { - title: 'Components/Tooltip', + title: 'Overlay/Tooltip', component: Tooltip, parameters: { layout: 'centered', diff --git a/tsconfig.json b/tsconfig.json index cfeda16..759f90d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,38 @@ "compilerOptions": { "baseUrl": ".", "paths": { + "@/components/avatar": ["./src/components/data-display/avatar"], + "@/components/card": ["./src/components/data-display/card"], + "@/components/list": ["./src/components/data-display/list"], + "@/components/table/Table": ["./src/components/data-display/table/Table"], + "@/components/table": ["./src/components/data-display/table"], + "@/components/empty": ["./src/components/feedback/empty"], + "@/components/loader": ["./src/components/feedback/loader"], + "@/components/skeletonLoader": ["./src/components/feedback/skeletonLoader"], + "@/components/button": ["./src/components/input/button"], + "@/components/buttonCircle": ["./src/components/input/buttonCircle"], + "@/components/checkbox": ["./src/components/input/checkbox"], + "@/components/copyable": ["./src/components/input/copyable"], + "@/components/input": ["./src/components/input/input"], + "@/components/radioButton": ["./src/components/input/radioButton"], + "@/components/slider": ["./src/components/input/slider"], + "@/components/switch": ["./src/components/input/switch"], + "@/components/textArea": ["./src/components/input/textArea"], + "@/components/header": ["./src/components/layout/header"], + "@/components/infiniteScroll": ["./src/components/layout/infiniteScroll"], + "@/components/breadcrumbs/BreadcrumbsItem": ["./src/components/navigation/breadcrumbs/BreadcrumbsItem"], + "@/components/breadcrumbs": ["./src/components/navigation/breadcrumbs"], + "@/components/dropdown": ["./src/components/navigation/dropdown"], + "@/components/menu": ["./src/components/navigation/menu"], + "@/components/sidenav": ["./src/components/navigation/sidenav"], + "@/components/suiteLauncher": ["./src/components/navigation/suiteLauncher"], + "@/components/baseDialog": ["./src/components/overlay/baseDialog"], + "@/components/contextMenu": ["./src/components/overlay/contextMenu"], + "@/components/dialog": ["./src/components/overlay/dialog"], + "@/components/modal": ["./src/components/overlay/modal"], + "@/components/modalTransparent": ["./src/components/overlay/modalTransparent"], + "@/components/popover": ["./src/components/overlay/popover"], + "@/components/tooltip": ["./src/components/overlay/tooltip"], "@/components/*": ["./src/components/*"] }, "target": "ES5",