From a0244c9afc1927510f0b0ea9d6e007ec527dedee Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Thu, 19 Feb 2026 21:10:43 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B4=A2=E5=8A=A1=E9=97=A8=E6=88=B7=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web-vue/package.json | 1 + .../views/biz/monitorInfo/deviceInfo/list.vue | 33 -- .../views/biz/monitorInfo/serverInfo/list.vue | 33 -- .../analysis/components/WarningAlert.vue | 267 +++------ .../desktop/workbench/components/Welcome.vue | 4 + .../erp/green/components/ChartAccount.vue | 286 +++++---- .../erp/green/components/ChartCategoryExp.vue | 173 +++--- .../erp/green/components/ChartCategoryInc.vue | 173 +++--- .../views/erp/green/components/ChartLine.vue | 273 +++++---- .../views/erp/green/components/ChartMom.vue | 258 +++++--- .../views/erp/green/components/ChartPie.vue | 228 +++---- .../erp/green/components/ChartQuarter.vue | 309 +++++----- .../views/erp/green/components/ChartRank.vue | 254 ++++---- .../views/erp/green/components/ChartYear.vue | 262 ++++---- web-vue/pnpm-lock.yaml | 558 ++++++++++++++++-- 15 files changed, 1777 insertions(+), 1335 deletions(-) diff --git a/web-vue/package.json b/web-vue/package.json index 8235dc9e..b72316c5 100644 --- a/web-vue/package.json +++ b/web-vue/package.json @@ -80,6 +80,7 @@ "prettier": "3.6.2", "prettier-plugin-packagejson": "2.5.19", "rimraf": "6.0.1", + "sass-embedded": "^1.97.3", "stylelint": "16.25.0", "stylelint-config-recommended": "17.0.0", "stylelint-config-recommended-less": "3.0.1", diff --git a/web-vue/packages/biz/views/biz/monitorInfo/deviceInfo/list.vue b/web-vue/packages/biz/views/biz/monitorInfo/deviceInfo/list.vue index bd93c942..0b681301 100644 --- a/web-vue/packages/biz/views/biz/monitorInfo/deviceInfo/list.vue +++ b/web-vue/packages/biz/views/biz/monitorInfo/deviceInfo/list.vue @@ -16,7 +16,6 @@ - + \ No newline at end of file diff --git a/web-vue/packages/core/layouts/views/desktop/workbench/components/Welcome.vue b/web-vue/packages/core/layouts/views/desktop/workbench/components/Welcome.vue index 059e03c6..26b99bfb 100644 --- a/web-vue/packages/core/layouts/views/desktop/workbench/components/Welcome.vue +++ b/web-vue/packages/core/layouts/views/desktop/workbench/components/Welcome.vue @@ -11,6 +11,9 @@ + + + @@ -18,6 +21,7 @@ \ No newline at end of file diff --git a/web-vue/packages/erp/views/erp/green/components/ChartCategoryExp.vue b/web-vue/packages/erp/views/erp/green/components/ChartCategoryExp.vue index fcc64ad5..58a77f25 100644 --- a/web-vue/packages/erp/views/erp/green/components/ChartCategoryExp.vue +++ b/web-vue/packages/erp/views/erp/green/components/ChartCategoryExp.vue @@ -1,6 +1,6 @@ @@ -19,22 +19,27 @@ const chartDom = ref(null); let chartInstance: echarts.ECharts | null = null; let resizeTimer: number | null = null; -const formatNumber = (num: string | undefined, decimal = 2): number => { +const formatNumber = (num: string | undefined, decimal = 0): number => { if (!num) return 0; const parsed = Number(num); return isNaN(parsed) ? 0 : Number(parsed.toFixed(decimal)); }; -const toTenThousandYuan = (num: string | undefined): number => { - const rawNum = formatNumber(num); - return formatNumber((rawNum / 10000).toString()); +const formatWithCommas = (num: number): string => { + return num.toLocaleString('zh-CN', { + minimumFractionDigits: 0, + maximumFractionDigits: 0 + }); }; -const sortByMonth = (data: BizItemInfo[]): BizItemInfo[] => { - return data.sort((a, b) => { - const monthA = a.xaxis ? parseInt(a.xaxis, 10) : 0; - const monthB = b.xaxis ? parseInt(b.xaxis, 10) : 0; - return monthA - monthB; +const convertToTenThousand = (num: number, decimal = 2): number => { + return Number((num / 10000).toFixed(decimal)); +}; + +const formatTenThousand = (num: number): string => { + return convertToTenThousand(num).toLocaleString('zh-CN', { + minimumFractionDigits: 2, + maximumFractionDigits: 2 }); }; @@ -46,7 +51,7 @@ const fetchDataList = async (params?: Record) => { }; const result = await bizItemInfoListAll(reqParams); const validData = (result || []).filter(item => item.xaxis && item.index01); - rawData.value = sortByMonth(validData); + rawData.value = validData || []; } catch (error) { console.error('获取数据列表失败:', error); rawData.value = []; @@ -62,11 +67,11 @@ const initChart = () => { if (rawData.value.length === 0) { chartInstance.setOption({ + backgroundColor: 'transparent', title: { left: 'center', top: '50%', - text: '暂无支出数据', - textStyle: { fontSize: 18, color: '#333' } + textStyle: { fontSize: 18, color: '#a0cfff' } }, tooltip: { trigger: 'item' }, padding: [0, 0, 0, 0] @@ -76,22 +81,29 @@ const initChart = () => { const pieData = rawData.value.map(item => ({ name: item.xaxis || '', - value: toTenThousandYuan(item.index01) + value: formatNumber(item.index01) })).filter(item => item.value > 0); + const totalValue = pieData.reduce((sum, item) => sum + item.value, 0); + const option = { + backgroundColor: 'transparent', padding: [0, 0, 0, 0], tooltip: { trigger: 'item', - textStyle: { fontSize: 12 }, + textStyle: { fontSize: 12, color: '#fff' }, padding: 12, - backgroundColor: '#fff', - borderColor: '#e8e8e8', + backgroundColor: 'rgba(9, 30, 58, 0.95)', + borderColor: 'rgba(32, 160, 255, 0.3)', borderWidth: 1, - formatter: (params: any) => ` -
${params.name}
-
支出:${params.value.toFixed(2)} 万元
- ` + formatter: (params: any) => { + const percent = totalValue > 0 ? ((params.value / totalValue) * 100).toFixed(2) : 0; + return ` +
${params.name}
+
支出:${formatWithCommas(params.value)} 元
+
占比:${percent}%
+ `; + } }, legend: { type: 'scroll', @@ -100,7 +112,7 @@ const initChart = () => { left: 'center', textStyle: { fontSize: 10, - color: '#333', + color: '#a0cfff', cursor: 'pointer' }, itemGap: 15, @@ -109,9 +121,9 @@ const initChart = () => { selectedMode: true, scrollDataIndex: 0, pageButtonPosition: 'end', - pageIconColor: '#1890ff', - pageIconInactiveColor: '#ccc', - pageTextStyle: { fontSize: 9 }, + pageIconColor: '#40c4ff', + pageIconInactiveColor: 'rgba(32, 160, 255, 0.3)', + pageTextStyle: { fontSize: 9, color: '#a0cfff' }, height: 30, formatter: (name: string) => { return name.length > 6 ? `${name.substring(0, 6)}...` : name; @@ -122,26 +134,34 @@ const initChart = () => { name: '支出', type: 'pie', radius: ['30%', '60%'], - center: ['50%', '45%'], + center: ['50%', '50%'], data: pieData, label: { show: true, position: 'outside', fontSize: 10, + color: '#a0cfff', formatter: (params: any) => { const shortName = params.name.length > 4 ? `${params.name.substring(0, 4)}...` : params.name; - return `${shortName}: ${params.value}万元`; + const percent = totalValue > 0 ? ((params.value / totalValue) * 100).toFixed(1) : 0; + return `${shortName}: ${formatTenThousand(params.value)}万元 (${percent}%)`; } }, itemStyle: { - borderColor: '#fff', + borderColor: 'rgba(9, 30, 58, 0.8)', borderWidth: 2 }, emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, - shadowColor: 'rgba(0, 0, 0, 0.5)' + shadowColor: 'rgba(64, 196, 255, 0.5)' + } + }, + labelLine: { + show: true, + lineStyle: { + color: '#a0cfff' } } } @@ -199,60 +219,51 @@ onUnmounted(() => { \ No newline at end of file diff --git a/web-vue/packages/erp/views/erp/green/components/ChartCategoryInc.vue b/web-vue/packages/erp/views/erp/green/components/ChartCategoryInc.vue index f4c9b7a0..64aaf7b0 100644 --- a/web-vue/packages/erp/views/erp/green/components/ChartCategoryInc.vue +++ b/web-vue/packages/erp/views/erp/green/components/ChartCategoryInc.vue @@ -1,6 +1,6 @@ @@ -19,22 +19,27 @@ const chartDom = ref(null); let chartInstance: echarts.ECharts | null = null; let resizeTimer: number | null = null; -const formatNumber = (num: string | undefined, decimal = 2): number => { +const formatNumber = (num: string | undefined, decimal = 0): number => { if (!num) return 0; const parsed = Number(num); return isNaN(parsed) ? 0 : Number(parsed.toFixed(decimal)); }; -const toTenThousandYuan = (num: string | undefined): number => { - const rawNum = formatNumber(num); - return formatNumber((rawNum / 10000).toString()); +const formatWithCommas = (num: number): string => { + return num.toLocaleString('zh-CN', { + minimumFractionDigits: 0, + maximumFractionDigits: 0 + }); }; -const sortByMonth = (data: BizItemInfo[]): BizItemInfo[] => { - return data.sort((a, b) => { - const monthA = a.xaxis ? parseInt(a.xaxis, 10) : 0; - const monthB = b.xaxis ? parseInt(b.xaxis, 10) : 0; - return monthA - monthB; +const convertToTenThousand = (num: number, decimal = 2): number => { + return Number((num / 10000).toFixed(decimal)); +}; + +const formatTenThousand = (num: number): string => { + return convertToTenThousand(num).toLocaleString('zh-CN', { + minimumFractionDigits: 2, + maximumFractionDigits: 2 }); }; @@ -46,7 +51,7 @@ const fetchDataList = async (params?: Record) => { }; const result = await bizItemInfoListAll(reqParams); const validData = (result || []).filter(item => item.xaxis && item.index01); - rawData.value = sortByMonth(validData); + rawData.value = validData || []; } catch (error) { console.error('获取数据列表失败:', error); rawData.value = []; @@ -62,11 +67,11 @@ const initChart = () => { if (rawData.value.length === 0) { chartInstance.setOption({ + backgroundColor: 'transparent', title: { left: 'center', top: '50%', - text: '暂无收入数据', - textStyle: { fontSize: 18, color: '#333' } + textStyle: { fontSize: 18, color: '#a0cfff' } }, tooltip: { trigger: 'item' }, padding: [0, 0, 0, 0] @@ -76,22 +81,29 @@ const initChart = () => { const pieData = rawData.value.map(item => ({ name: item.xaxis || '', - value: toTenThousandYuan(item.index01) + value: formatNumber(item.index01) })).filter(item => item.value > 0); + const totalValue = pieData.reduce((sum, item) => sum + item.value, 0); + const option = { + backgroundColor: 'transparent', padding: [0, 0, 0, 0], tooltip: { trigger: 'item', - textStyle: { fontSize: 12 }, + textStyle: { fontSize: 12, color: '#fff' }, padding: 12, - backgroundColor: '#fff', - borderColor: '#e8e8e8', + backgroundColor: 'rgba(9, 30, 58, 0.95)', + borderColor: 'rgba(32, 160, 255, 0.3)', borderWidth: 1, - formatter: (params: any) => ` -
${params.name}
-
收入:${params.value.toFixed(2)} 万元
- ` + formatter: (params: any) => { + const percent = totalValue > 0 ? ((params.value / totalValue) * 100).toFixed(2) : 0; + return ` +
${params.name}
+
收入:${formatWithCommas(params.value)} 元
+
占比:${percent}%
+ `; + } }, legend: { type: 'scroll', @@ -100,7 +112,7 @@ const initChart = () => { left: 'center', textStyle: { fontSize: 10, - color: '#333', + color: '#a0cfff', cursor: 'pointer' }, itemGap: 15, @@ -109,9 +121,9 @@ const initChart = () => { selectedMode: true, scrollDataIndex: 0, pageButtonPosition: 'end', - pageIconColor: '#1890ff', - pageIconInactiveColor: '#ccc', - pageTextStyle: { fontSize: 9 }, + pageIconColor: '#40c4ff', + pageIconInactiveColor: 'rgba(32, 160, 255, 0.3)', + pageTextStyle: { fontSize: 9, color: '#a0cfff' }, height: 30, formatter: (name: string) => { return name.length > 6 ? `${name.substring(0, 6)}...` : name; @@ -122,26 +134,34 @@ const initChart = () => { name: '收入', type: 'pie', radius: ['30%', '60%'], - center: ['50%', '45%'], + center: ['50%', '50%'], data: pieData, label: { show: true, position: 'outside', fontSize: 10, + color: '#a0cfff', formatter: (params: any) => { const shortName = params.name.length > 4 ? `${params.name.substring(0, 4)}...` : params.name; - return `${shortName}: ${params.value}万元`; + const percent = totalValue > 0 ? ((params.value / totalValue) * 100).toFixed(1) : 0; + return `${shortName}: ${formatTenThousand(params.value)}万元 (${percent}%)`; } }, itemStyle: { - borderColor: '#fff', + borderColor: 'rgba(9, 30, 58, 0.8)', borderWidth: 2 }, emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, - shadowColor: 'rgba(0, 0, 0, 0.5)' + shadowColor: 'rgba(64, 196, 255, 0.5)' + } + }, + labelLine: { + show: true, + lineStyle: { + color: '#a0cfff' } } } @@ -199,60 +219,51 @@ onUnmounted(() => { \ No newline at end of file diff --git a/web-vue/packages/erp/views/erp/green/components/ChartLine.vue b/web-vue/packages/erp/views/erp/green/components/ChartLine.vue index a63e9b8e..b0a18b5b 100644 --- a/web-vue/packages/erp/views/erp/green/components/ChartLine.vue +++ b/web-vue/packages/erp/views/erp/green/components/ChartLine.vue @@ -1,13 +1,12 @@ \ No newline at end of file diff --git a/web-vue/packages/erp/views/erp/green/components/ChartMom.vue b/web-vue/packages/erp/views/erp/green/components/ChartMom.vue index 3e44d31f..8b9cf433 100644 --- a/web-vue/packages/erp/views/erp/green/components/ChartMom.vue +++ b/web-vue/packages/erp/views/erp/green/components/ChartMom.vue @@ -1,13 +1,12 @@ \ No newline at end of file diff --git a/web-vue/packages/erp/views/erp/green/components/ChartPie.vue b/web-vue/packages/erp/views/erp/green/components/ChartPie.vue index b211e6cb..66718033 100644 --- a/web-vue/packages/erp/views/erp/green/components/ChartPie.vue +++ b/web-vue/packages/erp/views/erp/green/components/ChartPie.vue @@ -8,24 +8,24 @@
- 收入 + 收入(元)
- - {{ thisIncome }} (元) + + {{ thisIncome || 0 }}
- 支出 + 支出(元)
- - {{ thisExpense }} (元) + + {{ thisExpense || 0 }}
占比
- - {{ thisShare }} (%) + + {{ thisShare || 0 }}%
@@ -60,7 +60,6 @@ const selectedMap = ref>({}); const totalAmountText = computed(() => { if (!listAccount.value.length) return '0.00'; - let total = 0; listAccount.value.forEach(item => { const name = item.accountName || '未知账户'; @@ -79,16 +78,14 @@ const formatPercent = (value: number) => { const generateRandomColors = (count: number): string[] => { const colorLibrary = [ - '#1890ff', '#52c41a', '#f5a623', '#fa8c16', '#722ed1', '#eb2f96', - '#13c2c2', '#2f54eb', '#f7ba1e', '#f5222d', '#8543e0', '#0fc6c2', - '#7cb305', '#ff7a45', '#ff4d4f', '#6b778c', '#5d7092', '#91d5ff' + '#40c4ff', '#20a0ff', '#096dd9', '#1890ff', '#69b1ff', '#8cc5ff', + '#91d5ff', '#b3d9f2', '#e6f7ff', '#0050b3', '#13c2c2', '#0fc6c2', + '#722ed1', '#52c41a', '#f5a623', '#fa8c16', '#eb2f96', '#2f54eb' ]; - if (count <= colorLibrary.length) return colorLibrary.slice(0, count); - const colors = [...colorLibrary]; while (colors.length < count) { - const hue = Math.floor(Math.random() * 360); + const hue = Math.floor(Math.random() * 60) + 180; colors.push(`hsl(${hue}, 75%, 55%)`); } return colors; @@ -105,10 +102,7 @@ const getThisData = async (params?: Record) => { thisExpense.value = Number(res?.[0]?.index02) || 0; thisShare.value = Number(res?.[0]?.index04) || 0; } catch (error) { - console.error('获取收支数据失败:', error); - thisIncome.value = 0; - thisExpense.value = 0; - thisShare.value = 0; + console.error(error); } }; @@ -116,66 +110,59 @@ const fetchList = async () => { try { const res = await erpAccountListAll(); listAccount.value = res || []; + listAccount.value.forEach(item => { + const name = item.accountName || '未知账户'; + if (selectedMap.value[name] === undefined) { + selectedMap.value[name] = true; + } + }); } catch (error) { - console.error('获取账户列表失败:', error); + console.error(error); listAccount.value = []; } }; const buildChartOption = (): EChartsOption => { - if (!listAccount.value.length) { - return { - title: { text: '暂无账户数据', left: 'center', top: 'middle', textStyle: { fontSize: 14, color: '#999' } }, - tooltip: { trigger: 'item' }, - legend: { show: false }, - series: [] - }; - } - - const pieData = listAccount.value + const allPieData = listAccount.value .map(item => ({ name: item.accountName || '未知账户', value: Number(item.currentBalance) || 0 })) .filter(item => item.value > 0 && item.name); - if (!pieData.length) { - return { - title: { text: '暂无有效账户金额数据', left: 'center', top: 'middle', textStyle: { fontSize: 14, color: '#999' } }, - tooltip: { trigger: 'item' }, - legend: { show: false }, - series: [] - }; - } + const filteredPieData = allPieData.filter(item => selectedMap.value[item.name] !== false); + const colors = generateRandomColors(allPieData.length); + const filteredTotal = filteredPieData.reduce((sum, item) => sum + item.value, 0); - const colors = generateRandomColors(pieData.length); - const total = pieData.reduce((sum, item) => sum + item.value, 0); - const selected: Record = {}; - pieData.forEach(item => { + allPieData.forEach(item => { selected[item.name] = selectedMap.value[item.name] !== false; }); return { tooltip: { trigger: 'item', - formatter: ({ name, value, percent }: any) => `${name}: ${value} 元 (${(percent * 100).toFixed(1)}%)`, - textStyle: { fontSize: 11 }, + formatter: ({ name, value }: any) => { + const percent = filteredTotal > 0 ? (value / filteredTotal) * 100 : 0; + return `${name}: ${value} 元 (${percent.toFixed(1)}%)`; + }, + textStyle: { fontSize: 11, color: '#fff' }, padding: 8, - backgroundColor: '#fff', - borderColor: '#e8e8e8', + backgroundColor: 'rgba(9, 30, 58, 0.9)', + borderColor: 'rgba(32, 160, 255, 0.5)', borderWidth: 1, - borderRadius: 4 + borderRadius: 4, }, legend: { + show: true, orient: 'vertical', right: 10, top: 'center', - textStyle: { fontSize: 11, color: '#666' }, + textStyle: { fontSize: 11, color: '#a0cfff' }, itemWidth: 10, itemHeight: 10, itemGap: 8, - selected: selected, + selected, formatter: (name: string) => name.length > 8 ? `${name.slice(0, 8)}...` : name }, series: [{ @@ -184,28 +171,33 @@ const buildChartOption = (): EChartsOption => { radius: ['30%', '70%'], center: ['40%', '50%'], avoidLabelOverlap: true, - itemStyle: { borderRadius: 6, borderColor: '#fff', borderWidth: 1 }, + itemStyle: { + borderRadius: 6, + borderColor: 'rgba(9, 30, 58, 0.8)', + borderWidth: 1 + }, label: { show: true, fontSize: 11, + color: '#40c4ff', + distance: 10, formatter: (params: any) => { - if (total <= 0) return params.name; - return `${params.name} ${formatPercent((params.value / total) * 100)}`; - }, - color: '#333', - distance: 10 + if (filteredTotal <= 0) return params.name; + const percent = (params.value / filteredTotal) * 100; + return `${params.name} ${formatPercent(percent)}`; + } }, labelLine: { show: true, length: 10, length2: 8, smooth: 0.2, - lineStyle: { width: 1, color: '#999' } + lineStyle: { width: 1, color: '#91d5ff' } }, - data: pieData.map((item, index) => ({ + data: allPieData.map((item, index) => ({ name: item.name, value: item.value, - itemStyle: { color: colors[index] } + itemStyle: { color: colors[index] }, })) }] }; @@ -213,27 +205,16 @@ const buildChartOption = (): EChartsOption => { const initChart = () => { if (!chartDom.value) return; - if (myChart) { - myChart.off('legendselectchanged'); myChart.dispose(); myChart = null; } - - try { - myChart = echarts.init(chartDom.value); - - myChart.on('legendselectchanged', (params: any) => { - if (params && params.name !== undefined) { - selectedMap.value[params.name] = params.selected[params.name]; - } - }); - - const option = buildChartOption(); - myChart.setOption(option); - } catch (e) { - console.error('初始化图表失败:', e); - } + myChart = echarts.init(chartDom.value); + myChart.on('legendselectchanged', (params: any) => { + selectedMap.value[params.name] = params.selected[params.name]; + myChart?.setOption(buildChartOption()); + }); + myChart.setOption(buildChartOption()); }; const resizeChart = () => { @@ -244,7 +225,11 @@ const resizeChart = () => { }; watch(() => props.formParams, async () => { - await Promise.all([fetchList(), getThisData()]); + await getThisData(); +}, { deep: true }); + +watch([listAccount, selectedMap], () => { + nextTick(() => myChart?.setOption(buildChartOption())); }, { deep: true }); onMounted(async () => { @@ -258,12 +243,8 @@ onMounted(async () => { onUnmounted(() => { if (resizeTimer) clearTimeout(resizeTimer); window.removeEventListener('resize', resizeChart); - if (myChart) { - myChart.off('legendselectchanged'); - myChart.dispose(); - myChart = null; - } - selectedMap.value = {}; + myChart?.dispose(); + myChart = null; }); @@ -272,17 +253,27 @@ onUnmounted(() => { width: 100% !important; height: 100% !important; box-sizing: border-box !important; - border-radius: 8px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); + border-radius: 4px !important; + box-shadow: 0 0 15px rgba(32, 160, 255, 0.1) !important; margin: 0 !important; padding: 0 !important; + background: rgba(9, 30, 58, 0.8) !important; + border: 1px solid rgba(32, 160, 255, 0.3) !important; } :deep(.ant-card-head) { padding: 0 16px !important; - border-bottom: 1px solid #f0f0f0; + border-bottom: 1px solid rgba(32, 160, 255, 0.2) !important; height: 56px !important; line-height: 56px !important; + background: rgba(18, 60, 110, 0.7) !important; + border-radius: 8px 8px 0 0 !important; +} + +:deep(.ant-card-head-title) { + color: #20a0ff !important; + font-weight: 600 !important; + text-shadow: 0 0 5px rgba(32, 160, 255, 0.2) !important; } :deep(.ant-card-body) { @@ -293,17 +284,19 @@ onUnmounted(() => { box-sizing: border-box !important; overflow: hidden !important; display: flex; + background: transparent !important; } .total-amount { font-size: 14px; - color: #333; + color: #a0cfff; font-weight: 500; } .amount-value { - color: #1890ff; + color: #40c4ff; font-weight: 600; + text-shadow: 0 0 5px rgba(64, 196, 255, 0.5); } .layout-container { @@ -316,53 +309,68 @@ onUnmounted(() => { overflow: hidden !important; align-items: center; justify-content: flex-start; + background: transparent !important; } .left-panel { width: 150px; display: flex; flex-direction: column; - gap: 4px; + gap: 8px; flex-shrink: 0; overflow-y: auto; overflow-x: hidden; padding-right: 4px; box-sizing: border-box; - max-height: 100%; + height: 100%; } .stat-card { - background-color: #f0f7ff; - border-radius: 8px; - padding: 4px; - border: 1px solid #e6f4ff; - flex-shrink: 0; - min-height: 0; + background-color: rgba(18, 60, 110, 0.7) !important; + border-radius: 12px; + padding: 2px 4px; + border: 1px solid rgba(32, 160, 255, 0.3) !important; + flex: 1; + display: flex; + flex-direction: column; + box-shadow: 0 0 10px rgba(32, 160, 255, 0.1) !important; + transition: all 0.2s ease; +} + +.stat-card:hover { + border-color: rgba(64, 196, 255, 0.5) !important; + box-shadow: 0 0 15px rgba(32, 160, 255, 0.2) !important; } .stat-title { font-size: 12px; font-weight: 400; - color: #1f2937; - margin-bottom: 8px; + color: #a0cfff; + margin-bottom: 2px; display: block; } .stat-content { display: flex; + width: 100%; align-items: center; gap: 8px; + flex: 1; + align-items: center; + justify-content: center; } :deep(.stat-content .icon) { flex-shrink: 0; + filter: hue-rotate(180deg) saturate(1.5); } .stat-value { font-size: 14px; font-weight: 600; - color: #1890ff; + color: #40c4ff; margin-left: auto; + text-shadow: 0 0 5px rgba(64, 196, 255, 0.3); } .right-panel { @@ -372,6 +380,9 @@ onUnmounted(() => { min-width: 0; overflow: hidden !important; max-height: 100%; + background: rgba(9, 30, 58, 0.5) !important; + border-radius: 20px; + border: 1px solid rgba(32, 160, 255, 0.2) !important; } .chart-container { @@ -379,15 +390,16 @@ onUnmounted(() => { height: 100% !important; min-height: 0 !important; box-sizing: border-box !important; + padding: 2px; } :deep(.left-panel::-webkit-scrollbar) { width: 4px; - background: transparent; + background: rgba(9, 30, 58, 0.3); } :deep(.left-panel::-webkit-scrollbar-thumb) { - background: #d9d9d9; + background: rgba(32, 160, 255, 0.5); border-radius: 2px; } @@ -400,7 +412,7 @@ onUnmounted(() => { align-items: center; justify-content: center; } - + .left-panel { width: 100%; height: auto !important; @@ -411,22 +423,16 @@ onUnmounted(() => { padding-right: 0; padding-bottom: 4px; } - + .stat-card { min-width: 120px; + flex: 1; + min-height: 80px; } - + .right-panel { height: calc(100% - 132px) !important; min-height: 200px; } - - :deep(.echarts-legend) { - top: auto !important; - bottom: 10px !important; - left: 0 !important; - right: 0 !important; - orient: 'horizontal' !important; - } } \ No newline at end of file diff --git a/web-vue/packages/erp/views/erp/green/components/ChartQuarter.vue b/web-vue/packages/erp/views/erp/green/components/ChartQuarter.vue index 671c6f92..6b53e72e 100644 --- a/web-vue/packages/erp/views/erp/green/components/ChartQuarter.vue +++ b/web-vue/packages/erp/views/erp/green/components/ChartQuarter.vue @@ -1,13 +1,12 @@ \ No newline at end of file diff --git a/web-vue/packages/erp/views/erp/green/components/ChartRank.vue b/web-vue/packages/erp/views/erp/green/components/ChartRank.vue index 08d3be19..05135493 100644 --- a/web-vue/packages/erp/views/erp/green/components/ChartRank.vue +++ b/web-vue/packages/erp/views/erp/green/components/ChartRank.vue @@ -1,6 +1,6 @@ @@ -19,24 +19,20 @@ const chartDom = ref(null); let chartInstance: echarts.ECharts | null = null; let resizeTimer: number | null = null; -// 格式化数字 const formatNumber = (num: string | undefined): number => { if (!num) return 0; const parsed = Number(num); return isNaN(parsed) ? 0 : parsed; }; -// 格式化金额显示 const formatMoney = (num: number): string => { return num.toLocaleString('zh-CN'); }; -// 转换为万元单位 const toTenThousandYuan = (num: number): number => { return Number((num / 10000).toFixed(2)); }; -// 按序号排序 const sortBySeq = (data: BizItemInfo[]): BizItemInfo[] => { return data.sort((a, b) => { const seqA = a.seq ? parseInt(a.seq, 10) : 999; @@ -45,7 +41,6 @@ const sortBySeq = (data: BizItemInfo[]): BizItemInfo[] => { }); }; -// 获取数据列表 const fetchDataList = async (params?: Record) => { try { const reqParams = { @@ -62,86 +57,77 @@ const fetchDataList = async (params?: Record) => { } }; -// 获取排名对应的渐变颜色 const getRankColorGradient = (rank: number) => { + if (rank === 1) { + return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ + { offset: 0, color: '#ff4d4f' }, + { offset: 0.5, color: '#ff7875' }, + { offset: 1, color: '#ff8c8c' } + ]); + } else if (rank === 2) { + return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ + { offset: 0, color: '#ffa940' }, + { offset: 0.5, color: '#ffc069' }, + { offset: 1, color: '#ffd08f' } + ]); + } else if (rank === 3) { + return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ + { offset: 0, color: '#ffec3d' }, + { offset: 0.5, color: '#fff566' }, + { offset: 1, color: '#fff98f' } + ]); + } else { + return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ + { offset: 0, color: '#40a9ff' }, + { offset: 0.5, color: '#69c0ff' }, + { offset: 1, color: '#91d5ff' } + ]); + } +}; + +const getRankEmphasisColor = (rank: number) => { if (rank === 1) { return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ { offset: 0, color: '#f5222d' }, - { offset: 0.5, color: '#ff4d4f' }, - { offset: 1, color: '#ff7875' } + { offset: 1, color: '#ff4d4f' } ]); } else if (rank === 2) { return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ { offset: 0, color: '#fa8c16' }, - { offset: 0.5, color: '#ffa940' }, - { offset: 1, color: '#ffc069' } + { offset: 1, color: '#ffa940' } ]); } else if (rank === 3) { return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ { offset: 0, color: '#fadb14' }, - { offset: 0.5, color: '#ffec3d' }, - { offset: 1, color: '#fff566' } + { offset: 1, color: '#ffec3d' } ]); } else { return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ { offset: 0, color: '#1890ff' }, - { offset: 0.5, color: '#40a9ff' }, - { offset: 1, color: '#69c0ff' } + { offset: 1, color: '#40a9ff' } ]); } }; -// 获取hover时的强调色 -const getRankEmphasisColor = (rank: number) => { - if (rank === 1) { - return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ - { offset: 0, color: '#cf1322' }, - { offset: 1, color: '#f5222d' } - ]); - } else if (rank === 2) { - return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ - { offset: 0, color: '#d46b08' }, - { offset: 1, color: '#fa8c16' } - ]); - } else if (rank === 3) { - return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ - { offset: 0, color: '#d4b106' }, - { offset: 1, color: '#fadb14' } - ]); - } else { - return new echarts.graphic.LinearGradient(0, 0, 1, 0, [ - { offset: 0, color: '#096dd9' }, - { offset: 1, color: '#1890ff' } - ]); - } -}; - -// 初始化/更新图表 const initChart = () => { - // 确保DOM元素存在 if (!chartDom.value) return; - // 初始化图表实例(避免重复创建) if (!chartInstance) { chartInstance = echarts.init(chartDom.value); } - // 无数据时显示提示 if (rawData.value.length === 0) { chartInstance.setOption({ + backgroundColor: 'transparent', title: { left: 'center', top: '50%', - text: '暂无排名数据', - textStyle: { fontSize: 18, color: '#333' } + textStyle: { fontSize: 18, color: '#a0cfff' } }, - tooltip: { trigger: 'axis' }, - padding: [2, 2, 2, 2] - }, true); // 第二个参数设为true,强制更新 + }, true); return; } - // 处理图表数据 const categories = rawData.value.map(item => item.xaxis || '').reverse(); const rawAmountData = rawData.value.map(item => formatNumber(item.index01)).reverse(); const amountData = rawAmountData.map(num => toTenThousandYuan(num)); @@ -151,46 +137,45 @@ const initChart = () => { }).reverse(); const rankData = rawData.value.map(item => parseInt(item.seq || '0', 10)).reverse(); - // 图表配置项 const option = { - padding: [2, 2, 2, 2], + backgroundColor: 'transparent', tooltip: { trigger: 'axis', - axisPointer: { type: 'shadow' }, - textStyle: { fontSize: 12 }, + axisPointer: { type: 'shadow', lineStyle: { color: '#40c4ff' } }, + textStyle: { fontSize: 12, color: '#fff' }, padding: 12, - backgroundColor: '#fff', - borderColor: '#e8e8e8', + backgroundColor: 'rgba(9, 30, 58, 0.95)', + borderColor: 'rgba(32, 160, 255, 0.3)', borderWidth: 1, formatter: (params: any) => { const index = params[0].dataIndex; return ` -
${categories[index]}
-
排名:${rankData[index]}名
-
支出:${formatMoney(rawAmountData[index])} 元
-
占比:${ratioData[index]}%
+
${categories[index]}
+
排名:${rankData[index]}名
+
支出:${formatMoney(rawAmountData[index])} 元
+
占比:${ratioData[index]}%
`; } }, grid: { - left: '2%', - right: '18%', - top: '2%', - bottom: '2%', + left: 10, + right: 120, + top: 10, + bottom: 12, containLabel: true }, xAxis: [ { type: 'value', name: '支出金额 (万元)', - nameTextStyle: { fontSize: 11, color: '#666' }, + nameTextStyle: { fontSize: 11, color: '#a0cfff' }, axisLabel: { fontSize: 10, - color: '#666', + color: '#a0cfff', formatter: (value: number) => value.toFixed(1) }, - axisLine: { lineStyle: { color: '#e8e8e8' } }, - splitLine: { lineStyle: { color: '#f5f5f5' } } + axisLine: { lineStyle: { color: 'rgba(32, 160, 255, 0.3)' } }, + splitLine: { lineStyle: { color: 'rgba(32, 160, 255, 0.1)' } } } ], yAxis: [ @@ -199,7 +184,7 @@ const initChart = () => { data: categories, axisLabel: { fontSize: 11, - color: '#333', + color: '#a0cfff', formatter: (name: string, index: number) => { const shortName = name.length > 8 ? `${name.substring(0, 8)}...` : name; return `${rankData[index]} ${shortName}`; @@ -209,7 +194,7 @@ const initChart = () => { axisTick: { show: false }, splitLine: { lineStyle: { - color: ['#fafafa', '#fff'], + color: 'rgba(32, 160, 255, 0.1)', type: 'solid' } } @@ -223,29 +208,33 @@ const initChart = () => { barWidth: 12, itemStyle: { borderRadius: [0, 4, 4, 0], - color: (params: any) => getRankColorGradient(rankData[params.dataIndex]) + color: (params: any) => getRankColorGradient(rankData[params.dataIndex]), + borderColor: 'rgba(255,255,255,0.2)', + borderWidth: 0.5 }, label: { show: true, position: 'right', fontSize: 10, - color: '#666', - formatter: (params: any) => `${params.data}万元 (${ratioData[params.dataIndex]}%)` + color: '#40c4ff', + formatter: (params: any) => `${params.data}万元 (${ratioData[params.dataIndex]}%)`, + textShadowColor: 'rgba(0,0,0,0.3)', + textShadowBlur: 1 }, emphasis: { itemStyle: { - color: (params: any) => getRankEmphasisColor(rankData[params.dataIndex]) + color: (params: any) => getRankEmphasisColor(rankData[params.dataIndex]), + shadowColor: 'rgba(255,255,255,0.2)', + shadowBlur: 5 } } } ] }; - // 设置配置项,强制更新(关键:第二个参数为true) chartInstance.setOption(option, true); }; -// 防抖调整图表大小 const resizeChart = () => { if (chartInstance) { chartInstance.resize({ @@ -262,7 +251,6 @@ const debounceResize = () => { resizeTimer = window.setTimeout(resizeChart, 100); }; -// 监听formParams变化,重新获取数据 watch( () => props.formParams, (newParams) => { @@ -273,28 +261,20 @@ watch( { deep: true, immediate: true } ); -// 监听数据变化,更新图表(使用watchEffect更高效) watchEffect(() => { - // 当rawData或chartDom变化时,重新初始化图表 if (rawData.value || chartDom.value) { initChart(); } }); -// 生命周期 onMounted(() => { - // 初始加载数据 fetchDataList(props.formParams); - // 监听窗口大小变化 window.addEventListener('resize', debounceResize); }); onUnmounted(() => { - // 清理定时器 if (resizeTimer) clearTimeout(resizeTimer); - // 移除事件监听 window.removeEventListener('resize', debounceResize); - // 销毁图表实例 if (chartInstance) { chartInstance.dispose(); chartInstance = null; @@ -303,78 +283,66 @@ onUnmounted(() => { \ No newline at end of file diff --git a/web-vue/packages/erp/views/erp/green/components/ChartYear.vue b/web-vue/packages/erp/views/erp/green/components/ChartYear.vue index 1bb3a165..6ba5019c 100644 --- a/web-vue/packages/erp/views/erp/green/components/ChartYear.vue +++ b/web-vue/packages/erp/views/erp/green/components/ChartYear.vue @@ -1,20 +1,18 @@ \ No newline at end of file diff --git a/web-vue/pnpm-lock.yaml b/web-vue/pnpm-lock.yaml index f9197486..e2df3b03 100644 --- a/web-vue/pnpm-lock.yaml +++ b/web-vue/pnpm-lock.yaml @@ -171,6 +171,9 @@ importers: rimraf: specifier: 6.0.1 version: 6.0.1 + sass-embedded: + specifier: ^1.97.3 + version: 1.97.3 stylelint: specifier: 16.25.0 version: 16.25.0(typescript@5.9.3) @@ -203,10 +206,10 @@ importers: version: 5.9.3 unocss: specifier: 66.5.3 - version: 66.5.3(postcss@8.5.6)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + version: 66.5.3(postcss@8.5.6)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) vite: specifier: 7.1.9 - version: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + version: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) packages/assets: {} @@ -325,16 +328,16 @@ importers: version: 1.15.8 '@vitejs/plugin-vue': specifier: 6.0.1 - version: 6.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.22(typescript@5.9.3)) + version: 6.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.22(typescript@5.9.3)) rollup-plugin-visualizer: specifier: 6.0.4 version: 6.0.4(rollup@4.53.3) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.7.2)(rollup@4.53.3)(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + version: 4.5.4(@types/node@24.7.2)(rollup@4.53.3)(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) vite-plugin-theme-vite3: specifier: 2.0.1 - version: 2.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + version: 2.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) packages/dbm: dependencies: @@ -381,13 +384,13 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: 6.0.1 - version: 6.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.22(typescript@5.9.3)) + version: 6.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.22(typescript@5.9.3)) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.7.2)(rollup@4.53.3)(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + version: 4.5.4(@types/node@24.7.2)(rollup@4.53.3)(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) vitest: specifier: 3.2.4 - version: 3.2.4(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + version: 3.2.4(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) packages/erp: dependencies: @@ -478,13 +481,13 @@ importers: version: 11.0.4 '@vitejs/plugin-legacy': specifier: 7.2.1 - version: 7.2.1(terser@5.44.1)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + version: 7.2.1(terser@5.44.1)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) '@vitejs/plugin-vue': specifier: 6.0.1 - version: 6.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.22(typescript@5.9.3)) + version: 6.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.22(typescript@5.9.3)) '@vitejs/plugin-vue-jsx': specifier: 5.1.1 - version: 5.1.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.22(typescript@5.9.3)) + version: 5.1.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.22(typescript@5.9.3)) dotenv: specifier: 17.2.3 version: 17.2.3 @@ -499,28 +502,28 @@ importers: version: 6.0.4(rollup@4.53.3) unbuild: specifier: 3.6.1 - version: 3.6.1(typescript@5.9.3)(vue-tsc@3.1.1(typescript@5.9.3))(vue@3.5.22(typescript@5.9.3)) + version: 3.6.1(sass@1.97.3)(typescript@5.9.3)(vue-tsc@3.1.1(typescript@5.9.3))(vue@3.5.22(typescript@5.9.3)) unocss: specifier: 66.5.3 - version: 66.5.3(postcss@8.5.6)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + version: 66.5.3(postcss@8.5.6)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) vite-plugin-compression: specifier: 0.5.1 - version: 0.5.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + version: 0.5.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) vite-plugin-html: specifier: 3.2.2 - version: 3.2.2(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + version: 3.2.2(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) vite-plugin-mkcert: specifier: 1.17.9 - version: 1.17.9(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + version: 1.17.9(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) vite-plugin-monaco-editor-esm: specifier: 2.0.2 version: 2.0.2(monaco-editor@0.54.0) vite-plugin-theme-vite3: specifier: 2.0.1 - version: 2.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + version: 2.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) vite-plugin-vue-setup-extend: specifier: 0.4.0 - version: 0.4.0(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + version: 0.4.0(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) web: {} @@ -1079,6 +1082,9 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@bufbuild/protobuf@2.11.0': + resolution: {integrity: sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==} + '@cacheable/memory@2.0.6': resolution: {integrity: sha512-7e8SScMocHxcAb8YhtkbMhGG+EKLRIficb1F5sjvhSYsWTZGxvg4KIDp8kgxnV2PUJ3ddPe6J9QESjKvBWRDkg==} @@ -1777,6 +1783,94 @@ packages: '@paralleldrive/cuid2@2.3.1': resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -2931,6 +3025,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} @@ -2977,6 +3075,9 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colorjs.io@0.5.2: + resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -3261,6 +3362,10 @@ packages: resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} engines: {node: '>=12.20'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + detect-newline@4.0.1: resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3776,6 +3881,7 @@ packages: glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@11.1.0: @@ -3943,6 +4049,9 @@ packages: immer@9.0.21: resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -4507,6 +4616,9 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} @@ -5068,6 +5180,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + regenerate-unicode-properties@10.2.2: resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} engines: {node: '>=4'} @@ -5173,6 +5289,9 @@ packages: run-series@1.1.9: resolution: {integrity: sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -5183,6 +5302,128 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sass-embedded-all-unknown@1.97.3: + resolution: {integrity: sha512-t6N46NlPuXiY3rlmG6/+1nwebOBOaLFOOVqNQOC2cJhghOD4hh2kHNQQTorCsbY9S1Kir2la1/XLBwOJfui0xg==} + cpu: ['!arm', '!arm64', '!riscv64', '!x64'] + + sass-embedded-android-arm64@1.97.3: + resolution: {integrity: sha512-aiZ6iqiHsUsaDx0EFbbmmA0QgxicSxVVN3lnJJ0f1RStY0DthUkquGT5RJ4TPdaZ6ebeJWkboV4bra+CP766eA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [android] + + sass-embedded-android-arm@1.97.3: + resolution: {integrity: sha512-cRTtf/KV/q0nzGZoUzVkeIVVFv3L/tS1w4WnlHapphsjTXF/duTxI8JOU1c/9GhRPiMdfeXH7vYNcMmtjwX7jg==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [android] + + sass-embedded-android-riscv64@1.97.3: + resolution: {integrity: sha512-zVEDgl9JJodofGHobaM/q6pNETG69uuBIGQHRo789jloESxxZe82lI3AWJQuPmYCOG5ElfRthqgv89h3gTeLYA==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [android] + + sass-embedded-android-x64@1.97.3: + resolution: {integrity: sha512-3ke0le7ZKepyXn/dKKspYkpBC0zUk/BMciyP5ajQUDy4qJwobd8zXdAq6kOkdiMB+d9UFJOmEkvgFJHl3lqwcw==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [android] + + sass-embedded-darwin-arm64@1.97.3: + resolution: {integrity: sha512-fuqMTqO4gbOmA/kC5b9y9xxNYw6zDEyfOtMgabS7Mz93wimSk2M1quQaTJnL98Mkcsl2j+7shNHxIS/qpcIDDA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + + sass-embedded-darwin-x64@1.97.3: + resolution: {integrity: sha512-b/2RBs/2bZpP8lMkyZ0Px0vkVkT8uBd0YXpOwK7iOwYkAT8SsO4+WdVwErsqC65vI5e1e5p1bb20tuwsoQBMVA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + + sass-embedded-linux-arm64@1.97.3: + resolution: {integrity: sha512-IP1+2otCT3DuV46ooxPaOKV1oL5rLjteRzf8ldZtfIEcwhSgSsHgA71CbjYgLEwMY9h4jeal8Jfv3QnedPvSjg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + libc: glibc + + sass-embedded-linux-arm@1.97.3: + resolution: {integrity: sha512-2lPQ7HQQg4CKsH18FTsj2hbw5GJa6sBQgDsls+cV7buXlHjqF8iTKhAQViT6nrpLK/e8nFCoaRgSqEC8xMnXuA==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + libc: glibc + + sass-embedded-linux-musl-arm64@1.97.3: + resolution: {integrity: sha512-Lij0SdZCsr+mNRSyDZ7XtJpXEITrYsaGbOTz5e6uFLJ9bmzUbV7M8BXz2/cA7bhfpRPT7/lwRKPdV4+aR9Ozcw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + libc: musl + + sass-embedded-linux-musl-arm@1.97.3: + resolution: {integrity: sha512-cBTMU68X2opBpoYsSZnI321gnoaiMBEtc+60CKCclN6PCL3W3uXm8g4TLoil1hDD6mqU9YYNlVG6sJ+ZNef6Lg==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + libc: musl + + sass-embedded-linux-musl-riscv64@1.97.3: + resolution: {integrity: sha512-sBeLFIzMGshR4WmHAD4oIM7WJVkSoCIEwutzptFtGlSlwfNiijULp+J5hA2KteGvI6Gji35apR5aWj66wEn/iA==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + libc: musl + + sass-embedded-linux-musl-x64@1.97.3: + resolution: {integrity: sha512-/oWJ+OVrDg7ADDQxRLC/4g1+Nsz1g4mkYS2t6XmyMJKFTFK50FVI2t5sOdFH+zmMp+nXHKM036W94y9m4jjEcw==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + libc: musl + + sass-embedded-linux-riscv64@1.97.3: + resolution: {integrity: sha512-l3IfySApLVYdNx0Kjm7Zehte1CDPZVcldma3dZt+TfzvlAEerM6YDgsk5XEj3L8eHBCgHgF4A0MJspHEo2WNfA==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + libc: glibc + + sass-embedded-linux-x64@1.97.3: + resolution: {integrity: sha512-Kwqwc/jSSlcpRjULAOVbndqEy2GBzo6OBmmuBVINWUaJLJ8Kczz3vIsDUWLfWz/kTEw9FHBSiL0WCtYLVAXSLg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + libc: glibc + + sass-embedded-unknown-all@1.97.3: + resolution: {integrity: sha512-/GHajyYJmvb0IABUQHbVHf1nuHPtIDo/ClMZ81IDr59wT5CNcMe7/dMNujXwWugtQVGI5UGmqXWZQCeoGnct8Q==} + os: ['!android', '!darwin', '!linux', '!win32'] + + sass-embedded-win32-arm64@1.97.3: + resolution: {integrity: sha512-RDGtRS1GVvQfMGAmVXNxYiUOvPzn9oO1zYB/XUM9fudDRnieYTcUytpNTQZLs6Y1KfJxgt5Y+giRceC92fT8Uw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + + sass-embedded-win32-x64@1.97.3: + resolution: {integrity: sha512-SFRa2lED9UEwV6vIGeBXeBOLKF+rowF3WmNfb/BzhxmdAsKofCXrJ8ePW7OcDVrvNEbTOGwhsReIsF5sH8fVaw==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + + sass-embedded@1.97.3: + resolution: {integrity: sha512-eKzFy13Nk+IRHhlAwP3sfuv+PzOrvzUkwJK2hdoCKYcWGSdmwFpeGpWmyewdw8EgBnsKaSBtgf/0b2K635ecSA==} + engines: {node: '>=16.0.0'} + hasBin: true + + sass@1.97.3: + resolution: {integrity: sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==} + engines: {node: '>=14.0.0'} + hasBin: true + sax@1.4.3: resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} @@ -5521,6 +5762,14 @@ packages: engines: {node: '>=16'} hasBin: true + sync-child-process@1.0.2: + resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==} + engines: {node: '>=16.0.0'} + + sync-message-port@1.2.0: + resolution: {integrity: sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==} + engines: {node: '>=16.0.0'} + synckit@0.11.11: resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -5832,6 +6081,9 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -6908,6 +7160,8 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@bufbuild/protobuf@2.11.0': {} + '@cacheable/memory@2.0.6': dependencies: '@cacheable/utils': 2.3.2 @@ -7489,6 +7743,67 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 + '@parcel/watcher-android-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-x64@2.5.6': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true + + '@parcel/watcher-win32-arm64@2.5.6': + optional: true + + '@parcel/watcher-win32-ia32@2.5.6': + optional: true + + '@parcel/watcher-win32-x64@2.5.6': + optional: true + + '@parcel/watcher@2.5.6': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.3 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + optional: true + '@pkgjs/parseargs@0.11.0': optional: true @@ -8082,13 +8397,13 @@ snapshots: '@typescript-eslint/types': 8.49.0 eslint-visitor-keys: 4.2.1 - '@unocss/astro@66.5.3(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2))': + '@unocss/astro@66.5.3(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2))': dependencies: '@unocss/core': 66.5.3 '@unocss/reset': 66.5.3 - '@unocss/vite': 66.5.3(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + '@unocss/vite': 66.5.3(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) optionalDependencies: - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) '@unocss/cli@66.5.3': dependencies: @@ -8239,7 +8554,7 @@ snapshots: dependencies: '@unocss/core': 66.5.3 - '@unocss/vite@66.5.3(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2))': + '@unocss/vite@66.5.3(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2))': dependencies: '@jridgewell/remapping': 2.3.5 '@unocss/config': 66.5.3 @@ -8250,7 +8565,7 @@ snapshots: pathe: 2.0.3 tinyglobby: 0.2.15 unplugin-utils: 0.3.1 - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) '@uppy/companion-client@2.2.2': dependencies: @@ -8281,7 +8596,7 @@ snapshots: '@uppy/utils': 4.1.3 nanoid: 3.3.11 - '@vitejs/plugin-legacy@7.2.1(terser@5.44.1)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2))': + '@vitejs/plugin-legacy@7.2.1(terser@5.44.1)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) @@ -8296,26 +8611,26 @@ snapshots: regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.44.1 - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.22(typescript@5.9.3))': + '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.22(typescript@5.9.3))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@rolldown/pluginutils': 1.0.0-beta.54 '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) vue: 3.5.22(typescript@5.9.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.22(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.22(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) vue: 3.5.22(typescript@5.9.3) '@vitest/expect@3.2.4': @@ -8326,13 +8641,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: @@ -8961,6 +9276,11 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + optional: true + citty@0.1.6: dependencies: consola: 3.4.2 @@ -9009,6 +9329,8 @@ snapshots: colorette@2.0.20: {} + colorjs.io@0.5.2: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -9254,6 +9576,9 @@ snapshots: detect-indent@7.0.2: {} + detect-libc@2.1.2: + optional: true + detect-newline@4.0.1: {} dezalgo@1.0.4: @@ -10043,6 +10368,8 @@ snapshots: immer@9.0.21: {} + immutable@5.1.4: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -10506,7 +10833,7 @@ snapshots: mkdirp@1.0.4: {} - mkdist@2.4.1(typescript@5.9.3)(vue-tsc@3.1.1(typescript@5.9.3))(vue@3.5.22(typescript@5.9.3)): + mkdist@2.4.1(sass@1.97.3)(typescript@5.9.3)(vue-tsc@3.1.1(typescript@5.9.3))(vue@3.5.22(typescript@5.9.3)): dependencies: autoprefixer: 10.4.21(postcss@8.5.6) citty: 0.1.6 @@ -10522,6 +10849,7 @@ snapshots: semver: 7.7.3 tinyglobby: 0.2.15 optionalDependencies: + sass: 1.97.3 typescript: 5.9.3 vue: 3.5.22(typescript@5.9.3) vue-tsc: 3.1.1(typescript@5.9.3) @@ -10587,6 +10915,9 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 + node-addon-api@7.1.1: + optional: true + node-fetch-native@1.6.7: {} node-html-parser@5.4.2: @@ -11172,6 +11503,9 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: + optional: true + regenerate-unicode-properties@10.2.2: dependencies: regenerate: 1.4.2 @@ -11290,6 +11624,10 @@ snapshots: run-series@1.1.9: {} + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + safe-buffer@5.2.1: {} safe-regex-test@1.1.0: @@ -11300,6 +11638,102 @@ snapshots: safer-buffer@2.1.2: {} + sass-embedded-all-unknown@1.97.3: + dependencies: + sass: 1.97.3 + optional: true + + sass-embedded-android-arm64@1.97.3: + optional: true + + sass-embedded-android-arm@1.97.3: + optional: true + + sass-embedded-android-riscv64@1.97.3: + optional: true + + sass-embedded-android-x64@1.97.3: + optional: true + + sass-embedded-darwin-arm64@1.97.3: + optional: true + + sass-embedded-darwin-x64@1.97.3: + optional: true + + sass-embedded-linux-arm64@1.97.3: + optional: true + + sass-embedded-linux-arm@1.97.3: + optional: true + + sass-embedded-linux-musl-arm64@1.97.3: + optional: true + + sass-embedded-linux-musl-arm@1.97.3: + optional: true + + sass-embedded-linux-musl-riscv64@1.97.3: + optional: true + + sass-embedded-linux-musl-x64@1.97.3: + optional: true + + sass-embedded-linux-riscv64@1.97.3: + optional: true + + sass-embedded-linux-x64@1.97.3: + optional: true + + sass-embedded-unknown-all@1.97.3: + dependencies: + sass: 1.97.3 + optional: true + + sass-embedded-win32-arm64@1.97.3: + optional: true + + sass-embedded-win32-x64@1.97.3: + optional: true + + sass-embedded@1.97.3: + dependencies: + '@bufbuild/protobuf': 2.11.0 + colorjs.io: 0.5.2 + immutable: 5.1.4 + rxjs: 7.8.2 + supports-color: 8.1.1 + sync-child-process: 1.0.2 + varint: 6.0.0 + optionalDependencies: + sass-embedded-all-unknown: 1.97.3 + sass-embedded-android-arm: 1.97.3 + sass-embedded-android-arm64: 1.97.3 + sass-embedded-android-riscv64: 1.97.3 + sass-embedded-android-x64: 1.97.3 + sass-embedded-darwin-arm64: 1.97.3 + sass-embedded-darwin-x64: 1.97.3 + sass-embedded-linux-arm: 1.97.3 + sass-embedded-linux-arm64: 1.97.3 + sass-embedded-linux-musl-arm: 1.97.3 + sass-embedded-linux-musl-arm64: 1.97.3 + sass-embedded-linux-musl-riscv64: 1.97.3 + sass-embedded-linux-musl-x64: 1.97.3 + sass-embedded-linux-riscv64: 1.97.3 + sass-embedded-linux-x64: 1.97.3 + sass-embedded-unknown-all: 1.97.3 + sass-embedded-win32-arm64: 1.97.3 + sass-embedded-win32-x64: 1.97.3 + + sass@1.97.3: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.4 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.6 + optional: true + sax@1.4.3: {} scroll-into-view-if-needed@2.2.31: @@ -11655,6 +12089,12 @@ snapshots: picocolors: 1.1.1 sax: 1.4.3 + sync-child-process@1.0.2: + dependencies: + sync-message-port: 1.2.0 + + sync-message-port@1.2.0: {} + synckit@0.11.11: dependencies: '@pkgr/core': 0.2.9 @@ -11843,7 +12283,7 @@ snapshots: ufo@1.6.1: {} - unbuild@3.6.1(typescript@5.9.3)(vue-tsc@3.1.1(typescript@5.9.3))(vue@3.5.22(typescript@5.9.3)): + unbuild@3.6.1(sass@1.97.3)(typescript@5.9.3)(vue-tsc@3.1.1(typescript@5.9.3))(vue@3.5.22(typescript@5.9.3)): dependencies: '@rollup/plugin-alias': 5.1.1(rollup@4.53.3) '@rollup/plugin-commonjs': 28.0.9(rollup@4.53.3) @@ -11859,7 +12299,7 @@ snapshots: hookable: 5.5.3 jiti: 2.6.1 magic-string: 0.30.21 - mkdist: 2.4.1(typescript@5.9.3)(vue-tsc@3.1.1(typescript@5.9.3))(vue@3.5.22(typescript@5.9.3)) + mkdist: 2.4.1(sass@1.97.3)(typescript@5.9.3)(vue-tsc@3.1.1(typescript@5.9.3))(vue@3.5.22(typescript@5.9.3)) mlly: 1.8.0 pathe: 2.0.3 pkg-types: 2.3.0 @@ -11911,9 +12351,9 @@ snapshots: universalify@2.0.1: {} - unocss@66.5.3(postcss@8.5.6)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)): + unocss@66.5.3(postcss@8.5.6)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)): dependencies: - '@unocss/astro': 66.5.3(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + '@unocss/astro': 66.5.3(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) '@unocss/cli': 66.5.3 '@unocss/core': 66.5.3 '@unocss/postcss': 66.5.3(postcss@8.5.6) @@ -11931,9 +12371,9 @@ snapshots: '@unocss/transformer-compile-class': 66.5.3 '@unocss/transformer-directives': 66.5.3 '@unocss/transformer-variant-group': 66.5.3 - '@unocss/vite': 66.5.3(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + '@unocss/vite': 66.5.3(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) optionalDependencies: - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - postcss - supports-color @@ -11969,19 +12409,21 @@ snapshots: v8-compile-cache-lib@3.0.1: {} + varint@6.0.0: {} + vary@1.1.2: {} vditor@3.11.2: dependencies: diff-match-patch: 1.0.5 - vite-node@3.2.4(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2): + vite-node@3.2.4(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@5.5.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -11996,16 +12438,16 @@ snapshots: - tsx - yaml - vite-plugin-compression@0.5.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)): + vite-plugin-compression@0.5.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)): dependencies: chalk: 4.1.2 debug: 4.4.3(supports-color@5.5.0) fs-extra: 10.1.0 - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - supports-color - vite-plugin-dts@4.5.4(@types/node@24.7.2)(rollup@4.53.3)(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)): + vite-plugin-dts@4.5.4(@types/node@24.7.2)(rollup@4.53.3)(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)): dependencies: '@microsoft/api-extractor': 7.55.2(@types/node@24.7.2) '@rollup/pluginutils': 5.3.0(rollup@4.53.3) @@ -12018,13 +12460,13 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-html@3.2.2(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)): + vite-plugin-html@3.2.2(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -12038,14 +12480,14 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) - vite-plugin-mkcert@1.17.9(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)): + vite-plugin-mkcert@1.17.9(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)): dependencies: axios: 1.12.2(debug@4.4.3) debug: 4.4.3(supports-color@5.5.0) picocolors: 1.1.1 - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -12053,7 +12495,7 @@ snapshots: dependencies: monaco-editor: 0.54.0 - vite-plugin-theme-vite3@2.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)): + vite-plugin-theme-vite3@2.0.1(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)): dependencies: '@types/node': 24.1.0 '@types/tinycolor2': 1.4.6 @@ -12063,17 +12505,17 @@ snapshots: esbuild-plugin-alias: 0.2.1 picocolors: 1.1.1 tinycolor2: 1.6.0 - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - supports-color - vite-plugin-vue-setup-extend@0.4.0(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)): + vite-plugin-vue-setup-extend@0.4.0(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)): dependencies: '@vue/compiler-sfc': 3.5.22 magic-string: 0.25.9 - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) - vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2): + vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -12086,14 +12528,16 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 less: 4.4.2 + sass: 1.97.3 + sass-embedded: 1.97.3 terser: 5.44.1 yaml: 2.8.2 - vitest@3.2.4(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2): + vitest@3.2.4(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -12111,8 +12555,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(terser@5.44.1)(yaml@2.8.2) + vite: 7.1.9(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@24.7.2)(jiti@2.6.1)(less@4.4.2)(sass-embedded@1.97.3)(sass@1.97.3)(terser@5.44.1)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.7.2