diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f9c32b6..f99c332 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,10 +13,13 @@ jobs: steps: - uses: actions/checkout@v2 # Setup .npmrc file to publish to GitHub Packages - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v4 with: node-version: '18.x' registry-url: 'https://npm.pkg.github.com' + - run: | + echo "@internxt:registry=https://npm.pkg.github.com/" > .npmrc + echo "//npm.pkg.github.com/:_authToken=${{ secrets.PERSONAL_ACCESS_TOKEN }}" >> .npmrc # Install all necessary dependencies - run: yarn env: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 83af979..b958a35 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,21 +11,18 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [18.x] + node-version: [20.x] steps: - name: Checkout uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - - run: echo "registry=https://registry.yarnpkg.com/" > .npmrc - - run: echo "@internxt:registry=https://npm.pkg.github.com" >> .npmrc - # You cannot read packages from other private repos with GITHUB_TOKEN - # You have to use a PAT instead https://github.com/actions/setup-node/issues/49 - - run: echo //npm.pkg.github.com/:_authToken=${{ secrets.PERSONAL_ACCESS_TOKEN }} >> .npmrc - - run: echo "always-auth=true" >> .npmrc + - run: | + echo "@internxt:registry=https://npm.pkg.github.com/" > .npmrc + echo "//npm.pkg.github.com/:_authToken=${{ secrets.PERSONAL_ACCESS_TOKEN }}" >> .npmrc - name: Install dependencies run: yarn diff --git a/package.json b/package.json index 2882cb6..56e1527 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "@internxt/ui", - "version": "0.0.7", + "version": "0.0.8", "description": "Library of Internxt components", "repository": { "type": "git", - "url": "git+https://github.com/internxt/InternxtUI.git" + "url": "git+https://github.com/internxt/ui.git" }, "author": "", "license": "MIT", - "homepage": "https://github.com/internxt/InternxtUI#readme", + "homepage": "https://github.com/internxt/ui#readme", "type": "module", "main": "dist/index.cjs.js", "module": "dist/index.es.js", @@ -24,7 +24,6 @@ }, "devDependencies": { "@chromatic-com/storybook": "^1.2.25", - "@internxt/css-config": "^1.0.2", "@internxt/eslint-config-internxt": "^1.0.9", "@internxt/prettier-config": "^1.0.2", "@storybook/addon-essentials": "^8.0.4", @@ -59,6 +58,8 @@ "prettier": "^3.2.5", "prettier-plugin-tailwindcss": "^0.5.12", "react": "^18.2.0", + "react-dnd": "14.0.5", + "react-dnd-html5-backend": "^14.0.0", "sass": "^1.72.0", "storybook": "^8.0.4", "tailwindcss": "^3.4.1", @@ -88,11 +89,10 @@ "storybook:build": "storybook build" }, "dependencies": { + "@internxt/css-config": "^1.0.2", "@phosphor-icons/react": "^2.1.5", "@radix-ui/react-switch": "^1.1.0", - "@radix-ui/themes": "^3.0.0", - "react-dnd": "^16.0.1", - "react-dnd-html5-backend": "^16.0.1" + "@radix-ui/themes": "^3.0.0" }, "lint-staged": { "*.{ts,tsx}": [ diff --git a/src/components/contextMenu/ContextMenu.tsx b/src/components/contextMenu/ContextMenu.tsx index 1337f32..774474f 100644 --- a/src/components/contextMenu/ContextMenu.tsx +++ b/src/components/contextMenu/ContextMenu.tsx @@ -7,6 +7,7 @@ export interface ContextMenuProps { menuItemsRef: React.MutableRefObject; menu?: MenuItemsType; openedFromRightClick: boolean; + isOpen: boolean; posX: number; posY: number; isContextMenuCutOff: boolean; @@ -34,6 +35,9 @@ export interface ContextMenuProps { * - Indicates whether the context menu was opened via a right-click (`true`). * Determines whether the menu's position is set based on the click location or a predefined position. * + * @property {boolean} [isOpen] + * - To know is Menu is visible. + * * @property {number} posX * - X-coordinate for the menu's position, used if `openedFromRightClick` is `true`. * @@ -60,6 +64,7 @@ const ContextMenu = ({ posX, posY, isContextMenuCutOff, + isOpen, genericEnterKey, handleMenuClose, }: ContextMenuProps): JSX.Element => { @@ -78,7 +83,13 @@ const ContextMenu = ({ } ref={menuItemsRef} > - + ); }; diff --git a/src/components/contextMenu/__test__/ContextMenu.test.tsx b/src/components/contextMenu/__test__/ContextMenu.test.tsx index 6e2a901..03f0524 100644 --- a/src/components/contextMenu/__test__/ContextMenu.test.tsx +++ b/src/components/contextMenu/__test__/ContextMenu.test.tsx @@ -22,6 +22,7 @@ describe('ContextMenu Component', () => { posX: 100, posY: 100, isContextMenuCutOff: false, + isOpen: true, genericEnterKey: vi.fn(), handleMenuClose: vi.fn(), }; diff --git a/src/components/dropdown/Dropdown.tsx b/src/components/dropdown/Dropdown.tsx index 7666495..1d4be7b 100644 --- a/src/components/dropdown/Dropdown.tsx +++ b/src/components/dropdown/Dropdown.tsx @@ -1,4 +1,4 @@ -import { useState, ReactNode } from 'react'; +import { useState, ReactNode, useEffect, useRef } from 'react'; import { Menu, MenuItemType } from '../'; export type DropdownProps = { @@ -56,6 +56,23 @@ const Dropdown = ({ }: DropdownProps): JSX.Element => { const [isOpen, setIsOpen] = useState(false); const direction = openDirection === 'left' ? 'origin-top-left' : 'origin-top-right'; + const containerRef = useRef(null); + + useEffect(() => { + const handleClickOutside = (e: MouseEvent) => { + if (containerRef.current && !containerRef.current.contains(e.target as Node)) { + setIsOpen(false); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + document.addEventListener('contextmenu', handleClickOutside); + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + document.removeEventListener('contextmenu', handleClickOutside); + }; + }, []); const group1: Array> = options ? options.map((option) => ({ @@ -78,7 +95,7 @@ const Dropdown = ({ const closeMenu = () => setIsOpen(false); return ( -
+
diff --git a/src/components/index.ts b/src/components/index.ts index 52e10dc..8e4ec6a 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -18,6 +18,7 @@ export * from './modal'; export * from './popover'; export * from './radioButton'; export * from './slider'; +export * from './skeletonLoader'; export * from './switch'; export * from './textArea'; export * from './tooltip'; diff --git a/src/components/list/List.tsx b/src/components/list/List.tsx index 5516d25..daf0dda 100644 --- a/src/components/list/List.tsx +++ b/src/components/list/List.tsx @@ -225,6 +225,7 @@ const List = ({ }; const onOrderableColumnClicked = (field: HeaderProps) => { + onCloseContextMenu(); if (!field.orderable || !onOrderByChanged) return; const columnWasAlreadySelected = orderBy?.field === field.name; @@ -307,6 +308,7 @@ const List = ({ displayMenuDiv={displayMenuDiv} isVerticalScrollbarVisible={isVerticalScrollbarVisible} checkboxDataCy={checkboxDataCy} + onClose={onCloseContextMenu} /> ) : null} @@ -318,7 +320,7 @@ const List = ({ } + loader={loader} scrollableTarget="scrollableList" > {items.map((item, index) => ( diff --git a/src/components/list/ListHeader.tsx b/src/components/list/ListHeader.tsx index 0bf2cbf..08b51c1 100644 --- a/src/components/list/ListHeader.tsx +++ b/src/components/list/ListHeader.tsx @@ -21,6 +21,7 @@ interface ListHeaderProps { checkboxDataCy?: string; onTopSelectionCheckboxClick: () => void; onOrderableColumnClicked: (column: HeaderProps) => void; + onClose?: () => void; } const ListHeader = ({ @@ -34,9 +35,10 @@ const ListHeader = ({ displayMenuDiv, isVerticalScrollbarVisible, checkboxDataCy, + onClose, }: ListHeaderProps) => { return ( -
+
{/* COLUMN */}
{/* SELECTION CHECKBOX */} diff --git a/src/components/list/ListItem.tsx b/src/components/list/ListItem.tsx index f105de1..95b0203 100644 --- a/src/components/list/ListItem.tsx +++ b/src/components/list/ListItem.tsx @@ -163,6 +163,7 @@ const ListItem = ({ menu={menu} menuItemsRef={menuItemsRef} openedFromRightClick={openedFromRightClick} + isOpen={isOpen} posX={posX} posY={posY} isContextMenuCutOff={isContextMenuCutOff} diff --git a/src/components/menu/Menu.tsx b/src/components/menu/Menu.tsx index 5636d3c..81f693d 100644 --- a/src/components/menu/Menu.tsx +++ b/src/components/menu/Menu.tsx @@ -1,4 +1,4 @@ -import { ReactNode, useEffect, useState } from 'react'; +import { isValidElement, ReactNode, useEffect, useState } from 'react'; import useHotkeys from '../../hooks/useHotKeys'; export type MenuItemType = @@ -23,6 +23,7 @@ export type MenuItemsType = Array>; export interface MenuProps { item?: T; + isOpen: boolean; menu?: MenuItemsType; handleMenuClose: () => void; genericEnterKey?: () => void; @@ -37,6 +38,9 @@ export interface MenuProps { * @property {T} [item] * - Optional item that may be used in menu actions (e.g., data passed for actions). * + * @property {boolean} [isOpen] + * - To know is Menu is visible. + * * @property {MenuItemsType} [menu] * - Optional array of menu items. Each item can define a separator, title, icon, action, etc. * @@ -58,7 +62,7 @@ export interface MenuProps { * It features a dynamic index for item selection, with keyboard and mouse-based navigation. */ -const Menu = ({ item, menu, genericEnterKey, handleMenuClose }: MenuProps): JSX.Element => { +const Menu = ({ item, menu, isOpen, genericEnterKey, handleMenuClose }: MenuProps): JSX.Element => { const [selectedIndex, setSelectedIndex] = useState(null); const [enterPressed, setEnterPressed] = useState(false); const handleMouseEnter = (index: number) => { @@ -70,6 +74,7 @@ const Menu = ({ item, menu, genericEnterKey, handleMenuClose }: MenuProps const handleArrowDown = () => { menu && + isOpen && setSelectedIndex((prevIndex) => { const getNextEnabledIndex = (startIndex: number): number => { let newIndex = startIndex; @@ -91,6 +96,7 @@ const Menu = ({ item, menu, genericEnterKey, handleMenuClose }: MenuProps const handleArrowUp = () => { menu && + isOpen && setSelectedIndex((prevIndex) => { const getPreviousEnabledIndex = (startIndex: number): number => { let newIndex = startIndex; @@ -111,14 +117,20 @@ const Menu = ({ item, menu, genericEnterKey, handleMenuClose }: MenuProps }; const handleEnterKey = () => { - setSelectedIndex((prevIndex) => { - if (prevIndex !== null) { - const menuItem = menu ? menu[prevIndex] : undefined; - if (item && menuItem && 'action' in menuItem && menuItem.action) menuItem.action(item); - } else if (genericEnterKey) genericEnterKey(); - setEnterPressed(true); - return null; - }); + menu && + isOpen && + setSelectedIndex((prevIndex) => { + if (prevIndex !== null) { + const menuItem = menu ? menu[prevIndex] : undefined; + if (item && menuItem && 'action' in menuItem && menuItem.action) menuItem.action(item); + if (item && menuItem && 'node' in menuItem && menuItem.node && isValidElement(menuItem.node)) { + const onClick = menuItem.node.props.onClick; + onClick && onClick(); + } + } else if (genericEnterKey) genericEnterKey(); + setEnterPressed(true); + return null; + }); }; useEffect(() => { @@ -134,7 +146,7 @@ const Menu = ({ item, menu, genericEnterKey, handleMenuClose }: MenuProps arrowup: handleArrowUp, enter: handleEnterKey, }, - [], + [isOpen], ); return ( diff --git a/src/components/menu/__test__/Menu.test.tsx b/src/components/menu/__test__/Menu.test.tsx index b9afd7b..3297be0 100644 --- a/src/components/menu/__test__/Menu.test.tsx +++ b/src/components/menu/__test__/Menu.test.tsx @@ -29,6 +29,7 @@ describe('Menu Component', () => { const defaultProps: MenuProps<{ id: number; name: string }> = { item: { id: 1, name: 'Sample Item' }, menu: menuItems, + isOpen: true, handleMenuClose, genericEnterKey, }; diff --git a/src/hooks/useHotKeys.ts b/src/hooks/useHotKeys.ts index e7107a2..a89671f 100644 --- a/src/hooks/useHotKeys.ts +++ b/src/hooks/useHotKeys.ts @@ -4,6 +4,12 @@ type KeyMap = { [key: string]: () => void }; const useHotkeys = (keyMap: KeyMap, dependencies: unknown[] = []) => { const handleKeyDown = (event: KeyboardEvent) => { + const isInputElement = ['input', 'textarea'].includes(document.activeElement?.tagName.toLowerCase() ?? ''); + + if (isInputElement && event.key.toLowerCase() !== 'escape') { + return; + } + const keyCombination = `${event.ctrlKey ? 'ctrl+' : ''}${event.metaKey ? 'meta+' : ''}${event.key.toLowerCase()}`; if (keyMap[keyCombination]) { event.preventDefault(); diff --git a/src/stories/components/breadcrumbs/breadcrumbs.stories.tsx b/src/stories/components/breadcrumbs/breadcrumbs.stories.tsx index f82a297..a014433 100644 --- a/src/stories/components/breadcrumbs/breadcrumbs.stories.tsx +++ b/src/stories/components/breadcrumbs/breadcrumbs.stories.tsx @@ -63,6 +63,7 @@ const menuBreadcrumbs = (props: BreadcrumbsMenuProps): JSX.Element => { true }, { separator: true }, diff --git a/src/stories/components/contextMenu/ContextMenu.stories.tsx b/src/stories/components/contextMenu/ContextMenu.stories.tsx index 4986a5e..8a0e36a 100644 --- a/src/stories/components/contextMenu/ContextMenu.stories.tsx +++ b/src/stories/components/contextMenu/ContextMenu.stories.tsx @@ -62,6 +62,7 @@ const ContextMenuWithNotifications = () => { isContextMenuCutOff={false} genericEnterKey={() => {}} handleMenuClose={() => {}} + isOpen={true} />
diff --git a/src/stories/components/dropdown/Dropdown.stories.tsx b/src/stories/components/dropdown/Dropdown.stories.tsx index 60ffd88..74efe5a 100644 --- a/src/stories/components/dropdown/Dropdown.stories.tsx +++ b/src/stories/components/dropdown/Dropdown.stories.tsx @@ -21,9 +21,18 @@ const defaultArgs: DropdownProps = { { text: 'Option 1', onClick: () => alert('Option 1 selected') }, { text: 'Option 2', onClick: () => alert('Option 2 selected') }, ], - menuItems: ['Item 1', 'Item 2'], + menuItems: [ +
alert('Item 1 selected')}>{'Item 1'}
, +
alert('Item 2 selected')}>{'Item 2'}
, + ], dropdownActionsContext: [ - { name: 'Action 1', action: () => alert('Launched action 1') }, + { + name: 'Action 1', + action: () => { + console.log('llamada'); + alert('Launched action 1'); + }, + }, { name: 'Action 2', action: () => alert('Launched action 2') }, { separator: true }, { name: 'Action 3', action: () => alert('Launched action 3') }, diff --git a/src/stories/components/menu/Menu.stories.tsx b/src/stories/components/menu/Menu.stories.tsx index 4d58808..98f746d 100644 --- a/src/stories/components/menu/Menu.stories.tsx +++ b/src/stories/components/menu/Menu.stories.tsx @@ -10,7 +10,7 @@ const withCloseHandler: Decorator = (Story, context) => { ...context, args: { ...context.allArgs, - handleMenuClose: () => setArgs({ ...context.args, isOpen: false }), + handleMenuClose: () => setArgs({ ...context.args, isOpen: true }), }, }); }; @@ -59,6 +59,7 @@ const ExampleIconGreen = React.forwardRef true }, { separator: true }, @@ -76,6 +77,7 @@ export const Default: Story = { export const WithIcons: Story = { args: { item: { id: 1, name: 'Sample Item' }, + isOpen: true, menu: [ { name: 'Title', isTitle: () => true }, { separator: true }, diff --git a/yarn.lock b/yarn.lock index bda7afe..83d9663 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1392,20 +1392,20 @@ classnames "2.3.2" react-remove-scroll-bar "2.3.4" -"@react-dnd/asap@^5.0.1": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@react-dnd/asap/-/asap-5.0.2.tgz#1f81f124c1cd6f39511c11a881cfb0f715343488" - integrity sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A== +"@react-dnd/asap@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@react-dnd/asap/-/asap-4.0.1.tgz#5291850a6b58ce6f2da25352a64f1b0674871aab" + integrity sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg== -"@react-dnd/invariant@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@react-dnd/invariant/-/invariant-4.0.2.tgz#b92edffca10a26466643349fac7cdfb8799769df" - integrity sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw== +"@react-dnd/invariant@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-dnd/invariant/-/invariant-2.0.0.tgz#09d2e81cd39e0e767d7da62df9325860f24e517e" + integrity sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw== -"@react-dnd/shallowequal@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz#d1b4befa423f692fa4abf1c79209702e7d8ae4b4" - integrity sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA== +"@react-dnd/shallowequal@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz#a3031eb54129f2c66b2753f8404266ec7bf67f0a" + integrity sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg== "@rollup/pluginutils@^5.0.2", "@rollup/pluginutils@^5.0.5", "@rollup/pluginutils@^5.1.0": version "5.1.2" @@ -2999,7 +2999,7 @@ check-error@^2.1.1: resolved "https://registry.yarnpkg.com/check-error/-/check-error-2.1.1.tgz#87eb876ae71ee388fa0471fe423f494be1d96ccc" integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== -chokidar@^3.5.3: +chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -3342,14 +3342,14 @@ dlv@^1.1.3: resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== -dnd-core@^16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/dnd-core/-/dnd-core-16.0.1.tgz#a1c213ed08961f6bd1959a28bb76f1a868360d19" - integrity sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng== +dnd-core@14.0.1: + version "14.0.1" + resolved "https://registry.yarnpkg.com/dnd-core/-/dnd-core-14.0.1.tgz#76d000e41c494983210fb20a48b835f81a203c2e" + integrity sha512-+PVS2VPTgKFPYWo3vAFEA8WPbTf7/xo43TifH9G8S1KqnrQu0o77A3unrF5yOugy4mIz7K5wAVFHUcha7wsz6A== dependencies: - "@react-dnd/asap" "^5.0.1" - "@react-dnd/invariant" "^4.0.1" - redux "^4.2.0" + "@react-dnd/asap" "^4.0.0" + "@react-dnd/invariant" "^2.0.0" + redux "^4.1.1" doctrine@^2.1.0: version "2.1.0" @@ -3907,7 +3907,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== -fast-glob@^3.2.9, fast-glob@^3.3.0: +fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -4799,7 +4799,7 @@ jackspeak@2.1.1, jackspeak@^3.1.2: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" -jiti@^1.21.0: +jiti@^1.21.0, jiti@^1.21.6: version "1.21.6" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== @@ -4939,6 +4939,11 @@ lilconfig@^3.0.0, lilconfig@~3.1.2: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== +lilconfig@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -5146,7 +5151,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.4, micromatch@^4.0.5, micromatch@~4.0.8: +micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8, micromatch@~4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== @@ -5598,7 +5603,7 @@ postcss-js@^4.0.1: dependencies: camelcase-css "^2.0.1" -postcss-load-config@^4.0.1: +postcss-load-config@^4.0.1, postcss-load-config@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== @@ -5606,14 +5611,14 @@ postcss-load-config@^4.0.1: lilconfig "^3.0.0" yaml "^2.3.4" -postcss-nested@^6.0.1: +postcss-nested@^6.0.1, postcss-nested@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== dependencies: postcss-selector-parser "^6.1.1" -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1: +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== @@ -5635,7 +5640,7 @@ postcss@^8.4.23: picocolors "^1.1.0" source-map-js "^1.2.1" -postcss@^8.4.43: +postcss@^8.4.43, postcss@^8.4.47: version "8.4.49" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== @@ -5751,21 +5756,21 @@ react-confetti@^6.1.0: dependencies: tween-functions "^1.2.0" -react-dnd-html5-backend@^16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz#87faef15845d512a23b3c08d29ecfd34871688b6" - integrity sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw== +react-dnd-html5-backend@^14.0.0: + version "14.1.0" + resolved "https://registry.yarnpkg.com/react-dnd-html5-backend/-/react-dnd-html5-backend-14.1.0.tgz#b35a3a0c16dd3a2bfb5eb7ec62cf0c2cace8b62f" + integrity sha512-6ONeqEC3XKVf4eVmMTe0oPds+c5B9Foyj8p/ZKLb7kL2qh9COYxiBHv3szd6gztqi/efkmriywLUVlPotqoJyw== dependencies: - dnd-core "^16.0.1" + dnd-core "14.0.1" -react-dnd@^16.0.1: - version "16.0.1" - resolved "https://registry.yarnpkg.com/react-dnd/-/react-dnd-16.0.1.tgz#2442a3ec67892c60d40a1559eef45498ba26fa37" - integrity sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q== +react-dnd@14.0.5: + version "14.0.5" + resolved "https://registry.yarnpkg.com/react-dnd/-/react-dnd-14.0.5.tgz#ecf264e220ae62e35634d9b941502f3fca0185ed" + integrity sha512-9i1jSgbyVw0ELlEVt/NkCUkxy1hmhJOkePoCH713u75vzHGyXhPDm28oLfc2NMSBjZRM1Y+wRjHXJT3sPrTy+A== dependencies: - "@react-dnd/invariant" "^4.0.1" - "@react-dnd/shallowequal" "^4.0.1" - dnd-core "^16.0.1" + "@react-dnd/invariant" "^2.0.0" + "@react-dnd/shallowequal" "^2.0.0" + dnd-core "14.0.1" fast-deep-equal "^3.1.3" hoist-non-react-statics "^3.3.2" @@ -5903,7 +5908,7 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -redux@^4.2.0: +redux@^4.1.1: version "4.2.1" resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== @@ -6431,7 +6436,7 @@ strip-outer@^1.0.1: dependencies: escape-string-regexp "^1.0.2" -sucrase@^3.32.0: +sucrase@^3.32.0, sucrase@^3.35.0: version "3.35.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== @@ -6488,7 +6493,7 @@ synckit@^0.9.1: "@pkgr/core" "^0.1.0" tslib "^2.6.2" -tailwindcss@^3.4.1, tailwindcss@^3.4.14: +tailwindcss@^3.4.1: version "3.4.14" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.14.tgz#6dd23a7f54ec197b19159e91e3bb1e55e7aa73ac" integrity sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA== @@ -6516,6 +6521,34 @@ tailwindcss@^3.4.1, tailwindcss@^3.4.14: resolve "^1.22.2" sucrase "^3.32.0" +tailwindcss@^3.4.14: + version "3.4.16" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.16.tgz#35a7c3030844d6000fc271878db4096b6a8d2ec9" + integrity sha512-TI4Cyx7gDiZ6r44ewaJmt0o6BrMCT5aK5e0rmJ/G9Xq3w7CX/5VXl/zIPEJZFUK5VEqwByyhqNPycPlvcK4ZNw== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.6.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.2" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.6" + lilconfig "^3.1.3" + micromatch "^4.0.8" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.1.1" + postcss "^8.4.47" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.2" + postcss-nested "^6.2.0" + postcss-selector-parser "^6.1.2" + resolve "^1.22.8" + sucrase "^3.35.0" + telejson@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/telejson/-/telejson-7.2.0.tgz#3994f6c9a8f8d7f2dba9be2c7c5bbb447e876f32" @@ -6755,11 +6788,16 @@ typescript@5.4.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== -typescript@^5.4.3, typescript@^5.6.3: +typescript@^5.4.3: version "5.6.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== +typescript@^5.6.3: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"