From b197b47a34de03dc23ec4e266e1db4420537086a Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 22 May 2026 20:22:20 +0000 Subject: [PATCH 1/2] feat: add v-model support to SegmentedControl - Refactor SegmentedControl to \ No newline at end of file + diff --git a/src/tests/SegmentedControlVModel.spec.ts b/src/tests/SegmentedControlVModel.spec.ts new file mode 100644 index 00000000..f9dfeafd --- /dev/null +++ b/src/tests/SegmentedControlVModel.spec.ts @@ -0,0 +1,64 @@ +import { describe, test, expect } from 'vitest'; +import SegmentedControl from '../components/SegmentedControl.vue'; +import { mount } from '@vue/test-utils'; +import { nextTick } from 'vue'; + +describe('SegmentedControl v-model', () => { + test('should respect initial modelValue', async () => { + const wrapper = mount(SegmentedControl, { + props: { + segments: ['Segment 1', 'Segment 2'], + modelValue: 'Segment 2', + }, + }); + + const activeButtons = wrapper.findAll('.segment-control__button--active'); + expect(activeButtons.length).toBe(1); + expect(activeButtons[0].text()).toBe('Segment 2'); + }); + + test('should update modelValue when a segment is clicked', async () => { + const wrapper = mount(SegmentedControl, { + props: { + segments: ['Segment 1', 'Segment 2'], + modelValue: 'Segment 1', + 'onUpdate:modelValue': (e) => wrapper.setProps({ modelValue: e }), + }, + }); + + const buttons = wrapper.findAll('.segment-control__button'); + await buttons[1].trigger('click'); + + expect(wrapper.emitted('update:modelValue')).toBeTruthy(); + expect(wrapper.emitted('update:modelValue')![0]).toEqual(['Segment 2']); + }); + + test('should default to the first segment if no modelValue is provided', async () => { + const wrapper = mount(SegmentedControl, { + props: { + segments: ['Segment 1', 'Segment 2'], + }, + }); + + await nextTick(); + + const activeButtons = wrapper.findAll('.segment-control__button--active'); + expect(activeButtons.length).toBe(1); + expect(activeButtons[0].text()).toBe('Segment 1'); + }); + + test('should still emit click event when a segment is clicked', async () => { + const wrapper = mount(SegmentedControl, { + props: { + segments: ['Segment 1', 'Segment 2'], + modelValue: 'Segment 1', + }, + }); + + const buttons = wrapper.findAll('.segment-control__button'); + await buttons[1].trigger('click'); + + expect(wrapper.emitted('click')).toBeTruthy(); + expect(wrapper.emitted('click')![0]).toEqual(['Segment 2', 1]); + }); +}); From 4a26262a3b7220e2d7afb89040f80a2800e9d925 Mon Sep 17 00:00:00 2001 From: jvictordev1 Date: Thu, 18 Jun 2026 11:48:25 -0300 Subject: [PATCH 2/2] docs: documenta o evento do update:model-value --- docs/.docgen/components-metadata.json | 6 +++++- src/components/SegmentedControl.vue | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/.docgen/components-metadata.json b/docs/.docgen/components-metadata.json index 118084e2..b99b82a7 100644 --- a/docs/.docgen/components-metadata.json +++ b/docs/.docgen/components-metadata.json @@ -10722,7 +10722,11 @@ "events": [ { "name": "click", - "description": "Evento emitido quando o componente é clicado." + "description": "Evento emitido quando o usuário clica em algum segmento." + }, + { + "name": "update:model-value", + "description": "Evento emitido quando o usuário clica em algum segmento." } ], "sourceFiles": [ diff --git a/src/components/SegmentedControl.vue b/src/components/SegmentedControl.vue index 327dc4c1..01e8ae04 100644 --- a/src/components/SegmentedControl.vue +++ b/src/components/SegmentedControl.vue @@ -70,10 +70,15 @@ const props = defineProps({ const emit = defineEmits([ /** - * Evento emitido quando o componente é clicado. + * Evento emitido quando o usuário clica em algum segmento. * @event click */ 'click', + /** + * Evento emitido quando o usuário clica em algum segmento. + * @event update:model-value + */ + 'update:model-value', ]); onMounted(() => {