diff --git a/package-lock.json b/package-lock.json index 80bd76c5b6b8199feb121ce0da4f7e042b8e88af..790d099b51f95f09a498568be9d57e750ec8b88e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "next": "13.4.19", "postcss": "8.4.29", "react": "18.2.0", + "react-accessible-accordion": "^5.0.0", "react-dom": "18.2.0", "react-redux": "^8.1.2", "tailwind-merge": "^1.14.0", @@ -10308,6 +10309,15 @@ "node": ">=0.10.0" } }, + "node_modules/react-accessible-accordion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/react-accessible-accordion/-/react-accessible-accordion-5.0.0.tgz", + "integrity": "sha512-MT2obYpTgLIIfPr9d7hEyvPB5rg8uJcHpgA83JSRlEUHvzH48+8HJPvzSs+nM+XprTugDgLfhozO5qyJpBvYRQ==", + "peerDependencies": { + "react": "^16.3.2 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.3.3 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", diff --git a/package.json b/package.json index ba33ffe0d572091683ee3d35a956907d38a82725..c4ee3467a915fbdc7f06a1716ac8ec02826fe8d4 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "next": "13.4.19", "postcss": "8.4.29", "react": "18.2.0", + "react-accessible-accordion": "^5.0.0", "react-dom": "18.2.0", "react-redux": "^8.1.2", "tailwind-merge": "^1.14.0", @@ -79,9 +80,9 @@ "lint-staged": "^14.0.1", "prettier": "^3.0.3", "prettier-2": "npm:prettier@^2", + "prettier-plugin-tailwindcss": "^0.5.4", "typescript": "^5.2.2", - "zod-fixture": "^2.5.0", - "prettier-plugin-tailwindcss": "^0.5.4" + "zod-fixture": "^2.5.0" }, "config": { "commitizen": { diff --git a/pages/_app.tsx b/pages/_app.tsx index f0e8ed0cf72767f1f7198d9eb7c5ed36575ded60..d767f29ca9bff1e622a7e7d4fd8723c6ed9b3050 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,5 +1,6 @@ import { AppWrapper } from '@/components/AppWrapper'; import type { AppProps } from 'next/app'; +import '@/styles/index.css'; const MyApp = ({ Component, pageProps }: AppProps): JSX.Element => ( <AppWrapper> diff --git a/pages/index.tsx b/pages/index.tsx index 929f13282f87b83a95e22a173b80847366a920fb..0c103a3f5ee878df66fdedc789539a641d538fc0 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,4 +1,3 @@ import { MinervaSPA } from '@/components/SPA'; -import '@/styles/index.css'; export default MinervaSPA; diff --git a/pages/redux-api-poc.tsx b/pages/redux-api-poc.tsx deleted file mode 100644 index 2811cf8aaf9a75b3364ca34aba8533bbaf5031c0..0000000000000000000000000000000000000000 --- a/pages/redux-api-poc.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { useSelector } from 'react-redux'; -import { selectSearchValue } from '@/redux/search/search.selectors'; -import { useAppDispatch } from '@/redux/hooks/useAppDispatch'; -import { getDrugs } from '@/redux/drugs/drugs.thunks'; -import { getMirnas } from '@/redux/mirnas/mirnas.thunks'; - -const ReduxPage = (): JSX.Element => { - const dispatch = useAppDispatch(); - const searchValue = useSelector(selectSearchValue); - - const triggerSyncUpdate = (): void => { - dispatch(getDrugs('aspirin')); - dispatch(getMirnas('hsa-miR-302b-3p')); - }; - - return ( - <div> - {searchValue} - <button type="button" onClick={triggerSyncUpdate}> - sync update - </button> - </div> - ); -}; - -export default ReduxPage; diff --git a/src/shared/.gitkeep b/src/shared/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/shared/Accordion/Accordion.component.tsx b/src/shared/Accordion/Accordion.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f0de2a3e2d506006d8211936ca45c70ad0b11f1d --- /dev/null +++ b/src/shared/Accordion/Accordion.component.tsx @@ -0,0 +1,31 @@ +import { Accordion as Ac } from 'react-accessible-accordion'; +import { DivAttributes } from 'react-accessible-accordion/dist/types/helpers/types'; + +type ID = string | number; + +type AccordionProps = Pick<DivAttributes, Exclude<keyof DivAttributes, 'onChange'>> & { + children: React.ReactNode; + preExpanded?: ID[]; + allowMultipleExpanded?: boolean; + allowZeroExpanded?: boolean; + onChange?(args: ID[]): void; +}; + +export const Accordion = ({ + children, + preExpanded, + allowMultipleExpanded, + allowZeroExpanded, + onChange, + ...rest +}: AccordionProps): JSX.Element => ( + <Ac + preExpanded={preExpanded} + allowMultipleExpanded={allowMultipleExpanded} + allowZeroExpanded={allowZeroExpanded} + onChange={onChange} + {...rest} + > + {children} + </Ac> +); diff --git a/src/shared/Accordion/AccordionItem/AccordionItem.component.tsx b/src/shared/Accordion/AccordionItem/AccordionItem.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..36c4f38212b6218af2c96722eddadfe4a4f28d60 --- /dev/null +++ b/src/shared/Accordion/AccordionItem/AccordionItem.component.tsx @@ -0,0 +1,27 @@ +import { twMerge } from 'tailwind-merge'; +import { AccordionItem as AccItem } from 'react-accessible-accordion'; + +interface AccordionItemProps extends React.HTMLAttributes<HTMLDivElement> { + uuid?: string | number; + activeClassName?: string; + dangerouslySetExpanded?: boolean; + children: React.ReactNode; + className?: string; +} + +export const AccordionItem = ({ + uuid: customUuid, + dangerouslySetExpanded, + children, + className, + ...rest +}: AccordionItemProps): JSX.Element => ( + <AccItem + uuid={customUuid} + dangerouslySetExpanded={dangerouslySetExpanded} + className={twMerge('border-b', className)} + {...rest} + > + {children} + </AccItem> +); diff --git a/src/shared/Accordion/AccordionItem/index.ts b/src/shared/Accordion/AccordionItem/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4940ad3798b4680b2387e4176f99da18f200b9b3 --- /dev/null +++ b/src/shared/Accordion/AccordionItem/index.ts @@ -0,0 +1 @@ +export { AccordionItem } from './AccordionItem.component'; diff --git a/src/shared/Accordion/AccordionItemButton/AccordionItemButton.component.tsx b/src/shared/Accordion/AccordionItemButton/AccordionItemButton.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..32942ae9a996c6f83c3402b9f904a4d27e1351a3 --- /dev/null +++ b/src/shared/Accordion/AccordionItemButton/AccordionItemButton.component.tsx @@ -0,0 +1,14 @@ +import { Icon } from '@/shared/Icon'; +import { AccordionItemButton as AIB } from 'react-accessible-accordion'; +import './AccordionItemButton.style.css'; + +interface AccordionItemButtonProps { + children: React.ReactNode; +} + +export const AccordionItemButton = ({ children }: AccordionItemButtonProps): JSX.Element => ( + <AIB className="accordion-button flex flex-row flex-nowrap justify-between"> + {children} + <Icon name="chevron-down" className="arrow-button h-6 w-6 fill-font-500" /> + </AIB> +); diff --git a/src/shared/Accordion/AccordionItemButton/AccordionItemButton.style.css b/src/shared/Accordion/AccordionItemButton/AccordionItemButton.style.css new file mode 100644 index 0000000000000000000000000000000000000000..ee300f20ba887d33a867a0524f9683a95d85d4cf --- /dev/null +++ b/src/shared/Accordion/AccordionItemButton/AccordionItemButton.style.css @@ -0,0 +1,3 @@ +.accordion-button[aria-expanded='true'] > .arrow-button { + @apply rotate-180; +} diff --git a/src/shared/Accordion/AccordionItemButton/index.ts b/src/shared/Accordion/AccordionItemButton/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..24541a1a7e94146b4272f1cab555d154410328d0 --- /dev/null +++ b/src/shared/Accordion/AccordionItemButton/index.ts @@ -0,0 +1 @@ +export { AccordionItemButton } from './AccordionItemButton.component'; diff --git a/src/shared/Accordion/AccordionItemHeading/AccordionItemHeading.component.tsx b/src/shared/Accordion/AccordionItemHeading/AccordionItemHeading.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a2e1af342ff60b3754101ccda2a603e4537d0f9c --- /dev/null +++ b/src/shared/Accordion/AccordionItemHeading/AccordionItemHeading.component.tsx @@ -0,0 +1,9 @@ +import { AccordionItemHeading as AIH } from 'react-accessible-accordion'; + +interface AccordionItemHeadingProps { + children: React.ReactNode; +} + +export const AccordionItemHeading = ({ children }: AccordionItemHeadingProps): JSX.Element => ( + <AIH className="py-4">{children}</AIH> +); diff --git a/src/shared/Accordion/AccordionItemHeading/index.ts b/src/shared/Accordion/AccordionItemHeading/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..9eb4999c4036bdac50d39ae9bce8703253bda605 --- /dev/null +++ b/src/shared/Accordion/AccordionItemHeading/index.ts @@ -0,0 +1 @@ +export { AccordionItemHeading } from './AccordionItemHeading.component'; diff --git a/src/shared/Accordion/AccordionItemPanel/AccordionItemPanel.component.tsx b/src/shared/Accordion/AccordionItemPanel/AccordionItemPanel.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d0ef686da639ebe64570fac06c6eee25deb7af8d --- /dev/null +++ b/src/shared/Accordion/AccordionItemPanel/AccordionItemPanel.component.tsx @@ -0,0 +1,9 @@ +import { AccordionItemPanel as AIP } from 'react-accessible-accordion'; + +interface AccordionItemPanelProps { + children: React.ReactNode; +} + +export const AccordionItemPanel = ({ children }: AccordionItemPanelProps): JSX.Element => ( + <AIP className="pb-4">{children}</AIP> +); diff --git a/src/shared/Accordion/AccordionItemPanel/index.ts b/src/shared/Accordion/AccordionItemPanel/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..d45a4338adc9e58627329999b07169fd2ace0673 --- /dev/null +++ b/src/shared/Accordion/AccordionItemPanel/index.ts @@ -0,0 +1 @@ +export { AccordionItemPanel } from './AccordionItemPanel.component'; diff --git a/src/shared/Accordion/index.ts b/src/shared/Accordion/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..244e2026c57a60a8de98cbe435a8239fdfec1ccc --- /dev/null +++ b/src/shared/Accordion/index.ts @@ -0,0 +1,5 @@ +export { AccordionItem } from '@/shared/Accordion/AccordionItem'; +export { AccordionItemButton } from '@/shared/Accordion/AccordionItemButton'; +export { AccordionItemHeading } from '@/shared/Accordion/AccordionItemHeading'; +export { Accordion } from './Accordion.component'; +export { AccordionItemPanel } from '@/shared/Accordion/AccordionItemPanel';