Commit efbde0d57e20d07373d78d1226e2e83f396a74f3
1 parent
fb57cf73
perf(i18n): merge common lang
Showing
47 changed files
with
175 additions
and
102 deletions
package.json
... | ... | @@ -96,7 +96,7 @@ |
96 | 96 | "stylelint-order": "^4.1.0", |
97 | 97 | "ts-node": "^9.1.0", |
98 | 98 | "typescript": "^4.1.3", |
99 | - "vite": "^2.0.0-beta.22", | |
99 | + "vite": "^2.0.0-beta.23", | |
100 | 100 | "vite-plugin-html": "^2.0.0-beta.5", |
101 | 101 | "vite-plugin-mock": "^2.0.0-beta.3", |
102 | 102 | "vite-plugin-purge-icons": "^0.5.0", | ... | ... |
src/components/Application/src/search/AppSearch.vue
src/components/Application/src/search/AppSearchFooter.vue
... | ... | @@ -15,7 +15,7 @@ |
15 | 15 | <span :class="`${prefixCls}__item`"> |
16 | 16 | <g-icon icon="mdi:keyboard-esc" /> |
17 | 17 | </span> |
18 | - <span>{{ t('component.app.toClose') }}</span> | |
18 | + <span>{{ t('common.closeText') }}</span> | |
19 | 19 | </div> |
20 | 20 | </template> |
21 | 21 | <script lang="ts"> |
... | ... | @@ -47,7 +47,7 @@ |
47 | 47 | font-size: 12px; |
48 | 48 | color: #666; |
49 | 49 | background: rgb(255 255 255); |
50 | - border-radius: 0 0 8px 8px; | |
50 | + border-radius: 0 0 16px 16px; | |
51 | 51 | box-shadow: 0 -1px 0 0 #e0e3e8, 0 -3px 6px 0 rgba(69, 98, 155, 0.12); |
52 | 52 | align-items: center; |
53 | 53 | flex-shrink: 0; | ... | ... |
src/components/Application/src/search/AppSearchModal.vue
... | ... | @@ -7,7 +7,7 @@ |
7 | 7 | <div :class="`${prefixCls}-input__wrapper`"> |
8 | 8 | <a-input |
9 | 9 | :class="`${prefixCls}-input`" |
10 | - :placeholder="t('component.app.search')" | |
10 | + :placeholder="t('common.searchText')" | |
11 | 11 | allow-clear |
12 | 12 | @change="handleSearch" |
13 | 13 | > |
... | ... | @@ -16,7 +16,7 @@ |
16 | 16 | </template> |
17 | 17 | </a-input> |
18 | 18 | <span :class="`${prefixCls}-cancel`" @click="handleClose">{{ |
19 | - t('component.app.cancel') | |
19 | + t('common.cancelText') | |
20 | 20 | }}</span> |
21 | 21 | </div> |
22 | 22 | |
... | ... | @@ -116,6 +116,7 @@ |
116 | 116 | scrollWrap, |
117 | 117 | handleMouseenter, |
118 | 118 | handleClose: () => { |
119 | + searchResult.value = []; | |
119 | 120 | emit('close'); |
120 | 121 | }, |
121 | 122 | }; |
... | ... | @@ -135,7 +136,7 @@ |
135 | 136 | height: 100%; |
136 | 137 | padding-top: 50px; |
137 | 138 | // background: #656c85cc; |
138 | - background: rgba(0, 0, 0, 0.8); | |
139 | + background: rgba(0, 0, 0, 0.25); | |
139 | 140 | justify-content: center; |
140 | 141 | // backdrop-filter: blur(2px); |
141 | 142 | |
... | ... | @@ -178,12 +179,13 @@ |
178 | 179 | |
179 | 180 | &-content { |
180 | 181 | position: relative; |
181 | - width: 532px; | |
182 | + width: 632px; | |
182 | 183 | // padding: 14px; |
183 | 184 | margin: 0 auto auto auto; |
184 | 185 | background: #f5f6f7; |
185 | - border-radius: 6px; | |
186 | - box-shadow: inset 1px 1px 0 0 hsla(0, 0%, 100%, 0.5), 0 3px 8px 0 #555a64; | |
186 | + border-radius: 16px; | |
187 | + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); | |
188 | + // box-shadow: inset 1px 1px 0 0 hsla(0, 0%, 100%, 0.5), 0 3px 8px 0 #555a64; | |
187 | 189 | flex-direction: column; |
188 | 190 | } |
189 | 191 | |
... | ... | @@ -196,9 +198,10 @@ |
196 | 198 | |
197 | 199 | &-input { |
198 | 200 | width: 100%; |
199 | - height: 56px; | |
201 | + height: 48px; | |
200 | 202 | font-size: 1.5em; |
201 | 203 | color: #1c1e21; |
204 | + border-radius: 6px; | |
202 | 205 | |
203 | 206 | span[role='img'] { |
204 | 207 | color: #999; | ... | ... |
src/components/Application/src/search/useMenuSearch.ts
1 | 1 | import { cloneDeep } from 'lodash-es'; |
2 | -import { ref, onBeforeMount, unref, Ref } from 'vue'; | |
2 | +import { ref, onBeforeMount, unref, Ref, nextTick } from 'vue'; | |
3 | 3 | import { useI18n } from '/@/hooks/web/useI18n'; |
4 | 4 | import { getMenus } from '/@/router/menus'; |
5 | 5 | import type { Menu } from '/@/router/types'; |
... | ... | @@ -130,7 +130,7 @@ export function useMenuSearch(refs: Ref<HTMLElement[]>, scrollWrap: Ref<ElRef>, |
130 | 130 | start(); |
131 | 131 | } |
132 | 132 | |
133 | - function handleEnter() { | |
133 | + async function handleEnter() { | |
134 | 134 | if (!searchResult.value.length) return; |
135 | 135 | const result = unref(searchResult); |
136 | 136 | const index = unref(activeIndex); |
... | ... | @@ -139,10 +139,12 @@ export function useMenuSearch(refs: Ref<HTMLElement[]>, scrollWrap: Ref<ElRef>, |
139 | 139 | } |
140 | 140 | const to = result[index]; |
141 | 141 | handleClose(); |
142 | + await nextTick(); | |
142 | 143 | go(to.path); |
143 | 144 | } |
144 | 145 | |
145 | 146 | function handleClose() { |
147 | + searchResult.value = []; | |
146 | 148 | emit('close'); |
147 | 149 | } |
148 | 150 | ... | ... |
src/components/Button/src/PopConfirmButton.vue
1 | 1 | <script lang="ts"> |
2 | - import { defineComponent, h, unref } from 'vue'; | |
2 | + import { defineComponent, h, unref, computed } from 'vue'; | |
3 | 3 | |
4 | 4 | import { Popconfirm } from 'ant-design-vue'; |
5 | 5 | import BasicButton from './BasicButton.vue'; |
... | ... | @@ -7,7 +7,6 @@ |
7 | 7 | import { useI18n } from '/@/hooks/web/useI18n'; |
8 | 8 | import { extendSlots } from '/@/utils/helper/tsxHelper'; |
9 | 9 | import { omit } from 'lodash-es'; |
10 | - const { t } = useI18n(); | |
11 | 10 | |
12 | 11 | export default defineComponent({ |
13 | 12 | name: 'PopButton', |
... | ... | @@ -15,19 +14,29 @@ |
15 | 14 | components: { Popconfirm, BasicButton }, |
16 | 15 | props: { |
17 | 16 | enable: propTypes.bool.def(true), |
18 | - okText: propTypes.string.def(t('component.drawer.okText')), | |
19 | - cancelText: propTypes.string.def(t('component.drawer.cancelText')), | |
17 | + okText: propTypes.string, | |
18 | + cancelText: propTypes.string, | |
20 | 19 | }, |
21 | 20 | setup(props, { slots, attrs }) { |
22 | - return () => { | |
23 | - const popValues = { ...props, ...unref(attrs) }; | |
21 | + const { t } = useI18n(); | |
24 | 22 | |
23 | + const getBindValues = computed(() => { | |
24 | + const popValues = Object.assign( | |
25 | + { | |
26 | + okText: t('common.okText'), | |
27 | + cancelText: t('common.cancelText'), | |
28 | + }, | |
29 | + { ...props, ...unref(attrs) } | |
30 | + ); | |
31 | + return popValues; | |
32 | + }); | |
33 | + return () => { | |
25 | 34 | const Button = h(BasicButton, omit(unref(attrs), 'icon'), extendSlots(slots)); |
26 | 35 | if (!props.enable) { |
27 | 36 | return Button; |
28 | 37 | } |
29 | 38 | |
30 | - return h(Popconfirm, omit(popValues, 'icon'), { default: () => Button }); | |
39 | + return h(Popconfirm, omit(unref(getBindValues), 'icon'), { default: () => Button }); | |
31 | 40 | }; |
32 | 41 | }, |
33 | 42 | }); | ... | ... |
src/components/Drawer/src/BasicDrawer.vue
src/components/Drawer/src/props.ts
... | ... | @@ -11,13 +11,13 @@ export const footerProps = { |
11 | 11 | */ |
12 | 12 | showCancelBtn: propTypes.bool.def(true), |
13 | 13 | cancelButtonProps: Object as PropType<Recordable>, |
14 | - cancelText: propTypes.string.def(t('component.drawer.cancelText')), | |
14 | + cancelText: propTypes.string.def(t('common.cancelText')), | |
15 | 15 | /** |
16 | 16 | * @description: Show confirmation button |
17 | 17 | */ |
18 | 18 | showOkBtn: propTypes.bool.def(true), |
19 | 19 | okButtonProps: Object as PropType<Recordable>, |
20 | - okText: propTypes.string.def(t('component.drawer.okText')), | |
20 | + okText: propTypes.string.def(t('common.okText')), | |
21 | 21 | okType: propTypes.string.def('primary'), |
22 | 22 | showFooter: propTypes.bool, |
23 | 23 | footerHeight: { | ... | ... |
src/components/Form/src/components/FormAction.vue
... | ... | @@ -101,7 +101,7 @@ |
101 | 101 | (): ButtonOptions => { |
102 | 102 | return Object.assign( |
103 | 103 | { |
104 | - text: t('component.form.resetButton'), | |
104 | + text: t('common.resetText'), | |
105 | 105 | }, |
106 | 106 | props.resetButtonOptions |
107 | 107 | ); |
... | ... | @@ -111,7 +111,7 @@ |
111 | 111 | const getSubmitBtnOptions = computed(() => { |
112 | 112 | return Object.assign( |
113 | 113 | { |
114 | - text: t('component.form.submitButton'), | |
114 | + text: t('common.queryText'), | |
115 | 115 | }, |
116 | 116 | props.submitButtonOptions |
117 | 117 | ); | ... | ... |
src/components/Form/src/helper.ts
... | ... | @@ -10,10 +10,10 @@ const { t } = useI18n(); |
10 | 10 | */ |
11 | 11 | export function createPlaceholderMessage(component: ComponentType) { |
12 | 12 | if (component.includes('Input') || component.includes('Complete')) { |
13 | - return t('component.form.input'); | |
13 | + return t('common.inputText'); | |
14 | 14 | } |
15 | 15 | if (component.includes('Picker')) { |
16 | - return t('component.form.choose'); | |
16 | + return t('common.chooseText'); | |
17 | 17 | } |
18 | 18 | if ( |
19 | 19 | component.includes('Select') || |
... | ... | @@ -23,7 +23,7 @@ export function createPlaceholderMessage(component: ComponentType) { |
23 | 23 | component.includes('Switch') |
24 | 24 | ) { |
25 | 25 | // return `请选择${label}`; |
26 | - return t('component.form.choose'); | |
26 | + return t('common.chooseText'); | |
27 | 27 | } |
28 | 28 | return ''; |
29 | 29 | } | ... | ... |
src/components/MenuPlus/index.ts
0 → 100644
1 | +export { default as Menu } from './src/index.vue'; | ... | ... |
src/components/MenuPlus/src/index.vue
0 → 100644
1 | +<template> | |
2 | + <ul :class="getClass" :style="getStyle"> | |
3 | + <slot></slot> | |
4 | + </ul> | |
5 | +</template> | |
6 | + | |
7 | +<script lang="ts"> | |
8 | + import { defineComponent, ref, computed, CSSProperties, unref } from 'vue'; | |
9 | + import { useDesign } from '/@/hooks/web/useDesign'; | |
10 | + import { propTypes } from '/@/utils/propTypes'; | |
11 | + export default defineComponent({ | |
12 | + props: { | |
13 | + mode: propTypes.oneOf(['horizontal', 'vertical']).def('vertical'), | |
14 | + theme: propTypes.oneOf(['light', 'dark', 'primary']).def('light'), | |
15 | + activeName: propTypes.oneOfType([propTypes.string, propTypes.number]), | |
16 | + openNames: propTypes.array.def([]), | |
17 | + accordion: propTypes.bool, | |
18 | + width: propTypes.string.def('210px'), | |
19 | + }, | |
20 | + setup(props) { | |
21 | + const currentActiveName = ref(props.activeName); | |
22 | + const openedNames = ref<string[]>(); | |
23 | + | |
24 | + const { prefixCls } = useDesign('menu'); | |
25 | + | |
26 | + const getClass = computed(() => { | |
27 | + const { theme, mode } = props; | |
28 | + let curTheme = theme; | |
29 | + if (mode === 'vertical' && theme === 'primary') { | |
30 | + curTheme = 'light'; | |
31 | + } | |
32 | + return [ | |
33 | + prefixCls, | |
34 | + `${prefixCls}-${curTheme}`, | |
35 | + { | |
36 | + [`${prefixCls}-${mode}`]: mode, | |
37 | + }, | |
38 | + ]; | |
39 | + }); | |
40 | + | |
41 | + const getStyle = computed( | |
42 | + (): CSSProperties => { | |
43 | + const { mode, width } = props; | |
44 | + if (mode === 'vertical') { | |
45 | + return { | |
46 | + width: width, | |
47 | + }; | |
48 | + } | |
49 | + return {}; | |
50 | + } | |
51 | + ); | |
52 | + | |
53 | + function updateActiveName() { | |
54 | + if (unref(currentActiveName) === undefined) { | |
55 | + currentActiveName.value = -1; | |
56 | + } | |
57 | + } | |
58 | + | |
59 | + function updateOpened() {} | |
60 | + | |
61 | + return { getClass, getStyle }; | |
62 | + }, | |
63 | + }); | |
64 | +</script> | ... | ... |
src/components/Modal/src/BasicModal.vue
src/components/Modal/src/props.ts
... | ... | @@ -13,13 +13,14 @@ export const modalProps = { |
13 | 13 | // open drag |
14 | 14 | draggable: propTypes.bool.def(true), |
15 | 15 | centered: propTypes.bool, |
16 | - cancelText: propTypes.string.def(t('component.modal.cancelText')), | |
17 | - okText: propTypes.string.def(t('component.modal.okText')), | |
16 | + cancelText: propTypes.string.def(t('common.cancelText')), | |
17 | + okText: propTypes.string.def(t('common.okText')), | |
18 | 18 | |
19 | 19 | closeFunc: Function as PropType<() => Promise<boolean>>, |
20 | 20 | }; |
21 | 21 | |
22 | 22 | export const basicProps = Object.assign({}, modalProps, { |
23 | + defaultFullscreen: propTypes.bool, | |
23 | 24 | // Can it be full screen |
24 | 25 | canFullscreen: propTypes.bool.def(true), |
25 | 26 | // After enabling the wrapper, the bottom can be increased in height | ... | ... |
src/components/Preview/src/index.vue
... | ... | @@ -21,9 +21,26 @@ |
21 | 21 | import { Image } from 'ant-design-vue'; |
22 | 22 | import { useDesign } from '/@/hooks/web/useDesign'; |
23 | 23 | import { propTypes } from '/@/utils/propTypes'; |
24 | - import { ImageItem } from './types'; | |
25 | 24 | import { isString } from '/@/utils/is'; |
26 | 25 | |
26 | + interface ImageProps { | |
27 | + alt?: string; | |
28 | + fallback?: string; | |
29 | + src: string; | |
30 | + width: string | number; | |
31 | + height?: string | number; | |
32 | + placeholder?: string | boolean; | |
33 | + preview?: | |
34 | + | boolean | |
35 | + | { | |
36 | + visible?: boolean; | |
37 | + onVisibleChange?: (visible: boolean, prevVisible: boolean) => void; | |
38 | + getContainer: string | HTMLElement | (() => HTMLElement); | |
39 | + }; | |
40 | + } | |
41 | + | |
42 | + type ImageItem = string | ImageProps; | |
43 | + | |
27 | 44 | export default defineComponent({ |
28 | 45 | name: 'ImagePreview', |
29 | 46 | components: { | ... | ... |
src/components/Table/src/components/settings/ColumnSetting.vue
src/components/Table/src/components/settings/RedoSetting.vue
src/layouts/default/setting/components/SettingFooter.vue
... | ... | @@ -7,7 +7,7 @@ |
7 | 7 | |
8 | 8 | <a-button color="warning" block @click="handleResetSetting" class="my-3"> |
9 | 9 | <RedoOutlined class="mr-2" /> |
10 | - {{ t('layout.setting.resetBtn') }} | |
10 | + {{ t('common.resetText') }} | |
11 | 11 | </a-button> |
12 | 12 | |
13 | 13 | <a-button color="error" block @click="handleClearAndRedo"> | ... | ... |
src/layouts/default/tabs/components/TabRedo.vue
1 | 1 | <template> |
2 | - <Tooltip :title="t('layout.multipleTab.tooltipRedo')" placement="bottom" :mouseEnterDelay="0.5"> | |
2 | + <Tooltip :title="t('common.redo')" placement="bottom" :mouseEnterDelay="0.5"> | |
3 | 3 | <span :class="`${prefixCls}__extra-redo`" @click="handleRedo"> |
4 | 4 | <RedoOutlined :spin="loading" /> |
5 | 5 | </span> | ... | ... |
src/layouts/default/tabs/useTabDropdown.ts
... | ... | @@ -51,7 +51,7 @@ export function useTabDropdown(tabContentProps: TabContentProps) { |
51 | 51 | { |
52 | 52 | icon: 'ion:reload-sharp', |
53 | 53 | event: MenuEventEnum.REFRESH_PAGE, |
54 | - text: t('layout.multipleTab.redo'), | |
54 | + text: t('layout.multipleTab.reload'), | |
55 | 55 | disabled: refreshDisabled, |
56 | 56 | }, |
57 | 57 | { | ... | ... |
src/locales/lang/en/common.ts
0 → 100644
1 | +export default { | |
2 | + okText: 'OK', | |
3 | + closeText: 'Close', | |
4 | + cancelText: 'Cancel', | |
5 | + loadingText: 'Loading...', | |
6 | + saveText: 'Save', | |
7 | + delText: 'Delete', | |
8 | + resetText: 'Reset', | |
9 | + searchText: 'Search', | |
10 | + queryText: 'Search', | |
11 | + | |
12 | + inputText: 'Please enter', | |
13 | + chooseText: 'Please choose', | |
14 | + | |
15 | + redo: 'Refresh', | |
16 | + back: 'Back', | |
17 | +}; | ... | ... |
src/locales/lang/en/component/app.ts
src/locales/lang/en/component/drawer.ts deleted
100644 → 0
src/locales/lang/en/component/form.ts
1 | 1 | export default { |
2 | - resetButton: 'Reset', | |
3 | - submitButton: 'Search', | |
4 | 2 | putAway: 'Put away', |
5 | 3 | unfold: 'Unfold', |
6 | 4 | |
7 | - input: 'Please Input ', | |
8 | - choose: 'Please Choose ', | |
9 | - | |
10 | 5 | maxTip: 'The number of characters should be less than {0}', |
11 | 6 | |
12 | 7 | apiSelectNotFound: 'Wait for data loading to complete...', | ... | ... |
src/locales/lang/en/component/menu.ts deleted
100644 → 0
src/locales/lang/en/component/modal.ts deleted
100644 → 0
src/locales/lang/en/component/table.ts
1 | 1 | export default { |
2 | - settingRedo: 'Refresh', | |
3 | 2 | settingDens: 'Density', |
4 | 3 | settingDensDefault: 'Default', |
5 | 4 | settingDensMiddle: 'Middle', |
... | ... | @@ -8,7 +7,6 @@ export default { |
8 | 7 | settingColumnShow: 'Column display', |
9 | 8 | settingIndexColumnShow: 'Index Column', |
10 | 9 | settingSelectColumnShow: 'Selection Column', |
11 | - settingReset: 'Reset', | |
12 | 10 | settingFixedLeft: 'Fixed Left', |
13 | 11 | settingFixedRight: 'Fixed Right', |
14 | 12 | settingFullScreen: 'Full Screen', | ... | ... |
src/locales/lang/en/layout/header.ts
src/locales/lang/en/layout/multipleTab.ts
src/locales/lang/en/layout/setting.ts
src/locales/lang/en/sys/exception.ts
src/locales/lang/en/sys/lock.ts
src/locales/lang/zh_CN/common.ts
0 → 100644
1 | +export default { | |
2 | + okText: '确认', | |
3 | + closeText: '关闭', | |
4 | + cancelText: '取消', | |
5 | + loadingText: '加载中...', | |
6 | + saveText: '保存', | |
7 | + delText: '删除', | |
8 | + resetText: '重置', | |
9 | + searchText: '搜索', | |
10 | + queryText: '查询', | |
11 | + | |
12 | + inputText: '请输入', | |
13 | + chooseText: '请选择', | |
14 | + | |
15 | + redo: '刷新', | |
16 | + back: '返回', | |
17 | +}; | ... | ... |
src/locales/lang/zh_CN/component/app.ts
src/locales/lang/zh_CN/component/drawer.ts deleted
100644 → 0
src/locales/lang/zh_CN/component/form.ts
src/locales/lang/zh_CN/component/menu.ts deleted
100644 → 0
src/locales/lang/zh_CN/component/modal.ts deleted
100644 → 0
src/locales/lang/zh_CN/component/table.ts
1 | 1 | export default { |
2 | - settingRedo: '刷新', | |
3 | 2 | settingDens: '密度', |
4 | 3 | settingDensDefault: '默认', |
5 | 4 | settingDensMiddle: '中等', |
6 | 5 | settingDensSmall: '紧凑', |
7 | 6 | settingColumn: '列设置', |
8 | 7 | settingColumnShow: '列展示', |
9 | - settingReset: '重置', | |
10 | 8 | settingIndexColumnShow: '序号列', |
11 | 9 | settingSelectColumnShow: '勾选列', |
12 | 10 | settingFixedLeft: '固定到左侧', | ... | ... |
src/locales/lang/zh_CN/layout/header.ts
src/locales/lang/zh_CN/layout/multipleTab.ts
src/locales/lang/zh_CN/layout/setting.ts
src/locales/lang/zh_CN/sys/exception.ts
src/locales/lang/zh_CN/sys/lock.ts
src/views/sys/exception/Exception.tsx
... | ... | @@ -97,7 +97,7 @@ export default defineComponent({ |
97 | 97 | unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_DATA, { |
98 | 98 | title: t('sys.exception.noDataTitle'), |
99 | 99 | subTitle: '', |
100 | - btnText: t('sys.exception.redo'), | |
100 | + btnText: t('common.redo'), | |
101 | 101 | handler: () => redo(), |
102 | 102 | icon: notDataImg, |
103 | 103 | }); | ... | ... |
src/views/sys/lock/LockPage.vue
yarn.lock
... | ... | @@ -7835,10 +7835,10 @@ vite-plugin-pwa@^0.3.5: |
7835 | 7835 | pretty-bytes "^5.5.0" |
7836 | 7836 | workbox-build "^6.0.2" |
7837 | 7837 | |
7838 | -vite@^2.0.0-beta.22: | |
7839 | - version "2.0.0-beta.22" | |
7840 | - resolved "https://registry.npmjs.org/vite/-/vite-2.0.0-beta.22.tgz#c33a4689fe1659bfdc87a36b9e8527baea0e3119" | |
7841 | - integrity sha512-Mj9qTSYx0625htRTClQV4OLQhjhujgHCV/FStGNu8G9NcHp3MP56gc6+UoRgQzrAsK8HI9MKfcW+NFgljoJKyA== | |
7838 | +vite@^2.0.0-beta.23: | |
7839 | + version "2.0.0-beta.23" | |
7840 | + resolved "https://registry.npmjs.org/vite/-/vite-2.0.0-beta.23.tgz#9cbbfc85c5737f5bdee4784c7b838365852396f7" | |
7841 | + integrity sha512-vrQ56VBUCSjNFgx6DapDXMo6fkW2s3S7zmxWCIEE2ZiAbxoTQCic+NveTiMRA4+JF29ZQf00tzsAri6BIzi9VA== | |
7842 | 7842 | dependencies: |
7843 | 7843 | esbuild "^0.8.26" |
7844 | 7844 | postcss "^8.2.1" | ... | ... |