import { type Orientation, callHandler, composeEventHandlers, mergeDefaultProps, mergeRefs, } from "@kobalte/utils"; import { type Component, type JSX, type ValidComponent, createUniqueId, splitProps, } from "solid-js"; import type { ElementOf, PolymorphicProps } from "../polymorphic"; import type { CollectionItemWithRef } from "../primitives"; import { createDomCollectionItem } from "../primitives/create-dom-collection"; import { createSelectableItem } from "../selection"; import * as ToggleButton from "../toggle-button"; import { useToggleGroupContext } from "./toggle-group-context"; export interface ToggleGroupItemOptions extends Omit< ToggleButton.ToggleButtonRootOptions, "pressed" | "defaultPressed" | "onChange" > { /** A string value for the toggle group item. All items within a toggle group should use a unique value. */ value: string; } export interface ToggleGroupItemCommonProps< T extends HTMLElement = HTMLElement, > { id: string; ref: T | ((el: T) => void); disabled: boolean | undefined; onPointerDown: JSX.EventHandlerUnion; onPointerUp: JSX.EventHandlerUnion; onClick: JSX.EventHandlerUnion; onKeyDown: JSX.EventHandlerUnion; onMouseDown: JSX.EventHandlerUnion; onFocus: JSX.EventHandlerUnion; } export interface ToggleGroupItemRenderProps extends ToggleGroupItemCommonProps, ToggleButton.ToggleButtonRootRenderProps { tabIndex: number | undefined; "data-orientation": Orientation; } export type ToggleGroupItemProps< T extends ValidComponent | HTMLElement = HTMLElement, > = ToggleGroupItemOptions & Partial>>; export function ToggleGroupItem( props: PolymorphicProps>, ) { let ref: HTMLElement | undefined; const rootContext = useToggleGroupContext(); const defaultID = rootContext.generateId(`item-${createUniqueId()}`); const mergedProps = mergeDefaultProps( { id: defaultID, }, props as ToggleGroupItemProps, ); const [local, others] = splitProps(mergedProps, [ "ref", "value", "disabled", "onPointerDown", "onPointerUp", "onClick", "onKeyDown", "onMouseDown", "onFocus", ]); const selectionManager = () => rootContext.listState().selectionManager(); const isDisabled = () => rootContext.isDisabled() || local.disabled; createDomCollectionItem({ getItem: () => ({ ref: () => ref, type: "item", key: local.value, textValue: "", disabled: local.disabled! || rootContext.isDisabled(), }), }); const selectableItem = createSelectableItem( { key: () => local.value, selectionManager: selectionManager, disabled: isDisabled, }, () => ref, ); const onKeyDown: JSX.EventHandlerUnion = (e) => { // Prevent `Enter` and `Space` default behavior which fires a click event when using a