diff --git a/.changeset/warm-suits-report.md b/.changeset/warm-suits-report.md new file mode 100644 index 0000000000..aa971e188a --- /dev/null +++ b/.changeset/warm-suits-report.md @@ -0,0 +1,8 @@ +--- +"@nextui-org/calendar": patch +"@nextui-org/theme": patch +"@nextui-org/use-infinite-scroll": patch +"@nextui-org/shared-utils": patch +--- + +replaced lodash with native approaches diff --git a/apps/docs/app/examples/table/custom-styles/page.tsx b/apps/docs/app/examples/table/custom-styles/page.tsx index 813532048a..abce10af67 100644 --- a/apps/docs/app/examples/table/custom-styles/page.tsx +++ b/apps/docs/app/examples/table/custom-styles/page.tsx @@ -23,7 +23,7 @@ import { } from "@nextui-org/react"; import {ChevronDownIcon, SearchIcon} from "@nextui-org/shared-icons"; import {useCallback, useMemo, useState} from "react"; -import {capitalize} from "lodash"; +import {capitalize} from "@nextui-org/shared-utils"; import {PlusLinearIcon} from "@/components/icons"; import {VerticalDotsIcon} from "@/components/icons/vertical-dots"; diff --git a/apps/docs/app/examples/table/use-case/page.tsx b/apps/docs/app/examples/table/use-case/page.tsx index 7aa18ed3f9..283a68ef5a 100644 --- a/apps/docs/app/examples/table/use-case/page.tsx +++ b/apps/docs/app/examples/table/use-case/page.tsx @@ -23,7 +23,7 @@ import { } from "@nextui-org/react"; import {ChevronDownIcon, SearchIcon} from "@nextui-org/shared-icons"; import {useCallback, useMemo, useState} from "react"; -import {capitalize} from "lodash"; +import {capitalize} from "@nextui-org/shared-utils"; import {PlusLinearIcon} from "@/components/icons"; import {VerticalDotsIcon} from "@/components/icons/vertical-dots"; diff --git a/apps/docs/components/cmdk.tsx b/apps/docs/components/cmdk.tsx index 25a33d03f5..e3213d47af 100644 --- a/apps/docs/components/cmdk.tsx +++ b/apps/docs/components/cmdk.tsx @@ -13,7 +13,8 @@ import {clsx} from "@nextui-org/shared-utils"; import scrollIntoView from "scroll-into-view-if-needed"; import {isAppleDevice, isWebKit} from "@react-aria/utils"; import {create} from "zustand"; -import {intersectionBy, isEmpty} from "lodash"; +import {isEmpty} from "@nextui-org/shared-utils"; +import intersectionBy from "lodash/intersectionBy"; import {writeStorage, useLocalStorage} from "@rehooks/local-storage"; import { diff --git a/apps/docs/components/demo-code-modal.tsx b/apps/docs/components/demo-code-modal.tsx index baf2e1dede..31c9996d91 100644 --- a/apps/docs/components/demo-code-modal.tsx +++ b/apps/docs/components/demo-code-modal.tsx @@ -12,7 +12,6 @@ import { Skeleton, } from "@nextui-org/react"; import Link from "next/link"; -import {toLower} from "lodash"; import {CodeWindow} from "@/components/code-window"; import {useIsMobile} from "@/hooks/use-media-query"; @@ -30,8 +29,8 @@ export const DemoCodeModal: FC = ({isOpen, code, title, subt const isMobile = useIsMobile(); - const lowerTitle = toLower(title); - const fileName = `${toLower(lowerTitle)}.tsx`; + const lowerTitle = title.toLowerCase(); + const fileName = `${lowerTitle}.tsx`; return ( { +export const transformCode = ( + code: string, + imports: {[key: string]: any} = {}, + compName = "App", +) => { let cleanedCode = code .replace(importRegex, (match) => { // get component name from the match ex. "import { Table } from '@nextui-org/react'" const componentName = match.match(/\w+/g)?.[1] || ""; - const matchingImport = get(imports, componentName); + const matchingImport = imports[componentName] || {}; if (matchingImport) { // remove the matching import diff --git a/apps/docs/components/docs/components/codeblock.tsx b/apps/docs/components/docs/components/codeblock.tsx index 8d4f61cbf1..57b6408e08 100644 --- a/apps/docs/components/docs/components/codeblock.tsx +++ b/apps/docs/components/docs/components/codeblock.tsx @@ -1,7 +1,7 @@ import React, {forwardRef, useEffect} from "react"; import {clsx, dataAttr, getUniqueID} from "@nextui-org/shared-utils"; import BaseHighlight, {Language, PrismTheme, defaultProps} from "prism-react-renderer"; -import {debounce, omit} from "lodash"; +import {debounce, omit} from "@nextui-org/shared-utils"; import defaultTheme from "@/libs/prism-theme"; diff --git a/apps/docs/components/docs/components/swatch-colors-set.tsx b/apps/docs/components/docs/components/swatch-colors-set.tsx index 319e9e72e0..0696a8926e 100644 --- a/apps/docs/components/docs/components/swatch-colors-set.tsx +++ b/apps/docs/components/docs/components/swatch-colors-set.tsx @@ -1,10 +1,10 @@ import {parseToRgba, readableColor} from "color2k"; import {Button, Tooltip} from "@nextui-org/react"; -import {commonColors, semanticColors} from "@nextui-org/theme"; +import {commonColors, semanticColors, SemanticBaseColors, ThemeColors} from "@nextui-org/theme"; import {useClipboard} from "@nextui-org/use-clipboard"; import {useState} from "react"; import {useTheme} from "next-themes"; -import {get, isEmpty} from "lodash"; +import {isEmpty} from "@nextui-org/shared-utils"; type ColorsItem = { color: string; @@ -106,12 +106,12 @@ const SemanticSwatch = ({ let value: string = ""; const [colorName, colorScale] = color.split("-"); - let currentPalette = get(semanticColors, theme ?? "", {}); + const currentPalette = semanticColors[theme as keyof SemanticBaseColors] || {}; if (!colorScale) { - value = get(currentPalette, `${colorName}.DEFAULT`, ""); + value = (currentPalette[colorName as keyof ThemeColors] as any)?.DEFAULT || ""; } else { - value = get(currentPalette, `${colorName}.${colorScale}`, ""); + value = (currentPalette[colorName as keyof ThemeColors] as any)?.colorScale || ""; } const handleCopy = () => { diff --git a/apps/docs/components/docs/sidebar.tsx b/apps/docs/components/docs/sidebar.tsx index e52ccdc639..ac25317ad1 100644 --- a/apps/docs/components/docs/sidebar.tsx +++ b/apps/docs/components/docs/sidebar.tsx @@ -18,7 +18,7 @@ import { dataFocusVisibleClasses, } from "@nextui-org/react"; import Link from "next/link"; -import {isEmpty} from "lodash"; +import {isEmpty} from "@nextui-org/shared-utils"; import {usePathname, useRouter} from "next/navigation"; import {ScrollArea} from "../scroll-area"; diff --git a/apps/docs/components/marketing/custom-themes/custom-themes.tsx b/apps/docs/components/marketing/custom-themes/custom-themes.tsx index ecb1f2cf23..9046ca8e29 100644 --- a/apps/docs/components/marketing/custom-themes/custom-themes.tsx +++ b/apps/docs/components/marketing/custom-themes/custom-themes.tsx @@ -3,7 +3,6 @@ /* eslint-disable react/display-name */ import {useMemo, useState} from "react"; import {Tabs, Tab, Card, CardBody, Image, Button, RadioGroup, Radio} from "@nextui-org/react"; -import get from "lodash/get"; import NextLink from "next/link"; import NextImage from "next/image"; @@ -238,7 +237,7 @@ export const CustomThemes = () => { = ({sponsors = []}) => { size={getSponsorSize(sponsor, isMobile)} src={sponsor.image} style={getSponsorAvatarStyles(index, sponsors)} - onClick={() => - handleExternalLinkClick(get(sponsor, "website") || get(sponsor, "profile")) - } + onClick={() => handleExternalLinkClick(sponsor["website"] || sponsor["profile"])} /> ))} diff --git a/apps/docs/components/navbar.tsx b/apps/docs/components/navbar.tsx index d9e95b7456..11cc145e6f 100644 --- a/apps/docs/components/navbar.tsx +++ b/apps/docs/components/navbar.tsx @@ -24,7 +24,6 @@ import {isAppleDevice} from "@react-aria/utils"; import {clsx} from "@nextui-org/shared-utils"; import NextLink from "next/link"; import {usePathname} from "next/navigation"; -import {includes} from "lodash"; import {motion, AnimatePresence} from "framer-motion"; import {useEffect} from "react"; import {usePress} from "@react-aria/interactions"; @@ -197,7 +196,7 @@ export const Navbar: FC = ({children, routes, mobileRoutes = [], sl handlePressNavbarItem("Docs", "/docs/guide/introduction")} > @@ -208,7 +207,7 @@ export const Navbar: FC = ({children, routes, mobileRoutes = [], sl handlePressNavbarItem("Components", "/docs/components/avatar")} > @@ -219,7 +218,7 @@ export const Navbar: FC = ({children, routes, mobileRoutes = [], sl handlePressNavbarItem("Blog", "/blog")} > @@ -230,7 +229,7 @@ export const Navbar: FC = ({children, routes, mobileRoutes = [], sl handlePressNavbarItem("Figma", "/figma")} > diff --git a/apps/docs/components/sandpack/bugreport-button.tsx b/apps/docs/components/sandpack/bugreport-button.tsx index 0f7438e719..2c2e19491d 100644 --- a/apps/docs/components/sandpack/bugreport-button.tsx +++ b/apps/docs/components/sandpack/bugreport-button.tsx @@ -1,7 +1,7 @@ import React from "react"; import {usePathname} from "next/navigation"; import {Tooltip, Button} from "@nextui-org/react"; -import {capitalize, last} from "lodash"; +import {capitalize} from "@nextui-org/shared-utils"; import {BugIcon} from "@/components/icons"; import {ISSUE_REPORT_URL} from "@/libs/github/constants"; @@ -9,7 +9,7 @@ import {ISSUE_REPORT_URL} from "@/libs/github/constants"; export const BugReportButton = () => { const pathname = usePathname(); - const componentTitle = capitalize(last(pathname?.split("/"))); + const componentTitle = capitalize(pathname?.split("/")?.at(-1) ?? ""); const handlePress = () => { window.open(`${ISSUE_REPORT_URL}${componentTitle}`, "_blank"); diff --git a/apps/docs/content/components/table/custom-styles.ts b/apps/docs/content/components/table/custom-styles.ts index 10b03e444d..b622329c6d 100644 --- a/apps/docs/content/components/table/custom-styles.ts +++ b/apps/docs/content/components/table/custom-styles.ts @@ -220,8 +220,8 @@ const users = [ export {columns, users, statusOptions};`; -const utils = `export function capitalize(str) { - return str.charAt(0).toUpperCase() + str.slice(1); +const utils = `export function capitalize(s) { + return s ? s.charAt(0).toUpperCase() + s.slice(1).toLowerCase() : ""; }`; const PlusIcon = `export const PlusIcon = ({size = 24, width, height, ...props}) => ( diff --git a/apps/docs/content/components/table/use-case.ts b/apps/docs/content/components/table/use-case.ts index 6c7c255f8c..72b7e05c82 100644 --- a/apps/docs/content/components/table/use-case.ts +++ b/apps/docs/content/components/table/use-case.ts @@ -448,8 +448,8 @@ export type IconSvgProps = SVGProps & { size?: number; };`; -const utils = `export function capitalize(str) { - return str.charAt(0).toUpperCase() + str.slice(1); +const utils = `export function capitalize(s) { + return s ? s.charAt(0).toUpperCase() + s.slice(1).toLowerCase() : ""; }`; const PlusIcon = `export const PlusIcon = ({size = 24, width, height, ...props}) => ( @@ -544,8 +544,8 @@ const ChevronDownIcon = `export const ChevronDownIcon = ({strokeWidth = 1.5, ... );`; -const utilsTs = `export function capitalize(str: string) { - return str.charAt(0).toUpperCase() + str.slice(1); +const utilsTs = `export function capitalize(s: string) { + return s ? s.charAt(0).toUpperCase() + s.slice(1).toLowerCase() : ""; }`; const PlusIconTs = `import {IconSvgProps} from "./types"; diff --git a/apps/docs/package.json b/apps/docs/package.json index 40a930ee94..bfaf58848c 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -104,7 +104,7 @@ "@react-types/shared": "3.23.1", "@tailwindcss/typography": "^0.5.9", "@types/canvas-confetti": "^1.4.2", - "@types/lodash": "^4.14.194", + "@types/lodash": "^4.17.5", "@types/marked": "^5.0.0", "@types/mdx": "^2.0.5", "@types/node": "20.2.5", diff --git a/apps/docs/utils/get-sponsors.ts b/apps/docs/utils/get-sponsors.ts index 06723ed2ea..046fa5cd3b 100644 --- a/apps/docs/utils/get-sponsors.ts +++ b/apps/docs/utils/get-sponsors.ts @@ -1,4 +1,4 @@ -import {uniqBy} from "lodash"; +import {uniqBy} from "@nextui-org/shared-utils"; import fetch from "node-fetch"; import {__PROD__} from "./env"; diff --git a/packages/components/calendar/package.json b/packages/components/calendar/package.json index 4f57b6ad50..4be97746e0 100644 --- a/packages/components/calendar/package.json +++ b/packages/components/calendar/package.json @@ -46,7 +46,6 @@ "@nextui-org/framer-utils": "workspace:*", "@nextui-org/use-aria-button": "workspace:*", "@nextui-org/button": "workspace:*", - "lodash.debounce": "^4.0.8", "@internationalized/date": "^3.5.4", "@react-aria/calendar": "3.5.8", "@react-aria/focus": "3.17.1", @@ -59,8 +58,7 @@ "@react-types/calendar": "3.4.6", "@react-aria/interactions": "3.21.3", "@react-types/shared": "3.23.1", - "scroll-into-view-if-needed": "3.0.10", - "@types/lodash.debounce": "^4.0.7" + "scroll-into-view-if-needed": "3.0.10" }, "devDependencies": { "@nextui-org/system": "workspace:*", diff --git a/packages/components/calendar/src/use-calendar-picker.ts b/packages/components/calendar/src/use-calendar-picker.ts index ff9dce3109..189004d567 100644 --- a/packages/components/calendar/src/use-calendar-picker.ts +++ b/packages/components/calendar/src/use-calendar-picker.ts @@ -4,8 +4,8 @@ import type {PressEvent} from "@react-types/shared"; import {useDateFormatter} from "@react-aria/i18n"; import {HTMLNextUIProps} from "@nextui-org/system"; import {useCallback, useRef, useEffect} from "react"; -import debounce from "lodash.debounce"; import {areRectsIntersecting} from "@nextui-org/react-utils"; +import {debounce} from "@nextui-org/shared-utils"; import scrollIntoView from "scroll-into-view-if-needed"; import {getMonthsInYear, getYearRange} from "./utils"; diff --git a/packages/core/theme/__tests__/semantic-colors.test.ts b/packages/core/theme/__tests__/semantic-colors.test.ts index 45d6effb6a..b40691f298 100644 --- a/packages/core/theme/__tests__/semantic-colors.test.ts +++ b/packages/core/theme/__tests__/semantic-colors.test.ts @@ -1,5 +1,4 @@ import {getContrast} from "color2k"; -import get from "lodash.get"; import {semanticColors} from "../src/colors/semantic"; @@ -8,10 +7,13 @@ type Guideline = keyof typeof guidelines; const guidelines = {decorative: 1.5, readable: 3, aa: 4.5, aaa: 7}; const targetGuideline: Guideline = "readable"; -const testGoodContrast = (colorPath: string, backgroundPath: string, standard: Guideline) => { - const color = get(semanticColors, colorPath); - const background = get(semanticColors, backgroundPath); - +const testGoodContrast = ( + colorPath: string, + color: string, + backgroundPath: string, + background: string, + standard: Guideline, +) => { it(`${colorPath}(${color}) has enough contrast with ${backgroundPath}(${background}) to be ${standard}`, () => { expect(getContrast(color, background)).toBeGreaterThanOrEqual(guidelines[standard]); }); @@ -20,14 +22,44 @@ const testGoodContrast = (colorPath: string, backgroundPath: string, standard: G describe("semanticColors", () => { ["light", "dark"].forEach((mode) => { describe(mode, () => { - testGoodContrast(`${mode}.divider.DEFAULT`, `${mode}.background.DEFAULT`, "decorative"); - testGoodContrast(`${mode}.foreground.DEFAULT`, `${mode}.background.DEFAULT`, targetGuideline); + testGoodContrast( + `${mode}.divider.DEFAULT`, + semanticColors[mode]?.divider?.DEFAULT, + `${mode}.background.DEFAULT`, + semanticColors[mode]?.background?.DEFAULT, + "decorative", + ); + testGoodContrast( + `${mode}.foreground.DEFAULT`, + semanticColors[mode]?.foreground?.DEFAULT, + `${mode}.background.DEFAULT`, + semanticColors[mode]?.background?.DEFAULT, + targetGuideline, + ); ["default", "content1", "content2", "content3", "content4"].forEach((name) => { - testGoodContrast(`${mode}.foreground.DEFAULT`, `${mode}.${name}.DEFAULT`, targetGuideline); - testGoodContrast(`${mode}.${name}.foreground`, `${mode}.${name}.DEFAULT`, targetGuideline); + testGoodContrast( + `${mode}.foreground.DEFAULT`, + semanticColors[mode]?.foreground?.DEFAULT, + `${mode}.${name}.DEFAULT`, + semanticColors[mode]?.[name]?.DEFAULT, + targetGuideline, + ); + testGoodContrast( + `${mode}.${name}.foreground`, + semanticColors[mode]?.[name]?.foreground, + `${mode}.${name}.DEFAULT`, + semanticColors[mode]?.[name]?.DEFAULT, + targetGuideline, + ); }); ["primary", "secondary", "success", "warning", "danger"].forEach((name) => { - testGoodContrast(`${mode}.${name}.foreground`, `${mode}.${name}.DEFAULT`, targetGuideline); + testGoodContrast( + `${mode}.${name}.foreground`, + semanticColors[mode]?.[name]?.foreground, + `${mode}.${name}.DEFAULT`, + semanticColors[mode]?.[name]?.DEFAULT, + targetGuideline, + ); }); }); }); diff --git a/packages/core/theme/package.json b/packages/core/theme/package.json index a188aac775..875042efb5 100644 --- a/packages/core/theme/package.json +++ b/packages/core/theme/package.json @@ -50,14 +50,10 @@ "color2k": "^2.0.2", "deepmerge": "4.3.1", "flat": "^5.0.2", - "lodash.foreach": "^4.5.0", - "lodash.get": "^4.4.2", - "lodash.kebabcase": "^4.1.1", - "lodash.mapkeys": "^4.6.0", - "lodash.omit": "^4.5.0", "clsx": "^1.2.1", "tailwind-variants": "^0.1.20", - "tailwind-merge": "^1.14.0" + "tailwind-merge": "^1.14.0", + "@nextui-org/shared-utils": "workspace:*" }, "peerDependencies": { "tailwindcss": ">=3.4.0" @@ -65,11 +61,6 @@ "devDependencies": { "@types/color": "^3.0.3", "@types/flat": "^5.0.2", - "@types/lodash.foreach": "^4.5.7", - "@types/lodash.get": "^4.4.7", - "@types/lodash.kebabcase": "^4.1.7", - "@types/lodash.mapkeys": "^4.6.7", - "@types/lodash.omit": "^4.5.7", "tailwindcss": "^3.4.0", "clean-package": "2.2.0" }, diff --git a/packages/core/theme/src/plugin.ts b/packages/core/theme/src/plugin.ts index c3bcbdfd91..6fc522aa99 100644 --- a/packages/core/theme/src/plugin.ts +++ b/packages/core/theme/src/plugin.ts @@ -5,12 +5,8 @@ import Color from "color"; import plugin from "tailwindcss/plugin.js"; -import get from "lodash.get"; -import omit from "lodash.omit"; -import forEach from "lodash.foreach"; -import mapKeys from "lodash.mapkeys"; -import kebabCase from "lodash.kebabcase"; import deepMerge from "deepmerge"; +import {omit, kebabCase} from "@nextui-org/shared-utils"; import {semanticColors, commonColors} from "./colors"; import {animations} from "./animations"; @@ -27,6 +23,7 @@ const DEFAULT_PREFIX = "nextui"; const parsedColorsCache: Record = {}; // @internal + const resolveConfig = ( themes: ConfigThemes = {}, defaultTheme: DefaultThemeType, @@ -63,7 +60,13 @@ const resolveConfig = ( // flatten color definitions const flatColors = flattenThemeObject(colors) as Record; - const flatLayout = layout ? mapKeys(layout, (value, key) => kebabCase(key)) : {}; + const flatLayout = layout + ? Object.keys(layout).reduce((acc, key) => { + acc[kebabCase(key)] = (layout as Record)[key]; + + return acc; + }, {} as Record) + : {}; // resolved.variants resolved.variants.push({ @@ -246,8 +249,8 @@ export const nextui = (config: NextUIPluginConfig = {}): ReturnType { + Object.entries(otherThemes).forEach(([themeName, {extend, colors, layout}]) => { const baseTheme = extend && isBaseTheme(extend) ? extend : defaultExtendTheme; if (colors && typeof colors === "object") { @@ -283,12 +286,12 @@ export const nextui = (config: NextUIPluginConfig = {}): ReturnType=18" }, diff --git a/packages/hooks/use-infinite-scroll/src/index.ts b/packages/hooks/use-infinite-scroll/src/index.ts index 7c9f0542ae..d71dce7fdc 100644 --- a/packages/hooks/use-infinite-scroll/src/index.ts +++ b/packages/hooks/use-infinite-scroll/src/index.ts @@ -1,4 +1,3 @@ -import debounce from "lodash.debounce"; import {useLayoutEffect, useRef} from "react"; export interface UseInfiniteScrollProps { @@ -26,6 +25,25 @@ export interface UseInfiniteScrollProps { onLoadMore?: () => void; } +function debounce void>(func: F, waitMilliseconds: number = 0) { + let timeout: ReturnType | undefined; + + return function (this: ThisParameterType, ...args: Parameters) { + const context = this; + + const later = () => { + timeout = undefined; + func.apply(context, args); + }; + + if (timeout !== undefined) { + clearTimeout(timeout); + } + + timeout = setTimeout(later, waitMilliseconds); + }; +} + export function useInfiniteScroll(props: UseInfiniteScrollProps = {}) { const {hasMore, distance = 250, isEnabled = true, shouldUseLoader = true, onLoadMore} = props; diff --git a/packages/utilities/shared-utils/src/functions.ts b/packages/utilities/shared-utils/src/functions.ts index 2663a84a6f..8cf60fa5fa 100644 --- a/packages/utilities/shared-utils/src/functions.ts +++ b/packages/utilities/shared-utils/src/functions.ts @@ -10,11 +10,11 @@ type Extractable = /** * Capitalizes the first letter of a string - * @param {string} text + * @param {string} s * @returns {string} */ -export const capitalize = (text: string) => { - return text.charAt(0).toUpperCase() + text.slice(1); +export const capitalize = (s: string) => { + return s ? s.charAt(0).toUpperCase() + s.slice(1).toLowerCase() : ""; }; export function callAllHandlers void>(...fns: (T | undefined)[]) { @@ -79,3 +79,47 @@ export function objectToDeps(obj: Extractable) { return ""; } } + +export function debounce void>( + func: F, + waitMilliseconds: number = 0, +) { + let timeout: ReturnType | undefined; + + return function (this: ThisParameterType, ...args: Parameters) { + const context = this; + + const later = () => { + timeout = undefined; + func.apply(context, args); + }; + + if (timeout !== undefined) { + clearTimeout(timeout); + } + + timeout = setTimeout(later, waitMilliseconds); + }; +} + +export function uniqBy(arr: T[], iteratee: any) { + if (typeof iteratee === "string") { + iteratee = (item: T) => item[iteratee as keyof T]; + } + + return arr.filter((x, i, self) => i === self.findIndex((y) => iteratee(x) === iteratee(y))); +} + +export const omit = (obj: Obj, keys: Keys[]): Omit => { + const res = Object.assign({}, obj); + + keys.forEach((key) => { + delete res[key]; + }); + + return res; +}; + +export const kebabCase = (s: string) => { + return s.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b60736bbb7..50dda1c9e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -533,8 +533,8 @@ importers: specifier: ^1.4.2 version: 1.6.4 '@types/lodash': - specifier: ^4.14.194 - version: 4.17.0 + specifier: ^4.17.5 + version: 4.17.5 '@types/marked': specifier: ^5.0.0 version: 5.0.2 @@ -1030,12 +1030,6 @@ importers: '@react-types/shared': specifier: 3.23.1 version: 3.23.1(react@18.2.0) - '@types/lodash.debounce': - specifier: ^4.0.7 - version: 4.0.9 - lodash.debounce: - specifier: ^4.0.8 - version: 4.0.8 scroll-into-view-if-needed: specifier: 3.0.10 version: 3.0.10 @@ -3044,6 +3038,9 @@ importers: packages/core/theme: dependencies: + '@nextui-org/shared-utils': + specifier: workspace:* + version: link:../../utilities/shared-utils clsx: specifier: ^1.2.1 version: 1.2.1 @@ -3059,21 +3056,6 @@ importers: flat: specifier: ^5.0.2 version: 5.0.2 - lodash.foreach: - specifier: ^4.5.0 - version: 4.5.0 - lodash.get: - specifier: ^4.4.2 - version: 4.4.2 - lodash.kebabcase: - specifier: ^4.1.1 - version: 4.1.1 - lodash.mapkeys: - specifier: ^4.6.0 - version: 4.6.0 - lodash.omit: - specifier: ^4.5.0 - version: 4.5.0 tailwind-merge: specifier: ^1.14.0 version: 1.14.0 @@ -3087,21 +3069,6 @@ importers: '@types/flat': specifier: ^5.0.2 version: 5.0.5 - '@types/lodash.foreach': - specifier: ^4.5.7 - version: 4.5.9 - '@types/lodash.get': - specifier: ^4.4.7 - version: 4.4.9 - '@types/lodash.kebabcase': - specifier: ^4.1.7 - version: 4.1.9 - '@types/lodash.mapkeys': - specifier: ^4.6.7 - version: 4.6.9 - '@types/lodash.omit': - specifier: ^4.5.7 - version: 4.5.9 clean-package: specifier: 2.2.0 version: 2.2.0 @@ -3425,13 +3392,6 @@ importers: version: 18.2.0 packages/hooks/use-infinite-scroll: - dependencies: - '@types/lodash.debounce': - specifier: ^4.0.7 - version: 4.0.9 - lodash.debounce: - specifier: ^4.0.8 - version: 4.0.8 devDependencies: clean-package: specifier: 2.2.0 @@ -11034,7 +10994,7 @@ packages: '@storybook/preview-api': 7.6.17 '@storybook/theming': 7.6.17(react-dom@18.2.0)(react@18.2.0) '@storybook/types': 7.6.17 - '@types/lodash': 4.17.0 + '@types/lodash': 4.17.5 color-convert: 2.0.1 dequal: 2.0.3 lodash: 4.17.21 @@ -12166,45 +12126,10 @@ packages: '@types/node': 15.14.9 dev: true - /@types/lodash.debounce@4.0.9: - resolution: {integrity: sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ==} - dependencies: - '@types/lodash': 4.17.0 - dev: false - - /@types/lodash.foreach@4.5.9: - resolution: {integrity: sha512-vmq0p/FK66PsALXRmK/qsnlLlCpnudvozWYrxJImHujHhXMADdeoPEY10zwmu26437w85wCvdxUqpFi+ALtkiQ==} - dependencies: - '@types/lodash': 4.17.0 - dev: true - - /@types/lodash.get@4.4.9: - resolution: {integrity: sha512-J5dvW98sxmGnamqf+/aLP87PYXyrha9xIgc2ZlHl6OHMFR2Ejdxep50QfU0abO1+CH6+ugx+8wEUN1toImAinA==} - dependencies: - '@types/lodash': 4.17.0 + /@types/lodash@4.17.5: + resolution: {integrity: sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==} dev: true - /@types/lodash.kebabcase@4.1.9: - resolution: {integrity: sha512-kPrrmcVOhSsjAVRovN0lRfrbuidfg0wYsrQa5IYuoQO1fpHHGSme66oyiYA/5eQPVl8Z95OA3HG0+d2SvYC85w==} - dependencies: - '@types/lodash': 4.17.0 - dev: true - - /@types/lodash.mapkeys@4.6.9: - resolution: {integrity: sha512-6/ERBCabeDI656LsV+oopLjdnJ/x1PCAE6kkkssH8e4i0K7Pw307noxHCbUc6cAVfTo9vx0Z+k3QZwy1IrUZcA==} - dependencies: - '@types/lodash': 4.17.0 - dev: true - - /@types/lodash.omit@4.5.9: - resolution: {integrity: sha512-zuAVFLUPJMOzsw6yawshsYGgq2hWUHtsZgeXHZmSFhaQQFC6EQ021uDKHkSjOpNhSvtNSU9165/o3o/Q51GpTw==} - dependencies: - '@types/lodash': 4.17.0 - dev: true - - /@types/lodash@4.17.0: - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} - /@types/marked@5.0.2: resolution: {integrity: sha512-OucS4KMHhFzhz27KxmWg7J+kIYqyqoW5kdIEI319hqARQQUTqhao3M/F+uFnDXD0Rg72iDDZxZNxq5gvctmLlg==} dev: true @@ -20311,12 +20236,9 @@ packages: /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - /lodash.foreach@4.5.0: - resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==} - dev: false - /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true /lodash.isfunction@3.0.9: resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} @@ -20328,10 +20250,7 @@ packages: /lodash.kebabcase@4.1.1: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - - /lodash.mapkeys@4.6.0: - resolution: {integrity: sha512-0Al+hxpYvONWtg+ZqHpa/GaVzxuN3V7Xeo2p+bY06EaK/n+Y9R7nBePPN2o1LxmL0TWQSwP8LYZ008/hc9JzhA==} - dev: false + dev: true /lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} @@ -20344,10 +20263,6 @@ packages: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} dev: true - /lodash.omit@4.5.0: - resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} - dev: false - /lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} dev: true