diff --git a/README.md b/README.md index e2eae7d..5df9518 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,7 @@ The main container component that provides the tree context. | `className` | `string` | `''` | Additional CSS classes for the tree container | | `aria-label` | `string` | - | Accessibility label for the tree | | `aria-labelledby` | `string` | - | Reference to an element that labels the tree | +| `dropDownIcon` | `React.ReactNode` | `'▶'` | Icon for expand/collapse in branch nodes | ### TreeItem @@ -143,11 +144,10 @@ Represents a single item in the tree. Provides the visual layout for a tree item. -| Prop | Type | Default | Description | -| -------------- | ----------------- | ------- | ------------------------------------------------ | -| `children` | `React.ReactNode` | - | **Required** Content to render inside the layout | -| `className` | `string` | `''` | Additional CSS classes for the layout | -| `dropDownIcon` | `React.ReactNode` | `'▶'` | Icon for expand/collapse in branch nodes | +| Prop | Type | Default | Description | +| ----------- | ----------------- | ------- | ------------------------------------------------ | +| `children` | `React.ReactNode` | - | **Required** Content to render inside the layout | +| `className` | `string` | `''` | Additional CSS classes for the layout | ### TreeWithJson diff --git a/src/tree/RootTreeContext.tsx b/src/tree/RootTreeContext.tsx index 41a13f2..830010b 100644 --- a/src/tree/RootTreeContext.tsx +++ b/src/tree/RootTreeContext.tsx @@ -5,7 +5,9 @@ export interface RootTreeContextValue { } export const RootTreeContext = React.createContext( - null + { + open: false, + } ); export const useRootTreeContext = () => { diff --git a/src/tree/SubTreeContext.tsx b/src/tree/SubTreeContext.tsx index e7fec83..65b0aef 100644 --- a/src/tree/SubTreeContext.tsx +++ b/src/tree/SubTreeContext.tsx @@ -1,9 +1,19 @@ import * as React from 'react'; -export interface SubTreeContextValue {} +export interface SubTreeContextValue { + dropDownIcon?: React.ReactNode; +} export const SubTreeContext = React.createContext< SubTreeContextValue | null | undefined >(undefined); SubTreeContext.displayName = 'SubTreeContext'; + +export const useSubTreeContext = () => { + const context = React.useContext(SubTreeContext); + if (!context) { + throw new Error('useSubTreeContext must be used within a SubTree'); + } + return context; +}; diff --git a/src/tree/Tree.stories.tsx b/src/tree/Tree.stories.tsx index 65c7dca..0618b7d 100644 --- a/src/tree/Tree.stories.tsx +++ b/src/tree/Tree.stories.tsx @@ -31,7 +31,7 @@ export const Default: Story = { args: { 'aria-label': 'Default', children: ( - + customer id: 1234567890 diff --git a/src/tree/Tree.tsx b/src/tree/Tree.tsx index 6ace99a..a9f9065 100644 --- a/src/tree/Tree.tsx +++ b/src/tree/Tree.tsx @@ -8,6 +8,7 @@ export interface TreeProps { 'aria-labelledby'?: string; children: React.ReactNode; open?: boolean; + dropDownIcon?: React.ReactNode; className?: string; } @@ -18,10 +19,16 @@ export const Tree = (props: TreeProps) => { return isRoot ? : ; }; -const RootTree = ({ children, open, className = '', ...props }: TreeProps) => { +const RootTree = ({ + children, + open, + dropDownIcon = '▶', + className = '', + ...props +}: TreeProps) => { return ( - +
{children}
@@ -30,9 +37,14 @@ const RootTree = ({ children, open, className = '', ...props }: TreeProps) => { ); }; -const SubTree = ({ children, className = '', ...props }: TreeProps) => { +const SubTree = ({ + children, + className = '', + dropDownIcon, + ...props +}: TreeProps) => { return ( - +
{children}
diff --git a/src/tree/TreeItemLayout.tsx b/src/tree/TreeItemLayout.tsx index 1e676dd..dcf7eb5 100644 --- a/src/tree/TreeItemLayout.tsx +++ b/src/tree/TreeItemLayout.tsx @@ -1,20 +1,20 @@ import * as React from 'react'; import { useTreeItemContext } from './TreeItemContext'; import './TreeItemLayout.css'; +import { useSubTreeContext } from './SubTreeContext'; export interface TreeItemLayoutProps extends React.HTMLAttributes { children: React.ReactNode; className?: string; - dropDownIcon?: React.ReactNode; } export const TreeItemLayout = ({ children, className = '', - dropDownIcon = '▶', ...props }: TreeItemLayoutProps) => { + const { dropDownIcon } = useSubTreeContext(); const { itemType, isOpen, onToggle } = useTreeItemContext(); return (