diff --git a/packages/frontend/.storybook/generate.tsx b/packages/frontend/.storybook/generate.tsx
index f442422109..cc720ce715 100644
--- a/packages/frontend/.storybook/generate.tsx
+++ b/packages/frontend/.storybook/generate.tsx
@@ -403,6 +403,7 @@ Promise.all([
glob('src/components/MkUserSetupDialog.vue'),
glob('src/components/MkUserSetupDialog.*.vue'),
glob('src/pages/user/home.vue'),
+ glob('src/widgets/server-metric/cpu-mem.vue'),
])
.then((globs) => globs.flat())
.then((components) => Promise.all(components.map((component) => {
diff --git a/packages/frontend/src/widgets/server-metric/cpu-mem.stories.impl.ts b/packages/frontend/src/widgets/server-metric/cpu-mem.stories.impl.ts
new file mode 100644
index 0000000000..7340fa29fa
--- /dev/null
+++ b/packages/frontend/src/widgets/server-metric/cpu-mem.stories.impl.ts
@@ -0,0 +1,46 @@
+/* eslint-disable @typescript-eslint/explicit-function-return-type */
+import { action } from '@storybook/addon-actions';
+import { StoryObj } from '@storybook/vue3';
+import cpu_mem from './cpu-mem.vue';
+export const Default = {
+ render(args) {
+ return {
+ components: {
+ cpu_mem,
+ },
+ setup() {
+ return {
+ args,
+ };
+ },
+ computed: {
+ props() {
+ return {
+ ...this.args,
+ };
+ },
+ },
+ template: '',
+ };
+ },
+ args: {
+ stats: Array.from({ length: 50 }, (_, i) => ({
+ cpu: (i % 11) / 10,
+ mem: {
+ active: (i % 11) / 10,
+ },
+ })),
+ meta: {
+ mem: {
+ total: 1,
+ },
+ },
+ connection: {
+ on: action('on'),
+ send: action('send'),
+ },
+ },
+ parameters: {
+ layout: 'centered',
+ },
+} satisfies StoryObj;
diff --git a/packages/frontend/src/widgets/server-metric/cpu-mem.vue b/packages/frontend/src/widgets/server-metric/cpu-mem.vue
index 80a8e427e1..71e7b1805a 100644
--- a/packages/frontend/src/widgets/server-metric/cpu-mem.vue
+++ b/packages/frontend/src/widgets/server-metric/cpu-mem.vue
@@ -1,10 +1,19 @@
+
+