diff --git a/apps/backend-mock/utils/mock-data.ts b/apps/backend-mock/utils/mock-data.ts
index 192f30a0068..689de2a1612 100644
--- a/apps/backend-mock/utils/mock-data.ts
+++ b/apps/backend-mock/utils/mock-data.ts
@@ -276,7 +276,7 @@ export const MOCK_MENU_LIST = [
children: [
{
id: 20_401,
- pid: 201,
+ pid: 202,
name: 'SystemDeptCreate',
status: 1,
type: 'button',
@@ -285,7 +285,7 @@ export const MOCK_MENU_LIST = [
},
{
id: 20_402,
- pid: 201,
+ pid: 202,
name: 'SystemDeptEdit',
status: 1,
type: 'button',
@@ -294,7 +294,7 @@ export const MOCK_MENU_LIST = [
},
{
id: 20_403,
- pid: 201,
+ pid: 202,
name: 'SystemDeptDelete',
status: 1,
type: 'button',
diff --git a/packages/@core/base/design/src/css/ui.css b/packages/@core/base/design/src/css/ui.css
index 0cf842a0786..a1bf0242366 100644
--- a/packages/@core/base/design/src/css/ui.css
+++ b/packages/@core/base/design/src/css/ui.css
@@ -1,5 +1,5 @@
.side-content {
- animation-duration: 0.2s;
+ animation-duration: 0.3s;
animation-timing-function: cubic-bezier(0.16, 1, 0.3, 1);
}
@@ -37,7 +37,7 @@
@keyframes slide-down {
from {
opacity: 0;
- transform: translateY(-10px);
+ transform: translateY(50px);
}
to {
@@ -49,7 +49,7 @@
@keyframes slide-left {
from {
opacity: 0;
- transform: translateX(-10px);
+ transform: translateX(-50px);
}
to {
@@ -61,7 +61,7 @@
@keyframes slide-right {
from {
opacity: 0;
- transform: translateX(-10px);
+ transform: translateX(50px);
}
to {
@@ -73,7 +73,7 @@
@keyframes slide-up {
from {
opacity: 0;
- transform: translateY(10px);
+ transform: translateY(-50px);
}
to {
diff --git a/packages/@core/ui-kit/layout-ui/src/vben-layout.vue b/packages/@core/ui-kit/layout-ui/src/vben-layout.vue
index e9e98dd4dde..3ae529eebc7 100644
--- a/packages/@core/ui-kit/layout-ui/src/vben-layout.vue
+++ b/packages/@core/ui-kit/layout-ui/src/vben-layout.vue
@@ -10,7 +10,7 @@ import {
useLayoutFooterStyle,
useLayoutHeaderStyle,
} from '@vben-core/composables';
-import { Menu } from '@vben-core/icons';
+import { IconifyIcon } from '@vben-core/icons';
import { VbenIconButton } from '@vben-core/shadcn-ui';
import { ELEMENT_ID_MAIN_CONTENT } from '@vben-core/shared/constants';
@@ -559,7 +559,8 @@ const idMainContent = ELEMENT_ID_MAIN_CONTENT;
class="my-0 mr-1 rounded-md"
@click="handleHeaderToggle"
>
-
+
+
diff --git a/packages/@core/ui-kit/popup-ui/src/modal/modal.vue b/packages/@core/ui-kit/popup-ui/src/modal/modal.vue
index 89184750cc1..a44a616ce64 100644
--- a/packages/@core/ui-kit/popup-ui/src/modal/modal.vue
+++ b/packages/@core/ui-kit/popup-ui/src/modal/modal.vue
@@ -180,7 +180,7 @@ function escapeKeyDown(e: KeyboardEvent) {
}
}
-function handerOpenAutoFocus(e: Event) {
+function handleOpenAutoFocus(e: Event) {
if (!openAutoFocus.value) {
e?.preventDefault();
}
@@ -209,6 +209,12 @@ const getForceMount = computed(() => {
return !unref(destroyOnClose) && unref(firstOpened);
});
+const handleOpened = () => {
+ requestAnimationFrame(() => {
+ props.modalApi?.onOpened();
+ });
+};
+
function handleClosed() {
isClosed.value = true;
props.modalApi?.onClosed();
@@ -253,8 +259,8 @@ function handleClosed() {
@escape-key-down="escapeKeyDown"
@focus-outside="handleFocusOutside"
@interact-outside="interactOutside"
- @open-auto-focus="handerOpenAutoFocus"
- @opened="() => modalApi?.onOpened()"
+ @open-auto-focus="handleOpenAutoFocus"
+ @opened="handleOpened"
@pointer-down-outside="pointerDownOutside"
>
{
v-bind="delegatedProps"
:class="
cn(
- 'bg-muted text-muted-foreground inline-flex h-9 items-center justify-center rounded-lg p-1',
+ 'bg-muted text-muted-foreground inline-flex h-9 items-center justify-center rounded-md p-1',
props.class,
)
"
diff --git a/packages/effects/layouts/src/authentication/authentication.vue b/packages/effects/layouts/src/authentication/authentication.vue
index e66954278da..72e31bd3a89 100644
--- a/packages/effects/layouts/src/authentication/authentication.vue
+++ b/packages/effects/layouts/src/authentication/authentication.vue
@@ -50,7 +50,7 @@ const { authPanelCenter, authPanelLeft, authPanelRight, isDark } =
@@ -86,7 +86,14 @@ const { authPanelCenter, authPanelLeft, authPanelRight, isDark } =
class="bg-background-deep absolute inset-0 h-full w-full dark:bg-[#070709]"
>
-
+
![]()
@@ -125,7 +133,8 @@ const { authPanelCenter, authPanelLeft, authPanelRight, isDark } =
diff --git a/packages/effects/layouts/src/authentication/form.vue b/packages/effects/layouts/src/authentication/form.vue
index 80c907493bd..fa73e128e0c 100644
--- a/packages/effects/layouts/src/authentication/form.vue
+++ b/packages/effects/layouts/src/authentication/form.vue
@@ -2,6 +2,10 @@
defineOptions({
name: 'AuthenticationFormView',
});
+
+defineProps<{
+ dataSide?: 'bottom' | 'left' | 'right' | 'top';
+}>();
@@ -16,7 +20,8 @@ defineOptions({
diff --git a/packages/effects/layouts/src/widgets/lock-screen/lock-screen-modal.vue b/packages/effects/layouts/src/widgets/lock-screen/lock-screen-modal.vue
index 5121d688c37..908e670601e 100644
--- a/packages/effects/layouts/src/widgets/lock-screen/lock-screen-modal.vue
+++ b/packages/effects/layouts/src/widgets/lock-screen/lock-screen-modal.vue
@@ -27,29 +27,30 @@ const emit = defineEmits<{
submit: [Recordable];
}>();
-const [Form, { resetForm, validate, getValues }] = useVbenForm(
- reactive({
- commonConfig: {
- hideLabel: true,
- hideRequiredMark: true,
- },
- schema: computed(() => [
- {
- component: 'VbenInputPassword' as const,
- componentProps: {
- placeholder: $t('ui.widgets.lockScreen.placeholder'),
- },
- fieldName: 'lockScreenPassword',
- formFieldProps: { validateOnBlur: false },
- label: $t('authentication.password'),
- rules: z
- .string()
- .min(1, { message: $t('ui.widgets.lockScreen.placeholder') }),
+const [Form, { resetForm, validate, getValues, getFieldComponentRef }] =
+ useVbenForm(
+ reactive({
+ commonConfig: {
+ hideLabel: true,
+ hideRequiredMark: true,
},
- ]),
- showDefaultActions: false,
- }),
-);
+ schema: computed(() => [
+ {
+ component: 'VbenInputPassword' as const,
+ componentProps: {
+ placeholder: $t('ui.widgets.lockScreen.placeholder'),
+ },
+ fieldName: 'lockScreenPassword',
+ formFieldProps: { validateOnBlur: false },
+ label: $t('authentication.password'),
+ rules: z
+ .string()
+ .min(1, { message: $t('ui.widgets.lockScreen.placeholder') }),
+ },
+ ]),
+ showDefaultActions: false,
+ }),
+ );
const [Modal] = useVbenModal({
onConfirm() {
@@ -60,6 +61,13 @@ const [Modal] = useVbenModal({
resetForm();
}
},
+ onOpened() {
+ requestAnimationFrame(() => {
+ getFieldComponentRef('lockScreenPassword')
+ ?.$el?.querySelector('[name="lockScreenPassword"]')
+ ?.focus();
+ });
+ },
});
async function handleSubmit() {
diff --git a/packages/effects/layouts/src/widgets/lock-screen/lock-screen.vue b/packages/effects/layouts/src/widgets/lock-screen/lock-screen.vue
index 6fb7a54a4e1..3f700334f17 100644
--- a/packages/effects/layouts/src/widgets/lock-screen/lock-screen.vue
+++ b/packages/effects/layouts/src/widgets/lock-screen/lock-screen.vue
@@ -37,7 +37,7 @@ const date = useDateFormat(now, 'YYYY-MM-DD dddd', { locales: locale.value });
const showUnlockForm = ref(false);
const { lockScreenPassword } = storeToRefs(accessStore);
-const [Form, { form, validate }] = useVbenForm(
+const [Form, { form, validate, getFieldComponentRef }] = useVbenForm(
reactive({
commonConfig: {
hideLabel: true,
@@ -75,6 +75,13 @@ async function handleSubmit() {
function toggleUnlockForm() {
showUnlockForm.value = !showUnlockForm.value;
+ if (showUnlockForm.value) {
+ requestAnimationFrame(() => {
+ getFieldComponentRef('password')
+ ?.$el?.querySelector('[name="password"]')
+ ?.focus();
+ });
+ }
}
useScrollLock();
diff --git a/playground/src/locales/langs/zh-CN/system.json b/playground/src/locales/langs/zh-CN/system.json
index b0f5e7fad7b..be5a7ae360d 100644
--- a/playground/src/locales/langs/zh-CN/system.json
+++ b/playground/src/locales/langs/zh-CN/system.json
@@ -1,4 +1,5 @@
{
+ "title": "系统管理",
"dept": {
"list": "部门列表",
"createTime": "创建时间",
@@ -62,6 +63,5 @@
"operation": "操作",
"permissions": "权限",
"setPermissions": "授权"
- },
- "title": "系统管理"
+ }
}
diff --git a/playground/src/views/examples/layout/col-page.vue b/playground/src/views/examples/layout/col-page.vue
index 5b18330eb55..5070ac3daa1 100644
--- a/playground/src/views/examples/layout/col-page.vue
+++ b/playground/src/views/examples/layout/col-page.vue
@@ -22,8 +22,8 @@ const props = reactive({
leftWidth: 30,
resizable: true,
rightWidth: 70,
- splitHandle: false,
- splitLine: false,
+ splitHandle: true,
+ splitLine: true,
});
const leftMinWidth = ref(props.leftMinWidth || 1);
const leftMaxWidth = ref(props.leftMaxWidth || 100);
@@ -42,7 +42,11 @@ const leftMaxWidth = ref(props.leftMaxWidth || 100);
-