From 43066fd9ea971c6b6c3bf5d58383bb2c9cd076a3 Mon Sep 17 00:00:00 2001 From: Romain Hamel Date: Tue, 7 May 2024 11:19:25 +0200 Subject: [PATCH] feat(ButtonGroup): new component (#88) Co-authored-by: Benjamin Canac --- playground/app.vue | 1 + playground/pages/button-group.vue | 57 ++++++++++++ src/runtime/components/Button.vue | 9 +- src/runtime/components/ButtonGroup.vue | 49 ++++++++++ src/runtime/components/Input.vue | 13 +-- src/runtime/composables/useButtonGroup.ts | 21 +++++ src/theme/button-group.ts | 32 +++++++ src/theme/button.ts | 3 + src/theme/index.ts | 1 + src/theme/input.ts | 3 + test/components/ButtonGroup.spec.ts | 47 ++++++++++ .../__snapshots__/ButtonGroup.spec.ts.snap | 91 +++++++++++++++++++ 12 files changed, 317 insertions(+), 10 deletions(-) create mode 100644 playground/pages/button-group.vue create mode 100644 src/runtime/components/ButtonGroup.vue create mode 100644 src/runtime/composables/useButtonGroup.ts create mode 100644 src/theme/button-group.ts create mode 100644 test/components/ButtonGroup.spec.ts create mode 100644 test/components/__snapshots__/ButtonGroup.spec.ts.snap diff --git a/playground/app.vue b/playground/app.vue index eeb838bc..c7225f5c 100644 --- a/playground/app.vue +++ b/playground/app.vue @@ -16,6 +16,7 @@ const components = [ 'badge', 'breadcrumb', 'button', + 'button-group', 'card', 'checkbox', 'chip', diff --git a/playground/pages/button-group.vue b/playground/pages/button-group.vue new file mode 100644 index 00000000..1a0f6b72 --- /dev/null +++ b/playground/pages/button-group.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/runtime/components/Button.vue b/src/runtime/components/Button.vue index 2e2b873f..555e4119 100644 --- a/src/runtime/components/Button.vue +++ b/src/runtime/components/Button.vue @@ -35,7 +35,7 @@ export interface ButtonSlots { import { computed } from 'vue' import { useForwardProps } from 'radix-vue' import { reactiveOmit } from '@vueuse/core' -import { useComponentIcons } from '#imports' +import { useComponentIcons, useButtonGroup } from '#imports' import { UIcon, UAvatar, ULink } from '#components' const props = defineProps() @@ -43,19 +43,20 @@ const slots = defineSlots() const linkProps = useForwardProps(reactiveOmit(props, 'type', 'label', 'color', 'variant', 'size', 'icon', 'leading', 'leadingIcon', 'trailing', 'trailingIcon', 'loading', 'loadingIcon', 'square', 'block', 'disabled', 'truncate', 'class', 'ui')) -// const { size, rounded } = useInjectButtonGroup({ ui, props }) +const { orientation, size: buttonSize } = useButtonGroup(props) const { isLeading, isTrailing, leadingIconName, trailingIconName, avatarSize } = useComponentIcons(props) const ui = computed(() => tv({ extend: button, slots: props.ui })({ color: props.color, variant: props.variant, - size: props.size, + size: buttonSize.value, loading: props.loading, truncate: props.truncate, block: props.block, square: props.square || (!slots.default && !props.label), leading: isLeading.value, - trailing: isTrailing.value + trailing: isTrailing.value, + buttonGroup: orientation.value })) diff --git a/src/runtime/components/ButtonGroup.vue b/src/runtime/components/ButtonGroup.vue new file mode 100644 index 00000000..1eb44e2d --- /dev/null +++ b/src/runtime/components/ButtonGroup.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/runtime/components/Input.vue b/src/runtime/components/Input.vue index 2015b493..85e289a1 100644 --- a/src/runtime/components/Input.vue +++ b/src/runtime/components/Input.vue @@ -45,7 +45,7 @@ export interface InputSlots {