fix: fixed some style issues (#4379)

This commit is contained in:
Vben 2024-09-12 22:03:58 +08:00 committed by GitHub
parent 537a4b0ecb
commit 76a879d4d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 160 additions and 66 deletions

View File

@ -19,7 +19,12 @@ const router = createRouter({
: createWebHistory(import.meta.env.VITE_BASE), : createWebHistory(import.meta.env.VITE_BASE),
// 应该添加到路由的初始路由列表。 // 应该添加到路由的初始路由列表。
routes, routes,
scrollBehavior: () => ({ left: 0, top: 0 }), scrollBehavior: (to, _from, savedPosition) => {
if (savedPosition) {
return savedPosition;
}
return to.hash ? { behavior: 'smooth', el: to.hash } : { left: 0, top: 0 };
},
// 是否应该禁止尾部斜杠。 // 是否应该禁止尾部斜杠。
// strict: true, // strict: true,
}); });

View File

@ -19,7 +19,12 @@ const router = createRouter({
: createWebHistory(import.meta.env.VITE_BASE), : createWebHistory(import.meta.env.VITE_BASE),
// 应该添加到路由的初始路由列表。 // 应该添加到路由的初始路由列表。
routes, routes,
scrollBehavior: () => ({ left: 0, top: 0 }), scrollBehavior: (to, _from, savedPosition) => {
if (savedPosition) {
return savedPosition;
}
return to.hash ? { behavior: 'smooth', el: to.hash } : { left: 0, top: 0 };
},
// 是否应该禁止尾部斜杠。 // 是否应该禁止尾部斜杠。
// strict: true, // strict: true,
}); });

View File

@ -19,7 +19,12 @@ const router = createRouter({
: createWebHistory(import.meta.env.VITE_BASE), : createWebHistory(import.meta.env.VITE_BASE),
// 应该添加到路由的初始路由列表。 // 应该添加到路由的初始路由列表。
routes, routes,
scrollBehavior: () => ({ left: 0, top: 0 }), scrollBehavior: (to, _from, savedPosition) => {
if (savedPosition) {
return savedPosition;
}
return to.hash ? { behavior: 'smooth', el: to.hash } : { left: 0, top: 0 };
},
// 是否应该禁止尾部斜杠。 // 是否应该禁止尾部斜杠。
// strict: true, // strict: true,
}); });

View File

@ -55,15 +55,15 @@ The execution command is: `pnpm run [script]` or `npm run [script]`.
// Build a local Docker image // Build a local Docker image
"build:docker": "./build-local-docker-image.sh", "build:docker": "./build-local-docker-image.sh",
// Build the web-antd application separately // Build the web-antd application separately
"build:antd": "pnpm run build --filter=@vben/web-antd", "build:antd": "pnpm -F @vben/web-antd run build",
// Build the documentation separately // Build the documentation separately
"build:docs": "pnpm run build --filter=@vben/docs", "build:docs": "pnpm -F @vben/docs run build",
// Build the web-ele application separately // Build the web-ele application separately
"build:ele": "pnpm run build --filter=@vben/web-ele", "build:ele": "pnpm -F @vben/web-ele run build",
// Build the web-naive application separately // Build the web-naive application separately
"build:naive": "pnpm run build --filter=@vben/naive", "build:naive": "pnpm -F @vben/web-naive run build",
// Build the playground application separately // Build the playground application separately
"build:play": "pnpm run build --filter=@vben/playground", "build:play": "pnpm -F @vben/playground run build",
// Changeset version management // Changeset version management
"changeset": "pnpm exec changeset", "changeset": "pnpm exec changeset",
// Check for various issues in the project // Check for various issues in the project

View File

