{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "disclosure-group", "type": "registry:ui", "title": "Disclosure Group", "description": "Disclosure Group from @pitsi-ui/native for native projects.", "dependencies": [ "tailwind-variants@^3.2.2" ], "registryDependencies": [], "files": [ { "path": "registry/native-ui/src/components/disclosure-group/disclosure-group.tsx", "content": "import { createContext, forwardRef, type ReactNode, useCallback, useMemo, useState } from \"react\";\nimport { View, type ViewProps } from \"react-native\";\nimport { tv, type VariantProps } from \"tailwind-variants\";\n\nexport type DisclosureKey = string | number;\n\nexport const disclosureGroupVariants = tv({\n base: \"w-full\",\n});\n\nexport type DisclosureGroupVariants = VariantProps;\n\nexport type DisclosureGroupContextValue = {\n expandedKeys: Set;\n setExpanded: (key: DisclosureKey, isExpanded: boolean) => void;\n};\n\nexport const DisclosureGroupContext = createContext(\n undefined,\n);\n\nexport interface DisclosureGroupRootProps\n extends Omit,\n DisclosureGroupVariants {\n allowsMultipleExpanded?: boolean;\n children?: ReactNode | ((props: { expandedKeys: Set }) => ReactNode);\n defaultExpandedKeys?: Iterable;\n expandedKeys?: Set;\n onExpandedChange?: (keys: Set) => void;\n}\n\nconst DisclosureGroupRoot = forwardRef(\n (\n {\n allowsMultipleExpanded = true,\n children,\n className,\n defaultExpandedKeys,\n expandedKeys,\n onExpandedChange,\n ...props\n },\n ref,\n ) => {\n const [internalKeys, setInternalKeys] = useState(\n () => new Set(defaultExpandedKeys),\n );\n const selectedKeys = expandedKeys ?? internalKeys;\n const rootClassName = disclosureGroupVariants({ className });\n\n const setExpanded = useCallback(\n (key: DisclosureKey, isExpanded: boolean) => {\n const nextKeys = new Set(allowsMultipleExpanded ? selectedKeys : []);\n\n if (isExpanded) {\n nextKeys.add(key);\n } else {\n nextKeys.delete(key);\n }\n\n if (!expandedKeys) {\n setInternalKeys(nextKeys);\n }\n onExpandedChange?.(nextKeys);\n },\n [allowsMultipleExpanded, selectedKeys, expandedKeys, onExpandedChange],\n );\n\n const contextValue = useMemo(\n () => ({\n expandedKeys: selectedKeys,\n setExpanded,\n }),\n [selectedKeys, setExpanded],\n );\n\n return (\n \n \n {typeof children === \"function\" ? children({ expandedKeys: selectedKeys }) : children}\n \n \n );\n },\n);\n\nDisclosureGroupRoot.displayName = \"PitsiUINative.DisclosureGroupRoot\";\n\nexport { DisclosureGroupRoot };\n", "type": "registry:ui", "target": "@components/pitsi-ui/native-ui/src/components/disclosure-group/disclosure-group.tsx" }, { "path": "registry/native-ui/src/components/disclosure-group/index.ts", "content": "import type { ComponentProps } from \"react\";\n\nimport { DisclosureGroupRoot } from \"./disclosure-group\";\n\nexport const DisclosureGroup = Object.assign(DisclosureGroupRoot, {\n Root: DisclosureGroupRoot,\n});\n\nexport type DisclosureGroup = {\n Props: ComponentProps;\n RootProps: ComponentProps;\n};\n\nexport type {\n DisclosureGroupContextValue,\n DisclosureGroupRootProps,\n DisclosureGroupRootProps as DisclosureGroupProps,\n DisclosureGroupVariants,\n DisclosureKey,\n} from \"./disclosure-group\";\nexport {\n DisclosureGroupContext,\n DisclosureGroupRoot,\n disclosureGroupVariants,\n} from \"./disclosure-group\";\nexport type {\n UseDisclosureGroupNavigationProps,\n UseDisclosureGroupNavigationReturn,\n} from \"./use-disclosure-group-navigation\";\nexport { useDisclosureGroupNavigation } from \"./use-disclosure-group-navigation\";\n", "type": "registry:ui", "target": "@components/pitsi-ui/native-ui/src/components/disclosure-group/index.ts" }, { "path": "registry/native-ui/src/components/disclosure-group/use-disclosure-group-navigation.ts", "content": "import { useMemo } from \"react\";\n\nimport type { DisclosureKey } from \"./disclosure-group\";\n\nexport type UseDisclosureGroupNavigationProps = {\n expandedKeys: Set;\n itemIds: DisclosureKey[];\n onExpandedChange: (keys: Set) => void;\n};\n\nexport type UseDisclosureGroupNavigationReturn = {\n isNextDisabled: boolean;\n isPrevDisabled: boolean;\n onNext: () => void;\n onPrevious: () => void;\n};\n\nexport function useDisclosureGroupNavigation({\n expandedKeys,\n itemIds,\n onExpandedChange,\n}: UseDisclosureGroupNavigationProps): UseDisclosureGroupNavigationReturn {\n return useMemo(() => {\n const currentKey = Array.from(expandedKeys).at(-1);\n const currentIndex = currentKey === undefined ? -1 : itemIds.indexOf(currentKey);\n\n const setIndex = (index: number) => {\n const nextKey = itemIds[index];\n if (nextKey !== undefined) {\n onExpandedChange(new Set([nextKey]));\n }\n };\n\n return {\n isNextDisabled: currentIndex >= itemIds.length - 1,\n isPrevDisabled: currentIndex <= 0,\n onNext: () => setIndex(Math.min(itemIds.length - 1, currentIndex + 1)),\n onPrevious: () => setIndex(Math.max(0, currentIndex - 1)),\n };\n }, [expandedKeys, itemIds, onExpandedChange]);\n}\n", "type": "registry:hook", "target": "@components/pitsi-ui/native-ui/src/components/disclosure-group/use-disclosure-group-navigation.ts" } ], "categories": [ "native", "react-native", "ui" ], "meta": { "package": "@pitsi-ui/native", "packageSlug": "native-ui", "platform": "native" } }