From 87528a38290a6a120c3ee008783f7a8fa7ff0db5 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 18:26:11 +0800 Subject: [PATCH 01/33] refactor(theme): replace lodash code --- packages/core/theme/src/plugin.ts | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/core/theme/src/plugin.ts b/packages/core/theme/src/plugin.ts index c3bcbdfd91..db49c71cd6 100644 --- a/packages/core/theme/src/plugin.ts +++ b/packages/core/theme/src/plugin.ts @@ -5,11 +5,6 @@ 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 {semanticColors, commonColors} from "./colors"; @@ -27,6 +22,10 @@ const DEFAULT_PREFIX = "nextui"; const parsedColorsCache: Record = {}; // @internal +const kebabCase = (str: string) => { + return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); +}; + const resolveConfig = ( themes: ConfigThemes = {}, defaultTheme: DefaultThemeType, @@ -63,7 +62,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 +251,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 +289,12 @@ export const nextui = (config: NextUIPluginConfig = {}): ReturnType Date: Mon, 24 Jun 2024 18:37:03 +0800 Subject: [PATCH 02/33] refactor(deps): remove lodash packages --- packages/core/theme/package.json | 10 ----- pnpm-lock.yaml | 74 +------------------------------- 2 files changed, 2 insertions(+), 82 deletions(-) diff --git a/packages/core/theme/package.json b/packages/core/theme/package.json index a188aac775..dad617acd5 100644 --- a/packages/core/theme/package.json +++ b/packages/core/theme/package.json @@ -50,11 +50,6 @@ "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" @@ -65,11 +60,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/pnpm-lock.yaml b/pnpm-lock.yaml index b60736bbb7..503ac20cbb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3059,21 +3059,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 +3072,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 @@ -12172,36 +12142,6 @@ packages: '@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 - 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==} @@ -20311,12 +20251,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 +20265,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 +20278,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 From 30a967fec81cfc2b160c5dbfd83f7beba489ad28 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 18:57:56 +0800 Subject: [PATCH 03/33] refactor(theme): replace lodash get usage --- .../theme/__tests__/semantic-colors.test.ts | 52 +++++++++++++++---- 1 file changed, 42 insertions(+), 10 deletions(-) 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, + ); }); }); }); From 16560e728e15b8993507cdf3d10d1bb3f7b79d26 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 19:25:49 +0800 Subject: [PATCH 04/33] refactor(use-infinite-scroll): replace lodash debounce --- .../hooks/use-infinite-scroll/package.json | 4 ---- .../hooks/use-infinite-scroll/src/index.ts | 20 ++++++++++++++++++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/packages/hooks/use-infinite-scroll/package.json b/packages/hooks/use-infinite-scroll/package.json index 1ff2d5ca36..63c733b439 100644 --- a/packages/hooks/use-infinite-scroll/package.json +++ b/packages/hooks/use-infinite-scroll/package.json @@ -33,10 +33,6 @@ "prepack": "clean-package", "postpack": "clean-package restore" }, - "dependencies": { - "lodash.debounce": "^4.0.8", - "@types/lodash.debounce": "^4.0.7" - }, "peerDependencies": { "react": ">=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; From 74d431e402a92e90f2024ec0b9e7c156e8747f4c Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 19:26:03 +0800 Subject: [PATCH 05/33] refactor(calendar): replace lodash debounce --- packages/components/calendar/package.json | 4 +--- .../calendar/src/use-calendar-picker.ts | 20 ++++++++++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) 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..57a71ecc05 100644 --- a/packages/components/calendar/src/use-calendar-picker.ts +++ b/packages/components/calendar/src/use-calendar-picker.ts @@ -4,7 +4,6 @@ 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 scrollIntoView from "scroll-into-view-if-needed"; @@ -83,6 +82,25 @@ export function useCalendarPicker(props: CalendarPickerProps) { } } + 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); + }; + } + const handleListScroll = useCallback( (e: Event, highlightEl: HTMLElement | null, list: CalendarPickerListType) => { if (!(e.target instanceof HTMLElement)) return; From 79bd8cea6f951606eba330e570a02ea6f659c432 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 19:45:39 +0800 Subject: [PATCH 06/33] refactor(docs): replace lodash captialize function --- apps/docs/app/examples/table/custom-styles/page.tsx | 2 +- apps/docs/app/examples/table/use-case/page.tsx | 2 +- apps/docs/content/components/table/custom-styles.ts | 4 ++-- apps/docs/content/components/table/use-case.ts | 8 ++++---- packages/utilities/shared-utils/src/functions.ts | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) 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/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/packages/utilities/shared-utils/src/functions.ts b/packages/utilities/shared-utils/src/functions.ts index 2663a84a6f..514417db27 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)[]) { From 84eaa295233d604a18b2da3b3120ad2381cd67b8 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 19:48:49 +0800 Subject: [PATCH 07/33] refactor(docs): replace lodash isEmpty --- apps/docs/components/cmdk.tsx | 3 ++- apps/docs/components/docs/components/swatch-colors-set.tsx | 3 ++- apps/docs/components/docs/sidebar.tsx | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/docs/components/cmdk.tsx b/apps/docs/components/cmdk.tsx index 25a33d03f5..36a1f65b10 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 {intersectionBy} from "lodash"; +import {isEmpty} from "@nextui-org/shared-utils"; import {writeStorage, useLocalStorage} from "@rehooks/local-storage"; import { diff --git a/apps/docs/components/docs/components/swatch-colors-set.tsx b/apps/docs/components/docs/components/swatch-colors-set.tsx index 319e9e72e0..b75e5df244 100644 --- a/apps/docs/components/docs/components/swatch-colors-set.tsx +++ b/apps/docs/components/docs/components/swatch-colors-set.tsx @@ -4,7 +4,8 @@ import {commonColors, semanticColors} 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 {get} from "lodash"; +import {isEmpty} from "@nextui-org/shared-utils"; type ColorsItem = { color: string; 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"; From f17abf7d575d6266d160ab1c7497acb1a84de8f0 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 19:49:17 +0800 Subject: [PATCH 08/33] feat(shared-utils): add isEmpty function --- packages/utilities/shared-utils/src/functions.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/utilities/shared-utils/src/functions.ts b/packages/utilities/shared-utils/src/functions.ts index 514417db27..d5ac321450 100644 --- a/packages/utilities/shared-utils/src/functions.ts +++ b/packages/utilities/shared-utils/src/functions.ts @@ -79,3 +79,9 @@ export function objectToDeps(obj: Extractable) { return ""; } } + +export function isEmpty(obj: Extractable) { + return ( + [Object, Array].includes(((obj || {}) as any).constructor) && !Object.entries(obj || {}).length + ); +} From e795c092783ccf9c2ccf946982aeb9b29e6a7371 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 19:58:07 +0800 Subject: [PATCH 09/33] refactor(docs): replace lodash toLower --- apps/docs/components/demo-code-modal.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/docs/components/demo-code-modal.tsx b/apps/docs/components/demo-code-modal.tsx index baf2e1dede..2dc4ff4d6a 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,7 @@ export const DemoCodeModal: FC = ({isOpen, code, title, subt const isMobile = useIsMobile(); - const lowerTitle = toLower(title); - const fileName = `${toLower(lowerTitle)}.tsx`; + const fileName = `${title.toLowerCase()}.tsx`; return ( Date: Mon, 24 Jun 2024 21:28:58 +0800 Subject: [PATCH 10/33] refactor(docs): replace lodash get --- .../docs/components/docs/components/code-demo/utils.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/docs/components/docs/components/code-demo/utils.ts b/apps/docs/components/docs/components/code-demo/utils.ts index f4c6714d5d..5119c3b0a8 100644 --- a/apps/docs/components/docs/components/code-demo/utils.ts +++ b/apps/docs/components/docs/components/code-demo/utils.ts @@ -1,17 +1,19 @@ -import {get} from "lodash"; - import {FileCode} from "./types"; const importRegex = /^(import)\s(?!type(of\s|\s)(?!from)).*?$/gm; const exportDefaultRegex = /export\s+default\s+function\s+\w+\s*\(\s*\)\s*\{/; -export const transformCode = (code: string, imports = {}, compName = "App") => { +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 From 0bcbf501c7431ca954f365a57d3a174cef6cbec6 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 21:30:40 +0800 Subject: [PATCH 11/33] refactor(docs): replace lodash includes --- apps/docs/components/navbar.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) 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")} > From 7631c00ff543d96b14823467234b16554639c4ca Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 21:34:06 +0800 Subject: [PATCH 12/33] refactor(docs): replace lodash capitalize & last --- apps/docs/components/sandpack/bugreport-button.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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"); From 3cd96a0770f302febc404b09e92fb426223492ae Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 21:36:24 +0800 Subject: [PATCH 13/33] refactor(docs): replace lodash clamp & get --- apps/docs/components/marketing/support.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/docs/components/marketing/support.tsx b/apps/docs/components/marketing/support.tsx index 8bce9750db..ec640ca648 100644 --- a/apps/docs/components/marketing/support.tsx +++ b/apps/docs/components/marketing/support.tsx @@ -2,7 +2,7 @@ import {FC, useMemo, useRef} from "react"; import {Avatar, AvatarProps, Button, Spacer, Tooltip} from "@nextui-org/react"; -import {clamp, get} from "lodash"; +import {clamp} from "@nextui-org/shared-utils"; import {sectionWrapper, titleWrapper, title, subtitle} from "../primitives"; @@ -132,9 +132,7 @@ export const Support: FC = ({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"])} /> ))} From 5efa8fe305ffde773888909809c754cdec62b11f Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 21:36:45 +0800 Subject: [PATCH 14/33] feat(shared-utils): add clamp --- packages/utilities/shared-utils/src/functions.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/utilities/shared-utils/src/functions.ts b/packages/utilities/shared-utils/src/functions.ts index d5ac321450..46d878e12a 100644 --- a/packages/utilities/shared-utils/src/functions.ts +++ b/packages/utilities/shared-utils/src/functions.ts @@ -85,3 +85,15 @@ export function isEmpty(obj: Extractable) { [Object, Array].includes(((obj || {}) as any).constructor) && !Object.entries(obj || {}).length ); } + +export function clamp(number: number, boundOne: number, boundTwo: number) { + if (!boundTwo) { + return Math.max(number, boundOne) === boundOne ? number : boundOne; + } else if (Math.min(number, boundOne) === number) { + return boundOne; + } else if (Math.max(number, boundTwo) === number) { + return boundTwo; + } + + return number; +} From 041e626707aef407a9ffb4f4769b06c50dedb229 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 21:45:48 +0800 Subject: [PATCH 15/33] refactor(docs): replace lodash intersectionBy --- apps/docs/components/cmdk.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/docs/components/cmdk.tsx b/apps/docs/components/cmdk.tsx index 36a1f65b10..34b0780276 100644 --- a/apps/docs/components/cmdk.tsx +++ b/apps/docs/components/cmdk.tsx @@ -13,8 +13,7 @@ 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} from "lodash"; -import {isEmpty} from "@nextui-org/shared-utils"; +import {isEmpty, intersectionBy} from "@nextui-org/shared-utils"; import {writeStorage, useLocalStorage} from "@rehooks/local-storage"; import { From 4ac3a72629b9a46b5b5b1cc7878bb5163280fc02 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 22:07:35 +0800 Subject: [PATCH 16/33] refactor(docs): replace lodash get --- apps/docs/components/marketing/custom-themes/custom-themes.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 = () => { Date: Mon, 24 Jun 2024 22:10:19 +0800 Subject: [PATCH 17/33] refactor(docs): replace lodash debounce --- apps/docs/components/docs/components/codeblock.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/components/docs/components/codeblock.tsx b/apps/docs/components/docs/components/codeblock.tsx index 8d4f61cbf1..a07a5e83a0 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} from "@nextui-org/shared-utils"; import defaultTheme from "@/libs/prism-theme"; From 7ec3f31d5800490ecd8fa1be9e9cec4b820bf5a1 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 22:10:49 +0800 Subject: [PATCH 18/33] refactor(shared-utils): add debounce --- .../utilities/shared-utils/src/functions.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/utilities/shared-utils/src/functions.ts b/packages/utilities/shared-utils/src/functions.ts index 46d878e12a..aff4f72e12 100644 --- a/packages/utilities/shared-utils/src/functions.ts +++ b/packages/utilities/shared-utils/src/functions.ts @@ -97,3 +97,25 @@ export function clamp(number: number, boundOne: number, boundTwo: number) { return number; } + +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); + }; +} From b047210f26cadc0bd7ab705b3c381c91c1fb4990 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 22:11:08 +0800 Subject: [PATCH 19/33] refactor(calendar): use debounce from shared-utils --- .../calendar/src/use-calendar-picker.ts | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/packages/components/calendar/src/use-calendar-picker.ts b/packages/components/calendar/src/use-calendar-picker.ts index 57a71ecc05..189004d567 100644 --- a/packages/components/calendar/src/use-calendar-picker.ts +++ b/packages/components/calendar/src/use-calendar-picker.ts @@ -5,6 +5,7 @@ import {useDateFormatter} from "@react-aria/i18n"; import {HTMLNextUIProps} from "@nextui-org/system"; import {useCallback, useRef, useEffect} from "react"; 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"; @@ -82,25 +83,6 @@ export function useCalendarPicker(props: CalendarPickerProps) { } } - 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); - }; - } - const handleListScroll = useCallback( (e: Event, highlightEl: HTMLElement | null, list: CalendarPickerListType) => { if (!(e.target instanceof HTMLElement)) return; From de138262e02f438bbaa776d596a5ba1316e815bb Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 22:18:47 +0800 Subject: [PATCH 20/33] refactor(docs): replace lodash uniqBy --- apps/docs/utils/get-sponsors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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"; From baae196551dee5295ebc63559935271a52aca06c Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 22:35:22 +0800 Subject: [PATCH 21/33] feat(shared-utils): add uniqBy --- packages/utilities/shared-utils/src/functions.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/utilities/shared-utils/src/functions.ts b/packages/utilities/shared-utils/src/functions.ts index aff4f72e12..7d1fa93090 100644 --- a/packages/utilities/shared-utils/src/functions.ts +++ b/packages/utilities/shared-utils/src/functions.ts @@ -119,3 +119,11 @@ export function debounce void>( 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))); +} From f5e2d196268f862a00b273ebd8872239b08dddb5 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 22:55:32 +0800 Subject: [PATCH 22/33] refactor(docs): replace lodash get --- .../components/docs/components/swatch-colors-set.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/docs/components/docs/components/swatch-colors-set.tsx b/apps/docs/components/docs/components/swatch-colors-set.tsx index b75e5df244..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,9 @@ 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} from "lodash"; import {isEmpty} from "@nextui-org/shared-utils"; type ColorsItem = { @@ -107,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 = () => { From b1df0b93cae1b3c68c7d9834dc5afe43053fed88 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Mon, 24 Jun 2024 22:57:02 +0800 Subject: [PATCH 23/33] chore(deps): remove lodash dependencies --- apps/docs/package.json | 2 -- pnpm-lock.yaml | 27 ++------------------------- 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/apps/docs/package.json b/apps/docs/package.json index 40a930ee94..62a8dfdc90 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -59,7 +59,6 @@ "github-slugger": "^2.0.0", "gray-matter": "^4.0.3", "hast-util-to-html": "7.1.2", - "lodash": "^4.17.21", "marked": "^5.1.0", "match-sorter": "^6.3.1", "mini-svg-data-uri": "^1.4.3", @@ -104,7 +103,6 @@ "@react-types/shared": "3.23.1", "@tailwindcss/typography": "^0.5.9", "@types/canvas-confetti": "^1.4.2", - "@types/lodash": "^4.14.194", "@types/marked": "^5.0.0", "@types/mdx": "^2.0.5", "@types/node": "20.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 503ac20cbb..6dcbe242da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -402,9 +402,6 @@ importers: hast-util-to-html: specifier: 7.1.2 version: 7.1.2 - lodash: - specifier: ^4.17.21 - version: 4.17.21 marked: specifier: ^5.1.0 version: 5.1.2 @@ -532,9 +529,6 @@ importers: '@types/canvas-confetti': specifier: ^1.4.2 version: 1.6.4 - '@types/lodash': - specifier: ^4.14.194 - version: 4.17.0 '@types/marked': specifier: ^5.0.0 version: 5.0.2 @@ -1030,12 +1024,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 @@ -3395,13 +3383,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 @@ -12136,14 +12117,9 @@ 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@4.17.0: resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} + dev: true /@types/marked@5.0.2: resolution: {integrity: sha512-OucS4KMHhFzhz27KxmWg7J+kIYqyqoW5kdIEI319hqARQQUTqhao3M/F+uFnDXD0Rg72iDDZxZNxq5gvctmLlg==} @@ -20321,6 +20297,7 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} From febed4dcd4599c2af1d40709dad0d939c5568dfc Mon Sep 17 00:00:00 2001 From: WK Wong Date: Tue, 25 Jun 2024 00:14:30 +0800 Subject: [PATCH 24/33] fix(docs): add back lowerTitle --- apps/docs/components/demo-code-modal.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/docs/components/demo-code-modal.tsx b/apps/docs/components/demo-code-modal.tsx index 2dc4ff4d6a..31c9996d91 100644 --- a/apps/docs/components/demo-code-modal.tsx +++ b/apps/docs/components/demo-code-modal.tsx @@ -29,7 +29,8 @@ export const DemoCodeModal: FC = ({isOpen, code, title, subt const isMobile = useIsMobile(); - const fileName = `${title.toLowerCase()}.tsx`; + const lowerTitle = title.toLowerCase(); + const fileName = `${lowerTitle}.tsx`; return ( Date: Tue, 25 Jun 2024 00:20:35 +0800 Subject: [PATCH 25/33] chore(deps): include @nextui-org/shared-utils --- packages/core/theme/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/theme/package.json b/packages/core/theme/package.json index dad617acd5..875042efb5 100644 --- a/packages/core/theme/package.json +++ b/packages/core/theme/package.json @@ -52,7 +52,8 @@ "flat": "^5.0.2", "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" From c0f22a4b3a941ec1560a26814afda8f263257e7d Mon Sep 17 00:00:00 2001 From: WK Wong Date: Tue, 25 Jun 2024 00:21:11 +0800 Subject: [PATCH 26/33] chore(theme): move kebabCase to shared-utils and use omit --- packages/core/theme/src/plugin.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/core/theme/src/plugin.ts b/packages/core/theme/src/plugin.ts index db49c71cd6..6fc522aa99 100644 --- a/packages/core/theme/src/plugin.ts +++ b/packages/core/theme/src/plugin.ts @@ -6,6 +6,7 @@ import Color from "color"; import plugin from "tailwindcss/plugin.js"; import deepMerge from "deepmerge"; +import {omit, kebabCase} from "@nextui-org/shared-utils"; import {semanticColors, commonColors} from "./colors"; import {animations} from "./animations"; @@ -22,9 +23,6 @@ const DEFAULT_PREFIX = "nextui"; const parsedColorsCache: Record = {}; // @internal -const kebabCase = (str: string) => { - return str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); -}; const resolveConfig = ( themes: ConfigThemes = {}, @@ -271,8 +269,7 @@ export const nextui = (config: NextUIPluginConfig = {}): ReturnType { const baseTheme = extend && isBaseTheme(extend) ? extend : defaultExtendTheme; From 25a33a8bc54c8f14b80526f3b947ab740d4c95a3 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Tue, 25 Jun 2024 00:21:25 +0800 Subject: [PATCH 27/33] fix(docs): add missing omit import --- apps/docs/components/docs/components/codeblock.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/components/docs/components/codeblock.tsx b/apps/docs/components/docs/components/codeblock.tsx index a07a5e83a0..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} from "@nextui-org/shared-utils"; +import {debounce, omit} from "@nextui-org/shared-utils"; import defaultTheme from "@/libs/prism-theme"; From a8274988cfafab6abb6383cc94c59f6acd95b5b0 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Tue, 25 Jun 2024 00:25:18 +0800 Subject: [PATCH 28/33] chore(deps): pnpm-lock.yaml --- pnpm-lock.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6dcbe242da..761d807cfc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3032,6 +3032,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 From 522596e915df8eecf96189a002d23d6f92122133 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Tue, 25 Jun 2024 00:51:22 +0800 Subject: [PATCH 29/33] chore(deps): keep lodash for intersectionBy --- apps/docs/package.json | 2 ++ pnpm-lock.yaml | 13 +++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/docs/package.json b/apps/docs/package.json index 62a8dfdc90..bfaf58848c 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -59,6 +59,7 @@ "github-slugger": "^2.0.0", "gray-matter": "^4.0.3", "hast-util-to-html": "7.1.2", + "lodash": "^4.17.21", "marked": "^5.1.0", "match-sorter": "^6.3.1", "mini-svg-data-uri": "^1.4.3", @@ -103,6 +104,7 @@ "@react-types/shared": "3.23.1", "@tailwindcss/typography": "^0.5.9", "@types/canvas-confetti": "^1.4.2", + "@types/lodash": "^4.17.5", "@types/marked": "^5.0.0", "@types/mdx": "^2.0.5", "@types/node": "20.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 761d807cfc..50dda1c9e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -402,6 +402,9 @@ importers: hast-util-to-html: specifier: 7.1.2 version: 7.1.2 + lodash: + specifier: ^4.17.21 + version: 4.17.21 marked: specifier: ^5.1.0 version: 5.1.2 @@ -529,6 +532,9 @@ importers: '@types/canvas-confetti': specifier: ^1.4.2 version: 1.6.4 + '@types/lodash': + specifier: ^4.17.5 + version: 4.17.5 '@types/marked': specifier: ^5.0.0 version: 5.0.2 @@ -10988,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 @@ -12120,8 +12126,8 @@ packages: '@types/node': 15.14.9 dev: true - /@types/lodash@4.17.0: - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} + /@types/lodash@4.17.5: + resolution: {integrity: sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==} dev: true /@types/marked@5.0.2: @@ -20300,7 +20306,6 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} From 93996d935b52970689d6ecac1e415b794f1500bd Mon Sep 17 00:00:00 2001 From: WK Wong Date: Tue, 25 Jun 2024 00:51:40 +0800 Subject: [PATCH 30/33] refactor(docs): tree shake intersectionBy --- apps/docs/components/cmdk.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/docs/components/cmdk.tsx b/apps/docs/components/cmdk.tsx index 34b0780276..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 {isEmpty, intersectionBy} from "@nextui-org/shared-utils"; +import {isEmpty} from "@nextui-org/shared-utils"; +import intersectionBy from "lodash/intersectionBy"; import {writeStorage, useLocalStorage} from "@rehooks/local-storage"; import { From c54c9c89befbc24b867c5c7e6c31d80cd9e2f65f Mon Sep 17 00:00:00 2001 From: WK Wong Date: Tue, 25 Jun 2024 00:52:13 +0800 Subject: [PATCH 31/33] feat(shared-utils): add omit and kebabCase --- packages/utilities/shared-utils/src/functions.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/utilities/shared-utils/src/functions.ts b/packages/utilities/shared-utils/src/functions.ts index 7d1fa93090..c249321bc6 100644 --- a/packages/utilities/shared-utils/src/functions.ts +++ b/packages/utilities/shared-utils/src/functions.ts @@ -127,3 +127,17 @@ export function uniqBy(arr: T[], iteratee: any) { 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(); +}; From 6934dd33da18d754d7743b08297ddfcc4fd891e0 Mon Sep 17 00:00:00 2001 From: WK Wong Date: Tue, 25 Jun 2024 12:51:15 +0800 Subject: [PATCH 32/33] refactor(shared-utils): remove isEmpty and clamp --- .../utilities/shared-utils/src/functions.ts | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/packages/utilities/shared-utils/src/functions.ts b/packages/utilities/shared-utils/src/functions.ts index c249321bc6..8cf60fa5fa 100644 --- a/packages/utilities/shared-utils/src/functions.ts +++ b/packages/utilities/shared-utils/src/functions.ts @@ -80,24 +80,6 @@ export function objectToDeps(obj: Extractable) { } } -export function isEmpty(obj: Extractable) { - return ( - [Object, Array].includes(((obj || {}) as any).constructor) && !Object.entries(obj || {}).length - ); -} - -export function clamp(number: number, boundOne: number, boundTwo: number) { - if (!boundTwo) { - return Math.max(number, boundOne) === boundOne ? number : boundOne; - } else if (Math.min(number, boundOne) === number) { - return boundOne; - } else if (Math.max(number, boundTwo) === number) { - return boundTwo; - } - - return number; -} - export function debounce void>( func: F, waitMilliseconds: number = 0, From 50eae3d701c707cf8bf2753d6e24c67f09289d3d Mon Sep 17 00:00:00 2001 From: WK Wong Date: Sat, 29 Jun 2024 01:14:58 +0800 Subject: [PATCH 33/33] feat(changeset): add changeset --- .changeset/warm-suits-report.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .changeset/warm-suits-report.md 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