@elementspanel/panel 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app.js +3995 -197
- package/app.js.map +1 -1
- package/package.json +18 -18
- package/public/assets/{AppDialog.vue_vue_type_style_index_0_lang-8b56f871.js → AppDialog.vue_vue_type_style_index_0_lang-e6e38e8b.js} +2 -2
- package/public/assets/AppDialog.vue_vue_type_style_index_0_lang-e6e38e8b.js.map +1 -0
- package/public/assets/CardPanel-59b7da2e.js +2 -0
- package/public/assets/CardPanel-59b7da2e.js.map +1 -0
- package/public/assets/{DesktopDialog-081410ca.js → DesktopDialog-e4041e4e.js} +2 -2
- package/public/assets/DesktopDialog-e4041e4e.js.map +1 -0
- package/public/assets/{Loading.vue_vue_type_script_setup_true_lang-9e79de95.js → Loading.vue_vue_type_script_setup_true_lang-1b74dd54.js} +2 -2
- package/public/assets/Loading.vue_vue_type_script_setup_true_lang-1b74dd54.js.map +1 -0
- package/public/assets/{PageToolbar-5ca1a069.js → PageToolbar-7130e13d.js} +2 -2
- package/public/assets/PageToolbar-7130e13d.js.map +1 -0
- package/public/assets/{_elements-sdk_pinia-fc8ba898.js → _elements-sdk_pinia-2c56d2c1.js} +3 -3
- package/public/assets/{_elements-sdk_pinia-fc8ba898.js.map → _elements-sdk_pinia-2c56d2c1.js.map} +1 -1
- package/public/assets/{_elements-sdk_vue-b86b0db6.js → _elements-sdk_vue-80f42d87.js} +2 -2
- package/public/assets/_elements-sdk_vue-80f42d87.js.map +1 -0
- package/public/assets/{_elements-sdk_vue-i18n-64f8e172.js → _elements-sdk_vue-i18n-4b8a106a.js} +2 -2
- package/public/assets/_elements-sdk_vue-i18n-4b8a106a.js.map +1 -0
- package/public/assets/{_elements-sdk_vue-router-a62f518d.js → _elements-sdk_vue-router-a171591a.js} +2 -2
- package/public/assets/_elements-sdk_vue-router-a171591a.js.map +1 -0
- package/public/assets/{const-cfe7ddfe.js → const-93b324c0.js} +2 -2
- package/public/assets/const-93b324c0.js.map +1 -0
- package/public/assets/{const-01673e6b.js → const-ea30795c.js} +2 -2
- package/public/assets/const-ea30795c.js.map +1 -0
- package/public/assets/{context-b16af9cc.js → context-cc90576e.js} +2 -2
- package/public/assets/{context-b16af9cc.js.map → context-cc90576e.js.map} +1 -1
- package/public/assets/{copy-4d64fc1f.js → copy-b106bb10.js} +2 -2
- package/public/assets/copy-b106bb10.js.map +1 -0
- package/public/assets/{core-b6992169.js → core-d3bfdede.js} +2 -2
- package/public/assets/core-d3bfdede.js.map +1 -0
- package/public/assets/{desktopNotice-2c886f6b.js → desktopNotice-5ca3448c.js} +2 -2
- package/public/assets/desktopNotice-5ca3448c.js.map +1 -0
- package/public/assets/dom-ff483262.js.map +1 -1
- package/public/assets/{i18n-fe0f1ee7.js → i18n-e810b9fa.js} +2 -2
- package/public/assets/i18n-e810b9fa.js.map +1 -0
- package/public/assets/index-1da88aed.js +2 -0
- package/public/assets/index-1da88aed.js.map +1 -0
- package/public/assets/index-e3f35709.js.map +1 -1
- package/public/assets/{instance-26cca4c8.js → instance-cc59e210.js} +2 -2
- package/public/assets/instance-cc59e210.js.map +1 -0
- package/public/assets/lodash-001e4f93.js.map +1 -1
- package/public/assets/{nodes-402cdcbd.js → nodes-a56b1b35.js} +2 -2
- package/public/assets/nodes-a56b1b35.js.map +1 -0
- package/public/assets/protocol-97f7bab7.js.map +1 -1
- package/public/assets/randId-56f93901.js +2 -0
- package/public/assets/randId-56f93901.js.map +1 -0
- package/public/assets/{router-0f7d4714.js → router-eff205cc.js} +2 -2
- package/public/assets/router-eff205cc.js.map +1 -0
- package/public/assets/safe-87846d89.js.map +1 -1
- package/public/assets/{sdk-01dda668.js → sdk-3f2277ab.js} +2 -2
- package/public/assets/sdk-3f2277ab.js.map +1 -0
- package/public/assets/{shared-f2e37690.js → shared-597ef52b.js} +2 -2
- package/public/assets/shared-597ef52b.js.map +1 -0
- package/public/assets/{useAppConfigStore-289073ec.js → useAppConfigStore-352fe033.js} +2 -2
- package/public/assets/useAppConfigStore-352fe033.js.map +1 -0
- package/public/assets/useAppRouters-747b627a.js +2 -0
- package/public/assets/useAppRouters-747b627a.js.map +1 -0
- package/public/assets/{useAppStateStore-a644582a.js → useAppStateStore-a438b9a6.js} +2 -2
- package/public/assets/useAppStateStore-a438b9a6.js.map +1 -0
- package/public/assets/{useAppToolsStore-3a911226.js → useAppToolsStore-288c4fe8.js} +2 -2
- package/public/assets/useAppToolsStore-288c4fe8.js.map +1 -0
- package/public/assets/{useDefineApi-ead2616e.js → useDefineApi-b726db1e.js} +2 -2
- package/public/assets/useDefineApi-b726db1e.js.map +1 -0
- package/public/assets/{useInstanceActionAvailability-dec16c10.js → useInstanceActionAvailability-16de3001.js} +2 -2
- package/public/assets/useInstanceActionAvailability-16de3001.js.map +1 -0
- package/public/assets/{useKeyboardEvents-dba9d5ca.js → useKeyboardEvents-6f7f845c.js} +2 -2
- package/public/assets/useKeyboardEvents-6f7f845c.js.map +1 -0
- package/public/assets/{useMountComponent-dd1fcfea.js → useMountComponent-4043cb4c.js} +2 -2
- package/public/assets/useMountComponent-4043cb4c.js.map +1 -0
- package/public/assets/{useOverviewChart-119bda3b.js → useOverviewChart-7d758bc4.js} +2 -2
- package/public/assets/useOverviewChart-7d758bc4.js.map +1 -0
- package/public/assets/{useOverviewInfo-a149d634.js → useOverviewInfo-9ca25ab9.js} +2 -2
- package/public/assets/useOverviewInfo-9ca25ab9.js.map +1 -0
- package/public/assets/{usePolling-f2f09d27.js → usePolling-1bc2009b.js} +2 -2
- package/public/assets/usePolling-1bc2009b.js.map +1 -0
- package/public/assets/{useScreen-e3715e1f.js → useScreen-fad29b7c.js} +2 -2
- package/public/assets/useScreen-fad29b7c.js.map +1 -0
- package/public/assets/{useSocketIo-bc0a62c2.js → useSocketIo-ea3c9a61.js} +2 -2
- package/public/assets/useSocketIo-ea3c9a61.js.map +1 -0
- package/public/assets/{useThemeSwitch-6ff90248.js → useThemeSwitch-dc70883c.js} +2 -2
- package/public/assets/useThemeSwitch-dc70883c.js.map +1 -0
- package/public/assets/{vue-2433bd89.js → vue-6b52a630.js} +2 -2
- package/public/assets/{vue-2433bd89.js.map → vue-6b52a630.js.map} +1 -1
- package/public/assets/{vuetifyModal-49cb95ba.js → vuetifyModal-8382b175.js} +2 -2
- package/public/assets/vuetifyModal-8382b175.js.map +1 -0
- package/public/index.html +4 -4
- package/public/stats.html +2 -2
- package/runtime/npm-plugins.cjs +49 -13
- package/runtime/plugin-resolution.cjs +27 -9
- package/public/assets/AppDialog.vue_vue_type_style_index_0_lang-8b56f871.js.map +0 -1
- package/public/assets/CardPanel-a704f146.js +0 -2
- package/public/assets/CardPanel-a704f146.js.map +0 -1
- package/public/assets/DesktopDialog-081410ca.js.map +0 -1
- package/public/assets/Loading.vue_vue_type_script_setup_true_lang-9e79de95.js.map +0 -1
- package/public/assets/PageToolbar-5ca1a069.js.map +0 -1
- package/public/assets/_elements-sdk_vue-b86b0db6.js.map +0 -1
- package/public/assets/_elements-sdk_vue-i18n-64f8e172.js.map +0 -1
- package/public/assets/_elements-sdk_vue-router-a62f518d.js.map +0 -1
- package/public/assets/const-01673e6b.js.map +0 -1
- package/public/assets/const-cfe7ddfe.js.map +0 -1
- package/public/assets/copy-4d64fc1f.js.map +0 -1
- package/public/assets/core-b6992169.js.map +0 -1
- package/public/assets/desktopNotice-2c886f6b.js.map +0 -1
- package/public/assets/i18n-fe0f1ee7.js.map +0 -1
- package/public/assets/index-76b0df52.js +0 -2
- package/public/assets/index-76b0df52.js.map +0 -1
- package/public/assets/instance-26cca4c8.js.map +0 -1
- package/public/assets/nodes-402cdcbd.js.map +0 -1
- package/public/assets/randId-ed0b95b7.js +0 -2
- package/public/assets/randId-ed0b95b7.js.map +0 -1
- package/public/assets/router-0f7d4714.js.map +0 -1
- package/public/assets/sdk-01dda668.js.map +0 -1
- package/public/assets/shared-f2e37690.js.map +0 -1
- package/public/assets/useAppConfigStore-289073ec.js.map +0 -1
- package/public/assets/useAppRouters-5f58db32.js +0 -2
- package/public/assets/useAppRouters-5f58db32.js.map +0 -1
- package/public/assets/useAppStateStore-a644582a.js.map +0 -1
- package/public/assets/useAppToolsStore-3a911226.js.map +0 -1
- package/public/assets/useDefineApi-ead2616e.js.map +0 -1
- package/public/assets/useInstanceActionAvailability-dec16c10.js.map +0 -1
- package/public/assets/useKeyboardEvents-dba9d5ca.js.map +0 -1
- package/public/assets/useMountComponent-dd1fcfea.js.map +0 -1
- package/public/assets/useOverviewChart-119bda3b.js.map +0 -1
- package/public/assets/useOverviewInfo-a149d634.js.map +0 -1
- package/public/assets/usePolling-f2f09d27.js.map +0 -1
- package/public/assets/useScreen-e3715e1f.js.map +0 -1
- package/public/assets/useSocketIo-bc0a62c2.js.map +0 -1
- package/public/assets/useThemeSwitch-6ff90248.js.map +0 -1
- package/public/assets/vuetifyModal-49cb95ba.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as g,a as m,L as f,b as x,c as y,P as h,i as C,p as v}from"./chartjs-1e331dfb.js";import{ay as k,b5 as S,au as L,bC as R}from"./vue-
|
|
2
|
-
//# sourceMappingURL=useOverviewChart-
|
|
1
|
+
import{C as g,a as m,L as f,b as x,c as y,P as h,i as C,p as v}from"./chartjs-1e331dfb.js";import{ay as k,b5 as S,au as L,bC as R}from"./vue-6b52a630.js";g.register(m,f,x,y,h,C,v);function F(d,u,{compact:a=!1,percentage:p=!1}={}){const o=R(),c=e=>({labels:[...e.labels],values:e.values.map(t=>Number.isFinite(t)?t:null),max:Number.isFinite(e.max)&&e.max>0?e.max:1});return k(()=>{if(!d.value)return;const e=c(u());let t,r,l;const b={type:"line",data:{labels:e.labels,datasets:[{data:e.values,borderColor:"rgba(67, 145, 250, 0.95)",borderWidth:1.5,pointRadius:0,pointHoverRadius:3,pointHitRadius:8,cubicInterpolationMode:"monotone",fill:!0,backgroundColor:({chart:s})=>{const{ctx:n,chartArea:i}=s;return i?((!t||r!==i.top||l!==i.bottom)&&(r=i.top,l=i.bottom,t=n.createLinearGradient(0,i.top,0,i.bottom),t.addColorStop(0,"rgba(67, 145, 250, 0.55)"),t.addColorStop(.6,"rgba(40, 100, 210, 0.15)"),t.addColorStop(1,"rgba(17, 60, 150, 0)")),t):"rgba(67, 145, 250, 0.15)"}}]},options:{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},layout:{padding:{top:a?6:8,bottom:a?4:0,right:a?6:8}},plugins:{legend:{display:!1},tooltip:{yAlign:"bottom",displayColors:!1,backgroundColor:"rgba(20, 24, 35, 0.85)",cornerRadius:6,padding:{top:6,bottom:6,left:10,right:10},bodyColor:"#e0e6f0",bodyFont:{size:12,weight:600},callbacks:{title:()=>"",label:({parsed:s})=>{const n=s.y??0;return p?`${n.toFixed(1)}%`:Number.isInteger(n)?String(n):n.toFixed(1)}}}},scales:{x:{type:"category",display:!a,grid:{display:!1},border:{color:"rgba(100, 130, 180, 0.2)"},ticks:{autoSkip:!0,maxTicksLimit:6,maxRotation:0,color:"rgba(160, 180, 210, 0.7)",font:{size:10},padding:4}},y:{type:"linear",min:0,max:e.max,border:{display:!1,dash:[4,4]},grid:{color:"rgba(100, 130, 180, 0.12)",tickLength:0},ticks:{stepSize:p?50:void 0,precision:0,maxTicksLimit:a?3:6,color:"rgba(160, 180, 210, 0.7)",font:{size:10},padding:4,callback:s=>p?`${s}%`:s}}}}};o.value=new g(d.value,b)}),S(u,e=>{var b;const t=o.value;if(!t)return;const r=c(e);t.data.labels=r.labels,t.data.datasets[0].data=r.values;const l=(b=t.options.scales)==null?void 0:b.y;l&&(l.max=r.max),t.update()},{deep:!0,flush:"post"}),L(()=>{var e;(e=o.value)==null||e.destroy(),o.value=void 0}),{instance:o}}function A(d,u){return F(d,()=>{const a=u();return{labels:a.map((p,o)=>String(o)),values:a,max:100}},{compact:!0,percentage:!0})}export{A as a,F as u};
|
|
2
|
+
//# sourceMappingURL=useOverviewChart-7d758bc4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOverviewChart-7d758bc4.js","sources":["../../../../plugins/console/panel/src/hooks/useOverviewChart.ts"],"sourcesContent":["import {\n CategoryScale,\n Chart,\n Filler,\n LineController,\n LineElement,\n LinearScale,\n PointElement,\n Tooltip,\n type ChartConfiguration\n} from \"chart.js\";\nimport { onBeforeUnmount, onMounted, shallowRef, watch, type Ref } from \"vue\";\n\nChart.register(CategoryScale, LinearScale, LineController, LineElement, PointElement, Filler, Tooltip);\n\nexport interface LineChartData {\n labels: string[];\n values: readonly (number | null)[];\n max: number;\n}\n\ninterface LineChartOptions {\n compact?: boolean;\n percentage?: boolean;\n}\n\ntype HistoryChart = Chart<\"line\", (number | null)[], string>;\n\nexport function useLineChart(\n canvas: Ref<HTMLCanvasElement | undefined>,\n readData: () => LineChartData,\n { compact = false, percentage = false }: LineChartOptions = {}\n) {\n // Chart instances must stay outside Vue's deep reactive proxies.\n const instance = shallowRef<HistoryChart>();\n const snapshot = (data: LineChartData) => ({\n labels: [...data.labels],\n values: data.values.map((value) => Number.isFinite(value) ? value : null),\n max: Number.isFinite(data.max) && data.max > 0 ? data.max : 1\n });\n\n onMounted(() => {\n if (!canvas.value) return;\n const data = snapshot(readData());\n let gradient: CanvasGradient | undefined;\n let gradientTop: number | undefined;\n let gradientBottom: number | undefined;\n const config: ChartConfiguration<\"line\", (number | null)[], string> = {\n type: \"line\",\n data: {\n labels: data.labels,\n datasets: [{\n data: data.values,\n borderColor: \"rgba(67, 145, 250, 0.95)\",\n borderWidth: 1.5,\n pointRadius: 0,\n pointHoverRadius: 3,\n pointHitRadius: 8,\n cubicInterpolationMode: \"monotone\",\n fill: true,\n backgroundColor: ({ chart }) => {\n const { ctx, chartArea } = chart;\n if (!chartArea) return \"rgba(67, 145, 250, 0.15)\";\n if (!gradient || gradientTop !== chartArea.top || gradientBottom !== chartArea.bottom) {\n gradientTop = chartArea.top;\n gradientBottom = chartArea.bottom;\n gradient = ctx.createLinearGradient(0, chartArea.top, 0, chartArea.bottom);\n gradient.addColorStop(0, \"rgba(67, 145, 250, 0.55)\");\n gradient.addColorStop(0.6, \"rgba(40, 100, 210, 0.15)\");\n gradient.addColorStop(1, \"rgba(17, 60, 150, 0)\");\n }\n return gradient;\n }\n }]\n },\n options: {\n responsive: true,\n maintainAspectRatio: false,\n interaction: { mode: \"index\", intersect: false },\n layout: { padding: { top: compact ? 6 : 8, bottom: compact ? 4 : 0, right: compact ? 6 : 8 } },\n plugins: {\n legend: { display: false },\n tooltip: {\n // Restore the pre-Chart.js hover card: a compact translucent panel\n // with no border, showing only the plotted value — the percentage on\n // usage charts. The axis label is redundant with the axis itself,\n // so the title row is dropped.\n // Always anchor the card above the hovered point (the bottom edge\n // aligns with it) instead of letting Chart.js flip it below when the\n // point sits in the upper half of the plot.\n yAlign: \"bottom\",\n displayColors: false,\n backgroundColor: \"rgba(20, 24, 35, 0.85)\",\n cornerRadius: 6,\n padding: { top: 6, bottom: 6, left: 10, right: 10 },\n bodyColor: \"#e0e6f0\",\n bodyFont: { size: 12, weight: 600 },\n callbacks: {\n title: () => \"\",\n label: ({ parsed }) => {\n const value = parsed.y ?? 0;\n if (percentage) return `${value.toFixed(1)}%`;\n return Number.isInteger(value) ? String(value) : value.toFixed(1);\n }\n }\n }\n },\n scales: {\n x: {\n type: \"category\",\n display: !compact,\n grid: { display: false },\n border: { color: \"rgba(100, 130, 180, 0.2)\" },\n ticks: {\n autoSkip: true,\n maxTicksLimit: 6,\n maxRotation: 0,\n color: \"rgba(160, 180, 210, 0.7)\",\n font: { size: 10 },\n padding: 4\n }\n },\n y: {\n type: \"linear\",\n min: 0,\n max: data.max,\n border: { display: false, dash: [4, 4] },\n grid: { color: \"rgba(100, 130, 180, 0.12)\", tickLength: 0 },\n ticks: {\n stepSize: percentage ? 50 : undefined,\n precision: 0,\n maxTicksLimit: compact ? 3 : 6,\n color: \"rgba(160, 180, 210, 0.7)\",\n font: { size: 10 },\n padding: 4,\n callback: (value) => percentage ? `${value}%` : value\n }\n }\n }\n }\n };\n instance.value = new Chart(canvas.value, config);\n });\n\n watch(readData, (value) => {\n const chart = instance.value;\n if (!chart) return;\n const data = snapshot(value);\n chart.data.labels = data.labels;\n chart.data.datasets[0].data = data.values;\n const axis = chart.options.scales?.y;\n if (axis) axis.max = data.max;\n // Default update mode keeps Chart.js's own transition between data points.\n chart.update();\n }, { deep: true, flush: \"post\" });\n\n onBeforeUnmount(() => {\n instance.value?.destroy();\n instance.value = undefined;\n });\n\n return { instance };\n}\n\nexport function useSimpleChart(\n canvas: Ref<HTMLCanvasElement | undefined>,\n readValues: () => readonly number[]\n) {\n return useLineChart(canvas, () => {\n const values = readValues();\n return { labels: values.map((_, index) => String(index)), values, max: 100 };\n }, { compact: true, percentage: true });\n}\n"],"names":["Chart","CategoryScale","LinearScale","LineController","LineElement","PointElement","Filler","Tooltip","useLineChart","canvas","readData","compact","percentage","instance","shallowRef","snapshot","data","value","onMounted","gradient","gradientTop","gradientBottom","config","chart","ctx","chartArea","parsed","watch","axis","_a","onBeforeUnmount","useSimpleChart","readValues","values","_","index"],"mappings":"0JAaAA,EAAM,SAASC,EAAeC,EAAaC,EAAgBC,EAAaC,EAAcC,EAAQC,CAAO,EAerF,SAAAC,EACdC,EACAC,EACA,CAAE,QAAAC,EAAU,GAAO,WAAAC,EAAa,EAA4B,EAAA,GAC5D,CAEA,MAAMC,EAAWC,IACXC,EAAYC,IAAyB,CACzC,OAAQ,CAAC,GAAGA,EAAK,MAAM,EACvB,OAAQA,EAAK,OAAO,IAAKC,GAAU,OAAO,SAASA,CAAK,EAAIA,EAAQ,IAAI,EACxE,IAAK,OAAO,SAASD,EAAK,GAAG,GAAKA,EAAK,IAAM,EAAIA,EAAK,IAAM,CAAA,GAG9D,OAAAE,EAAU,IAAM,CACd,GAAI,CAACT,EAAO,MAAO,OACb,MAAAO,EAAOD,EAASL,EAAA,CAAU,EAC5B,IAAAS,EACAC,EACAC,EACJ,MAAMC,EAAgE,CACpE,KAAM,OACN,KAAM,CACJ,OAAQN,EAAK,OACb,SAAU,CAAC,CACT,KAAMA,EAAK,OACX,YAAa,2BACb,YAAa,IACb,YAAa,EACb,iBAAkB,EAClB,eAAgB,EAChB,uBAAwB,WACxB,KAAM,GACN,gBAAiB,CAAC,CAAE,MAAAO,KAAY,CACxB,KAAA,CAAE,IAAAC,EAAK,UAAAC,CAAc,EAAAF,EAC3B,OAAKE,IACD,CAACN,GAAYC,IAAgBK,EAAU,KAAOJ,IAAmBI,EAAU,UAC7EL,EAAcK,EAAU,IACxBJ,EAAiBI,EAAU,OAC3BN,EAAWK,EAAI,qBAAqB,EAAGC,EAAU,IAAK,EAAGA,EAAU,MAAM,EAChEN,EAAA,aAAa,EAAG,0BAA0B,EAC1CA,EAAA,aAAa,GAAK,0BAA0B,EAC5CA,EAAA,aAAa,EAAG,sBAAsB,GAE1CA,GATgB,0BAUzB,CAAA,CACD,CACH,EACA,QAAS,CACP,WAAY,GACZ,oBAAqB,GACrB,YAAa,CAAE,KAAM,QAAS,UAAW,EAAM,EAC/C,OAAQ,CAAE,QAAS,CAAE,IAAKR,EAAU,EAAI,EAAG,OAAQA,EAAU,EAAI,EAAG,MAAOA,EAAU,EAAI,EAAI,EAC7F,QAAS,CACP,OAAQ,CAAE,QAAS,EAAM,EACzB,QAAS,CAQP,OAAQ,SACR,cAAe,GACf,gBAAiB,yBACjB,aAAc,EACd,QAAS,CAAE,IAAK,EAAG,OAAQ,EAAG,KAAM,GAAI,MAAO,EAAG,EAClD,UAAW,UACX,SAAU,CAAE,KAAM,GAAI,OAAQ,GAAI,EAClC,UAAW,CACT,MAAO,IAAM,GACb,MAAO,CAAC,CAAE,OAAAe,KAAa,CACf,MAAAT,EAAQS,EAAO,GAAK,EACtB,OAAAd,EAAmB,GAAGK,EAAM,QAAQ,CAAC,CAAC,IACnC,OAAO,UAAUA,CAAK,EAAI,OAAOA,CAAK,EAAIA,EAAM,QAAQ,CAAC,CAClE,CACF,CACF,CACF,EACA,OAAQ,CACN,EAAG,CACD,KAAM,WACN,QAAS,CAACN,EACV,KAAM,CAAE,QAAS,EAAM,EACvB,OAAQ,CAAE,MAAO,0BAA2B,EAC5C,MAAO,CACL,SAAU,GACV,cAAe,EACf,YAAa,EACb,MAAO,2BACP,KAAM,CAAE,KAAM,EAAG,EACjB,QAAS,CACX,CACF,EACA,EAAG,CACD,KAAM,SACN,IAAK,EACL,IAAKK,EAAK,IACV,OAAQ,CAAE,QAAS,GAAO,KAAM,CAAC,EAAG,CAAC,CAAE,EACvC,KAAM,CAAE,MAAO,4BAA6B,WAAY,CAAE,EAC1D,MAAO,CACL,SAAUJ,EAAa,GAAK,OAC5B,UAAW,EACX,cAAeD,EAAU,EAAI,EAC7B,MAAO,2BACP,KAAM,CAAE,KAAM,EAAG,EACjB,QAAS,EACT,SAAWM,GAAUL,EAAa,GAAGK,CAAK,IAAMA,CAClD,CACF,CACF,CACF,CAAA,EAEFJ,EAAS,MAAQ,IAAIb,EAAMS,EAAO,MAAOa,CAAM,CAAA,CAChD,EAEKK,EAAAjB,EAAWO,GAAU,OACzB,MAAMM,EAAQV,EAAS,MACvB,GAAI,CAACU,EAAO,OACN,MAAAP,EAAOD,EAASE,CAAK,EACrBM,EAAA,KAAK,OAASP,EAAK,OACzBO,EAAM,KAAK,SAAS,CAAC,EAAE,KAAOP,EAAK,OAC7B,MAAAY,GAAOC,EAAAN,EAAM,QAAQ,SAAd,YAAAM,EAAsB,EAC/BD,IAAMA,EAAK,IAAMZ,EAAK,KAE1BO,EAAM,OAAO,GACZ,CAAE,KAAM,GAAM,MAAO,MAAQ,CAAA,EAEhCO,EAAgB,IAAM,QACpBD,EAAAhB,EAAS,QAAT,MAAAgB,EAAgB,UAChBhB,EAAS,MAAQ,MAAA,CAClB,EAEM,CAAE,SAAAA,CAAS,CACpB,CAEgB,SAAAkB,EACdtB,EACAuB,EACA,CACO,OAAAxB,EAAaC,EAAQ,IAAM,CAChC,MAAMwB,EAASD,IACf,MAAO,CAAE,OAAQC,EAAO,IAAI,CAACC,EAAGC,IAAU,OAAOA,CAAK,CAAC,EAAG,OAAAF,EAAQ,IAAK,GAAI,GAC1E,CAAE,QAAS,GAAM,WAAY,EAAM,CAAA,CACxC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{o as w}from"./useAppStateStore-
|
|
2
|
-
//# sourceMappingURL=useOverviewInfo-
|
|
1
|
+
import{o as w}from"./useAppStateStore-a438b9a6.js";import{u as h}from"./usePolling-1bc2009b.js";import{N as v}from"./vue-6b52a630.js";function I(n){var c,i,f,l,p;if(!n.value)return;const t={...n.value};let s=0,m=0;for(const e of t.remote||[])e.instance&&(s+=e.instance.total,m+=e.instance.running);t.totalInstance=s,t.runningInstance=m;let o=Number(t.system.cpu*100).toFixed(0);const u=t.system.totalmem,y=u?(1-t.system.freemem/u)*100:0,N=Math.min(100,Math.max(0,y)).toFixed(0);t.cpu=Number(o),t.mem=Number(N);const a=(c=n.value.remote)==null?void 0:c.map(e=>({...e}));if(t.remote=a??[],a)for(let e of a){if(!e.system)continue;const b=Number(e.system.freemem/1024/1024/1024).toFixed(1),x=Number(e.system.totalmem/1024/1024/1024).toFixed(1),d=Number(Number(x)-Number(b)).toFixed(1);e.platformText=((i=e==null?void 0:e.system)==null?void 0:i.platform)=="win32"?"windows":((f=e==null?void 0:e.system)==null?void 0:f.platform)||"--",e.instanceStatus=e.instance?`${e.instance.running} / ${e.instance.total}`:"--",e.cpuInfo=`${Number(e.system.cpuUsage*100).toFixed(1)}%`,e.memText=`${d}G / ${x}G`,e.cpuChartData=((l=e.cpuMemChart)==null?void 0:l.map(r=>r.cpu))??[],e.memChartData=((p=e.cpuMemChart)==null?void 0:p.map(r=>r.mem))??[]}return t}function $({poll:n=!0}={}){const t=w(),s=v(()=>I(t.state)),m=async(o=!1)=>(await t.execute({forceRequest:o}),s.value);return n&&h(m,3e3),{...t,state:s,refresh:m,execute:null}}export{$ as u};
|
|
2
|
+
//# sourceMappingURL=useOverviewInfo-9ca25ab9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOverviewInfo-9ca25ab9.js","sources":["../../../../plugins/console/panel/src/hooks/useOverviewInfo.ts"],"sourcesContent":["import { overviewInfo } from \"@/services/apis\";\nimport { computed, type Ref } from \"vue\";\nimport { usePolling } from \"./usePolling\";\n\nexport interface ComputedOverviewResponse extends IPanelOverviewResponse {\n totalInstance: number;\n runningInstance: number;\n cpu: number;\n mem: number;\n remote: ComputedNodeInfo[];\n}\n\nexport interface ComputedNodeInfo extends IPanelOverviewRemoteResponse {\n platformText?: string;\n cpuInfo?: string;\n instanceStatus?: string;\n memText?: string;\n cpuChartData?: number[];\n memChartData?: number[];\n brand?: string;\n}\n\nfunction computeResponseData(v: Ref<IPanelOverviewResponse | undefined>) {\n if (!v.value) return undefined;\n const currentState = { ...v.value } as ComputedOverviewResponse;\n\n let totalInstance = 0;\n let runningInstance = 0;\n for (const iterator of currentState.remote || []) {\n if (iterator.instance) {\n totalInstance += iterator.instance.total;\n runningInstance += iterator.instance.running;\n }\n }\n\n currentState.totalInstance = totalInstance;\n currentState.runningInstance = runningInstance;\n\n let cpu = Number(currentState.system.cpu * 100).toFixed(0);\n const totalMemory = currentState.system.totalmem;\n const usedMemory = totalMemory ? (1 - currentState.system.freemem / totalMemory) * 100 : 0;\n const mem = Math.min(100, Math.max(0, usedMemory)).toFixed(0);\n\n currentState.cpu = Number(cpu);\n currentState.mem = Number(mem);\n\n const newNodes = v.value.remote?.map((node) => ({ ...node })) as ComputedNodeInfo[] | undefined;\n currentState.remote = newNodes ?? [];\n if (newNodes) {\n for (let node of newNodes) {\n if (!node.system) continue;\n const free = Number(node.system.freemem / 1024 / 1024 / 1024).toFixed(1);\n const total = Number(node.system.totalmem / 1024 / 1024 / 1024).toFixed(1);\n const used = Number(Number(total) - Number(free)).toFixed(1);\n node.platformText =\n node?.system?.platform == \"win32\" ? \"windows\" : node?.system?.platform || \"--\";\n node.instanceStatus = node.instance ? `${node.instance.running} / ${node.instance.total}` : \"--\";\n node.cpuInfo = `${Number(node.system.cpuUsage * 100).toFixed(1)}%`;\n node.memText = `${used}G / ${total}G`;\n node.cpuChartData = node.cpuMemChart?.map((v) => v.cpu) ?? [];\n node.memChartData = node.cpuMemChart?.map((v) => v.mem) ?? [];\n }\n }\n return currentState;\n}\n\nexport function useOverviewInfo({ poll = true }: { poll?: boolean } = {}) {\n const result = overviewInfo();\n const newState = computed(() => computeResponseData(result.state));\n\n const refresh = async (forceRequest = false) => {\n await result.execute({ forceRequest });\n return newState.value;\n };\n\n if (poll) usePolling(refresh, 3000);\n\n return {\n ...result,\n state: newState,\n refresh,\n execute: null\n };\n}\n"],"names":["computeResponseData","v","currentState","totalInstance","runningInstance","iterator","cpu","totalMemory","usedMemory","mem","newNodes","_a","node","free","total","used","_b","_c","_d","_e","useOverviewInfo","poll","result","overviewInfo","newState","computed","refresh","forceRequest","usePolling"],"mappings":"sIAsBA,SAASA,EAAoBC,EAA4C,eACvE,GAAI,CAACA,EAAE,MAAc,OACrB,MAAMC,EAAe,CAAE,GAAGD,EAAE,KAAM,EAElC,IAAIE,EAAgB,EAChBC,EAAkB,EACtB,UAAWC,KAAYH,EAAa,QAAU,CAAA,EACxCG,EAAS,WACXF,GAAiBE,EAAS,SAAS,MACnCD,GAAmBC,EAAS,SAAS,SAIzCH,EAAa,cAAgBC,EAC7BD,EAAa,gBAAkBE,EAE3B,IAAAE,EAAM,OAAOJ,EAAa,OAAO,IAAM,GAAG,EAAE,QAAQ,CAAC,EACnD,MAAAK,EAAcL,EAAa,OAAO,SAClCM,EAAaD,GAAe,EAAIL,EAAa,OAAO,QAAUK,GAAe,IAAM,EACnFE,EAAM,KAAK,IAAI,IAAK,KAAK,IAAI,EAAGD,CAAU,CAAC,EAAE,QAAQ,CAAC,EAE/CN,EAAA,IAAM,OAAOI,CAAG,EAChBJ,EAAA,IAAM,OAAOO,CAAG,EAEvB,MAAAC,GAAWC,EAAAV,EAAE,MAAM,SAAR,YAAAU,EAAgB,IAAKC,IAAU,CAAE,GAAGA,CAAO,IAE5D,GADaV,EAAA,OAASQ,GAAY,GAC9BA,EACF,QAASE,KAAQF,EAAU,CACzB,GAAI,CAACE,EAAK,OAAQ,SACZ,MAAAC,EAAO,OAAOD,EAAK,OAAO,QAAU,KAAO,KAAO,IAAI,EAAE,QAAQ,CAAC,EACjEE,EAAQ,OAAOF,EAAK,OAAO,SAAW,KAAO,KAAO,IAAI,EAAE,QAAQ,CAAC,EACnEG,EAAO,OAAO,OAAOD,CAAK,EAAI,OAAOD,CAAI,CAAC,EAAE,QAAQ,CAAC,EACtDD,EAAA,eACHI,EAAAJ,GAAA,YAAAA,EAAM,SAAN,YAAAI,EAAc,WAAY,QAAU,YAAYC,EAAAL,GAAA,YAAAA,EAAM,SAAN,YAAAK,EAAc,WAAY,KACvEL,EAAA,eAAiBA,EAAK,SAAW,GAAGA,EAAK,SAAS,OAAO,MAAMA,EAAK,SAAS,KAAK,GAAK,KACvFA,EAAA,QAAU,GAAG,OAAOA,EAAK,OAAO,SAAW,GAAG,EAAE,QAAQ,CAAC,CAAC,IAC/DA,EAAK,QAAU,GAAGG,CAAI,OAAOD,CAAK,IAC7BF,EAAA,eAAeM,EAAAN,EAAK,cAAL,YAAAM,EAAkB,IAAKjB,GAAMA,EAAE,OAAQ,GACtDW,EAAA,eAAeO,EAAAP,EAAK,cAAL,YAAAO,EAAkB,IAAKlB,GAAMA,EAAE,OAAQ,EAC7D,CAEK,OAAAC,CACT,CAEO,SAASkB,EAAgB,CAAE,KAAAC,EAAO,EAAK,EAAwB,CAAA,EAAI,CACxE,MAAMC,EAASC,IACTC,EAAWC,EAAS,IAAMzB,EAAoBsB,EAAO,KAAK,CAAC,EAE3DI,EAAU,MAAOC,EAAe,MACpC,MAAML,EAAO,QAAQ,CAAE,aAAAK,CAAc,CAAA,EAC9BH,EAAS,OAGd,OAAAH,GAAMO,EAAWF,EAAS,GAAI,EAE3B,CACL,GAAGJ,EACH,MAAOE,EACP,QAAAE,EACA,QAAS,IAAA,CAEb"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ay as i,aC as n}from"./vue-
|
|
2
|
-
//# sourceMappingURL=usePolling-
|
|
1
|
+
import{ay as i,aC as n}from"./vue-6b52a630.js";function u(r,o){let e=!1,t;const l=async()=>{try{await r()}catch(a){console.error("Polling request failed:",a)}finally{!e&&o!==void 0&&(t=setTimeout(l,o))}};i(l),n(()=>{e=!0,clearTimeout(t)})}export{u};
|
|
2
|
+
//# sourceMappingURL=usePolling-1bc2009b.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePolling-1bc2009b.js","sources":["../../../../plugins/console/panel/src/hooks/usePolling.ts"],"sourcesContent":["import { onMounted, onUnmounted } from \"vue\";\n\n/** Run once on mount, then wait between completed requests when an interval is supplied. */\nexport function usePolling(refresh: () => Promise<unknown>, interval?: number) {\n let disposed = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const poll = async () => {\n try {\n await refresh();\n } catch (error) {\n console.error(\"Polling request failed:\", error);\n } finally {\n if (!disposed && interval !== undefined) timer = setTimeout(poll, interval);\n }\n };\n\n onMounted(poll);\n onUnmounted(() => {\n disposed = true;\n clearTimeout(timer);\n });\n}\n"],"names":["usePolling","refresh","interval","disposed","timer","poll","error","onMounted","onUnmounted"],"mappings":"+CAGgB,SAAAA,EAAWC,EAAiCC,EAAmB,CAC7E,IAAIC,EAAW,GACXC,EAEJ,MAAMC,EAAO,SAAY,CACnB,GAAA,CACF,MAAMJ,EAAQ,QACPK,EAAO,CACN,QAAA,MAAM,0BAA2BA,CAAK,CAAA,QAC9C,CACI,CAACH,GAAYD,IAAa,SAAmBE,EAAA,WAAWC,EAAMH,CAAQ,EAC5E,CAAA,EAGFK,EAAUF,CAAI,EACdG,EAAY,IAAM,CACLL,EAAA,GACX,aAAaC,CAAK,CAAA,CACnB,CACH"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ay as o,aC as s,bz as r}from"./vue-
|
|
2
|
-
//# sourceMappingURL=useScreen-
|
|
1
|
+
import{ay as o,aC as s,bz as r}from"./vue-6b52a630.js";function i(){const e=r(!1),n=window.matchMedia("(max-width: 992px)"),a=t=>e.value=t.matches;return o(()=>{e.value=n.matches,n.addEventListener("change",a)}),s(()=>{n.removeEventListener("change",a)}),{isPhone:e}}export{i as u};
|
|
2
|
+
//# sourceMappingURL=useScreen-fad29b7c.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScreen-fad29b7c.js","sources":["../../../../plugins/console/panel/src/hooks/useScreen.ts"],"sourcesContent":["import { onMounted, onUnmounted, ref } from \"vue\";\n\nexport function useScreen() {\n const isPhone = ref(false);\n\n const mediaQuery = window.matchMedia(\"(max-width: 992px)\");\n\n const fn = (e: MediaQueryListEvent) => (isPhone.value = e.matches);\n\n onMounted(() => {\n isPhone.value = mediaQuery.matches;\n mediaQuery.addEventListener(\"change\", fn);\n });\n\n onUnmounted(() => {\n mediaQuery.removeEventListener(\"change\", fn);\n });\n\n return { isPhone };\n}\n"],"names":["useScreen","isPhone","ref","mediaQuery","fn","e","onMounted","onUnmounted"],"mappings":"uDAEO,SAASA,GAAY,CACpB,MAAAC,EAAUC,EAAI,EAAK,EAEnBC,EAAa,OAAO,WAAW,oBAAoB,EAEnDC,EAAMC,GAA4BJ,EAAQ,MAAQI,EAAE,QAE1D,OAAAC,EAAU,IAAM,CACdL,EAAQ,MAAQE,EAAW,QAChBA,EAAA,iBAAiB,SAAUC,CAAE,CAAA,CACzC,EAEDG,EAAY,IAAM,CACLJ,EAAA,oBAAoB,SAAUC,CAAE,CAAA,CAC5C,EAEM,CAAE,QAAAH,CAAQ,CACnB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{m,r as u,p as b}from"./protocol-97f7bab7.js";import{l}from"./index-e3f35709.js";import{bu as v,bz as C}from"./vue-
|
|
2
|
-
//# sourceMappingURL=useSocketIo-
|
|
1
|
+
import{m,r as u,p as b}from"./protocol-97f7bab7.js";import{l}from"./index-e3f35709.js";import{bu as v,bz as C}from"./vue-6b52a630.js";var k=(e=>(e[e.Connected=1]="Connected",e[e.Connecting=2]="Connecting",e[e.Error=0]="Error",e))(k||{});function w(e,t){return t=u((t??"").trim(),"/"),l(b(e,"ws"),{path:t+"/socket.io",multiplex:!1,reconnectionDelayMax:1e3*10,timeout:1e3*30,reconnection:!0,reconnectionAttempts:3,rejectUnauthorized:!1})}function f(e,t,n){return new Promise((d,s)=>{if(n!=null&&n.aborted)return s(new Error("Socket connection test cancelled"));const o=w(e,t),r=()=>{o.off("connect",a),o.off("connect_error",i),n==null||n.removeEventListener("abort",p),o.disconnect()},a=()=>{r(),d(o)},i=c=>{r(),s(c)},p=()=>i(new Error("Socket connection test cancelled"));o.once("connect",a),o.once("connect_error",i),n==null||n.addEventListener("abort",p,{once:!0})})}function A(){let e;const t=C(2);return v(()=>e==null?void 0:e.abort()),{testConnect:(s,o)=>(e==null||e.abort(),e=new AbortController,f(s,o,e.signal)),testFrontendSocket:async s=>{e==null||e.abort();const o=e=new AbortController,r=s;if(!(r!=null&&r.available)||!r.ip)t.value=0;else try{t.value=2;let a=`${r.ip}:${r.port}`,i=r.prefix;if(r.remoteMappings){const p=m(r.remoteMappings.map(c=>({from:{addr:`${c.from.ip}:${c.from.port}`,prefix:c.from.prefix},to:{addr:`${c.to.ip}:${c.to.port}`,prefix:c.to.prefix}})));p&&(a=p.addr,i=p.prefix)}await f(a,i,o.signal),o.signal.aborted||(t.value=1)}catch(a){if(o.signal.aborted)return;console.error("Socket error: ",a),t.value=0}},socketStatus:t}}export{k as S,w as m,f as t,A as u};
|
|
2
|
+
//# sourceMappingURL=useSocketIo-ea3c9a61.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSocketIo-ea3c9a61.js","sources":["../../../../plugins/console/panel/src/hooks/useSocketIo.ts"],"sourcesContent":["import { mapDaemonAddress, parseForwardAddress } from \"@/tools/protocol\";\nimport { removeTrail } from \"@/tools/string\";\nimport type { DefaultEventsMap } from \"@socket.io/component-emitter\";\nimport type { Socket } from \"socket.io-client\";\nimport { io } from \"socket.io-client\";\nimport { onScopeDispose, ref } from \"vue\";\nimport type { ComputedNodeInfo } from \"./useOverviewInfo\";\n\n// eslint-disable-next-line no-unused-vars\nexport enum SocketStatus {\n // eslint-disable-next-line no-unused-vars\n Connected = 1,\n // eslint-disable-next-line no-unused-vars\n Connecting = 2,\n // eslint-disable-next-line no-unused-vars\n Error = 0\n}\n\nexport function makeSocketIo(addr: string, prefix?: string) {\n prefix = removeTrail((prefix ?? \"\").trim(), \"/\");\n return io(parseForwardAddress(addr, \"ws\"), {\n path: prefix + \"/socket.io\",\n multiplex: false,\n reconnectionDelayMax: 1000 * 10,\n timeout: 1000 * 30,\n reconnection: true,\n reconnectionAttempts: 3,\n rejectUnauthorized: false\n });\n}\n\nexport function testSocketConnection(addr: string, prefix?: string, signal?: AbortSignal) {\n return new Promise<Socket<DefaultEventsMap, DefaultEventsMap>>((resolve, reject) => {\n if (signal?.aborted) return reject(new Error(\"Socket connection test cancelled\"));\n const socket = makeSocketIo(addr, prefix);\n const cleanup = () => {\n socket.off(\"connect\", connected);\n socket.off(\"connect_error\", failed);\n signal?.removeEventListener(\"abort\", cancelled);\n socket.disconnect();\n };\n const connected = () => {\n cleanup();\n resolve(socket);\n };\n const failed = (error: Error) => {\n cleanup();\n reject(error);\n };\n const cancelled = () => failed(new Error(\"Socket connection test cancelled\"));\n socket.once(\"connect\", connected);\n socket.once(\"connect_error\", failed);\n signal?.addEventListener(\"abort\", cancelled, { once: true });\n });\n}\n\nexport function useSocketIoClient() {\n let controller: AbortController | undefined;\n const socketStatus = ref<SocketStatus>(SocketStatus.Connecting);\n\n onScopeDispose(() => controller?.abort());\n\n const testFrontendSocket = async (remoteNode?: Partial<ComputedNodeInfo>) => {\n controller?.abort();\n const current = (controller = new AbortController());\n const nodeCfg = remoteNode;\n\n if (!nodeCfg?.available || !nodeCfg.ip) {\n socketStatus.value = SocketStatus.Error;\n } else {\n try {\n socketStatus.value = SocketStatus.Connecting;\n let addr = `${nodeCfg.ip}:${nodeCfg.port}`,\n prefix = nodeCfg.prefix;\n if (nodeCfg.remoteMappings) {\n const mapped = mapDaemonAddress(\n nodeCfg.remoteMappings.map((entry) => ({\n from: {\n addr: `${entry.from.ip}:${entry.from.port}`,\n prefix: entry.from.prefix\n },\n to: {\n addr: `${entry.to.ip}:${entry.to.port}`,\n prefix: entry.to.prefix\n }\n }))\n );\n if (mapped) {\n addr = mapped.addr;\n prefix = mapped.prefix;\n }\n }\n await testSocketConnection(addr, prefix, current.signal);\n if (!current.signal.aborted) socketStatus.value = SocketStatus.Connected;\n } catch (error) {\n if (current.signal.aborted) return;\n console.error(\"Socket error: \", error);\n socketStatus.value = SocketStatus.Error;\n }\n }\n };\n\n const testConnect = (addr: string, prefix?: string) => {\n controller?.abort();\n controller = new AbortController();\n return testSocketConnection(addr, prefix, controller.signal);\n };\n\n return { testConnect, testFrontendSocket, socketStatus };\n}\n"],"names":["SocketStatus","makeSocketIo","addr","prefix","removeTrail","io","parseForwardAddress","testSocketConnection","signal","resolve","reject","socket","cleanup","connected","failed","cancelled","error","useSocketIoClient","controller","socketStatus","ref","onScopeDispose","remoteNode","current","nodeCfg","mapped","mapDaemonAddress","entry"],"mappings":"sIASY,IAAAA,GAAAA,IAEVA,EAAAA,EAAA,UAAY,CAAZ,EAAA,YAEAA,EAAAA,EAAA,WAAa,CAAb,EAAA,aAEAA,EAAAA,EAAA,MAAQ,CAAR,EAAA,QANUA,IAAAA,GAAA,CAAA,CAAA,EASI,SAAAC,EAAaC,EAAcC,EAAiB,CAC1D,OAAAA,EAASC,GAAaD,GAAU,IAAI,KAAA,EAAQ,GAAG,EACxCE,EAAGC,EAAoBJ,EAAM,IAAI,EAAG,CACzC,KAAMC,EAAS,aACf,UAAW,GACX,qBAAsB,IAAO,GAC7B,QAAS,IAAO,GAChB,aAAc,GACd,qBAAsB,EACtB,mBAAoB,EAAA,CACrB,CACH,CAEgB,SAAAI,EAAqBL,EAAcC,EAAiBK,EAAsB,CACxF,OAAO,IAAI,QAAoD,CAACC,EAASC,IAAW,CAClF,GAAIF,GAAA,MAAAA,EAAQ,QAAS,OAAOE,EAAO,IAAI,MAAM,kCAAkC,CAAC,EAC1E,MAAAC,EAASV,EAAaC,EAAMC,CAAM,EAClCS,EAAU,IAAM,CACbD,EAAA,IAAI,UAAWE,CAAS,EACxBF,EAAA,IAAI,gBAAiBG,CAAM,EAC1BN,GAAA,MAAAA,EAAA,oBAAoB,QAASO,GACrCJ,EAAO,WAAW,CAAA,EAEdE,EAAY,IAAM,CACdD,IACRH,EAAQE,CAAM,CAAA,EAEVG,EAAUE,GAAiB,CACvBJ,IACRF,EAAOM,CAAK,CAAA,EAERD,EAAY,IAAMD,EAAO,IAAI,MAAM,kCAAkC,CAAC,EACrEH,EAAA,KAAK,UAAWE,CAAS,EACzBF,EAAA,KAAK,gBAAiBG,CAAM,EACnCN,GAAA,MAAAA,EAAQ,iBAAiB,QAASO,EAAW,CAAE,KAAM,IAAM,CAC5D,CACH,CAEO,SAASE,GAAoB,CAC9B,IAAAC,EACE,MAAAC,EAAeC,EAAkB,GAExB,OAAAC,EAAA,IAAMH,GAAA,YAAAA,EAAY,OAAO,EAgDjC,CAAE,YANW,CAAChB,EAAcC,KACjCe,GAAA,MAAAA,EAAY,QACZA,EAAa,IAAI,gBACVX,EAAqBL,EAAMC,EAAQe,EAAW,MAAM,GAGvC,mBA9CK,MAAOI,GAA2C,CAC3EJ,GAAA,MAAAA,EAAY,QACN,MAAAK,EAAWL,EAAa,IAAI,gBAC5BM,EAAUF,EAEhB,GAAI,EAACE,GAAA,MAAAA,EAAS,YAAa,CAACA,EAAQ,GAClCL,EAAa,MAAQ,MAEjB,IAAA,CACFA,EAAa,MAAQ,EACjB,IAAAjB,EAAO,GAAGsB,EAAQ,EAAE,IAAIA,EAAQ,IAAI,GACtCrB,EAASqB,EAAQ,OACnB,GAAIA,EAAQ,eAAgB,CAC1B,MAAMC,EAASC,EACbF,EAAQ,eAAe,IAAKG,IAAW,CACrC,KAAM,CACJ,KAAM,GAAGA,EAAM,KAAK,EAAE,IAAIA,EAAM,KAAK,IAAI,GACzC,OAAQA,EAAM,KAAK,MACrB,EACA,GAAI,CACF,KAAM,GAAGA,EAAM,GAAG,EAAE,IAAIA,EAAM,GAAG,IAAI,GACrC,OAAQA,EAAM,GAAG,MACnB,CAAA,EACA,CAAA,EAEAF,IACFvB,EAAOuB,EAAO,KACdtB,EAASsB,EAAO,OAEpB,CACA,MAAMlB,EAAqBL,EAAMC,EAAQoB,EAAQ,MAAM,EAClDA,EAAQ,OAAO,UAASJ,EAAa,MAAQ,SAC3CH,EAAO,CACd,GAAIO,EAAQ,OAAO,QAAS,OACpB,QAAA,MAAM,iBAAkBP,CAAK,EACrCG,EAAa,MAAQ,CACvB,CACF,EASwC,aAAAA,EAC5C"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a1 as f,b5 as g,aE as c,Q as l,R as k,O as T,F as d,aK as _,bO as y,A,bz as v,N as p}from"./vue-
|
|
2
|
-
//# sourceMappingURL=useThemeSwitch-
|
|
1
|
+
import{a1 as f,b5 as g,aE as c,Q as l,R as k,O as T,F as d,aK as _,bO as y,A,bz as v,N as p}from"./vue-6b52a630.js";import{_ as b}from"./_plugin-vue_export-helper-c27b6911.js";import{t as x}from"./i18n-e810b9fa.js";import{u as C}from"./useAppConfigStore-352fe033.js";import{A as h}from"./const-ea30795c.js";const B=["onAnimationend"],O=["onAnimationend"],R=f({__name:"ActionRipple",props:{trigger:{},inline:{type:Boolean}},setup(i){const m=i,t=v(),n=v([]);g(()=>m.trigger,(o,r)=>{if(!o||o===r||!t.value)return;const e=t.value.getBoundingClientRect(),u=getComputedStyle(t.value).getPropertyValue("--v-theme-primary").trim();n.value.push({key:o,x:e.left+e.width/2,y:e.top+e.height/2,color:u?`rgb(${u})`:"currentColor"})});const s=o=>{n.value=n.value.filter(r=>r.key!==o)};return(o,r)=>(c(),l(d,null,[k("span",{ref_key:"anchor",ref:t,class:"action-ripple-anchor","aria-hidden":"true"},null,512),i.inline?(c(!0),l(d,{key:1},_(n.value,e=>(c(),l("span",{key:e.key,class:"action-ripple-circle action-ripple-circle--inline",style:y({background:e.color}),"aria-hidden":"true",onAnimationend:u=>s(e.key)},null,44,O))),128)):(c(),T(A,{key:0,to:"body"},[(c(!0),l(d,null,_(n.value,e=>(c(),l("span",{key:e.key,class:"action-ripple-circle",style:y({left:`${e.x}px`,top:`${e.y}px`,background:e.color}),"aria-hidden":"true",onAnimationend:u=>s(e.key)},null,44,B))),128))]))],64))}});const S=b(R,[["__scopeId","data-v-73881e21"]]),a=[{value:h.AUTO,label:"TXT_CODE_dc8de4ff",icon:"mdi-theme-light-dark"},{value:h.LIGHT,label:"TXT_CODE_673eac8e",icon:"mdi-weather-sunny"},{value:h.DARK,label:"TXT_CODE_5e4a370d",icon:"mdi-weather-night"}];function X(){const{currentTheme:i,setTheme:m}=C(),t=p(()=>a.findIndex(r=>r.value===i.value)),n=p(()=>(a[t.value]??a[0]).icon),s=p(()=>x((a[t.value]??a[0]).label));return{themeIcon:n,themeTitle:s,cycleTheme:()=>{m(a[(t.value+1)%a.length].value)}}}export{S as A,X as u};
|
|
2
|
+
//# sourceMappingURL=useThemeSwitch-dc70883c.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useThemeSwitch-dc70883c.js","sources":["../../../../plugins/console/panel/src/components/ActionRipple.vue","../../../../plugins/console/panel/src/hooks/useThemeSwitch.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch } from \"vue\";\n\n/**\n * Draws the shell's one-shot ripple in the page layer, not inside the toolbar.\n *\n * The anchor is an absolutely positioned child of the button wrapper, so its\n * rect is the button's rect. The circles themselves are teleported to `body`;\n * a fixed position there is never clipped by the header, drawer or taskbar.\n *\n * `inline` renders the circles inside the button wrapper instead: the desktop\n * taskbar lives in a stacking context (`.desktop-container`, z-index 100) that\n * paints over any body-level ripple, while nothing in the taskbar chain clips\n * overflow. Staying local keeps the ripple above the taskbar and windows, yet\n * still under the start menu, context menu and dialogs.\n */\nconst props = defineProps<{\n /** A changing value starts a new ripple; `0`/`undefined` render nothing. */\n trigger?: number;\n /** Render the ripple inside the button wrapper instead of the page layer. */\n inline?: boolean;\n}>();\n\ninterface ActiveRipple {\n key: number;\n x: number;\n y: number;\n color: string;\n}\n\nconst anchor = ref<HTMLElement>();\nconst ripples = ref<ActiveRipple[]>([]);\n\nwatch(\n () => props.trigger,\n (value, previous) => {\n if (!value || value === previous || !anchor.value) return;\n const rect = anchor.value.getBoundingClientRect();\n const primary = getComputedStyle(anchor.value).getPropertyValue(\"--v-theme-primary\").trim();\n ripples.value.push({\n key: value,\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n color: primary ? `rgb(${primary})` : \"currentColor\"\n });\n }\n);\n\nconst remove = (key: number) => {\n ripples.value = ripples.value.filter((ripple) => ripple.key !== key);\n};\n</script>\n\n<template>\n <span ref=\"anchor\" class=\"action-ripple-anchor\" aria-hidden=\"true\" />\n <Teleport v-if=\"!inline\" to=\"body\">\n <span\n v-for=\"ripple in ripples\"\n :key=\"ripple.key\"\n class=\"action-ripple-circle\"\n :style=\"{ left: `${ripple.x}px`, top: `${ripple.y}px`, background: ripple.color }\"\n aria-hidden=\"true\"\n @animationend=\"remove(ripple.key)\"\n />\n </Teleport>\n <template v-else>\n <span\n v-for=\"ripple in ripples\"\n :key=\"ripple.key\"\n class=\"action-ripple-circle action-ripple-circle--inline\"\n :style=\"{ background: ripple.color }\"\n aria-hidden=\"true\"\n @animationend=\"remove(ripple.key)\"\n />\n </template>\n</template>\n\n<style lang=\"scss\" scoped>\n.action-ripple-anchor {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n\n/* Fixed to the page so the growth is never clipped by the header, and just\n above the shell chrome (header uses 20) while dialogs stay on top. */\n.action-ripple-circle {\n position: fixed;\n width: 40px;\n height: 40px;\n margin: -20px 0 0 -20px;\n border-radius: 50%;\n pointer-events: none;\n z-index: 30;\n animation: action-ripple 600ms cubic-bezier(0, -0.04, 0, 0.99) forwards;\n}\n\n/* Anchored to the button wrapper, so the ripple grows from the button itself\n and is painted inside the taskbar's own stacking context. */\n.action-ripple-circle--inline {\n position: absolute;\n left: 50%;\n top: 50%;\n}\n\n@keyframes action-ripple {\n from {\n transform: scale(0.35);\n opacity: 0.4;\n }\n to {\n transform: scale(20);\n opacity: 0;\n }\n}\n</style>\n","import { t } from \"@/lang/i18n\";\nimport { useAppConfigStore } from \"@/stores/useAppConfigStore\";\nimport { AppTheme } from \"@/types/const\";\nimport { computed } from \"vue\";\n\nconst themeModes = [\n { value: AppTheme.AUTO, label: \"TXT_CODE_dc8de4ff\", icon: \"mdi-theme-light-dark\" },\n { value: AppTheme.LIGHT, label: \"TXT_CODE_673eac8e\", icon: \"mdi-weather-sunny\" },\n { value: AppTheme.DARK, label: \"TXT_CODE_5e4a370d\", icon: \"mdi-weather-night\" }\n];\n\nexport function useThemeSwitch() {\n const { currentTheme, setTheme } = useAppConfigStore();\n const modeIndex = computed(() => themeModes.findIndex((mode) => mode.value === currentTheme.value));\n const themeIcon = computed(() => (themeModes[modeIndex.value] ?? themeModes[0]).icon);\n const themeTitle = computed(() => t((themeModes[modeIndex.value] ?? themeModes[0]).label));\n\n const cycleTheme = () => {\n setTheme(themeModes[(modeIndex.value + 1) % themeModes.length].value);\n };\n\n return { themeIcon, themeTitle, cycleTheme };\n}\n"],"names":["props","__props","anchor","ref","ripples","watch","value","previous","rect","primary","remove","key","ripple","_createElementVNode","_createElementBlock","_Fragment","_renderList","_normalizeStyle","$event","_createBlock","_Teleport","themeModes","AppTheme","useThemeSwitch","currentTheme","setTheme","useAppConfigStore","modeIndex","computed","mode","themeIcon","themeTitle","t"],"mappings":"gbAgBA,MAAMA,EAAQC,EAcRC,EAASC,IACTC,EAAUD,EAAoB,CAAA,CAAE,EAEtCE,EACE,IAAML,EAAM,QACZ,CAACM,EAAOC,IAAa,CACnB,GAAI,CAACD,GAASA,IAAUC,GAAY,CAACL,EAAO,MAAO,OAC7C,MAAAM,EAAON,EAAO,MAAM,sBAAsB,EAC1CO,EAAU,iBAAiBP,EAAO,KAAK,EAAE,iBAAiB,mBAAmB,EAAE,OACrFE,EAAQ,MAAM,KAAK,CACjB,IAAKE,EACL,EAAGE,EAAK,KAAOA,EAAK,MAAQ,EAC5B,EAAGA,EAAK,IAAMA,EAAK,OAAS,EAC5B,MAAOC,EAAU,OAAOA,CAAO,IAAM,cAAA,CACtC,CACH,CAAA,EAGI,MAAAC,EAAUC,GAAgB,CACtBP,EAAA,MAAQA,EAAQ,MAAM,OAAQQ,GAAWA,EAAO,MAAQD,CAAG,CAAA,8BAKnEE,EAAqE,OAAA,SAA3D,SAAJ,IAAIX,EAAS,MAAM,uBAAuB,cAAY,MAAA,YAC3CD,EAAM,cAWrBa,EAOEC,EAAA,CAAA,IAAA,CAAA,EAAAC,EANiBZ,EAAO,MAAjBQ,QADTE,EAOE,OAAA,CALC,IAAKF,EAAO,IACb,MAAM,oDACL,MAAKK,EAAA,CAAA,WAAgBL,EAAO,MAAK,EAClC,cAAY,OACX,eAAcM,GAAAR,EAAOE,EAAO,GAAG,CAAA,0BAjBpCO,EASWC,EAAA,OATc,GAAG,MAAA,UAC1BN,EAOEC,EAAA,KAAAC,EANiBZ,EAAO,MAAjBQ,QADTE,EAOE,OAAA,CALC,IAAKF,EAAO,IACb,MAAM,uBACL,MAAKK,EAAA,CAAA,KAAA,GAAaL,EAAO,CAAC,KAAA,IAAA,GAAcA,EAAO,CAAC,KAAA,WAAkBA,EAAO,MAAK,EAC/E,cAAY,OACX,eAAcM,GAAAR,EAAOE,EAAO,GAAG,CAAA,gFCzDhCS,EAAa,CACjB,CAAE,MAAOC,EAAS,KAAM,MAAO,oBAAqB,KAAM,sBAAuB,EACjF,CAAE,MAAOA,EAAS,MAAO,MAAO,oBAAqB,KAAM,mBAAoB,EAC/E,CAAE,MAAOA,EAAS,KAAM,MAAO,oBAAqB,KAAM,mBAAoB,CAChF,EAEO,SAASC,GAAiB,CAC/B,KAAM,CAAE,aAAAC,EAAc,SAAAC,CAAS,EAAIC,EAAkB,EAC/CC,EAAYC,EAAS,IAAMP,EAAW,UAAWQ,GAASA,EAAK,QAAUL,EAAa,KAAK,CAAC,EAC5FM,EAAYF,EAAS,KAAOP,EAAWM,EAAU,KAAK,GAAKN,EAAW,CAAC,GAAG,IAAI,EAC9EU,EAAaH,EAAS,IAAMI,GAAGX,EAAWM,EAAU,KAAK,GAAKN,EAAW,CAAC,GAAG,KAAK,CAAC,EAMlF,MAAA,CAAE,UAAAS,EAAW,WAAAC,EAAY,WAJb,IAAM,CACvBN,EAASJ,GAAYM,EAAU,MAAQ,GAAKN,EAAW,MAAM,EAAE,KAAK,CAAA,EAIxE"}
|