@ -52,11 +52,11 @@ After slimming down, you may need to adjust commands according to your project.
```json ```json
{ {
"scripts": { "scripts": {
"build:antd": "pnpm run build --filter=@vben/web-antd", "build:antd": "pnpm -F @vben/web-antd run build",
"build:docs": "pnpm run build --filter=@vben/docs", "build:docs": "pnpm -F @vben/docs run build",
"build:ele": "pnpm run build --filter=@vben/web-ele", "build:ele": "pnpm -F @vben/web-ele run build",
"build:naive": "pnpm run build --filter=@vben/web-naive", "build:naive": "pnpm -F @vben/web-naive run build",
"build:play": "pnpm run build --filter=@vben/playground", "build:play": "pnpm -F @vben/playground run build",
"dev:antd": "pnpm -F @vben/web-antd run dev", "dev:antd": "pnpm -F @vben/web-antd run dev",
"dev:docs": "pnpm -F @vben/docs run dev", "dev:docs": "pnpm -F @vben/docs run dev",
"dev:ele": "pnpm -F @vben/web-ele run dev", "dev:ele": "pnpm -F @vben/web-ele run dev",

View File

@ -55,15 +55,15 @@ npm 脚本是项目常见的配置,用于执行一些常见的任务,比如
// 构建本地 docker 镜像 // 构建本地 docker 镜像
"build:docker": "./build-local-docker-image.sh", "build:docker": "./build-local-docker-image.sh",
// 单独构建 web-antd 应用 // 单独构建 web-antd 应用
"build:antd": "pnpm run build --filter=@vben/web-antd", "build:antd": "pnpm -F @vben/web-antd run build",
// 单独构建文档 // 单独构建文档
"build:docs": "pnpm run build --filter=@vben/docs", "build:docs": "pnpm -F @vben/docs run build",
// 单独构建 web-ele 应用 // 单独构建 web-ele 应用
"build:ele": "pnpm run build --filter=@vben/web-ele", "build:ele": "pnpm -F @vben/web-ele run build",
// 单独构建 web-naive 应用 // 单独构建 web-naive 应用
"build:naive": "pnpm run build --filter=@vben/naive", "build:naive": "pnpm -F @vben/web-naive run build",
// 单独构建 playground 应用 // 单独构建 playground 应用
"build:play": "pnpm run build --filter=@vben/playground", "build:play": "pnpm -F @vben/playground run build",
// changeset 版本管理 // changeset 版本管理
"changeset": "pnpm exec changeset", "changeset": "pnpm exec changeset",
// 检查项目各种问题 // 检查项目各种问题

View File

@ -52,11 +52,11 @@ pnpm install
```json ```json
{ {
"scripts": { "scripts": {
"build:antd": "pnpm run build --filter=@vben/web-antd", "build:antd": "pnpm -F @vben/web-antd run build",
"build:docs": "pnpm run build --filter=@vben/docs", "build:docs": "pnpm -F @vben/docs run build",
"build:ele": "pnpm run build --filter=@vben/web-ele", "build:ele": "pnpm -F @vben/web-ele run build",
"build:naive": "pnpm run build --filter=@vben/web-naive", "build:naive": "pnpm -F @vben/web-naive run build",
"build:play": "pnpm run build --filter=@vben/playground", "build:play": "pnpm -F @vben/playground run build",
"dev:antd": "pnpm -F @vben/web-antd run dev", "dev:antd": "pnpm -F @vben/web-antd run dev",
"dev:docs": "pnpm -F @vben/docs run dev", "dev:docs": "pnpm -F @vben/docs run dev",
"dev:ele": "pnpm -F @vben/web-ele run dev", "dev:ele": "pnpm -F @vben/web-ele run dev",

View File

@ -29,11 +29,11 @@
"build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 turbo build", "build": "cross-env NODE_OPTIONS=--max-old-space-size=8192 turbo build",
"build:analyze": "turbo build:analyze", "build:analyze": "turbo build:analyze",
"build:docker": "./build-local-docker-image.sh", "build:docker": "./build-local-docker-image.sh",
"build:antd": "pnpm run build --filter=@vben/web-antd", "build:antd": "pnpm -F @vben/web-antd run build",
"build:docs": "pnpm run build --filter=@vben/docs", "build:docs": "pnpm -F @vben/docs run build",
"build:ele": "pnpm run build --filter=@vben/web-ele", "build:ele": "pnpm -F @vben/web-ele run build",
"build:naive": "pnpm run build --filter=@vben/web-naive", "build:naive": "pnpm -F @vben/web-naive run build",
"build:play": "pnpm run build --filter=@vben/playground", "build:play": "pnpm -F @vben/playground run build",
"changeset": "pnpm exec changeset", "changeset": "pnpm exec changeset",
"check": "pnpm run check:circular && pnpm run check:dep && pnpm run check:type && pnpm check:cspell", "check": "pnpm run check:circular && pnpm run check:dep && pnpm run check:type && pnpm check:cspell",
"check:circular": "vsh check-circular", "check:circular": "vsh check-circular",

View File

@ -1 +1 @@
export { defu as merge } from 'defu'; export { createDefu as createMerge, defu as merge } from 'defu';

View File

@ -10,7 +10,19 @@ import type { FormActions, VbenFormProps } from './types';
import { toRaw } from 'vue'; import { toRaw } from 'vue';
import { Store } from '@vben-core/shared/store'; import { Store } from '@vben-core/shared/store';
import { bindMethods, isFunction, StateHandler } from '@vben-core/shared/utils'; import {
bindMethods,
createMerge,
isFunction,
StateHandler,
} from '@vben-core/shared/utils';
const merge = createMerge((originObj, key, updates) => {
if (Array.isArray(originObj[key]) && Array.isArray(updates)) {
originObj[key] = updates;
return true;
}
});
function getDefaultState(): VbenFormProps { function getDefaultState(): VbenFormProps {
return { return {
@ -138,9 +150,11 @@ export class FormApi {
| Partial<VbenFormProps>, | Partial<VbenFormProps>,
) { ) {
if (isFunction(stateOrFn)) { if (isFunction(stateOrFn)) {
this.store.setState(stateOrFn as (prev: VbenFormProps) => VbenFormProps); this.store.setState((prev) => {
return merge(stateOrFn(prev), prev);
});
} else { } else {
this.store.setState((prev) => ({ ...prev, ...stateOrFn })); this.store.setState((prev) => merge(stateOrFn, prev));
} }
} }

View File

@ -22,7 +22,7 @@ export function useExpandable(props: FormRenderProps) {
for (let index = 1; index <= rows; index++) { for (let index = 1; index <= rows; index++) {
maxItem += mapping?.[index] ?? 0; maxItem += mapping?.[index] ?? 0;
} }
return maxItem - 1; return maxItem - 1 || 1;
}); });
watch( watch(
@ -50,11 +50,11 @@ export function useExpandable(props: FormRenderProps) {
return; return;
} }
// 小屏幕不计算 // 小屏幕不计算
if (breakpoints.smaller('sm').value) { // if (breakpoints.smaller('sm').value) {
// 保持一行 // // 保持一行
rowMapping.value = { 1: 2 }; // rowMapping.value = { 1: 2 };
return; // return;
} // }
const formItems = [...wrapperRef.value.children]; const formItems = [...wrapperRef.value.children];

View File

@ -29,10 +29,12 @@ export class DrawerApi {
} = options; } = options;
const defaultState: DrawerState = { const defaultState: DrawerState = {
class: '',
closable: true, closable: true,
closeOnClickModal: true, closeOnClickModal: true,
closeOnPressEscape: true, closeOnPressEscape: true,
confirmLoading: false, confirmLoading: false,
contentClass: '',
footer: true, footer: true,
isOpen: false, isOpen: false,
loading: false, loading: false,

View File

@ -7,6 +7,7 @@ export interface DrawerProps {
* *
*/ */
cancelText?: string; cancelText?: string;
class?: string;
/** /**
* *
* @default true * @default true
@ -31,6 +32,7 @@ export interface DrawerProps {
* *
*/ */
confirmText?: string; confirmText?: string;
contentClass?: string;
/** /**
* *
*/ */

View File

@ -26,14 +26,10 @@ import {
import { cn } from '@vben-core/shared/utils'; import { cn } from '@vben-core/shared/utils';
interface Props extends DrawerProps { interface Props extends DrawerProps {
class?: string;
contentClass?: string;
drawerApi?: ExtendedDrawerApi; drawerApi?: ExtendedDrawerApi;
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
class: '',
contentClass: '',
drawerApi: undefined, drawerApi: undefined,
}); });
@ -44,11 +40,13 @@ const state = props.drawerApi?.useStore?.();
const { const {
cancelText, cancelText,
class: drawerClass,
closable, closable,
closeOnClickModal, closeOnClickModal,
closeOnPressEscape, closeOnPressEscape,
confirmLoading, confirmLoading,
confirmText, confirmText,
contentClass,
description, description,
footer: showFooter, footer: showFooter,
loading: showLoading, loading: showLoading,
@ -98,7 +96,7 @@ function pointerDownOutside(e: Event) {
> >
<SheetContent <SheetContent
:class=" :class="
cn('flex w-[520px] flex-col', props.class, { cn('flex w-[520px] flex-col', drawerClass, {
'!w-full': isMobile, '!w-full': isMobile,
}) })
" "

View File

@ -30,14 +30,18 @@ export class ModalApi {
const defaultState: ModalState = { const defaultState: ModalState = {
centered: false, centered: false,
class: '',
closeOnClickModal: true, closeOnClickModal: true,
closeOnPressEscape: true, closeOnPressEscape: true,
confirmLoading: false, confirmLoading: false,
contentClass: '',
draggable: false, draggable: false,
footer: true, footer: true,
footerClass: '',
fullscreen: false, fullscreen: false,
fullscreenButton: true, fullscreenButton: true,
header: true, header: true,
headerClass: '',
isOpen: false, isOpen: false,
loading: false, loading: false,
modal: true, modal: true,

View File

@ -12,6 +12,7 @@ export interface ModalProps {
* @default false * @default false
*/ */
centered?: boolean; centered?: boolean;
class?: string;
/** /**
* *
* @default true * @default true
@ -36,6 +37,7 @@ export interface ModalProps {
* *
*/ */
confirmText?: string; confirmText?: string;
contentClass?: string;
/** /**
* *
*/ */
@ -50,6 +52,7 @@ export interface ModalProps {
* @default true * @default true
*/ */
footer?: boolean; footer?: boolean;
footerClass?: string;
/** /**
* *
* @default false * @default false
@ -65,6 +68,7 @@ export interface ModalProps {
* @default true * @default true
*/ */
header?: boolean; header?: boolean;
headerClass?: string;
/** /**
* *
* @default false * @default false

View File

@ -27,18 +27,10 @@ import { cn } from '@vben-core/shared/utils';
import { useModalDraggable } from './use-modal-draggable'; import { useModalDraggable } from './use-modal-draggable';
interface Props extends ModalProps { interface Props extends ModalProps {
class?: string;
contentClass?: string;
footerClass?: string;
headerClass?: string;
modalApi?: ExtendedModalApi; modalApi?: ExtendedModalApi;
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
class: '',
contentClass: '',
footerClass: '',
headerClass: '',
modalApi: undefined, modalApi: undefined,
}); });
@ -55,17 +47,21 @@ const state = props.modalApi?.useStore?.();
const { const {
cancelText, cancelText,
centered, centered,
class: modalClass,
closable, closable,
closeOnClickModal, closeOnClickModal,
closeOnPressEscape, closeOnPressEscape,
confirmLoading, confirmLoading,
confirmText, confirmText,
contentClass,
description, description,
draggable, draggable,
footer: showFooter, footer: showFooter,
footerClass,
fullscreen, fullscreen,
fullscreenButton, fullscreenButton,
header, header,
headerClass,
loading: showLoading, loading: showLoading,
modal, modal,
openAutoFocus, openAutoFocus,
@ -161,7 +157,7 @@ function pointerDownOutside(e: Event) {
:class=" :class="
cn( cn(
'border-border left-0 right-0 top-[10vh] mx-auto flex max-h-[80%] w-[520px] flex-col border p-0', 'border-border left-0 right-0 top-[10vh] mx-auto flex max-h-[80%] w-[520px] flex-col border p-0',
props.class, modalClass,
{ {
'left-0 top-0 size-full max-h-full !translate-x-0 !translate-y-0': 'left-0 top-0 size-full max-h-full !translate-x-0 !translate-y-0':
shouldFullscreen, shouldFullscreen,
@ -186,7 +182,7 @@ function pointerDownOutside(e: Event) {
hidden: !header, hidden: !header,
'cursor-move select-none': shouldDraggable, 'cursor-move select-none': shouldDraggable,
}, },
props.headerClass, headerClass,
) )
" "
> >
@ -240,10 +236,7 @@ function pointerDownOutside(e: Event) {
v-if="showFooter" v-if="showFooter"
ref="footerRef" ref="footerRef"
:class=" :class="
cn( cn('flex-row items-center justify-end border-t p-2', footerClass)
'flex-row items-center justify-end border-t p-2',
props.footerClass,
)
" "
> >
<slot name="prepend-footer"></slot> <slot name="prepend-footer"></slot>

View File

@ -20,6 +20,7 @@ export * from './render-content';
export * from './scrollbar'; export * from './scrollbar';
export * from './segmented'; export * from './segmented';
export * from './select'; export * from './select';
export * from './spine-text';
export * from './spinner'; export * from './spinner';
export * from './swap'; export * from './swap';
export * from './tooltip'; export * from './tooltip';

View File

@ -0,0 +1 @@
export { default as VbenSpineText } from './spine-text.vue';

View File

@ -0,0 +1,31 @@
<template>
<div class="vben-spine-text !bg-clip-text text-transparent">
<slot></slot>
</div>
</template>
<style>
.vben-spine-text {
background:
radial-gradient(circle at center, rgb(255 255 255 / 80%), #f000) -200% 50% /
200% 100% no-repeat,
#000;
animation: shine 3s linear infinite;
}
.dark .vben-spine-text {
background:
radial-gradient(circle at center, rgb(24 24 26 / 80%), transparent) -200% 50% /
200% 100% no-repeat,
#f4f4f4;
}
@keyframes shine {
0% {
background-position: 200% 0%;
}
100% {
background-position: -200% 0%;
}
}
</style>

View File

@ -96,7 +96,14 @@ function goToLogin() {
</template> </template>
</Title> </Title>
<Form /> <Form />
<VbenButton :loading="loading" class="w-full" @click="handleSubmit"> <VbenButton
:class="{
'cursor-wait': loading,
}"
:loading="loading"
class="w-full"
@click="handleSubmit"
>
<slot name="submitButtonText"> <slot name="submitButtonText">
{{ submitButtonText || $t('common.login') }} {{ submitButtonText || $t('common.login') }}
</slot> </slot>

View File

@ -91,7 +91,13 @@ function goToLogin() {
<Form /> <Form />
<div> <div>
<VbenButton class="mt-2 w-full" @click="handleSubmit"> <VbenButton
:class="{
'cursor-wait': loading,
}"
class="mt-2 w-full"
@click="handleSubmit"
>
<slot name="submitButtonText"> <slot name="submitButtonText">
{{ submitButtonText || $t('authentication.sendResetLink') }} {{ submitButtonText || $t('authentication.sendResetLink') }}
</slot> </slot>

View File

@ -124,7 +124,14 @@ onMounted(() => {
{{ $t('authentication.forgetPassword') }} {{ $t('authentication.forgetPassword') }}
</span> </span>
</div> </div>
<VbenButton :loading="loading" class="w-full" @click="handleSubmit"> <VbenButton
:class="{
'cursor-wait': loading,
}"
:loading="loading"
class="w-full"
@click="handleSubmit"
>
{{ submitButtonText || $t('common.login') }} {{ submitButtonText || $t('common.login') }}
</VbenButton> </VbenButton>

View File

@ -92,7 +92,14 @@ function goToLogin() {
</Title> </Title>
<Form /> <Form />
<VbenButton :loading="loading" class="mt-2 w-full" @click="handleSubmit"> <VbenButton
:class="{
'cursor-wait': loading,
}"
:loading="loading"
class="mt-2 w-full"
@click="handleSubmit"
>
<slot name="submitButtonText"> <slot name="submitButtonText">
{{ submitButtonText || $t('authentication.signUp') }} {{ submitButtonText || $t('authentication.signUp') }}
</slot> </slot>

View File

@ -19,7 +19,12 @@ const router = createRouter({
: createWebHistory(import.meta.env.VITE_BASE), : createWebHistory(import.meta.env.VITE_BASE),
// 应该添加到路由的初始路由列表。 // 应该添加到路由的初始路由列表。
routes, routes,
scrollBehavior: () => ({ left: 0, top: 0 }), scrollBehavior: (to, _from, savedPosition) => {
if (savedPosition) {
return savedPosition;
}
return to.hash ? { behavior: 'smooth', el: to.hash } : { left: 0, top: 0 };
},
// 是否应该禁止尾部斜杠。 // 是否应该禁止尾部斜杠。
// strict: true, // strict: true,
}); });

View File

@ -14,7 +14,7 @@ const [BaseForm] = useVbenForm({
componentProps: { componentProps: {
class: 'w-full', class: 'w-full',
}, },
labelWidth: 200, labelClass: 'w-2/6',
}, },
// 使 tailwindcss grid // 使 tailwindcss grid
// //

View File

@ -210,7 +210,6 @@ function onSubmit(values: Record<string, any>) {
function handleDelete() { function handleDelete() {
formApi.setState((prev) => { formApi.setState((prev) => {
return { return {
...prev,
schema: prev.schema?.filter((item) => item.fieldName !== 'field7'), schema: prev.schema?.filter((item) => item.fieldName !== 'field7'),
}; };
}); });
@ -219,7 +218,6 @@ function handleDelete() {
function handleAdd() { function handleAdd() {
formApi.setState((prev) => { formApi.setState((prev) => {
return { return {
...prev,
schema: [ schema: [
...(prev?.schema ?? []), ...(prev?.schema ?? []),
{ {
@ -235,7 +233,6 @@ function handleAdd() {
function handleUpdate() { function handleUpdate() {
formApi.setState((prev) => { formApi.setState((prev) => {
return { return {
...prev,
schema: prev.schema?.map((item) => { schema: prev.schema?.map((item) => {
if (item.fieldName === 'field3') { if (item.fieldName === 'field3') {
return { return {