UNPKG

@yamada-ui/toggle

Version:

Yamada UI toggle component

1 lines 6.83 kB
{"version":3,"sources":["../src/toggle-group.tsx"],"sourcesContent":["import type {\n ComponentArgs,\n CSSUIObject,\n CSSUIProps,\n HTMLUIProps,\n ThemeProps,\n} from \"@yamada-ui/core\"\nimport type { ForwardedRef, ReactElement, RefAttributes } from \"react\"\nimport { forwardRef, ui } from \"@yamada-ui/core\"\nimport { useControllableState } from \"@yamada-ui/use-controllable-state\"\nimport {\n createContext,\n cx,\n isArray,\n isUndefined,\n useUpdateEffect,\n} from \"@yamada-ui/utils\"\nimport { useCallback, useMemo, useRef } from \"react\"\n\ninterface ToggleGroupContext extends ThemeProps<\"Button\"> {\n controlled: boolean\n disabled?: boolean\n readOnly?: boolean\n value?: (number | string)[] | number | string\n onChange?: <M extends number | string = string>(value: M | undefined) => void\n}\n\nconst [ToggleGroupProvider, useToggleGroup] = createContext<ToggleGroupContext>(\n {\n name: \"ToggleGroupContext\",\n strict: false,\n },\n)\n\nexport { useToggleGroup }\n\ninterface ToggleGroupOptions<\n Y extends (number | string)[] | number | string = string,\n> {\n /**\n * The initial value of the toggle button group.\n */\n defaultValue?: Y extends any[] ? Y : undefined | Y\n /**\n * The CSS `flex-direction` property.\n *\n * @deprecated Use `flexDirection` instead.\n */\n direction?: CSSUIProps[\"flexDirection\"]\n /**\n * If `true`, all wrapped toggle button will be disabled.\n *\n * @default false\n */\n disabled?: boolean\n /**\n * If `true`, all wrapped toggle button will be disabled.\n *\n * @default false\n *\n * @deprecated Use `disabled` instead.\n */\n isDisabled?: boolean\n /**\n * If `true`, all wrapped toggle button will be readonly.\n *\n * @default false\n *\n * @deprecated Use `readOnly` instead.\n */\n isReadOnly?: boolean\n /**\n * If `true`, all wrapped toggle button will be readonly.\n *\n * @default false\n */\n readOnly?: boolean\n /**\n * The value of the toggle button group.\n */\n value?: Y extends any[] ? Y : undefined | Y\n /**\n * The callback fired when any children toggle button is selected or unselected.\n */\n onChange?: (value: Y extends any[] ? Y : undefined | Y) => void\n}\n\n/**\n * `ToggleGroup` is a set of two-state buttons that can be toggled on or off.\n *\n * @see Docs https://yamada-ui.com/components/forms/toggle\n */\nexport interface ToggleGroupProps<\n Y extends (number | string)[] | number | string = string,\n> extends Omit<HTMLUIProps, \"defaultValue\" | \"direction\" | \"onChange\">,\n ThemeProps<\"Toggle\">,\n ToggleGroupOptions<Y> {}\n\nexport const ToggleGroup = forwardRef(\n <Y extends (number | string)[] | number | string = string>(\n {\n className,\n size,\n variant,\n defaultValue,\n direction,\n isDisabled,\n disabled = isDisabled,\n flexDirection = direction,\n isReadOnly,\n readOnly = isReadOnly,\n value: valueProp,\n onChange: onChangeProp,\n ...rest\n }: ToggleGroupProps<Y>,\n ref: ForwardedRef<HTMLDivElement>,\n ) => {\n type Value = Y extends any[] ? Y : undefined | Y\n\n const [value, setValue] = useControllableState<Value>({\n defaultValue,\n value: valueProp,\n onChange: onChangeProp,\n })\n const controlledRef = useRef<boolean>(!isUndefined(value))\n\n const onChange = useCallback(\n <M extends number | string = Y extends any[] ? Y[number] : Y>(\n value: M | undefined,\n ) => {\n if (isUndefined(value)) return\n\n setValue((prev) => {\n if (isArray(prev)) {\n const isIncluded = prev.includes(value)\n\n if (isIncluded) {\n return prev.filter((prevValue) => prevValue !== value) as Value\n } else {\n return [...prev, value] as Value\n }\n } else {\n if (value === (prev as number | string | undefined)) {\n return undefined as Value\n } else {\n return value as unknown as Value\n }\n }\n })\n },\n [setValue],\n )\n\n const css: CSSUIObject = {\n display: \"inline-flex\",\n flexDirection,\n gap: \"0.5rem\",\n }\n\n const values: ToggleGroupContext = useMemo(\n () => ({\n size,\n variant,\n controlled: controlledRef.current,\n disabled,\n readOnly,\n value,\n onChange,\n }),\n [value, size, variant, disabled, readOnly, onChange],\n )\n\n useUpdateEffect(() => {\n if (isUndefined(value)) return\n\n controlledRef.current = true\n }, [valueProp])\n\n return (\n <ToggleGroupProvider value={values}>\n <ui.div\n ref={ref}\n className={cx(\"ui-toggle-group\", className)}\n role=\"group\"\n __css={css}\n {...rest}\n />\n </ToggleGroupProvider>\n )\n },\n) as {\n <Y extends (number | string)[] | number | string = string>(\n props: RefAttributes<HTMLDivElement> & ToggleGroupProps<Y>,\n ): ReactElement\n} & ComponentArgs\n\nToggleGroup.displayName = \"ToggleGroup\"\nToggleGroup.__ui__ = \"ToggleGroup\"\n"],"mappings":";;;AAQA,SAAS,YAAY,UAAU;AAC/B,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,aAAa,SAAS,cAAc;AAmKrC;AAzJR,IAAM,CAAC,qBAAqB,cAAc,IAAI;AAAA,EAC5C;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF;AAkEO,IAAM,cAAc;AAAA,EACzB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,IACP,UAAU;AAAA,IACV,GAAG;AAAA,EACL,GACA,QACG;AAGH,UAAM,CAAC,OAAO,QAAQ,IAAI,qBAA4B;AAAA,MACpD;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AACD,UAAM,gBAAgB,OAAgB,CAAC,YAAY,KAAK,CAAC;AAEzD,UAAM,WAAW;AAAA,MACf,CACEA,WACG;AACH,YAAI,YAAYA,MAAK,EAAG;AAExB,iBAAS,CAAC,SAAS;AACjB,cAAI,QAAQ,IAAI,GAAG;AACjB,kBAAM,aAAa,KAAK,SAASA,MAAK;AAEtC,gBAAI,YAAY;AACd,qBAAO,KAAK,OAAO,CAAC,cAAc,cAAcA,MAAK;AAAA,YACvD,OAAO;AACL,qBAAO,CAAC,GAAG,MAAMA,MAAK;AAAA,YACxB;AAAA,UACF,OAAO;AACL,gBAAIA,WAAW,MAAsC;AACnD,qBAAO;AAAA,YACT,OAAO;AACL,qBAAOA;AAAA,YACT;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAEA,UAAM,MAAmB;AAAA,MACvB,SAAS;AAAA,MACT;AAAA,MACA,KAAK;AAAA,IACP;AAEA,UAAM,SAA6B;AAAA,MACjC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,YAAY,cAAc;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,CAAC,OAAO,MAAM,SAAS,UAAU,UAAU,QAAQ;AAAA,IACrD;AAEA,oBAAgB,MAAM;AACpB,UAAI,YAAY,KAAK,EAAG;AAExB,oBAAc,UAAU;AAAA,IAC1B,GAAG,CAAC,SAAS,CAAC;AAEd,WACE,oBAAC,uBAAoB,OAAO,QAC1B;AAAA,MAAC,GAAG;AAAA,MAAH;AAAA,QACC;AAAA,QACA,WAAW,GAAG,mBAAmB,SAAS;AAAA,QAC1C,MAAK;AAAA,QACL,OAAO;AAAA,QACN,GAAG;AAAA;AAAA,IACN,GACF;AAAA,EAEJ;AACF;AAMA,YAAY,cAAc;AAC1B,YAAY,SAAS;","names":["value"]}