Merge branch 'main' into global-search
						commit
						1f4ec6369c
					
				| 
						 | 
					@ -9,6 +9,7 @@
 | 
				
			||||||
    "taze",
 | 
					    "taze",
 | 
				
			||||||
    "acmr",
 | 
					    "acmr",
 | 
				
			||||||
    "antd",
 | 
					    "antd",
 | 
				
			||||||
 | 
					    "lucide",
 | 
				
			||||||
    "brotli",
 | 
					    "brotli",
 | 
				
			||||||
    "defu",
 | 
					    "defu",
 | 
				
			||||||
    "iconify",
 | 
					    "iconify",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,6 +49,7 @@
 | 
				
			||||||
    "@vben-core/typings": "workspace:*",
 | 
					    "@vben-core/typings": "workspace:*",
 | 
				
			||||||
    "@vueuse/core": "^10.11.0",
 | 
					    "@vueuse/core": "^10.11.0",
 | 
				
			||||||
    "class-variance-authority": "^0.7.0",
 | 
					    "class-variance-authority": "^0.7.0",
 | 
				
			||||||
 | 
					    "lucide-vue-next": "^0.400.0",
 | 
				
			||||||
    "radix-vue": "^1.9.0",
 | 
					    "radix-vue": "^1.9.0",
 | 
				
			||||||
    "vue": "^3.4.31",
 | 
					    "vue": "^3.4.31",
 | 
				
			||||||
    "vue-sonner": "^1.1.3"
 | 
					    "vue-sonner": "^1.1.3"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,8 @@ export * from './ui/checkbox';
 | 
				
			||||||
export * from './ui/dialog';
 | 
					export * from './ui/dialog';
 | 
				
			||||||
export * from './ui/dropdown-menu';
 | 
					export * from './ui/dropdown-menu';
 | 
				
			||||||
export * from './ui/hover-card';
 | 
					export * from './ui/hover-card';
 | 
				
			||||||
 | 
					export * from './ui/input';
 | 
				
			||||||
 | 
					export * from './ui/number-field';
 | 
				
			||||||
export * from './ui/pin-input';
 | 
					export * from './ui/pin-input';
 | 
				
			||||||
export * from './ui/popover';
 | 
					export * from './ui/popover';
 | 
				
			||||||
