From c23ff2fa76111fcc1f8cdfa55f10ea34c537c347 Mon Sep 17 00:00:00 2001 From: xigua Date: Sat, 13 Jan 2024 17:53:43 +0800 Subject: [PATCH] feat: dropdown component support subMenu; add common pkg --- package.json | 2 +- packages/common/README.md | 1 + packages/common/package.json | 16 ++++ .../src/utils => common/src}/event_emitter.ts | 2 +- packages/common/src/index.ts | 1 + packages/common/src/vite-env.d.ts | 1 + packages/common/tsconfig.json | 21 +++++ packages/common/vite.config.ts | 11 +++ packages/components/package.json | 1 + .../dropdown/dropdown-item/dropdown-item.scss | 3 +- .../dropdown/dropdown-item/dropdown-item.tsx | 83 ++++++++++++++++--- .../components/dropdown/dropdown.stories.tsx | 26 +++++- .../src/components/dropdown/dropdown.tsx | 58 +++++++------ .../src/components/dropdown/type.ts | 17 ++++ .../src/components/popover/popover.tsx | 26 +++++- packages/components/tsconfig.json | 1 + packages/suika/package.json | 1 + packages/suika/src/editor/Img_manager.ts | 2 +- .../src/editor/commands/command_manager.ts | 2 +- .../host_event_manager/host_event_manager.ts | 2 +- .../suika/src/editor/scene/scene_graph.ts | 2 +- packages/suika/src/editor/selected_box.ts | 2 +- .../suika/src/editor/selected_elements.ts | 2 +- packages/suika/src/editor/setting.ts | 2 +- .../suika/src/editor/tools/tool_manager.ts | 2 +- packages/suika/src/editor/viewport_manager.ts | 2 +- packages/suika/src/editor/zoom_manager.ts | 2 +- packages/suika/src/events.ts | 2 +- packages/suika/tsconfig.json | 1 + pnpm-lock.yaml | 60 ++++---------- 30 files changed, 253 insertions(+), 101 deletions(-) create mode 100644 packages/common/README.md create mode 100644 packages/common/package.json rename packages/{suika/src/utils => common/src}/event_emitter.ts (92%) create mode 100644 packages/common/src/index.ts create mode 100644 packages/common/src/vite-env.d.ts create mode 100644 packages/common/tsconfig.json create mode 100644 packages/common/vite.config.ts create mode 100644 packages/components/src/components/dropdown/type.ts diff --git a/package.json b/package.json index b907593c..2cb6001f 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "packages/*" ], "scripts": { - "dev": "run-p \"watch icons\" \"watch components\" \"watch geo\" app:dev", + "dev": "run-p \"watch common\" \"watch icons\" \"watch components\" \"watch geo\" app:dev", "watch": "node scripts/dev.js", "app:dev": "pnpm --filter @suika/suika dev", "app:build": "pnpm --filter @suika/suika build", diff --git a/packages/common/README.md b/packages/common/README.md new file mode 100644 index 00000000..b183a285 --- /dev/null +++ b/packages/common/README.md @@ -0,0 +1 @@ +Common diff --git a/packages/common/package.json b/packages/common/package.json new file mode 100644 index 00000000..a84b1fa6 --- /dev/null +++ b/packages/common/package.json @@ -0,0 +1,16 @@ +{ + "name": "@suika/common", + "private": true, + "version": "0.0.1", + "type": "module", + "sideEffect": false, + "main": "dist/common.es.js", + "module": "dist/common.es.js", + "types": "dist/common.d.ts", + "scripts": { + "build": "tsc && vite build" + }, + "devDependencies": { + "vite": "^4.2.0" + } +} diff --git a/packages/suika/src/utils/event_emitter.ts b/packages/common/src/event_emitter.ts similarity index 92% rename from packages/suika/src/utils/event_emitter.ts rename to packages/common/src/event_emitter.ts index 153e0daf..243aa94b 100644 --- a/packages/suika/src/utils/event_emitter.ts +++ b/packages/common/src/event_emitter.ts @@ -4,7 +4,7 @@ * Publish-Subscribe Design Pattern */ -class EventEmitter> { +export class EventEmitter> { private eventMap: Record void>> = {} as any; diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts new file mode 100644 index 00000000..3d0ff566 --- /dev/null +++ b/packages/common/src/index.ts @@ -0,0 +1 @@ +export * from './event_emitter'; diff --git a/packages/common/src/vite-env.d.ts b/packages/common/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/packages/common/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/common/tsconfig.json b/packages/common/tsconfig.json new file mode 100644 index 00000000..3e8fbf61 --- /dev/null +++ b/packages/common/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2015", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/packages/common/vite.config.ts b/packages/common/vite.config.ts new file mode 100644 index 00000000..9a7198a0 --- /dev/null +++ b/packages/common/vite.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite'; + +export default defineConfig({ + build: { + lib: { + entry: 'src/index.ts', + name: 'geo', + fileName: (format) => `common.${format}.js`, + }, + }, +}); diff --git a/packages/components/package.json b/packages/components/package.json index 90604e86..fd0bf9d5 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -24,6 +24,7 @@ }, "dependencies": { "@floating-ui/react": "^0.22.3", + "@suika/common": "workspace:^", "@suika/icons": "workspace:^", "classnames": "^2.3.2" }, diff --git a/packages/components/src/components/dropdown/dropdown-item/dropdown-item.scss b/packages/components/src/components/dropdown/dropdown-item/dropdown-item.scss index 0c8ed5c8..c64c8788 100644 --- a/packages/components/src/components/dropdown/dropdown-item/dropdown-item.scss +++ b/packages/components/src/components/dropdown/dropdown-item/dropdown-item.scss @@ -11,7 +11,8 @@ cursor: pointer; - &:hover { + &:hover, + &.active { color: #fff; background-color: #0f8fff; } diff --git a/packages/components/src/components/dropdown/dropdown-item/dropdown-item.tsx b/packages/components/src/components/dropdown/dropdown-item/dropdown-item.tsx index 96720c91..f39d116b 100644 --- a/packages/components/src/components/dropdown/dropdown-item/dropdown-item.tsx +++ b/packages/components/src/components/dropdown/dropdown-item/dropdown-item.tsx @@ -1,28 +1,85 @@ -import { FC, PropsWithChildren } from 'react'; +import { FC, useEffect, useState } from 'react'; import './dropdown-item.scss'; import { CheckOutlined } from '@suika/icons'; +import { Dropdown } from '../dropdown'; +import { DropdownEvents, Item } from '../type'; +import { EventEmitter } from '@suika/common'; +import classNames from 'classnames'; -interface IProps extends PropsWithChildren { +interface IProps { + itemKey: string; + label: string; suffix?: string; - onClick: () => void; check?: boolean; + subItems?: Item[]; + + onClick: (params: { key: string }) => void; + + emitter: EventEmitter; } -export const DropdownItem: FC = ({ - onClick, - children, - suffix, - check, -}) => { - return ( -
+export const DropdownItem: FC = (props) => { + const { onClick, label, suffix, check, subItems, emitter } = props; + + useEffect(() => { + const handleOpenSubMenu = () => { + setOpen(false); + }; + + emitter.on('openSubMenu', handleOpenSubMenu); + return () => { + emitter.off('openSubMenu', handleOpenSubMenu); + }; + }, [emitter, props.itemKey]); + + const item = ( + <>
{check && }
- {children} + {label}
{suffix && {suffix}} -
+ + ); + + const [open, setOpen] = useState(false); + + return ( + <> + {subItems ? ( + +
{ + emitter.emit('openSubMenu', props.itemKey); + setOpen(true); + }} + > + {item} +
+
+ ) : ( +
onClick({ key: props.itemKey })} + onMouseEnter={() => { + emitter.emit('openSubMenu', props.itemKey); + }} + > + {item} +
+ )} + ); }; diff --git a/packages/components/src/components/dropdown/dropdown.stories.tsx b/packages/components/src/components/dropdown/dropdown.stories.tsx index d06cf6a0..41e84a8d 100644 --- a/packages/components/src/components/dropdown/dropdown.stories.tsx +++ b/packages/components/src/components/dropdown/dropdown.stories.tsx @@ -17,6 +17,7 @@ export const Default: Story = { { label: 'item one', check: true, + suffix: 'Ctrl+1', key: 'aa', }, { @@ -24,8 +25,31 @@ export const Default: Story = { }, { label: 'item two', - suffix: 'Ctrl+1', key: 'bb', + children: [ + { + label: 'item two one', + key: 'bb-1', + }, + { + label: 'item two two', + key: 'bb-2', + }, + ], + }, + { + label: 'item three', + key: 'cc', + children: [ + { + label: 'item three one', + key: 'cc-1', + }, + { + label: 'item three two', + key: 'cc-2', + }, + ], }, ], onClick: (params) => { diff --git a/packages/components/src/components/dropdown/dropdown.tsx b/packages/components/src/components/dropdown/dropdown.tsx index 9ed29e64..08c6ea72 100644 --- a/packages/components/src/components/dropdown/dropdown.tsx +++ b/packages/components/src/components/dropdown/dropdown.tsx @@ -1,26 +1,23 @@ -import React, { FC, useState } from 'react'; +import React, { FC, useRef, useState } from 'react'; import { Popover } from '../popover'; import { DropdownItem } from './dropdown-item'; import './dropdown.scss'; +import { DropdownDivider, DropdownEvents, Item } from './type'; +import { OffsetOptions, Placement } from '@floating-ui/react'; -interface DropdownDivider { - type: 'divider'; -} - -interface DropDownItem { - key: string; - label: string; - suffix?: string; - check?: boolean; - children?: DropDownItem[]; -} - -type Item = DropDownItem | DropdownDivider; +import { EventEmitter } from '@suika/common'; interface IProps { items: Item[]; onClick?: (params: { key: string }) => void; children: React.ReactNode; + + placement?: Placement; + trigger?: 'click' | 'hover'; + offset?: OffsetOptions; + + open?: boolean; + onOpenChange?: (open: boolean) => void; } const isDivider = (item: Item): item is DropdownDivider => { @@ -28,15 +25,25 @@ const isDivider = (item: Item): item is DropdownDivider => { }; export const Dropdown: FC = (props) => { - const { items, children } = props; + const { items, children, placement = 'bottom-start' } = props; const [open, setOpen] = useState(false); + const mixedOpen = props.open === undefined ? open : props.open; + + const onOpenChange = (visible: boolean) => { + setOpen(visible); + props.onOpenChange?.(visible); + }; + + const emitter = useRef(new EventEmitter()); + return ( { - setOpen(val); - }} + open={mixedOpen} + onOpenChange={onOpenChange} + placement={placement} + offset={props.offset} + trigger={props.trigger} content={
{items.map((item, index) => { @@ -45,20 +52,21 @@ export const Dropdown: FC = (props) => { ) : ( { + subItems={item.children} + emitter={emitter.current} + onClick={(params) => { setOpen(false); - props.onClick?.({ key: item.key }); + props.onClick?.(params); }} - > - {item.label} - + /> ); })}
} - placement="bottom-start" > {React.cloneElement(children as React.ReactElement)}
diff --git a/packages/components/src/components/dropdown/type.ts b/packages/components/src/components/dropdown/type.ts new file mode 100644 index 00000000..caf822b5 --- /dev/null +++ b/packages/components/src/components/dropdown/type.ts @@ -0,0 +1,17 @@ +export interface DropdownDivider { + type: 'divider'; +} + +export interface DropDownItemType { + key: string; + label: string; + suffix?: string; + check?: boolean; + children?: DropDownItemType[]; +} + +export type Item = DropDownItemType | DropdownDivider; + +export interface DropdownEvents { + openSubMenu(key: string): void; +} diff --git a/packages/components/src/components/popover/popover.tsx b/packages/components/src/components/popover/popover.tsx index f0a873b3..d11de4be 100644 --- a/packages/components/src/components/popover/popover.tsx +++ b/packages/components/src/components/popover/popover.tsx @@ -3,6 +3,7 @@ import './popover.scss'; import { FloatingPortal, + OffsetOptions, Placement, autoUpdate, flip, @@ -10,21 +11,30 @@ import { useClick, useDismiss, useFloating, + useHover, useInteractions, } from '@floating-ui/react'; interface PopoverProps { - placement?: Placement; content: React.ReactNode; children: React.ReactElement; - offset?: number; open?: boolean; onOpenChange?: (open: boolean) => void; + + placement?: Placement; + trigger?: 'click' | 'hover'; + offset?: OffsetOptions; } export const Popover: FC = (props) => { - const { placement = 'bottom', content, children, offset = 5 } = props; + const { + content, + children, + placement = 'bottom-start', + trigger = 'click', + offset = 5, + } = props; const [open, setOpen] = useState(false); @@ -48,11 +58,19 @@ export const Popover: FC = (props) => { ], }); - const click = useClick(context, { event: 'mousedown' }); + const click = useClick(context, { + event: 'mousedown', + enabled: trigger === 'click', + }); const dismiss = useDismiss(context); + const hover = useHover(context, { + enabled: trigger === 'hover', + }); + const { getReferenceProps, getFloatingProps } = useInteractions([ click, + hover, dismiss, ]); diff --git a/packages/components/tsconfig.json b/packages/components/tsconfig.json index 4278e070..ab144763 100644 --- a/packages/components/tsconfig.json +++ b/packages/components/tsconfig.json @@ -16,6 +16,7 @@ "noEmit": true, "jsx": "react-jsx", "paths": { + "@suika/common": ["../common/src"], "@suika/icons": ["../icons/src"] } }, diff --git a/packages/suika/package.json b/packages/suika/package.json index 7ba875ce..436a0d26 100644 --- a/packages/suika/package.json +++ b/packages/suika/package.json @@ -12,6 +12,7 @@ "dependencies": { "@floating-ui/react": "^0.22.3", "@suika/components": "workspace:^", + "@suika/common": "workspace:^", "@suika/icons": "workspace:^", "@suika/geo": "workspace:^", "@testing-library/jest-dom": "^5.14.1", diff --git a/packages/suika/src/editor/Img_manager.ts b/packages/suika/src/editor/Img_manager.ts index 5ccecc20..be84057f 100644 --- a/packages/suika/src/editor/Img_manager.ts +++ b/packages/suika/src/editor/Img_manager.ts @@ -1,4 +1,4 @@ -import EventEmitter from '../utils/event_emitter'; +import { EventEmitter } from '@suika/common'; export class ImgManager { eventEmitter = new EventEmitter<{ diff --git a/packages/suika/src/editor/commands/command_manager.ts b/packages/suika/src/editor/commands/command_manager.ts index f4961e69..547c30bc 100644 --- a/packages/suika/src/editor/commands/command_manager.ts +++ b/packages/suika/src/editor/commands/command_manager.ts @@ -1,4 +1,4 @@ -import EventEmitter from '../../utils/event_emitter'; +import { EventEmitter } from '@suika/common'; import { Editor } from '../editor'; import { ICommand } from './type'; diff --git a/packages/suika/src/editor/host_event_manager/host_event_manager.ts b/packages/suika/src/editor/host_event_manager/host_event_manager.ts index 755809b6..15df6757 100644 --- a/packages/suika/src/editor/host_event_manager/host_event_manager.ts +++ b/packages/suika/src/editor/host_event_manager/host_event_manager.ts @@ -1,5 +1,5 @@ import { IPoint } from '../../type'; -import EventEmitter from '../../utils/event_emitter'; +import { EventEmitter } from '@suika/common'; import { Editor } from '../editor'; import { MoveGraphsKeyBinding } from './move_graphs_key_binding'; import { CommandKeyBinding } from './command_key_binding'; diff --git a/packages/suika/src/editor/scene/scene_graph.ts b/packages/suika/src/editor/scene/scene_graph.ts index 271946c7..2fc5587f 100644 --- a/packages/suika/src/editor/scene/scene_graph.ts +++ b/packages/suika/src/editor/scene/scene_graph.ts @@ -1,7 +1,7 @@ import { Editor } from '../editor'; import { GraphType, IEditorPaperData, IObject } from '../../type'; import { IRect } from '@suika/geo'; -import EventEmitter from '../../utils/event_emitter'; +import { EventEmitter } from '@suika/common'; import { isRectIntersect } from '@suika/geo'; import rafThrottle from '../../utils/raf_throttle'; import { Ellipse } from './ellipse'; diff --git a/packages/suika/src/editor/selected_box.ts b/packages/suika/src/editor/selected_box.ts index 8f9e5aa7..faa2ffe3 100644 --- a/packages/suika/src/editor/selected_box.ts +++ b/packages/suika/src/editor/selected_box.ts @@ -2,7 +2,7 @@ import { IPoint, IRectWithRotation, isPointInRect } from '@suika/geo'; import { Editor } from './editor'; import { getRectCenterPoint } from '../utils/geo'; import { rotateInCanvas } from '../utils/canvas'; -import EventEmitter from '../utils/event_emitter'; +import { EventEmitter } from '@suika/common'; interface Events { hoverChange(isHover: boolean): void; diff --git a/packages/suika/src/editor/selected_elements.ts b/packages/suika/src/editor/selected_elements.ts index 50a16c2b..240a8d95 100644 --- a/packages/suika/src/editor/selected_elements.ts +++ b/packages/suika/src/editor/selected_elements.ts @@ -1,7 +1,7 @@ import { Graph } from './scene/graph'; import { IBox } from '../type'; import { isSameArray } from '../utils/common'; -import EventEmitter from '../utils/event_emitter'; +import { EventEmitter } from '@suika/common'; import { getRectCenterPoint } from '../utils/geo'; import { getMergedRect } from '@suika/geo'; import { RemoveElement } from './commands/remove_element'; diff --git a/packages/suika/src/editor/setting.ts b/packages/suika/src/editor/setting.ts index 65f863fa..fe64ee2e 100644 --- a/packages/suika/src/editor/setting.ts +++ b/packages/suika/src/editor/setting.ts @@ -1,4 +1,4 @@ -import EventEmitter from '../utils/event_emitter'; +import { EventEmitter } from '@suika/common'; import { ITexture, TextureType } from './texture'; interface Events { diff --git a/packages/suika/src/editor/tools/tool_manager.ts b/packages/suika/src/editor/tools/tool_manager.ts index a9978be3..8ef634d8 100644 --- a/packages/suika/src/editor/tools/tool_manager.ts +++ b/packages/suika/src/editor/tools/tool_manager.ts @@ -1,5 +1,5 @@ import { noop } from '../../utils/common'; -import EventEmitter from '../../utils/event_emitter'; +import { EventEmitter } from '@suika/common'; import { Editor } from '../editor'; import { DragCanvasTool } from './tool_drag_canvas'; import { DrawEllipseTool } from './tool_draw_ellipse'; diff --git a/packages/suika/src/editor/viewport_manager.ts b/packages/suika/src/editor/viewport_manager.ts index 53242495..bd3a7171 100644 --- a/packages/suika/src/editor/viewport_manager.ts +++ b/packages/suika/src/editor/viewport_manager.ts @@ -1,6 +1,6 @@ import { IBox, IBox2 } from '../type'; import { getDevicePixelRatio } from '../utils/common'; -import EventEmitter from '../utils/event_emitter'; +import { EventEmitter } from '@suika/common'; import { Editor } from './editor'; interface Events { diff --git a/packages/suika/src/editor/zoom_manager.ts b/packages/suika/src/editor/zoom_manager.ts index 7fc99c5f..0502f1e3 100644 --- a/packages/suika/src/editor/zoom_manager.ts +++ b/packages/suika/src/editor/zoom_manager.ts @@ -1,6 +1,6 @@ import { IBox } from '../type'; import { remainDecimal, viewportCoordsToSceneUtil } from '../utils/common'; -import EventEmitter from '../utils/event_emitter'; +import { EventEmitter } from '@suika/common'; import { getMergedRect } from '@suika/geo'; import { Editor } from './editor'; diff --git a/packages/suika/src/events.ts b/packages/suika/src/events.ts index 4a748f8c..5440257d 100644 --- a/packages/suika/src/events.ts +++ b/packages/suika/src/events.ts @@ -1,5 +1,5 @@ import { SupportedLocale } from './locale'; -import EventEmitter from './utils/event_emitter'; +import { EventEmitter } from '@suika/common'; interface Events { localeChange: (locale: SupportedLocale) => void; diff --git a/packages/suika/tsconfig.json b/packages/suika/tsconfig.json index 8d1b6c2b..a57fa7e2 100644 --- a/packages/suika/tsconfig.json +++ b/packages/suika/tsconfig.json @@ -17,6 +17,7 @@ "jsx": "react-jsx", "noImplicitOverride": true, "paths": { + "@suika/common": ["../common/src"], "@suika/icons": ["../icons/src"], "@suika/components": ["../components/src"], "@suika/geo": ["../geo/src"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 05f2d822..1fd87fd9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,11 +61,20 @@ importers: specifier: ^4.9.3 version: 4.9.5 + packages/common: + devDependencies: + vite: + specifier: ^4.2.0 + version: 4.3.1(@types/node@18.15.13)(sass@1.62.0) + packages/components: dependencies: '@floating-ui/react': specifier: ^0.22.3 version: 0.22.3(react-dom@18.2.0)(react@18.2.0) + '@suika/common': + specifier: workspace:^ + version: link:../common '@suika/icons': specifier: workspace:^ version: link:../icons @@ -147,7 +156,7 @@ importers: devDependencies: vite: specifier: ^4.2.0 - version: 4.3.1(@types/node@18.15.13) + version: 4.3.1(@types/node@18.15.13)(sass@1.62.0) packages/icons: dependencies: @@ -175,13 +184,16 @@ importers: version: 2.5.0 vite: specifier: ^4.2.0 - version: 4.3.1(@types/node@18.15.13) + version: 4.3.1(@types/node@18.15.13)(sass@1.62.0) packages/suika: dependencies: '@floating-ui/react': specifier: ^0.22.3 version: 0.22.3(react-dom@18.2.0)(react@18.2.0) + '@suika/common': + specifier: workspace:^ + version: link:../common '@suika/components': specifier: workspace:^ version: link:../components @@ -11267,6 +11279,7 @@ packages: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 + dev: false /postcss@8.4.31: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} @@ -12116,14 +12129,6 @@ packages: fsevents: 2.3.2 dev: false - /rollup@3.20.7: - resolution: {integrity: sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - /rollup@3.29.4: resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -13547,7 +13552,7 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /vite@4.3.1(@types/node@18.15.13): + /vite@4.3.1(@types/node@18.15.13)(sass@1.62.0): resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -13576,39 +13581,6 @@ packages: esbuild: 0.17.18 postcss: 8.4.31 rollup: 3.29.4 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vite@4.3.1(@types/node@18.15.13)(sass@1.62.0): - resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.15.13 - esbuild: 0.17.18 - postcss: 8.4.23 - rollup: 3.20.7 sass: 1.62.0 optionalDependencies: fsevents: 2.3.2