From 79650d0b726b051b08f72d52e827965c38585abb Mon Sep 17 00:00:00 2001 From: "bert.hausmans" Date: Mon, 18 May 2026 11:16:57 +0200 Subject: [PATCH] =?UTF-8?q?feat(gui-v2):=20EnergyDots=205-dot=20meter=20(s?= =?UTF-8?q?coped=20CSS=20justified=20per=20=C2=A78)=20+=20story?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shared/EnergyDots.stories.ts | 15 ++++++++ .../src/components-v2/shared/EnergyDots.vue | 37 +++++++++++++++++++ .../shared/__tests__/EnergyDots.spec.ts | 22 +++++++++++ 3 files changed, 74 insertions(+) create mode 100644 apps/app/src/components-v2/shared/EnergyDots.stories.ts create mode 100644 apps/app/src/components-v2/shared/EnergyDots.vue create mode 100644 apps/app/src/components-v2/shared/__tests__/EnergyDots.spec.ts diff --git a/apps/app/src/components-v2/shared/EnergyDots.stories.ts b/apps/app/src/components-v2/shared/EnergyDots.stories.ts new file mode 100644 index 00000000..39e1f2b2 --- /dev/null +++ b/apps/app/src/components-v2/shared/EnergyDots.stories.ts @@ -0,0 +1,15 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' +import EnergyDots from '@/components-v2/shared/EnergyDots.vue' + +const meta: Meta = { + title: 'Shared/EnergyDots', + component: EnergyDots, + tags: ['autodocs'], + argTypes: { value: { control: { type: 'range', min: 0, max: 5, step: 1 } }, lg: { control: 'boolean' } }, +} + +export default meta +type Story = StoryObj +export const Level3: Story = { args: { value: 3 } } +export const Level5: Story = { args: { value: 5 } } +export const Large: Story = { args: { value: 4, lg: true } } diff --git a/apps/app/src/components-v2/shared/EnergyDots.vue b/apps/app/src/components-v2/shared/EnergyDots.vue new file mode 100644 index 00000000..bb658c25 --- /dev/null +++ b/apps/app/src/components-v2/shared/EnergyDots.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/apps/app/src/components-v2/shared/__tests__/EnergyDots.spec.ts b/apps/app/src/components-v2/shared/__tests__/EnergyDots.spec.ts new file mode 100644 index 00000000..ca173bb1 --- /dev/null +++ b/apps/app/src/components-v2/shared/__tests__/EnergyDots.spec.ts @@ -0,0 +1,22 @@ +import { mount } from '@vue/test-utils' +import { describe, expect, it } from 'vitest' +import EnergyDots from '@/components-v2/shared/EnergyDots.vue' + +describe('EnergyDots', () => { + it('always renders 5 dots; `on` count equals value', () => { + const w = mount(EnergyDots, { props: { value: 3 } }) + + expect(w.findAll('.d')).toHaveLength(5) + expect(w.findAll('.d.on')).toHaveLength(3) + }) + it('exposes data-energy for level colouring and lg class when lg', () => { + const w = mount(EnergyDots, { props: { value: 5, lg: true } }) + + expect(w.get('[data-energy]').attributes('data-energy')).toBe('5') + expect(w.get('.energy-dots').classes()).toContain('lg') + }) + it('clamps value into 0..5', () => { + expect(mount(EnergyDots, { props: { value: 9 } }).findAll('.d.on')).toHaveLength(5) + expect(mount(EnergyDots, { props: { value: -2 } }).findAll('.d.on')).toHaveLength(0) + }) +})