export * from './ui/scroll-area';
 | 
					export * from './ui/scroll-area';
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,34 @@
 | 
				
			||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import type { HTMLAttributes } from 'vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { cn } from '@vben-core/toolkit';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { useVModel } from '@vueuse/core';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const props = defineProps<{
 | 
				
			||||||
 | 
					  class?: HTMLAttributes['class'];
 | 
				
			||||||
 | 
					  defaultValue?: number | string;
 | 
				
			||||||
 | 
					  modelValue?: number | string;
 | 
				
			||||||
 | 
					}>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const emits = defineEmits<{
 | 
				
			||||||
 | 
					  (e: 'update:modelValue', payload: number | string): void;
 | 
				
			||||||
 | 
					}>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const modelValue = useVModel(props, 'modelValue', emits, {
 | 
				
			||||||
 | 
					  defaultValue: props.defaultValue,
 | 
				
			||||||
 | 
					  passive: true,
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <input
 | 
				
			||||||
 | 
					    v-model="modelValue"
 | 
				
			||||||
 | 
					    :class="
 | 
				
			||||||
 | 
					      cn(
 | 
				
			||||||
 | 
					        'border-input placeholder:text-muted-foreground focus-visible:ring-ring flex h-9 w-full rounded-md border bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50',
 | 
				
			||||||
 | 
					        props.class,
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					export { default as Input } from './Input.vue';
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import type { NumberFieldRootEmits, NumberFieldRootProps } from 'radix-vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { type HTMLAttributes, computed } from 'vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { cn } from '@vben-core/toolkit';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { NumberFieldRoot, useForwardPropsEmits } from 'radix-vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const props = defineProps<
 | 
				
			||||||
 | 
					  { class?: HTMLAttributes['class'] } & NumberFieldRootProps
 | 
				
			||||||
 | 
					>();
 | 
				
			||||||
 | 
					const emits = defineEmits<NumberFieldRootEmits>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const delegatedProps = computed(() => {
 | 
				
			||||||
 | 
					  const { class: _, ...delegated } = props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return delegated;
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const forwarded = useForwardPropsEmits(delegatedProps, emits);
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <NumberFieldRoot v-bind="forwarded" :class="cn('grid gap-1.5', props.class)">
 | 
				
			||||||
 | 
					    <slot></slot>
 | 
				
			||||||
 | 
					  </NumberFieldRoot>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import type { HTMLAttributes } from 'vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { cn } from '@vben-core/toolkit';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const props = defineProps<{
 | 
				
			||||||
 | 
					  class?: HTMLAttributes['class'];
 | 
				
			||||||
 | 
					}>();
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div
 | 
				
			||||||
 | 
					    :class="
 | 
				
			||||||
 | 
					      cn(
 | 
				
			||||||
 | 
					        'relative [&>[data-slot=input]]:has-[[data-slot=decrement]]:pl-5 [&>[data-slot=input]]:has-[[data-slot=increment]]:pr-5',
 | 
				
			||||||
 | 
					        props.class,
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <slot></slot>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,39 @@
 | 
				
			||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import type { NumberFieldDecrementProps } from 'radix-vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { type HTMLAttributes, computed } from 'vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { cn } from '@vben-core/toolkit';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { Minus } from 'lucide-vue-next';
 | 
				
			||||||
 | 
					import { NumberFieldDecrement, useForwardProps } from 'radix-vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const props = defineProps<
 | 
				
			||||||
 | 
					  { class?: HTMLAttributes['class'] } & NumberFieldDecrementProps
 | 
				
			||||||
 | 
					>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const delegatedProps = computed(() => {
 | 
				
			||||||
 | 
					  const { class: _, ...delegated } = props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return delegated;
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const forwarded = useForwardProps(delegatedProps);
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <NumberFieldDecrement
 | 
				
			||||||
 | 
					    data-slot="decrement"
 | 
				
			||||||
 | 
					    v-bind="forwarded"
 | 
				
			||||||
 | 
					    :class="
 | 
				
			||||||
 | 
					      cn(
 | 
				
			||||||
 | 
					        'absolute left-0 top-1/2 -translate-y-1/2 p-3 disabled:cursor-not-allowed disabled:opacity-20',
 | 
				
			||||||
 | 
					        props.class,
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <slot>
 | 
				
			||||||
 | 
					      <Minus class="h-4 w-4" />
 | 
				
			||||||
 | 
					    </slot>
 | 
				
			||||||
 | 
					  </NumberFieldDecrement>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,39 @@
 | 
				
			||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import type { NumberFieldIncrementProps } from 'radix-vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { type HTMLAttributes, computed } from 'vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { cn } from '@vben-core/toolkit';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { Plus } from 'lucide-vue-next';
 | 
				
			||||||
 | 
					import { NumberFieldIncrement, useForwardProps } from 'radix-vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const props = defineProps<
 | 
				
			||||||
 | 
					  { class?: HTMLAttributes['class'] } & NumberFieldIncrementProps
 | 
				
			||||||
 | 
					>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const delegatedProps = computed(() => {
 | 
				
			||||||
 | 
					  const { class: _, ...delegated } = props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return delegated;
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const forwarded = useForwardProps(delegatedProps);
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <NumberFieldIncrement
 | 
				
			||||||
 | 
					    data-slot="increment"
 | 
				
			||||||
 | 
					    v-bind="forwarded"
 | 
				
			||||||
 | 
					    :class="
 | 
				
			||||||
 | 
					      cn(
 | 
				
			||||||
 | 
					        'absolute right-0 top-1/2 -translate-y-1/2 p-3 disabled:cursor-not-allowed disabled:opacity-20',
 | 
				
			||||||
 | 
					        props.class,
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <slot>
 | 
				
			||||||
 | 
					      <Plus class="h-4 w-4" />
 | 
				
			||||||
 | 
					    </slot>
 | 
				
			||||||
 | 
					  </NumberFieldIncrement>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import { cn } from '@vben-core/toolkit';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { NumberFieldInput } from 'radix-vue';
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <NumberFieldInput
 | 
				
			||||||
 | 
					    :class="
 | 
				
			||||||
 | 
					      cn(
 | 
				
			||||||
 | 
					        'border-input placeholder:text-muted-foreground focus-visible:ring-ring flex h-9 w-full rounded-md border bg-transparent py-1 text-center text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50',
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					    data-slot="input"
 | 
				
			||||||
 | 
					  />
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,5 @@
 | 
				
			||||||
 | 
					export { default as NumberField } from './NumberField.vue';
 | 
				
			||||||
 | 
					export { default as NumberFieldContent } from './NumberFieldContent.vue';
 | 
				
			||||||
 | 
					export { default as NumberFieldDecrement } from './NumberFieldDecrement.vue';
 | 
				
			||||||
 | 
					export { default as NumberFieldIncrement } from './NumberFieldIncrement.vue';
 | 
				
			||||||
 | 
					export { default as NumberFieldInput } from './NumberFieldInput.vue';
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,51 @@
 | 
				
			||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import type { SelectListItem } from '@vben/types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { useSlots } from 'vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { MdiQuestionMarkCircleOutline } from '@vben-core/iconify';
 | 
				
			||||||
 | 
					import { Input, VbenTooltip } from '@vben-core/shadcn-ui';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					defineOptions({
 | 
				
			||||||
 | 
					  name: 'PreferenceSelectItem',
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					withDefaults(
 | 
				
			||||||
 | 
					  defineProps<{
 | 
				
			||||||
 | 
					    disabled?: boolean;
 | 
				
			||||||
 | 
					    items?: SelectListItem[];
 | 
				
			||||||
 | 
					    placeholder?: string;
 | 
				
			||||||
 | 
					  }>(),
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    disabled: false,
 | 
				
			||||||
 | 
					    placeholder: '',
 | 
				
			||||||
 | 
					    items: () => [],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const inputValue = defineModel<string>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const slots = useSlots();
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div
 | 
				
			||||||
 | 
					    :class="{
 | 
				
			||||||
 | 
					      'hover:bg-accent': !slots.tip,
 | 
				
			||||||
 | 
					      'pointer-events-none opacity-50': disabled,
 | 
				
			||||||
 | 
					    }"
 | 
				
			||||||
 | 
					    class="my-1 flex w-full items-center justify-between rounded-md px-2 py-1"
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <span class="flex items-center text-sm">
 | 
				
			||||||
 | 
					      <slot></slot>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <VbenTooltip v-if="slots.tip" side="bottom">
 | 
				
			||||||
 | 
					        <template #trigger>
 | 
				
			||||||
 | 
					          <MdiQuestionMarkCircleOutline class="ml-1 cursor-help" />
 | 
				
			||||||
 | 
					        </template>
 | 
				
			||||||
 | 
					        <slot name="tip"></slot>
 | 
				
			||||||
 | 
					      </VbenTooltip>
 | 
				
			||||||
 | 
					    </span>
 | 
				
			||||||
 | 
					    <Input v-model="inputValue" class="h-8 w-[160px]" />
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
import { $t } from '@vben/locales';
 | 
					import { $t } from '@vben/locales';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import InputItem from '../input-item.vue';
 | 
				
			||||||
import SwitchItem from '../switch-item.vue';
 | 
					import SwitchItem from '../switch-item.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
defineOptions({
 | 
					defineOptions({
 | 
				
			||||||
| 
						 | 
					@ -8,10 +9,34 @@ defineOptions({
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const copyrightEnable = defineModel<boolean>('copyrightEnable');
 | 
					const copyrightEnable = defineModel<boolean>('copyrightEnable');
 | 
				
			||||||
 | 
					const copyrightDate = defineModel<string>('copyrightDate');
 | 
				
			||||||
 | 
					const copyrightIcp = defineModel<string>('copyrightIcp');
 | 
				
			||||||
 | 
					const copyrightIcpLink = defineModel<string>('copyrightIcpLink');
 | 
				
			||||||
 | 
					const copyrightCompanyName = defineModel<string>('copyrightCompanyName');
 | 
				
			||||||
 | 
					const copyrightCompanySiteLink = defineModel<string>(
 | 
				
			||||||
 | 
					  'copyrightCompanySiteLink',
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <SwitchItem v-model="copyrightEnable">
 | 
					  <SwitchItem v-model="copyrightEnable">
 | 
				
			||||||
    {{ $t('preferences.copyright.enable') }}
 | 
					    {{ $t('preferences.copyright.enable') }}
 | 
				
			||||||
  </SwitchItem>
 | 
					  </SwitchItem>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <InputItem v-model="copyrightCompanyName" :disabled="!copyrightEnable">
 | 
				
			||||||
 | 
					    {{ $t('preferences.copyright.company-name') }}
 | 
				
			||||||
 | 
					  </InputItem>
 | 
				
			||||||
 | 
					  <InputItem v-model="copyrightCompanySiteLink" :disabled="!copyrightEnable">
 | 
				
			||||||
 | 
					    {{ $t('preferences.copyright.company-site-link') }}
 | 
				
			||||||
 | 
					  </InputItem>
 | 
				
			||||||
 | 
					  <InputItem v-model="copyrightDate" :disabled="!copyrightEnable">
 | 
				
			||||||
 | 
					    {{ $t('preferences.copyright.date') }}
 | 
				
			||||||
 | 
					  </InputItem>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <InputItem v-model="copyrightIcp" :disabled="!copyrightEnable">
 | 
				
			||||||
 | 
					    {{ $t('preferences.copyright.icp') }}
 | 
				
			||||||
 | 
					  </InputItem>
 | 
				
			||||||
 | 
					  <InputItem v-model="copyrightIcpLink" :disabled="!copyrightEnable">
 | 
				
			||||||
 | 
					    {{ $t('preferences.copyright.icp-link') }}
 | 
				
			||||||
 | 
					  </InputItem>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
<script setup lang="ts">
 | 
					<script setup lang="ts">
 | 
				
			||||||
import { $t } from '@vben/locales';
 | 
					import { $t } from '@vben/locales';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import NumberFieldItem from '../number-field-item.vue';
 | 
				
			||||||
import SwitchItem from '../switch-item.vue';
 | 
					import SwitchItem from '../switch-item.vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
defineOptions({
 | 
					defineOptions({
 | 
				
			||||||
| 
						 | 
					@ -10,6 +11,7 @@ defineOptions({
 | 
				
			||||||
defineProps<{ disabled: boolean }>();
 | 
					defineProps<{ disabled: boolean }>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const sidebarEnable = defineModel<boolean>('sidebarEnable');
 | 
					const sidebarEnable = defineModel<boolean>('sidebarEnable');
 | 
				
			||||||
 | 
					const sidebarWidth = defineModel<number>('sidebarWidth');
 | 
				
			||||||
const sidebarCollapsedShowTitle = defineModel<boolean>(
 | 
					const sidebarCollapsedShowTitle = defineModel<boolean>(
 | 
				
			||||||
  'sidebarCollapsedShowTitle',
 | 
					  'sidebarCollapsedShowTitle',
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
| 
						 | 
					@ -18,15 +20,24 @@ const sidebarCollapsed = defineModel<boolean>('sidebarCollapsed');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<template>
 | 
					<template>
 | 
				
			||||||
  <SwitchItem v-model="sidebarEnable" :disabled="disabled">
 | 
					  <SwitchItem v-model="sidebarEnable" :disabled="disabled">
 | 
				
			||||||
    {{ $t('preferences.side-visible') }}
 | 
					    {{ $t('preferences.sidebar.visible') }}
 | 
				
			||||||
  </SwitchItem>
 | 
					  </SwitchItem>
 | 
				
			||||||
  <SwitchItem v-model="sidebarCollapsed" :disabled="!sidebarEnable || disabled">
 | 
					  <SwitchItem v-model="sidebarCollapsed" :disabled="!sidebarEnable || disabled">
 | 
				
			||||||
    {{ $t('preferences.collapse') }}
 | 
					    {{ $t('preferences.sidebar.collapsed') }}
 | 
				
			||||||
  </SwitchItem>
 | 
					  </SwitchItem>
 | 
				
			||||||
  <SwitchItem
 | 
					  <SwitchItem
 | 
				
			||||||
    v-model="sidebarCollapsedShowTitle"
 | 
					    v-model="sidebarCollapsedShowTitle"
 | 
				
			||||||
    :disabled="!sidebarEnable || disabled"
 | 
					    :disabled="!sidebarEnable || disabled"
 | 
				
			||||||
  >
 | 
					  >
 | 
				
			||||||
    {{ $t('preferences.collapse-show-title') }}
 | 
					    {{ $t('preferences.sidebar.collapsed-show-title') }}
 | 
				
			||||||
  </SwitchItem>
 | 
					  </SwitchItem>
 | 
				
			||||||
 | 
					  <NumberFieldItem
 | 
				
			||||||
 | 
					    v-model="sidebarWidth"
 | 
				
			||||||
 | 
					    :disabled="!sidebarEnable || disabled"
 | 
				
			||||||
 | 
					    :max="320"
 | 
				
			||||||
 | 
					    :min="160"
 | 
				
			||||||
 | 
					    :step="10"
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    {{ $t('preferences.sidebar.width') }}
 | 
				
			||||||
 | 
					  </NumberFieldItem>
 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,4 @@ const tabbarShowIcon = defineModel<boolean>('tabbarShowIcon');
 | 
				
			||||||
  <SwitchItem v-model="tabbarShowIcon" :disabled="!tabbarEnable">
 | 
					  <SwitchItem v-model="tabbarShowIcon" :disabled="!tabbarEnable">
 | 
				
			||||||
    {{ $t('preferences.tabbar.icon') }}
 | 
					    {{ $t('preferences.tabbar.icon') }}
 | 
				
			||||||
  </SwitchItem>
 | 
					  </SwitchItem>
 | 
				
			||||||
  <!-- <SwitchItem v-model="sideCollapseShowTitle" :disabled="!tabsVisible">
 | 
					 | 
				
			||||||
    {{ $t('preferences.collapse-show-title') }}
 | 
					 | 
				
			||||||
  </SwitchItem> -->
 | 
					 | 
				
			||||||
</template>
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,65 @@
 | 
				
			||||||
 | 
					<script setup lang="ts">
 | 
				
			||||||
 | 
					import type { SelectListItem } from '@vben/types';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { useSlots } from 'vue';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { MdiQuestionMarkCircleOutline } from '@vben-core/iconify';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  NumberField,
 | 
				
			||||||
 | 
					  NumberFieldContent,
 | 
				
			||||||
 | 
					  NumberFieldDecrement,
 | 
				
			||||||
 | 
					  NumberFieldIncrement,
 | 
				
			||||||
 | 
					  NumberFieldInput,
 | 
				
			||||||
 | 
					  VbenTooltip,
 | 
				
			||||||
 | 
					} from '@vben-core/shadcn-ui';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					defineOptions({
 | 
				
			||||||
 | 
					  name: 'PreferenceSelectItem',
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					withDefaults(
 | 
				
			||||||
 | 
					  defineProps<{
 | 
				
			||||||
 | 
					    disabled?: boolean;
 | 
				
			||||||
 | 
					    items?: SelectListItem[];
 | 
				
			||||||
 | 
					    placeholder?: string;
 | 
				
			||||||
 | 
					  }>(),
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    disabled: false,
 | 
				
			||||||
 | 
					    placeholder: '',
 | 
				
			||||||
 | 
					    items: () => [],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const inputValue = defineModel<number>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const slots = useSlots();
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div
 | 
				
			||||||
 | 
					    :class="{
 | 
				
			||||||
 | 
					      'hover:bg-accent': !slots.tip,
 | 
				
			||||||
 | 
					      'pointer-events-none opacity-50': disabled,
 | 
				
			||||||
 | 
					    }"
 | 
				
			||||||
 | 
					    class="my-1 flex w-full items-center justify-between rounded-md px-2 py-1"
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <span class="flex items-center text-sm">
 | 
				
			||||||
 | 
					      <slot></slot>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <VbenTooltip v-if="slots.tip" side="bottom">
 | 
				
			||||||
 | 
					        <template #trigger>
 | 
				
			||||||
 | 
					          <MdiQuestionMarkCircleOutline class="ml-1 cursor-help" />
 | 
				
			||||||
 | 
					        </template>
 | 
				
			||||||
 | 
					        <slot name="tip"></slot>
 | 
				
			||||||
 | 
					      </VbenTooltip>
 | 
				
			||||||
 | 
					    </span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <NumberField v-model="inputValue" v-bind="$attrs" class="w-[160px]">
 | 
				
			||||||
 | 
					      <NumberFieldContent>
 | 
				
			||||||
 | 
					        <NumberFieldDecrement />
 | 
				
			||||||
 | 
					        <NumberFieldInput />
 | 
				
			||||||
 | 
					        <NumberFieldIncrement />
 | 
				
			||||||
 | 
					      </NumberFieldContent>
 | 
				
			||||||
 | 
					    </NumberField>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
| 
						 | 
					@ -54,7 +54,7 @@ const slots = useSlots();
 | 
				
			||||||
      </VbenTooltip>
 | 
					      </VbenTooltip>
 | 
				
			||||||
    </span>
 | 
					    </span>
 | 
				
			||||||
    <Select v-model="selectValue">
 | 
					    <Select v-model="selectValue">
 | 
				
			||||||
      <SelectTrigger class="h-7 w-[140px]">
 | 
					      <SelectTrigger class="h-8 w-[160px]">
 | 
				
			||||||
        <SelectValue :placeholder="placeholder" />
 | 
					        <SelectValue :placeholder="placeholder" />
 | 
				
			||||||
      </SelectTrigger>
 | 
					      </SelectTrigger>
 | 
				
			||||||
      <SelectContent>
 | 
					      <SelectContent>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@ function handleClick() {
 | 
				
			||||||
    :class="{
 | 
					    :class="{
 | 
				
			||||||
      'pointer-events-none opacity-50': disabled,
 | 
					      'pointer-events-none opacity-50': disabled,
 | 
				
			||||||
    }"
 | 
					    }"
 | 
				
			||||||
    class="hover:bg-accent my-1 flex w-full items-center justify-between rounded-md px-2 py-2"
 | 
					    class="hover:bg-accent my-1 flex w-full items-center justify-between rounded-md px-2 py-2.5"
 | 
				
			||||||
    @click="handleClick"
 | 
					    @click="handleClick"
 | 
				
			||||||
  >
 | 
					  >
 | 
				
			||||||
    <span class="flex items-center text-sm">
 | 
					    <span class="flex items-center text-sm">
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,12 @@ import Preferences from './preferences.vue';
 | 
				
			||||||
    :breadcrumb-show-home="preferences.breadcrumb.showHome"
 | 
					    :breadcrumb-show-home="preferences.breadcrumb.showHome"
 | 
				
			||||||
    :breadcrumb-show-icon="preferences.breadcrumb.showIcon"
 | 
					    :breadcrumb-show-icon="preferences.breadcrumb.showIcon"
 | 
				
			||||||
    :breadcrumb-style-type="preferences.breadcrumb.styleType"
 | 
					    :breadcrumb-style-type="preferences.breadcrumb.styleType"
 | 
				
			||||||
 | 
					    :copyright-company-name="preferences.copyright.companyName"
 | 
				
			||||||
 | 
					    :copyright-company-site-link="preferences.copyright.companySiteLink"
 | 
				
			||||||
 | 
					    :copyright-date="preferences.copyright.date"
 | 
				
			||||||
    :copyright-enable="preferences.copyright.enable"
 | 
					    :copyright-enable="preferences.copyright.enable"
 | 
				
			||||||
 | 
					    :copyright-icp="preferences.copyright.icp"
 | 
				
			||||||
 | 
					    :copyright-icp-link="preferences.copyright.icpLink"
 | 
				
			||||||
    :footer-enable="preferences.footer.enable"
 | 
					    :footer-enable="preferences.footer.enable"
 | 
				
			||||||
    :footer-fixed="preferences.footer.fixed"
 | 
					    :footer-fixed="preferences.footer.fixed"
 | 
				
			||||||
    :header-enable="preferences.header.enable"
 | 
					    :header-enable="preferences.header.enable"
 | 
				
			||||||
| 
						 | 
					@ -36,6 +41,7 @@ import Preferences from './preferences.vue';
 | 
				
			||||||
    :sidebar-collapsed="preferences.sidebar.collapsed"
 | 
					    :sidebar-collapsed="preferences.sidebar.collapsed"
 | 
				
			||||||
    :sidebar-collapsed-show-title="preferences.sidebar.collapsedShowTitle"
 | 
					    :sidebar-collapsed-show-title="preferences.sidebar.collapsedShowTitle"
 | 
				
			||||||
    :sidebar-enable="preferences.sidebar.enable"
 | 
					    :sidebar-enable="preferences.sidebar.enable"
 | 
				
			||||||
 | 
					    :sidebar-width="preferences.sidebar.width"
 | 
				
			||||||
    :tabbar-enable="preferences.tabbar.enable"
 | 
					    :tabbar-enable="preferences.tabbar.enable"
 | 
				
			||||||
    :tabbar-show-icon="preferences.tabbar.showIcon"
 | 
					    :tabbar-show-icon="preferences.tabbar.showIcon"
 | 
				
			||||||
    :theme-builtin-type="preferences.theme.builtinType"
 | 
					    :theme-builtin-type="preferences.theme.builtinType"
 | 
				
			||||||
| 
						 | 
					@ -86,9 +92,24 @@ import Preferences from './preferences.vue';
 | 
				
			||||||
    @update:breadcrumb-style-type="
 | 
					    @update:breadcrumb-style-type="
 | 
				
			||||||
      (val) => updatePreferences({ breadcrumb: { styleType: val } })
 | 
					      (val) => updatePreferences({ breadcrumb: { styleType: val } })
 | 
				
			||||||
    "
 | 
					    "
 | 
				
			||||||
 | 
					    @update:copyright-company-name="
 | 
				
			||||||
 | 
					      (val) => updatePreferences({ copyright: { companyName: val } })
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					    @update:copyright-company-site-link="
 | 
				
			||||||
 | 
					      (val) => updatePreferences({ copyright: { companySiteLink: val } })
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					    @update:copyright-date="
 | 
				
			||||||
 | 
					      (val) => updatePreferences({ copyright: { date: val } })
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
    @update:copyright-enable="
 | 
					    @update:copyright-enable="
 | 
				
			||||||
      (val) => updatePreferences({ copyright: { enable: val } })
 | 
					      (val) => updatePreferences({ copyright: { enable: val } })
 | 
				
			||||||
    "
 | 
					    "
 | 
				
			||||||
 | 
					    @update:copyright-icp="
 | 
				
			||||||
 | 
					      (val) => updatePreferences({ copyright: { icp: val } })
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					    @update:copyright-icp-link="
 | 
				
			||||||
 | 
					      (val) => updatePreferences({ copyright: { icpLink: val } })
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
    @update:footer-enable="
 | 
					    @update:footer-enable="
 | 
				
			||||||
      (val) => updatePreferences({ footer: { enable: val } })
 | 
					      (val) => updatePreferences({ footer: { enable: val } })
 | 
				
			||||||
    "
 | 
					    "
 | 
				
			||||||
| 
						 | 
					@ -129,6 +150,9 @@ import Preferences from './preferences.vue';
 | 
				
			||||||
    @update:sidebar-enable="
 | 
					    @update:sidebar-enable="
 | 
				
			||||||
      (val) => updatePreferences({ sidebar: { enable: val } })
 | 
					      (val) => updatePreferences({ sidebar: { enable: val } })
 | 
				
			||||||
    "
 | 
					    "
 | 
				
			||||||
 | 
					    @update:sidebar-width="
 | 
				
			||||||
 | 
					      (val) => updatePreferences({ sidebar: { width: val } })
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
    @update:tabbar-enable="
 | 
					    @update:tabbar-enable="
 | 
				
			||||||
      (val) => updatePreferences({ tabbar: { enable: val } })
 | 
					      (val) => updatePreferences({ tabbar: { enable: val } })
 | 
				
			||||||
    "
 | 
					    "
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -77,6 +77,7 @@ const themeMode = defineModel<ThemeModeType>('themeMode');
 | 
				
			||||||
const themeRadius = defineModel<string>('themeRadius');
 | 
					const themeRadius = defineModel<string>('themeRadius');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const sidebarEnable = defineModel<boolean>('sidebarEnable');
 | 
					const sidebarEnable = defineModel<boolean>('sidebarEnable');
 | 
				
			||||||
 | 
					const sidebarWidth = defineModel<number>('sidebarWidth');
 | 
				
			||||||
const sidebarCollapsed = defineModel<boolean>('sidebarCollapsed');
 | 
					const sidebarCollapsed = defineModel<boolean>('sidebarCollapsed');
 | 
				
			||||||
const sidebarCollapsedShowTitle = defineModel<boolean>(
 | 
					const sidebarCollapsedShowTitle = defineModel<boolean>(
 | 
				
			||||||
  'sidebarCollapsedShowTitle',
 | 
					  'sidebarCollapsedShowTitle',
 | 
				
			||||||
| 
						 | 
					@ -108,6 +109,13 @@ const footerEnable = defineModel<boolean>('footerEnable');
 | 
				
			||||||
const footerFixed = defineModel<boolean>('footerFixed');
 | 
					const footerFixed = defineModel<boolean>('footerFixed');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const copyrightEnable = defineModel<boolean>('copyrightEnable');
 | 
					const copyrightEnable = defineModel<boolean>('copyrightEnable');
 | 
				
			||||||
 | 
					const copyrightCompanyName = defineModel<string>('copyrightCompanyName');
 | 
				
			||||||
 | 
					const copyrightCompanySiteLink = defineModel<string>(
 | 
				
			||||||
 | 
					  'copyrightCompanySiteLink',
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					const copyrightDate = defineModel<string>('copyrightDate');
 | 
				
			||||||
 | 
					const copyrightIcp = defineModel<string>('copyrightIcp');
 | 
				
			||||||
 | 
					const copyrightIcpLink = defineModel<string>('copyrightIcpLink');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const shortcutKeysEnable = defineModel<boolean>('shortcutKeysEnable');
 | 
					const shortcutKeysEnable = defineModel<boolean>('shortcutKeysEnable');
 | 
				
			||||||
const shortcutKeysGlobalSearch = defineModel<boolean>(
 | 
					const shortcutKeysGlobalSearch = defineModel<boolean>(
 | 
				
			||||||
| 
						 | 
					@ -272,11 +280,12 @@ async function handleReset() {
 | 
				
			||||||
              <Content v-model="appContentCompact" />
 | 
					              <Content v-model="appContentCompact" />
 | 
				
			||||||
            </Block>
 | 
					            </Block>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            <Block :title="$t('preferences.sidebar')">
 | 
					            <Block :title="$t('preferences.sidebar.title')">
 | 
				
			||||||
              <Sidebar
 | 
					              <Sidebar
 | 
				
			||||||
                v-model:sidebar-collapsed="sidebarCollapsed"
 | 
					                v-model:sidebar-collapsed="sidebarCollapsed"
 | 
				
			||||||
                v-model:sidebar-collapsed-show-title="sidebarCollapsedShowTitle"
 | 
					                v-model:sidebar-collapsed-show-title="sidebarCollapsedShowTitle"
 | 
				
			||||||
                v-model:sidebar-enable="sidebarEnable"
 | 
					                v-model:sidebar-enable="sidebarEnable"
 | 
				
			||||||
 | 
					                v-model:sidebar-width="sidebarWidth"
 | 
				
			||||||
                :disabled="!isSideMode"
 | 
					                :disabled="!isSideMode"
 | 
				
			||||||
              />
 | 
					              />
 | 
				
			||||||
            </Block>
 | 
					            </Block>
 | 
				
			||||||
| 
						 | 
					@ -325,7 +334,14 @@ async function handleReset() {
 | 
				
			||||||
              />
 | 
					              />
 | 
				
			||||||
            </Block>
 | 
					            </Block>
 | 
				
			||||||
            <Block :title="$t('preferences.copyright.title')">
 | 
					            <Block :title="$t('preferences.copyright.title')">
 | 
				
			||||||
              <Copyright v-model:copyright-enable="copyrightEnable" />
 | 
					              <Copyright
 | 
				
			||||||
 | 
					                v-model:copyright-company-name="copyrightCompanyName"
 | 
				
			||||||
 | 
					                v-model:copyright-company-site-link="copyrightCompanySiteLink"
 | 
				
			||||||
 | 
					                v-model:copyright-date="copyrightDate"
 | 
				
			||||||
 | 
					                v-model:copyright-enable="copyrightEnable"
 | 
				
			||||||
 | 
					                v-model:copyright-icp="copyrightIcp"
 | 
				
			||||||
 | 
					                v-model:copyright-icp-link="copyrightIcpLink"
 | 
				
			||||||
 | 
					              />
 | 
				
			||||||
            </Block>
 | 
					            </Block>
 | 
				
			||||||
          </template>
 | 
					          </template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -160,15 +160,11 @@ preferences:
 | 
				
			||||||
  normal: Normal
 | 
					  normal: Normal
 | 
				
			||||||
  plain: Plain
 | 
					  plain: Plain
 | 
				
			||||||
  rounded: Rounded
 | 
					  rounded: Rounded
 | 
				
			||||||
  collapse: Collpase Menu
 | 
					 | 
				
			||||||
  collapse-show-title: Display menu name
 | 
					 | 
				
			||||||
  interface-control: Interface Layout Control
 | 
					  interface-control: Interface Layout Control
 | 
				
			||||||
  copy: Copy Preferences
 | 
					  copy: Copy Preferences
 | 
				
			||||||
  copy-success: Copy successful. Please replace in `src/preferences.ts` of the app
 | 
					  copy-success: Copy successful. Please replace in `src/preferences.ts` of the app
 | 
				
			||||||
  clear-and-logout: Clear Cache & Logout
 | 
					  clear-and-logout: Clear Cache & Logout
 | 
				
			||||||
  reset-success: Preferences reset successfully
 | 
					  reset-success: Preferences reset successfully
 | 
				
			||||||
  sidebar: Sidebar
 | 
					 | 
				
			||||||
  side-visible: Display Sidebar
 | 
					 | 
				
			||||||
  mode: Mode
 | 
					  mode: Mode
 | 
				
			||||||
  logo-visible: Display Logo
 | 
					  logo-visible: Display Logo
 | 
				
			||||||
  # general
 | 
					  # general
 | 
				
			||||||
| 
						 | 
					@ -176,6 +172,12 @@ preferences:
 | 
				
			||||||
  language: Language
 | 
					  language: Language
 | 
				
			||||||
  dynamic-title: Dynamic Title
 | 
					  dynamic-title: Dynamic Title
 | 
				
			||||||
  ai-assistant: Ai Assistant
 | 
					  ai-assistant: Ai Assistant
 | 
				
			||||||
 | 
					  sidebar:
 | 
				
			||||||
 | 
					    title: Sidebar
 | 
				
			||||||
 | 
					    width: Width
 | 
				
			||||||
 | 
					    visible: Display Sidebar
 | 
				
			||||||
 | 
					    collapsed: Collpase Menu
 | 
				
			||||||
 | 
					    collapsed-show-title: Display menu name
 | 
				
			||||||
  tabbar:
 | 
					  tabbar:
 | 
				
			||||||
    title: Tabbar
 | 
					    title: Tabbar
 | 
				
			||||||
    enable: Enable Tab Bar
 | 
					    enable: Enable Tab Bar
 | 
				
			||||||
| 
						 | 
					@ -246,7 +248,12 @@ preferences:
 | 
				
			||||||
    fixed: Fixed at the bottom
 | 
					    fixed: Fixed at the bottom
 | 
				
			||||||
  copyright:
 | 
					  copyright:
 | 
				
			||||||
    title: Copyright
 | 
					    title: Copyright
 | 
				
			||||||
    enable: Enable CopyRight
 | 
					    enable: Enable copyright
 | 
				
			||||||
 | 
					    company-name: Company name
 | 
				
			||||||
 | 
					    company-site-link: Company homepage
 | 
				
			||||||
 | 
					    date: Date
 | 
				
			||||||
 | 
					    icp: ICP number
 | 
				
			||||||
 | 
					    icp-link: ICP Site Link
 | 
				
			||||||
  shortcut-keys:
 | 
					  shortcut-keys:
 | 
				
			||||||
    title: Shortcut Keys
 | 
					    title: Shortcut Keys
 | 
				
			||||||
    global: Global
 | 
					    global: Global
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -145,8 +145,6 @@ preferences:
 | 
				
			||||||
  wide: 流式
 | 
					  wide: 流式
 | 
				
			||||||
  compact: 定宽
 | 
					  compact: 定宽
 | 
				
			||||||
  follow-system: 跟随系统
 | 
					  follow-system: 跟随系统
 | 
				
			||||||
  collapse: 折叠菜单
 | 
					 | 
				
			||||||
  collapse-show-title: 显示菜单名
 | 
					 | 
				
			||||||
  vertical: 垂直
 | 
					  vertical: 垂直
 | 
				
			||||||
  vertical-tip: 侧边垂直菜单模式
 | 
					  vertical-tip: 侧边垂直菜单模式
 | 
				
			||||||
  horizontal: 水平
 | 
					  horizontal: 水平
 | 
				
			||||||
| 
						 | 
					@ -166,8 +164,6 @@ preferences:
 | 
				
			||||||
  copy-success: 拷贝成功,请在 app 下的 `src/preferences.ts`内进行覆盖
 | 
					  copy-success: 拷贝成功,请在 app 下的 `src/preferences.ts`内进行覆盖
 | 
				
			||||||
  clear-and-logout: 清空缓存 & 退出登录
 | 
					  clear-and-logout: 清空缓存 & 退出登录
 | 
				
			||||||
  reset-success: 重置偏好设置成功
 | 
					  reset-success: 重置偏好设置成功
 | 
				
			||||||
  sidebar: 侧边栏
 | 
					 | 
				
			||||||
  side-visible: 显示侧边栏
 | 
					 | 
				
			||||||
  mode: 模式
 | 
					  mode: 模式
 | 
				
			||||||
  logo-visible: 显示 Logo
 | 
					  logo-visible: 显示 Logo
 | 
				
			||||||
  # general
 | 
					  # general
 | 
				
			||||||
| 
						 | 
					@ -175,6 +171,12 @@ preferences:
 | 
				
			||||||
  language: 语言
 | 
					  language: 语言
 | 
				
			||||||
  dynamic-title: 动态标题
 | 
					  dynamic-title: 动态标题
 | 
				
			||||||
  ai-assistant: Ai 助手
 | 
					  ai-assistant: Ai 助手
 | 
				
			||||||
 | 
					  sidebar:
 | 
				
			||||||
 | 
					    title: 侧边栏
 | 
				
			||||||
 | 
					    width: 宽度
 | 
				
			||||||
 | 
					    visible: 显示侧边栏
 | 
				
			||||||
 | 
					    collapsed: 折叠菜单
 | 
				
			||||||
 | 
					    collapsed-show-title: 显示菜单名
 | 
				
			||||||
  tabbar:
 | 
					  tabbar:
 | 
				
			||||||
    title: 标签栏
 | 
					    title: 标签栏
 | 
				
			||||||
    enable: 启用标签栏
 | 
					    enable: 启用标签栏
 | 
				
			||||||
| 
						 | 
					@ -246,6 +248,11 @@ preferences:
 | 
				
			||||||
  copyright:
 | 
					  copyright:
 | 
				
			||||||
    title: 版权
 | 
					    title: 版权
 | 
				
			||||||
    enable: 启用版权
 | 
					    enable: 启用版权
 | 
				
			||||||
 | 
					    company-name: 公司名
 | 
				
			||||||
 | 
					    company-site-link: 公司主页
 | 
				
			||||||
 | 
					    date: 日期
 | 
				
			||||||
 | 
					    icp: ICP 备案号
 | 
				
			||||||
 | 
					    icp-link: ICP 网站链接
 | 
				
			||||||
  shortcut-keys:
 | 
					  shortcut-keys:
 | 
				
			||||||
    title: 快捷键
 | 
					    title: 快捷键
 | 
				
			||||||
    global: 全局
 | 
					    global: 全局
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -760,6 +760,9 @@ importers:
 | 
				
			||||||
      class-variance-authority:
 | 
					      class-variance-authority:
 | 
				
			||||||
        specifier: ^0.7.0
 | 
					        specifier: ^0.7.0
 | 
				
			||||||
        version: 0.7.0
 | 
					        version: 0.7.0
 | 
				
			||||||
 | 
					      lucide-vue-next:
 | 
				
			||||||
 | 
					        specifier: ^0.400.0
 | 
				
			||||||
 | 
					        version: 0.400.0(vue@3.4.31(typescript@5.5.3))
 | 
				
			||||||
      radix-vue:
 | 
					      radix-vue:
 | 
				
			||||||
        specifier: ^1.9.0
 | 
					        specifier: ^1.9.0
 | 
				
			||||||
        version: 1.9.0(vue@3.4.31(typescript@5.5.3))
 | 
					        version: 1.9.0(vue@3.4.31(typescript@5.5.3))
 | 
				
			||||||
| 
						 | 
					@ -6552,6 +6555,11 @@ packages:
 | 
				
			||||||
    resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
 | 
					    resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
 | 
				
			||||||
    engines: {node: '>=10'}
 | 
					    engines: {node: '>=10'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  lucide-vue-next@0.400.0:
 | 
				
			||||||
 | 
					    resolution: {integrity: sha512-JQMby6HuSr/ALLL3IAjpca/hP499vWy4+zqzCrTsAzdg0BHM0Lge84bMMxvpqqXnU24uRQkmOZCi5ksecTogfw==}
 | 
				
			||||||
 | 
					    peerDependencies:
 | 
				
			||||||
 | 
					      vue: ^3.4.31
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  magic-string@0.25.9:
 | 
					  magic-string@0.25.9:
 | 
				
			||||||
    resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
 | 
					    resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15771,6 +15779,10 @@ snapshots:
 | 
				
			||||||
    dependencies:
 | 
					    dependencies:
 | 
				
			||||||
      yallist: 4.0.0
 | 
					      yallist: 4.0.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  lucide-vue-next@0.400.0(vue@3.4.31(typescript@5.5.3)):
 | 
				
			||||||
 | 
					    dependencies:
 | 
				
			||||||
 | 
					      vue: 3.4.31(typescript@5.5.3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  magic-string@0.25.9:
 | 
					  magic-string@0.25.9:
 | 
				
			||||||
    dependencies:
 | 
					    dependencies:
 | 
				
			||||||
      sourcemap-codec: 1.4.8
 | 
					      sourcemap-codec: 1.4.8
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue