diff --git a/packages/core/package.json b/packages/core/package.json index dc3b8e42..652895dd 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -61,9 +61,9 @@ "aeac": "rimraf src/index.ts && rimraf src/install.ts && esno .build/scripts/auto-export-all-components.js" }, "peerDependencies": { - "typescript-api-pro": "^0.0.6", "@element-plus/icons-vue": "^2.3.1", - "element-plus": "^2.9.7" + "element-plus": "^2.9.7", + "typescript-api-pro": "^0.0.6" }, "dependencies": { "@vueuse/core": "^13.1.0", diff --git a/packages/core/src/auto-import.d.ts b/packages/core/src/auto-import.d.ts index 2a988d1e..d82c4212 100644 --- a/packages/core/src/auto-import.d.ts +++ b/packages/core/src/auto-import.d.ts @@ -6,83 +6,66 @@ // biome-ignore lint: disable export {} declare global { - const EffectScope: (typeof import('vue'))['EffectScope']; - const ElMessage: (typeof import('element-plus/es'))['ElMessage']; - const computed: (typeof import('vue'))['computed']; - const createApp: (typeof import('vue'))['createApp']; - const customRef: (typeof import('vue'))['customRef']; - const defineAsyncComponent: (typeof import('vue'))['defineAsyncComponent']; - const defineComponent: (typeof import('vue'))['defineComponent']; - const effectScope: (typeof import('vue'))['effectScope']; - const getCurrentInstance: (typeof import('vue'))['getCurrentInstance']; - const getCurrentScope: (typeof import('vue'))['getCurrentScope']; - const inject: (typeof import('vue'))['inject']; - const isProxy: (typeof import('vue'))['isProxy']; - const isReactive: (typeof import('vue'))['isReactive']; - const isReadonly: (typeof import('vue'))['isReadonly']; - const isRef: (typeof import('vue'))['isRef']; - const markRaw: (typeof import('vue'))['markRaw']; - const nextTick: (typeof import('vue'))['nextTick']; - const onActivated: (typeof import('vue'))['onActivated']; - const onBeforeMount: (typeof import('vue'))['onBeforeMount']; - const onBeforeUnmount: (typeof import('vue'))['onBeforeUnmount']; - const onBeforeUpdate: (typeof import('vue'))['onBeforeUpdate']; - const onDeactivated: (typeof import('vue'))['onDeactivated']; - const onErrorCaptured: (typeof import('vue'))['onErrorCaptured']; - const onMounted: (typeof import('vue'))['onMounted']; - const onRenderTracked: (typeof import('vue'))['onRenderTracked']; - const onRenderTriggered: (typeof import('vue'))['onRenderTriggered']; - const onScopeDispose: (typeof import('vue'))['onScopeDispose']; - const onServerPrefetch: (typeof import('vue'))['onServerPrefetch']; - const onUnmounted: (typeof import('vue'))['onUnmounted']; - const onUpdated: (typeof import('vue'))['onUpdated']; - const onWatcherCleanup: (typeof import('vue'))['onWatcherCleanup']; - const provide: (typeof import('vue'))['provide']; - const reactive: (typeof import('vue'))['reactive']; - const readonly: (typeof import('vue'))['readonly']; - const ref: (typeof import('vue'))['ref']; - const resolveComponent: (typeof import('vue'))['resolveComponent']; - const shallowReactive: (typeof import('vue'))['shallowReactive']; - const shallowReadonly: (typeof import('vue'))['shallowReadonly']; - const shallowRef: (typeof import('vue'))['shallowRef']; - const toRaw: (typeof import('vue'))['toRaw']; - const toRef: (typeof import('vue'))['toRef']; - const toRefs: (typeof import('vue'))['toRefs']; - const toValue: (typeof import('vue'))['toValue']; - const triggerRef: (typeof import('vue'))['triggerRef']; - const unref: (typeof import('vue'))['unref']; - const useAttrs: (typeof import('vue'))['useAttrs']; - const useCssModule: (typeof import('vue'))['useCssModule']; - const useCssVars: (typeof import('vue'))['useCssVars']; - const useId: (typeof import('vue'))['useId']; - const useModel: (typeof import('vue'))['useModel']; - const useSlots: (typeof import('vue'))['useSlots']; - const useTemplateRef: (typeof import('vue'))['useTemplateRef']; - const watch: (typeof import('vue'))['watch']; - const watchEffect: (typeof import('vue'))['watchEffect']; - const watchPostEffect: (typeof import('vue'))['watchPostEffect']; - const watchSyncEffect: (typeof import('vue'))['watchSyncEffect']; + const EffectScope: typeof import('vue')['EffectScope'] + const ElMessage: (typeof import('element-plus/es'))['ElMessage'] + const computed: typeof import('vue')['computed'] + const createApp: typeof import('vue')['createApp'] + const customRef: typeof import('vue')['customRef'] + const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] + const defineComponent: typeof import('vue')['defineComponent'] + const effectScope: typeof import('vue')['effectScope'] + const getCurrentInstance: typeof import('vue')['getCurrentInstance'] + const getCurrentScope: typeof import('vue')['getCurrentScope'] + const inject: typeof import('vue')['inject'] + const isProxy: typeof import('vue')['isProxy'] + const isReactive: typeof import('vue')['isReactive'] + const isReadonly: typeof import('vue')['isReadonly'] + const isRef: typeof import('vue')['isRef'] + const markRaw: typeof import('vue')['markRaw'] + const nextTick: typeof import('vue')['nextTick'] + const onActivated: typeof import('vue')['onActivated'] + const onBeforeMount: typeof import('vue')['onBeforeMount'] + const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] + const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] + const onDeactivated: typeof import('vue')['onDeactivated'] + const onErrorCaptured: typeof import('vue')['onErrorCaptured'] + const onMounted: typeof import('vue')['onMounted'] + const onRenderTracked: typeof import('vue')['onRenderTracked'] + const onRenderTriggered: typeof import('vue')['onRenderTriggered'] + const onScopeDispose: typeof import('vue')['onScopeDispose'] + const onServerPrefetch: typeof import('vue')['onServerPrefetch'] + const onUnmounted: typeof import('vue')['onUnmounted'] + const onUpdated: typeof import('vue')['onUpdated'] + const onWatcherCleanup: typeof import('vue')['onWatcherCleanup'] + const provide: typeof import('vue')['provide'] + const reactive: typeof import('vue')['reactive'] + const readonly: typeof import('vue')['readonly'] + const ref: typeof import('vue')['ref'] + const resolveComponent: typeof import('vue')['resolveComponent'] + const shallowReactive: typeof import('vue')['shallowReactive'] + const shallowReadonly: typeof import('vue')['shallowReadonly'] + const shallowRef: typeof import('vue')['shallowRef'] + const toRaw: typeof import('vue')['toRaw'] + const toRef: typeof import('vue')['toRef'] + const toRefs: typeof import('vue')['toRefs'] + const toValue: typeof import('vue')['toValue'] + const triggerRef: typeof import('vue')['triggerRef'] + const unref: typeof import('vue')['unref'] + const useAttrs: typeof import('vue')['useAttrs'] + const useCssModule: typeof import('vue')['useCssModule'] + const useCssVars: typeof import('vue')['useCssVars'] + const useId: typeof import('vue')['useId'] + const useModel: typeof import('vue')['useModel'] + const useSlots: typeof import('vue')['useSlots'] + const useTemplateRef: typeof import('vue')['useTemplateRef'] + const watch: typeof import('vue')['watch'] + const watchEffect: typeof import('vue')['watchEffect'] + const watchPostEffect: typeof import('vue')['watchPostEffect'] + const watchSyncEffect: typeof import('vue')['watchSyncEffect'] } // for type re-export declare global { // @ts-ignore - export type { - Component, - Slot, - Slots, - ComponentPublicInstance, - ComputedRef, - DirectiveBinding, - ExtractDefaultPropTypes, - ExtractPropTypes, - ExtractPublicPropTypes, - InjectionKey, - PropType, - Ref, - MaybeRef, - MaybeRefOrGetter, - VNode, - WritableComputedRef - } from 'vue'; - import('vue'); + export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' + import('vue') } diff --git a/packages/core/src/components/Sender/index.vue b/packages/core/src/components/Sender/index.vue index 42d33394..006e611e 100644 --- a/packages/core/src/components/Sender/index.vue +++ b/packages/core/src/components/Sender/index.vue @@ -5,14 +5,14 @@ import { LoadingButton, SendButton, SpeechButton, - SpeechLoadingButton, + SpeechLoadingButton } from './components'; const props = withDefaults(defineProps(), { placeholder: '请输入内容', autoSize: () => ({ minRows: 1, - maxRows: 6, + maxRows: 6 }), submitType: 'enter', headerAnimationTimer: 300, @@ -31,7 +31,7 @@ const props = withDefaults(defineProps(), { triggerPopoverWidth: 'fit-content', triggerPopoverLeft: '0px', triggerPopoverOffset: 8, - triggerPopoverPlacement: 'top-start', + triggerPopoverPlacement: 'top-start' }); const emits = defineEmits([ @@ -43,11 +43,14 @@ const emits = defineEmits([ 'cancel', 'recordingChange', - 'trigger', + 'trigger' ]); const slots = defineSlots(); +const defaultLineGradientColor = + 'linear-gradient(125deg, #ff6ec5, #7873f5, #08995de0, #0048ff,#ff6ec5)'; + // 获取当前组件实例 const instance = getCurrentInstance(); // 判断是否存在 submit 监听器 @@ -61,10 +64,9 @@ const internalValue = computed({ return props.modelValue; }, set(val) { - if (props.readOnly || props.disabled) - return; + if (props.readOnly || props.disabled) return; emits('update:modelValue', val); - }, + } }); // 处理输入法组合状态 @@ -90,10 +92,15 @@ const popoverVisible = computed({ return props.triggerPopoverVisible; }, set(value) { - if (props.readOnly || props.disabled) - return; + if (props.readOnly || props.disabled) return; emits('update:triggerPopoverVisible', value); - }, + } +}); + +const senderLineGradientColorComputed = computed(() => { + return props.senderLineGradientColor !== '' + ? props.senderLineGradientColor + : defaultLineGradientColor; }); // 当前触发 指令的 字符 @@ -103,8 +110,7 @@ const triggerString = ref(''); watch( () => internalValue.value, (newVal, oldVal) => { - if (isComposing.value) - return; + if (isComposing.value) return; // 触发逻辑:当输入值等于数组中的任意一个指令字符时触发 // 确保 oldVal 是字符串类型 const triggerStrings = props.triggerStrings || []; // 如果为 undefined,就使用空数组 @@ -120,11 +126,10 @@ watch( oldValue: oldVal, // 关闭时返回之前触发的字符 newValue: newVal, triggerString: newVal, - isOpen: true, + isOpen: true }); popoverVisible.value = true; - } - else { + } else { popoverVisible.value = true; } } @@ -135,11 +140,10 @@ watch( oldValue: oldVal, // 关闭时返回之前触发的字符 newValue: newVal, triggerString: undefined, - isOpen: false, + isOpen: false }); popoverVisible.value = false; - } - else { + } else { popoverVisible.value = false; } } @@ -151,16 +155,15 @@ watch( oldValue: oldVal, // 关闭时返回之前触发的字符 newValue: newVal, triggerString: newVal, - isOpen: true, + isOpen: true }); popoverVisible.value = true; - } - else { + } else { popoverVisible.value = true; } } }, - { deep: true, immediate: true }, + { deep: true, immediate: true } ); /* 内容容器聚焦 开始 */ @@ -176,19 +179,15 @@ function onContentMouseDown(e: MouseEvent) { /* 头部显示隐藏 开始 */ const visiableHeader = ref(false); function openHeader() { - if (!slots.header) - return false; + if (!slots.header) return false; - if (props.readOnly) - return false; + if (props.readOnly) return false; visiableHeader.value = true; } function closeHeader() { - if (!slots.header) - return; - if (props.readOnly) - return; + if (!slots.header) return; + if (props.readOnly) return; visiableHeader.value = false; } /* 头部显示隐藏 结束 */ @@ -198,8 +197,7 @@ const recognition = ref(null); const speechLoading = ref(false); function startRecognition() { - if (props.readOnly) - return; // 直接返回,不执行后续逻辑 + if (props.readOnly) return; // 直接返回,不执行后续逻辑 if (hasOnRecordingChangeListener.value) { speechLoading.value = true; emits('recordingChange', true); @@ -230,8 +228,7 @@ function startRecognition() { speechLoading.value = false; }; recognition.value.start(); - } - else { + } else { console.error('浏览器不支持 Web Speech API'); } } @@ -252,28 +249,30 @@ function stopRecognition() { /* 输入框事件 开始 */ function submit() { - if (props.readOnly || props.loading || props.disabled || isSubmitDisabled.value) + if ( + props.readOnly || + props.loading || + props.disabled || + isSubmitDisabled.value + ) return; emits('submit', internalValue.value); } // 取消按钮 function cancel() { - if (props.readOnly) - return; + if (props.readOnly) return; emits('cancel', internalValue.value); } function clear() { - if (props.readOnly) - return; // 直接返回,不执行后续逻辑 + if (props.readOnly) return; // 直接返回,不执行后续逻辑 inputRef.value.clear(); internalValue.value = ''; } // 在这判断组合键的回车键 (目前支持两种模式) function handleKeyDown(e: { target: HTMLTextAreaElement } & KeyboardEvent) { - if (props.readOnly) - return; // 直接返回,不执行后续逻辑 + if (props.readOnly) return; // 直接返回,不执行后续逻辑 if (props.submitType === 'enter') { // 判断是否按下了 Shift + 回车键 if (e.shiftKey && e.keyCode === 13) { @@ -283,23 +282,20 @@ function handleKeyDown(e: { target: HTMLTextAreaElement } & KeyboardEvent) { const textAfterCursor = internalValue.value.slice(cursorPosition); // 光标后的文本 internalValue.value = `${textBeforeCursor}\n${textAfterCursor}`; // 插入换行符 e.target.setSelectionRange(cursorPosition + 1, cursorPosition + 1); // 更新光标位置 - } - else if (e.keyCode === 13 && !e.shiftKey) { + } else if (e.keyCode === 13 && !e.shiftKey) { // 阻止掉 Enter 的默认换行行为 e.preventDefault(); // 触发提交功能 submit(); } - } - else if (props.submitType === 'shiftEnter') { + } else if (props.submitType === 'shiftEnter') { // 判断是否按下了 Shift + 回车键 if (e.shiftKey && e.keyCode === 13) { // 阻止掉 Enter 的默认换行行为 e.preventDefault(); // 触发提交功能 submit(); - } - else if (e.keyCode === 13 && !e.shiftKey) { + } else if (e.keyCode === 13 && !e.shiftKey) { e.preventDefault(); const cursorPosition = e.target.selectionStart; // 获取光标位置 const textBeforeCursor = internalValue.value.slice(0, cursorPosition); // 光标前的文本 @@ -325,11 +321,9 @@ function focus(type = 'all') { } if (type === 'all') { inputRef.value.select(); - } - else if (type === 'start') { + } else if (type === 'start') { focusToStart(); - } - else if (type === 'end') { + } else if (type === 'end') { focusToEnd(); } } @@ -353,7 +347,10 @@ function focusToEnd() { const textarea = inputRef.value.$el.querySelector('textarea'); if (textarea) { textarea.focus(); // 聚焦到输入框 - textarea.setSelectionRange(internalValue.value.length, internalValue.value.length); // 设置光标到最后方 + textarea.setSelectionRange( + internalValue.value.length, + internalValue.value.length + ); // 设置光标到最后方 } } } @@ -378,7 +375,7 @@ defineExpose({ submit, cancel, startRecognition, - stopRecognition, + stopRecognition }); @@ -386,9 +383,9 @@ defineExpose({
@@ -419,7 +418,10 @@ defineExpose({ @mousedown="onContentMouseDown" > -
+
@@ -427,11 +429,13 @@ defineExpose({ ref="inputRef" v-model="internalValue" class="el-sender-input" - :input-style="props.inputStyle || { - 'resize': 'none', - 'max-height': '176px', - 'max-width': inputWidth, - }" + :input-style=" + props.inputStyle || { + resize: 'none', + 'max-height': '176px', + 'max-width': inputWidth + } + " :rows="1" :autosize="autoSize" type="textarea" @@ -446,10 +450,12 @@ defineExpose({
-
- +
+ @@ -469,7 +475,10 @@ defineExpose({
-
+
@@ -478,10 +487,12 @@ defineExpose({
-
- +
+ @@ -523,8 +534,15 @@ defineExpose({ popper-class="el-sender-trigger-popover" :teleported="false" > - - 当前触发的字符为:{{ `${triggerString}` }} 在这里定义的内容,但注意这里的回车事件将会被 输入框 覆盖 + + 当前触发的字符为:{{ + `${triggerString}` + }} + 在这里定义的内容,但注意这里的回车事件将会被 输入框 覆盖
@@ -546,17 +564,19 @@ defineExpose({ border-style: solid; transition: width var(--el-sender-header-animation-duration); - &:after { + &::after { content: ''; position: absolute; inset: 0; pointer-events: none; - transition: border-color var(--el-transition-duration); border-radius: inherit; border-style: inherit; border-color: inherit; border-width: var(--el-border-width); + box-sizing: border-box; + transition: border-color var(--el-transition-duration); } + &:focus-within { box-shadow: var(--el-box-shadow); border-color: var(--el-color-primary); @@ -683,6 +703,37 @@ defineExpose({ } } +.el-sender-line-gradient { + transition: background var(--el-transition-duration); + &:focus-within { + box-shadow: var(--el-box-shadow); + border-color: transparent; + + &::after { + border-style: none; + mask: + linear-gradient(#fff 0 0) content-box, + linear-gradient(#fff 0 0); + -webkit-mask-composite: xor; + mask-composite: exclude; + background: v-bind(senderLineGradientColorComputed); // 渐变色 + padding: 3px; + // background-size: 300% 100%; /* 宽度放大,方便做左右滑动 */ + // background-position: 0% 0%; + // animation: gradientFlow 1s ease-in-out forwards; + } + } +} + +@keyframes gradientFlow { + 0% { + background-position: 0% 0%; + } + 100% { + background-position: 100% 0%; + } +} + .el-sender-disabled { background-color: var(--el-fill-color); pointer-events: none; diff --git a/packages/core/src/components/Sender/types.d.ts b/packages/core/src/components/Sender/types.d.ts index e286485e..ce9035c9 100644 --- a/packages/core/src/components/Sender/types.d.ts +++ b/packages/core/src/components/Sender/types.d.ts @@ -1,38 +1,53 @@ -export interface SenderProps { - modelValue?: string; - placeholder?: string; - autoSize?: { - minRows: number; - maxRows: number; - }; - readOnly?: boolean; - disabled?: boolean; - loading?: boolean; - clearable?: boolean; - allowSpeech?: boolean; - submitType?: 'enter' | 'shiftEnter'; - headerAnimationTimer?: number; - inputWidth?: string; - - // 变体属性 - variant?: 'default' | 'updown'; - showUpdown?: boolean; - submitBtnDisabled?: boolean; - - // 新增 el-input 样式透传 - inputStyle?: string | CSSProperties | CSSProperties[] | string[]; - - // 新增 el-popover 样式透传 - triggerStrings?: string[]; - triggerPopoverVisible?: boolean; // 指令提示框是否可见 - triggerPopoverWidth?: string; - triggerPopoverLeft?: string; - triggerPopoverOffset?: number; - triggerPopoverPlacement?: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end'; -} - -export interface TriggerEvent { - oldValue: string; // 明确触发的字符 - newValue: string; // 当前输入框的值 - isOpen: boolean; // 弹窗状态 -} +export interface SenderProps { + modelValue?: string; + placeholder?: string; + autoSize?: { + minRows: number; + maxRows: number; + }; + readOnly?: boolean; + disabled?: boolean; + loading?: boolean; + clearable?: boolean; + allowSpeech?: boolean; + submitType?: 'enter' | 'shiftEnter'; + headerAnimationTimer?: number; + inputWidth?: string; + + // 变体属性 + variant?: 'default' | 'updown'; + showUpdown?: boolean; + submitBtnDisabled?: boolean; + + // 新增 el-input 样式透传 + inputStyle?: string | CSSProperties | CSSProperties[] | string[]; + + // 新增 el-popover 样式透传 + triggerStrings?: string[]; + triggerPopoverVisible?: boolean; // 指令提示框是否可见 + triggerPopoverWidth?: string; + triggerPopoverLeft?: string; + triggerPopoverOffset?: number; + triggerPopoverPlacement?: + | 'top' + | 'top-start' + | 'top-end' + | 'bottom' + | 'bottom-start' + | 'bottom-end' + | 'left' + | 'left-start' + | 'left-end' + | 'right' + | 'right-start' + | 'right-end'; + + // 新增 sender 边框的样式渐变色 + senderLineGradientColor?: string; +} + +export interface TriggerEvent { + oldValue: string; // 明确触发的字符 + newValue: string; // 当前输入框的值 + isOpen: boolean; // 弹窗状态 +} diff --git a/packages/core/src/stories/Sender/Sender.stories.ts b/packages/core/src/stories/Sender/Sender.stories.ts index 9848cc5b..f2367f31 100644 --- a/packages/core/src/stories/Sender/Sender.stories.ts +++ b/packages/core/src/stories/Sender/Sender.stories.ts @@ -128,6 +128,12 @@ const meta: Meta = { 'right-end' ], description: '触发指令的弹框的位置。' + }, + senderLineGradientColor: { + control: 'text', + description: 'sender 输入框的边框渐变颜色。', + defaultValue: + 'linear-gradient(125deg, #ff6ec5, #7873f5, #08995de0, #0048ff,#ff6ec5)' } }, args: { @@ -157,7 +163,9 @@ const meta: Meta = { triggerPopoverWidth: '400px', triggerPopoverLeft: '0px', triggerPopoverOffset: 8, - triggerPopoverPlacement: 'top' + triggerPopoverPlacement: 'top', + senderLineGradientColor: + 'linear-gradient(125deg, #ff6ec5, #7873f5, #08995de0, #0048ff,#ff6ec5)' } } satisfies Meta; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 17016192..b5c2924e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -420,24 +420,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@ast-grep/napi-linux-arm64-musl@0.36.3': resolution: {integrity: sha512-2XRmNYuovZu0Pa4J3or4PKMkQZnXXfpVcCrPwWB/2ytX7XUo+TWLgYE8rPVnJOyw5zujkveFb0XUrro9mQgLzw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@ast-grep/napi-linux-x64-gnu@0.36.3': resolution: {integrity: sha512-mTwPRbBi1feGqR2b5TWC5gkEDeRi8wfk4euF5sKNihfMGHj6pdfINHQ3QvLVO4C7z0r/wgWLAvditFA0b997dg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@ast-grep/napi-linux-x64-musl@0.36.3': resolution: {integrity: sha512-tMGPrT+zuZzJK6n1cD1kOii7HYZE9gUXjwtVNE/uZqXEaWP6lmkfoTMbLjnxEe74VQbmaoDGh1/cjrDBnqC6Uw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@ast-grep/napi-win32-arm64-msvc@0.36.3': resolution: {integrity: sha512-7pFyr9+dyV+4cBJJ1I57gg6PDXP3GBQeVAsEEitzEruxx4Hb4cyNro54gGtlsS+6ty+N0t004tPQxYO2VrsPIg==} @@ -1317,21 +1321,25 @@ packages: resolution: {integrity: sha512-wULkYyufJz91NAjLtZyb3ycEw9w7sg0iFoGG9rHABqRtRHkFieaFT8BjjJTvUwRf2ZolQk+YZL4edE88h85QFQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@oxlint/linux-arm64-musl@0.16.11': resolution: {integrity: sha512-c7Evd7fCpocr2LFzHcl9eQF0BxXZauTraIiCxpKK7ddIuCnpbuPllkMpAUE9vob20mqnGy5WLHZby9v7vqSr+Q==} cpu: [arm64] os: [linux] + libc: [musl] '@oxlint/linux-x64-gnu@0.16.11': resolution: {integrity: sha512-LbjKo4seS7m6rOzw/r9H3VLvnjhuo/fFuRJ8OG6pYCbkZNtChdhk88DFN8Qr0n8Qe9PFwweIvQxXBZK7IEUu6A==} cpu: [x64] os: [linux] + libc: [glibc] '@oxlint/linux-x64-musl@0.16.11': resolution: {integrity: sha512-kKuIf5hD12rtmJFSe/EGv8jXi0QWwCMDpcL2F0cRVvq6RSAxwSBF/RTEq40PJBBGAf6KJeqgV9j4glxhFn5f7w==} cpu: [x64] os: [linux] + libc: [musl] '@oxlint/win32-arm64@0.16.11': resolution: {integrity: sha512-lx9x2EEbyHW5t2aooWtXI2AWd3WzDs+4T/p3RBp/HPp9ziwL2hEdzmjMC3DgdnbmwUmUGvfquSElF6ZGC9L5pA==} @@ -1372,36 +1380,42 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.1': resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.1': resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.1': resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.1': resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.1': resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] '@parcel/watcher-win32-arm64@2.5.1': resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} @@ -1491,56 +1505,67 @@ packages: resolution: {integrity: sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.41.0': resolution: {integrity: sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.41.0': resolution: {integrity: sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.41.0': resolution: {integrity: sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.41.0': resolution: {integrity: sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.41.0': resolution: {integrity: sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.41.0': resolution: {integrity: sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.41.0': resolution: {integrity: sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.41.0': resolution: {integrity: sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.41.0': resolution: {integrity: sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.41.0': resolution: {integrity: sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.41.0': resolution: {integrity: sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==} @@ -2254,41 +2279,49 @@ packages: resolution: {integrity: sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==} cpu: [arm64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.7.2': resolution: {integrity: sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==} cpu: [arm64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.7.2': resolution: {integrity: sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==} cpu: [ppc64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.7.2': resolution: {integrity: sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==} cpu: [riscv64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.7.2': resolution: {integrity: sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.7.2': resolution: {integrity: sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==} cpu: [s390x] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.7.2': resolution: {integrity: sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==} cpu: [x64] os: [linux] + libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.7.2': resolution: {integrity: sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==} cpu: [x64] os: [linux] + libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.7.2': resolution: {integrity: sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==} @@ -6188,7 +6221,7 @@ snapshots: '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.27.0(jiti@2.4.2)) '@eslint/markdown': 6.4.0 '@stylistic/eslint-plugin': 4.2.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) '@vitest/eslint-plugin': 1.2.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(vitest@3.1.3) ansis: 4.0.0 @@ -6209,7 +6242,7 @@ snapshots: eslint-plugin-regexp: 2.7.0(eslint@9.27.0(jiti@2.4.2)) eslint-plugin-toml: 0.12.0(eslint@9.27.0(jiti@2.4.2)) eslint-plugin-unicorn: 59.0.1(eslint@9.27.0(jiti@2.4.2)) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.27.0(jiti@2.4.2)) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)) eslint-plugin-vue: 10.1.0(eslint@9.27.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.27.0(jiti@2.4.2))) eslint-plugin-yml: 1.18.0(eslint@9.27.0(jiti@2.4.2)) eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.14)(eslint@9.27.0(jiti@2.4.2)) @@ -8165,10 +8198,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.2) + '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.32.1 '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) @@ -9923,6 +9956,12 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.2))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.2) + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)): + dependencies: + eslint: 9.27.0(jiti@2.4.2) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + eslint-plugin-vue@10.1.0(eslint@9.27.0(jiti@2.4.2))(vue-eslint-parser@10.1.3(eslint@9.27.0(jiti@2.4.2))): dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2))