feat(ComboControl): add reduced flag that removes increase/decrease buttons keeping the slider popover

This commit is contained in:
Ilia Mashkov
2026-02-07 11:24:44 +03:00
parent 4891cd3bbd
commit 46a3c3e8fc
2 changed files with 33 additions and 23 deletions

View File

@@ -31,7 +31,7 @@ $effect(() => {
}); });
</script> </script>
<div class="py-2 px-10 flex flex-row items-center gap-2"> <div class="sm:py-2 sm:px-10 flex flex-row items-center gap-2">
<div class="flex flex-row gap-3"> <div class="flex flex-row gap-3">
{#each controlManager.controls as control (control.id)} {#each controlManager.controls as control (control.id)}
<ComboControl <ComboControl
@@ -39,6 +39,7 @@ $effect(() => {
increaseLabel={control.increaseLabel} increaseLabel={control.increaseLabel}
decreaseLabel={control.decreaseLabel} decreaseLabel={control.decreaseLabel}
controlLabel={control.controlLabel} controlLabel={control.controlLabel}
reduced={responsive.isMobile}
/> />
{/each} {/each}
</div> </div>

View File

@@ -26,7 +26,7 @@ import PlusIcon from '@lucide/svelte/icons/plus';
import type { ChangeEventHandler } from 'svelte/elements'; import type { ChangeEventHandler } from 'svelte/elements';
import IconButton from '../IconButton/IconButton.svelte'; import IconButton from '../IconButton/IconButton.svelte';
interface ComboControlProps { interface Props {
/** /**
* Text for increase button aria-label * Text for increase button aria-label
*/ */
@@ -43,6 +43,10 @@ interface ComboControlProps {
* Control instance * Control instance
*/ */
control: TypographyControl; control: TypographyControl;
/**
* Reduced amount of controls
*/
reduced?: boolean;
} }
const { const {
@@ -50,7 +54,8 @@ const {
decreaseLabel, decreaseLabel,
increaseLabel, increaseLabel,
controlLabel, controlLabel,
}: ComboControlProps = $props(); reduced = false,
}: Props = $props();
// Local state for the slider to prevent infinite loops // Local state for the slider to prevent infinite loops
// svelte-ignore state_referenced_locally - $state captures initial value, $effect syncs updates // svelte-ignore state_referenced_locally - $state captures initial value, $effect syncs updates
@@ -80,6 +85,7 @@ const handleSliderChange = (newValue: number) => {
<TooltipRoot> <TooltipRoot>
<ButtonGroupRoot class="bg-transparent border-none shadow-none"> <ButtonGroupRoot class="bg-transparent border-none shadow-none">
<TooltipTrigger class="flex items-center"> <TooltipTrigger class="flex items-center">
{#if !reduced}
<IconButton <IconButton
onclick={control.decrease} onclick={control.decrease}
disabled={control.isAtMin} disabled={control.isAtMin}
@@ -90,6 +96,7 @@ const handleSliderChange = (newValue: number) => {
<MinusIcon class={className} /> <MinusIcon class={className} />
{/snippet} {/snippet}
</IconButton> </IconButton>
{/if}
<PopoverRoot> <PopoverRoot>
<PopoverTrigger> <PopoverTrigger>
{#snippet child({ props })} {#snippet child({ props })}
@@ -127,6 +134,7 @@ const handleSliderChange = (newValue: number) => {
</PopoverContent> </PopoverContent>
</PopoverRoot> </PopoverRoot>
{#if !reduced}
<IconButton <IconButton
aria-label={increaseLabel} aria-label={increaseLabel}
onclick={control.increase} onclick={control.increase}
@@ -137,6 +145,7 @@ const handleSliderChange = (newValue: number) => {
<PlusIcon class={className} /> <PlusIcon class={className} />
{/snippet} {/snippet}
</IconButton> </IconButton>
{/if}
</TooltipTrigger> </TooltipTrigger>
</ButtonGroupRoot> </ButtonGroupRoot>
{#if controlLabel} {#if controlLabel}