Compare commits

...
8 Commits
Author SHA1 Message Date
Hooray be4a274f00 fix: 修复应用运行时警告 2026-08-30 01:31:08 +08:00
Hooray 6889792142 chore: 更新依赖 2026-08-28 15:35:36 +08:00
Hooray b02192d293 style: 调整 FaPagination 组件的分页宽度样式 2026-08-14 19:01:29 +08:00
Hooray 09a179cd7f fix: 修复 FaSwitch 组件激活样式 2026-08-14 18:58:17 +08:00
Hooray 1b3ed11d55 chore: 更新依赖 2026-08-01 08:04:31 +08:00
Hooray d712653c17 chore: readme 2026-07-18 01:19:58 +08:00
Hooray 75197a0889 chore: 更新依赖 2026-07-17 21:48:36 +08:00
Hooray 3d7d9168d1 style: 规范 unocss class 2026-07-13 04:09:19 +08:00
41 changed files with 3890 additions and 4395 deletions
+1 -7
View File
@@ -24,7 +24,7 @@ An **AI-oriented** admin system framework
- AI-friendly engineering foundation with multiple built-in Skills
- First-class tech stack: Vue 3.6 / Vite 8 / Pinia / UnoCSS / VueUse / TypeScript / ESLint / Stylelint / ...
- Freely choose your preferred UI library, with Element Plus by default
- Freely choose your preferred UI library
- 8 built-in theme schemes with extensibility for distinct industry brand styles
- 7 navigation menu modes to match products at different growth stages
- Fine-grained and controllable page keep-alive strategy
@@ -48,12 +48,6 @@ If you find Fantastic-admin useful, or you are already using it, please consider
[![star](https://atomgit.com/fantastic-admin/basic/star/badge.svg)](https://atomgit.com/fantastic-admin/basic)
<details>
<summary>Github Stars Chart</summary>
[![Stargazers over time](https://starchart.cc/fantastic-admin/basic.svg)](https://starchart.cc/fantastic-admin/basic)
</details>
## Ecosystem
- [`Fantastic-startkit`](https://hooray.github.io/fantastic-startkit/) - A simple and easy-to-use Vue 3 project starter kit
-6
View File
@@ -48,12 +48,6 @@
[![star](https://atomgit.com/fantastic-admin/basic/star/badge.svg)](https://atomgit.com/fantastic-admin/basic)
<details>
<summary>Github Stars 曲线</summary>
[![Stargazers over time](https://starchart.cc/fantastic-admin/basic.svg)](https://starchart.cc/fantastic-admin/basic)
</details>
## 生态
- [`Fantastic-startkit`](https://hooray.github.io/fantastic-startkit/) - 简单好用的 Vue3 项目启动套件
+2
View File
@@ -1,5 +1,7 @@
/* eslint-disable */
/* prettier-ignore */
/* oxlint-disable */
/* oxfmt-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
+4 -5
View File
@@ -4,10 +4,9 @@ import process from 'node:process'
import dayjs from 'dayjs'
import { defineConfig, loadEnv } from 'vite'
import { parseLoadedEnv } from 'vite-plugin-env-parse'
import pkg from './package.json'
import createVitePlugins from './vite/plugins'
import pkg from './package.json' with { type: 'json' }
import createVitePlugins from './vite/plugins.ts'
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
const env = parseLoadedEnv(loadEnv(mode, process.cwd()))
// 全局 scss 资源
@@ -54,8 +53,8 @@ export default defineConfig(({ mode, command }) => {
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'#': path.resolve(__dirname, 'src/types'),
'@': path.resolve(import.meta.dirname, 'src'),
'#': path.resolve(import.meta.dirname, 'src/types'),
},
},
css: {
+2
View File
@@ -1,5 +1,7 @@
/* eslint-disable */
/* prettier-ignore */
/* oxlint-disable */
/* oxfmt-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
+4 -5
View File
@@ -4,10 +4,9 @@ import process from 'node:process'
import dayjs from 'dayjs'
import { defineConfig, loadEnv } from 'vite'
import { parseLoadedEnv } from 'vite-plugin-env-parse'
import pkg from './package.json'
import createVitePlugins from './vite/plugins'
import pkg from './package.json' with { type: 'json' }
import createVitePlugins from './vite/plugins.ts'
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
const env = parseLoadedEnv(loadEnv(mode, process.cwd()))
// 全局 scss 资源
@@ -54,8 +53,8 @@ export default defineConfig(({ mode, command }) => {
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'#': path.resolve(__dirname, 'src/types'),
'@': path.resolve(import.meta.dirname, 'src'),
'#': path.resolve(import.meta.dirname, 'src/types'),
},
},
css: {
+2
View File
@@ -1,5 +1,7 @@
/* eslint-disable */
/* prettier-ignore */
/* oxlint-disable */
/* oxfmt-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
+4 -5
View File
@@ -4,10 +4,9 @@ import process from 'node:process'
import dayjs from 'dayjs'
import { defineConfig, loadEnv } from 'vite'
import { parseLoadedEnv } from 'vite-plugin-env-parse'
import pkg from './package.json'
import createVitePlugins from './vite/plugins'
import pkg from './package.json' with { type: 'json' }
import createVitePlugins from './vite/plugins.ts'
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
const env = parseLoadedEnv(loadEnv(mode, process.cwd()))
// 全局 scss 资源
@@ -54,8 +53,8 @@ export default defineConfig(({ mode, command }) => {
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'#': path.resolve(__dirname, 'src/types'),
'@': path.resolve(import.meta.dirname, 'src'),
'#': path.resolve(import.meta.dirname, 'src/types'),
},
},
css: {
+3
View File
@@ -2,4 +2,7 @@ import { setSettings } from '@fantastic-admin/settings'
export default setSettings({
// 请在此处编写或粘贴应用配置
menu: {
mainMenuClickMode: 'smart',
},
})
+2
View File
@@ -1,5 +1,7 @@
/* eslint-disable */
/* prettier-ignore */
/* oxlint-disable */
/* oxfmt-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
+4 -5
View File
@@ -4,10 +4,9 @@ import process from 'node:process'
import dayjs from 'dayjs'
import { defineConfig, loadEnv } from 'vite'
import { parseLoadedEnv } from 'vite-plugin-env-parse'
import pkg from './package.json'
import createVitePlugins from './vite/plugins'
import pkg from './package.json' with { type: 'json' }
import createVitePlugins from './vite/plugins.ts'
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
const env = parseLoadedEnv(loadEnv(mode, process.cwd()))
// 全局 scss 资源
@@ -54,8 +53,8 @@ export default defineConfig(({ mode, command }) => {
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'#': path.resolve(__dirname, 'src/types'),
'@': path.resolve(import.meta.dirname, 'src'),
'#': path.resolve(import.meta.dirname, 'src/types'),
},
},
css: {
+2
View File
@@ -1,5 +1,7 @@
/* eslint-disable */
/* prettier-ignore */
/* oxlint-disable */
/* oxfmt-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
+4 -5
View File
@@ -4,10 +4,9 @@ import process from 'node:process'
import dayjs from 'dayjs'
import { defineConfig, loadEnv } from 'vite'
import { parseLoadedEnv } from 'vite-plugin-env-parse'
import pkg from './package.json'
import createVitePlugins from './vite/plugins'
import pkg from './package.json' with { type: 'json' }
import createVitePlugins from './vite/plugins.ts'
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
const env = parseLoadedEnv(loadEnv(mode, process.cwd()))
// 全局 scss 资源
@@ -54,8 +53,8 @@ export default defineConfig(({ mode, command }) => {
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'#': path.resolve(__dirname, 'src/types'),
'@': path.resolve(import.meta.dirname, 'src'),
'#': path.resolve(import.meta.dirname, 'src/types'),
},
},
css: {
+2
View File
@@ -1,5 +1,7 @@
/* eslint-disable */
/* prettier-ignore */
/* oxlint-disable */
/* oxfmt-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
+4 -5
View File
@@ -4,10 +4,9 @@ import process from 'node:process'
import dayjs from 'dayjs'
import { defineConfig, loadEnv } from 'vite'
import { parseLoadedEnv } from 'vite-plugin-env-parse'
import pkg from './package.json'
import createVitePlugins from './vite/plugins'
import pkg from './package.json' with { type: 'json' }
import createVitePlugins from './vite/plugins.ts'
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
const env = parseLoadedEnv(loadEnv(mode, process.cwd()))
// 全局 scss 资源
@@ -54,8 +53,8 @@ export default defineConfig(({ mode, command }) => {
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'#': path.resolve(__dirname, 'src/types'),
'@': path.resolve(import.meta.dirname, 'src'),
'#': path.resolve(import.meta.dirname, 'src/types'),
},
},
css: {
+2
View File
@@ -1,5 +1,7 @@
/* eslint-disable */
/* prettier-ignore */
/* oxlint-disable */
/* oxfmt-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
+4 -5
View File
@@ -4,10 +4,9 @@ import process from 'node:process'
import dayjs from 'dayjs'
import { defineConfig, loadEnv } from 'vite'
import { parseLoadedEnv } from 'vite-plugin-env-parse'
import pkg from './package.json'
import createVitePlugins from './vite/plugins'
import pkg from './package.json' with { type: 'json' }
import createVitePlugins from './vite/plugins.ts'
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
const env = parseLoadedEnv(loadEnv(mode, process.cwd()))
// 全局 scss 资源
@@ -54,8 +53,8 @@ export default defineConfig(({ mode, command }) => {
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'#': path.resolve(__dirname, 'src/types'),
'@': path.resolve(import.meta.dirname, 'src'),
'#': path.resolve(import.meta.dirname, 'src/types'),
},
},
css: {
+2
View File
@@ -1,5 +1,7 @@
/* eslint-disable */
/* prettier-ignore */
/* oxlint-disable */
/* oxfmt-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
+4
View File
@@ -35,6 +35,8 @@ declare module 'vue' {
FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown']
FaFileUpload: typeof import('@fantastic-admin/components')['FaFileUpload']
FaFixedBar: typeof import('@fantastic-admin/components')['FaFixedBar']
FaForm: typeof import('@fantastic-admin/components')['FaForm']
FaFormItem: typeof import('@fantastic-admin/components')['FaFormItem']
FaHoverCard: typeof import('@fantastic-admin/components')['FaHoverCard']
FaIcon: typeof import('@fantastic-admin/components')['FaIcon']
FaImagePreview: typeof import('@fantastic-admin/components')['FaImagePreview']
@@ -93,6 +95,8 @@ declare global {
const FaDropdown: typeof import('@fantastic-admin/components')['FaDropdown']
const FaFileUpload: typeof import('@fantastic-admin/components')['FaFileUpload']
const FaFixedBar: typeof import('@fantastic-admin/components')['FaFixedBar']
const FaForm: typeof import('@fantastic-admin/components')['FaForm']
const FaFormItem: typeof import('@fantastic-admin/components')['FaFormItem']
const FaHoverCard: typeof import('@fantastic-admin/components')['FaHoverCard']
const FaIcon: typeof import('@fantastic-admin/components')['FaIcon']
const FaImagePreview: typeof import('@fantastic-admin/components')['FaImagePreview']
+4 -5
View File
@@ -4,10 +4,9 @@ import process from 'node:process'
import dayjs from 'dayjs'
import { defineConfig, loadEnv } from 'vite'
import { parseLoadedEnv } from 'vite-plugin-env-parse'
import pkg from './package.json'
import createVitePlugins from './vite/plugins'
import pkg from './package.json' with { type: 'json' }
import createVitePlugins from './vite/plugins.ts'
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
const env = parseLoadedEnv(loadEnv(mode, process.cwd()))
// 全局 scss 资源
@@ -54,8 +53,8 @@ export default defineConfig(({ mode, command }) => {
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'#': path.resolve(__dirname, 'src/types'),
'@': path.resolve(import.meta.dirname, 'src'),
'#': path.resolve(import.meta.dirname, 'src/types'),
},
},
css: {
+2
View File
@@ -1,5 +1,7 @@
/* eslint-disable */
/* prettier-ignore */
/* oxlint-disable */
/* oxfmt-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
+4 -5
View File
@@ -4,10 +4,9 @@ import process from 'node:process'
import dayjs from 'dayjs'
import { defineConfig, loadEnv } from 'vite'
import { parseLoadedEnv } from 'vite-plugin-env-parse'
import pkg from './package.json'
import createVitePlugins from './vite/plugins'
import pkg from './package.json' with { type: 'json' }
import createVitePlugins from './vite/plugins.ts'
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
const env = parseLoadedEnv(loadEnv(mode, process.cwd()))
// 全局 scss 资源
@@ -55,8 +54,8 @@ export default defineConfig(({ mode, command }) => {
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
'#': path.resolve(__dirname, 'src/types'),
'@': path.resolve(import.meta.dirname, 'src'),
'#': path.resolve(import.meta.dirname, 'src/types'),
},
},
css: {
+1 -1
View File
@@ -3,7 +3,7 @@
"type": "module",
"version": "6.3.0",
"private": true,
"packageManager": "pnpm@11.9.0",
"packageManager": "pnpm@11.24.0",
"engines": {
"node": "^22.22.2 || ^24.15.0 || >=26.0.0"
},
@@ -4,7 +4,7 @@ import { cva } from 'class-variance-authority'
export { default as Badge } from './Badge.vue'
export const badgeVariants = cva(
'inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',
'inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',
{
variants: {
variant: {
@@ -4,7 +4,7 @@ import { cva } from 'class-variance-authority'
export { default as Button } from './Button.vue'
export const buttonVariants = cva(
'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*=size-])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',
'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*=size-])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',
{
variants: {
variant: {
@@ -158,7 +158,7 @@ function handleCustomOptionKeydown(option: TOption) {
cn(
'flex gap-2',
option.description ? 'items-start' : 'items-center',
slots.option && 'outline-none focus-visible:ring-ring/50 focus-visible:ring-[3px] rounded-xl',
slots.option && 'outline-none focus-visible:ring-ring/50 focus-visible:ring-3 rounded-xl',
props.optionClass,
)
"
@@ -20,7 +20,7 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits)
data-slot="checkbox"
v-bind="forwarded"
:class="
cn('peer border-input data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50', props.class)"
cn('peer border-input data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-3 disabled:cursor-not-allowed disabled:opacity-50', props.class)"
>
<CheckboxIndicator
data-slot="checkbox-indicator"
@@ -22,7 +22,7 @@ const slot = computed(() => context?.value.slots[props.index])
v-bind="forwarded"
data-slot="input-otp-slot"
:data-active="slot?.isActive"
:class="cn('data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-e text-sm shadow-xs transition-all outline-none first:rounded-ss-md first:rounded-es-md first:border-s last:rounded-se-md last:rounded-ee-md data-[active=true]:z-10 data-[active=true]:ring-[3px]', props.class)"
:class="cn('data-[active=true]:border-ring data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:ring-destructive/20 dark:data-[active=true]:aria-invalid:ring-destructive/40 aria-invalid:border-destructive data-[active=true]:aria-invalid:border-destructive dark:bg-input/30 border-input relative flex h-9 w-9 items-center justify-center border-y border-e text-sm shadow-xs transition-all outline-none first:rounded-ss-md first:rounded-es-md first:border-s last:rounded-se-md last:rounded-ee-md data-[active=true]:z-10 data-[active=true]:ring-3', props.class)"
>
{{ slot?.char }}
<div v-if="slot?.hasFakeCaret" class="flex pointer-events-none items-center inset-0 justify-center absolute">
@@ -60,7 +60,7 @@ defineExpose({
v-bind="{
...omit(props, ['type', 'align', 'clearable', 'class', 'inputClass', 'startClass', 'endClass']),
type,
class: cn('w-full flex-1 border-0 rounded-none bg-transparent ring-offset-transparent dark:bg-transparent focus-visible:ring-0 focus-visible:ring-transparent', props.inputClass),
class: cn('w-full flex-1 border-0 rounded-none bg-transparent shadow-none ring-offset-transparent dark:bg-transparent focus-visible:ring-0 focus-visible:ring-transparent', props.inputClass),
...$attrs,
}"
ref="inputRef"
@@ -22,7 +22,7 @@ const props = defineProps<{
'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3',
// Focus state.
'has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-[3px]',
'has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-3',
// Error state.
'has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40',
@@ -33,7 +33,7 @@ defineExpose({
data-slot="input"
:class="cn(
'file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]',
'focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-3',
'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',
props.class,
)"
@@ -109,7 +109,7 @@ function handleJump() {
<PaginationFirst size="icon-sm" class="size-8 rtl:rotate-180" />
<PaginationPrevious size="icon-sm" class="size-8 rtl:rotate-180" />
<template v-for="(item, index) in items" :key="index">
<PaginationItem v-if="item.type === 'page'" :value="item.value" :is-active="item.value === currentPage" size="icon-sm" class="size-8">
<PaginationItem v-if="item.type === 'page'" :value="item.value" :is-active="item.value === currentPage" size="icon-sm" class="min-w-8 w-auto">
{{ item.value }}
</PaginationItem>
<PaginationEllipsis v-else :key="item.type" :index="index" />
@@ -23,7 +23,7 @@ const forwardedProps = useForwardProps(delegatedProps)
v-bind="forwardedProps"
:class="
cn(
'border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
'border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-3 disabled:cursor-not-allowed disabled:opacity-50',
props.class,
)
"
@@ -55,7 +55,7 @@ defineExpose({
<ScrollAreaViewport
ref="viewportRef"
data-slot="scroll-area-viewport"
class="scroll-area-viewport outline-none rounded-[inherit] size-full transition-[color,box-shadow] focus-visible:outline-1 focus-visible:ring-[3px] focus-visible:ring-ring/50"
class="scroll-area-viewport outline-none rounded-[inherit] size-full transition-[color,box-shadow] focus-visible:outline-1 focus-visible:ring-3 focus-visible:ring-ring/50"
:class="{
'scroll-area-mask-vertical': props.mask && !props.horizontal,
'scroll-area-mask-horizontal': props.mask && props.horizontal,
@@ -21,7 +21,7 @@ const forwardedProps = useForwardProps(delegatedProps)
:data-size="size"
v-bind="forwardedProps"
:class="cn(
'border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*=text-])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=size-])]:size-4',
'border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*=text-])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-3 disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=size-])]:size-4',
props.class,
)"
>
@@ -24,13 +24,13 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits)
data-slot="switch"
v-bind="forwarded"
:class="cn(
'peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
'peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-3 disabled:cursor-not-allowed disabled:opacity-50',
props.class,
)"
>
<SwitchThumb
data-slot="switch-thumb"
:class="cn('bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none flex-center size-4 rounded-full ring-0 transition-transform data-[state=checked]:ltr:translate-x-[calc(100%-2px)] data-[state=checked]:rtl:-translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0')"
:class="cn('bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none flex-center size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=checked]:rtl:-translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0')"
>
<slot name="thumb" v-bind="slotProps" />
</SwitchThumb>
@@ -16,7 +16,7 @@ const forwardedProps = useForwardProps(delegatedProps)
<TabsTrigger
data-slot="tabs-trigger"
:class="cn(
'data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=size-])]:size-4',
'data-[state=active]:bg-background dark:data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 text-foreground dark:text-muted-foreground inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-3 focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*=size-])]:size-4',
props.class,
)"
v-bind="forwardedProps"
@@ -22,7 +22,7 @@ const props = defineProps<{
'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3',
// Focus state.
'has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-[3px]',
'has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-3',
// Error state.
'has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40',
@@ -23,6 +23,6 @@ const modelValue = useVModel(props, 'modelValue', emits, {
<textarea
v-model="modelValue"
data-slot="textarea"
:class="cn('border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', props.class)"
:class="cn('border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-3 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm', props.class)"
/>
</template>
+3751 -4260
View File
File diff suppressed because it is too large Load Diff
+59 -59
View File
@@ -10,127 +10,127 @@ packages:
- apps/*
- packages/*
catalog:
'@antfu/eslint-config': ^9.1.0
'@clack/prompts': ^1.6.0
'@faker-js/faker': ^10.5.0
'@iconify/json': ^2.2.495
'@antfu/eslint-config': ^9.3.0
'@clack/prompts': ^1.7.0
'@faker-js/faker': ^10.6.0
'@iconify/json': ^2.2.521
'@iconify/vue': ^5.0.1
'@lucide/vue': ^1.23.0
'@spiriit/vite-plugin-svg-spritemap': ^7.0.0
'@lucide/vue': ^1.34.0
'@spiriit/vite-plugin-svg-spritemap': ^7.2.0
'@stylistic/stylelint-config': ^5.0.0
'@tanstack/vue-table': ^8.21.3
'@tinymce/tinymce-vue': ^6.3.0
'@types/fs-extra': ^11.0.4
'@types/node': ^26.1.0
'@types/node': ^26.4.0
'@types/nprogress': ^0.2.3
'@types/path-browserify': ^1.0.3
'@types/qs': ^6.15.1
'@types/splitpanes': ^2.2.6
'@unocss/core': ^66.7.4
'@unocss/eslint-plugin': ^66.7.4
'@unocss/core': ^66.8.1
'@unocss/eslint-plugin': ^66.8.1
'@vee-validate/zod': ^4.15.1
'@visactor/vchart': ^2.1.2
'@vitejs/plugin-legacy': ^8.1.0
'@vitejs/plugin-vue': ^6.0.7
'@visactor/vchart': ^2.1.6
'@vitejs/plugin-legacy': ^8.2.3
'@vitejs/plugin-vue': ^6.0.8
'@vitejs/plugin-vue-jsx': ^5.1.6
'@vue/tsconfig': ^0.9.1
'@vueuse/components': ^14.3.0
'@vueuse/core': ^14.3.0
'@vueuse/integrations': ^14.3.0
'@zumer/snapdom': ^2.15.0
'@vueuse/components': ^14.4.0
'@vueuse/core': ^14.4.0
'@vueuse/integrations': ^14.4.0
'@zumer/snapdom': ^2.24.10
animate.css: ^4.1.1
autoprefixer: ^10.5.2
axios: ^1.18.1
autoprefixer: ^10.5.4
axios: ^1.20.0
boxen: ^8.0.1
bumpp: ^11.1.0
bumpp: ^12.2.2
class-variance-authority: ^0.7.1
clsx: ^2.1.1
cropperjs: 1.6.2
cz-git: ^1.13.1
dayjs: ^1.11.21
cz-git: ^1.14.0
dayjs: ^1.11.23
defu: ^6.1.7
echarts: ^6.1.0
eruda: ^3.4.3
es-toolkit: ^1.49.0
eslint: ^10.6.0
filesize: ^11.0.19
fs-extra: ^11.3.6
hotkeys-js: ^4.0.4
es-toolkit: ^1.51.0
eslint: ^10.9.1
filesize: ^11.0.22
fs-extra: ^11.4.0
hotkeys-js: ^4.0.5
http-server: ^14.1.1
lint-staged: ^17.0.8
lint-staged: ^17.3.0
mitt: ^3.0.1
npm-run-all2: ^9.0.2
npm-run-all2: ^9.0.3
nprogress: ^0.2.0
path-browserify: ^1.0.1
path-to-regexp: ^8.4.2
picocolors: ^1.1.1
pinia: ^3.0.4
pinia: ^4.0.3
pinia-plugin-persistedstate: ^4.7.1
pinyin-pro: ^3.28.1
postcss: ^8.5.16
postcss-nested: ^7.0.2
pinyin-pro: ^3.29.3
postcss: ^8.5.26
postcss-nested: ^8.0.1
print-js: ^1.6.0
qs: ^6.15.3
reka-ui: ^2.10.1
sass-embedded: ^1.100.0
reka-ui: ^2.10.4
sass-embedded: ^1.103.1
scule: ^1.3.0
sign-canvas: 2.0.0
simple-git-hooks: ^2.13.1
splitpanes: ^4.1.2
stylelint: ^17.14.0
stylelint-config-recess-order: ^7.7.0
stylelint: ^17.14.1
stylelint-config-recess-order: ^7.8.0
stylelint-config-standard-scss: ^17.0.0
stylelint-config-standard-vue: ^1.0.0
stylelint-config-standard-vue: ^2.0.0
stylelint-scss: ^7.2.0
svgo: ^4.0.1
swiper: ^14.0.1
svgo: ^4.1.0
swiper: ^14.2.0
tailwind-merge: ^3.6.0
taze: ^19.14.1
taze: ^21.1.0
tinymce: 7.9.3
tsx: ^4.23.0
type-fest: ^5.7.0
tsx: ^4.23.12
type-fest: ^5.8.0
typescript: ^6.0.3
ua-parser-js: ^2.0.10
unocss: ^66.7.4
unocss: ^66.8.1
unocss-preset-animations: ^1.3.0
unplugin-auto-import: ^21.0.0
unplugin-turbo-console: ^2.3.2
unplugin-auto-import: ^21.1.0
unplugin-turbo-console: ^2.3.3
unplugin-vue-components: ^32.1.0
vconsole: ^3.15.1
vee-validate: ^4.15.1
vite: ^8.1.3
vite: ^8.2.2
vite-plugin-app-loading: ^0.6.1
vite-plugin-archiver: ^0.4.1
vite-plugin-banner: ^0.8.1
vite-plugin-compression2: ^2.5.3
vite-plugin-env-parse: ^1.0.15
vite-plugin-fake-server: ^2.2.4
vite-plugin-vue-devtools: ^8.1.5
vue: ^3.5.39
vite-plugin-vue-devtools: ^8.2.1
vue: ^3.5.42
vue-currency-input: ^3.2.2
vue-data-ui: ^3.22.5
vue-data-ui: ^3.23.14
vue-hooks-plus: ^2.4.3
vue-input-otp: ^0.3.2
vue-router: ^5.1.0
vue-input-otp: ^0.4.0
vue-router: ^5.2.0
vue-sonner: ^2.0.9
vue-tsc: ^3.3.6
vxe-pc-ui: ^4.15.23
vxe-table: ^4.19.23
xe-utils: ^4.0.10
vue-tsc: ^3.3.11
vxe-pc-ui: ^4.17.19
vxe-table: ^4.21.2
xe-utils: ^4.0.12
zod: ^4.4.3
catalogs:
ant-design-vue:
ant-design-vue: ^4.2.6
antdv-next:
antdv-next: ^1.4.1
antdv-next: ^1.5.2
arco-design-vue:
'@arco-design/web-vue': ^2.58.0
element-plus:
element-plus: ^2.14.2
element-plus: ^2.14.5
naive-ui:
naive-ui: ^2.44.1
naive-ui: ^2.45.2
tdesign:
tdesign-vue-next: ^1.20.3
tdesign-vue-next: ^1.20.6
vexip-ui:
vexip-ui: ^2.3.40
allowBuilds: