1- import  {  useBoundSignal  }  from  "@qds.dev/utils" ; 
1+ import  {  type   BindableProps ,   useBindings  }  from  "@qds.dev/utils" ; 
22import  { 
33  $ , 
4-   type  PropsOf , 
5-   type  Signal , 
6-   Slot , 
74  component$ , 
85  createContextId , 
96  isServer , 
7+   type  PropsOf , 
8+   type  Signal , 
9+   Slot , 
1010  sync$ , 
1111  useContext , 
1212  useContextProvider , 
@@ -18,34 +18,44 @@ import { CollapsibleRoot } from "../collapsible/collapsible-root";
1818import  {  TreeRootContextId  }  from  "./tree-root" ; 
1919import  {  useTree  }  from  "./use-tree" ; 
2020
21- type  TreeItemContext  =  { 
21+ export  const  itemContextId  =  createContextId < TreeItemContext > ( "tree-item" ) ; 
22+ 
23+ export  interface  TreeItemContext  { 
2224  id : string ; 
2325  level : number ; 
24-   isOpenSig : Signal < boolean > ; 
25- } ; 
26- 
27- export  const  itemContextId  =  createContextId < TreeItemContext > ( "tree-item" ) ; 
26+   isOpen : Signal < boolean > ; 
27+   isDisabled : Signal < boolean > ; 
28+ } 
2829
29- interface   TreeItemProps  extends   PropsOf < typeof  CollapsibleRoot >  { 
30+ export   type   TreeItemProps  =   Omit < PropsOf < typeof  CollapsibleRoot > ,   "open"   |   "disabled" >   &  { 
3031  _index ?: number ; 
3132  groupTrigger ?: boolean ; 
3233  groupId ?: string ; 
33- } 
34+ }  &  BindableProps < TreeItemBinds > ; 
35+ 
36+ type  TreeItemBinds  =  { 
37+   open : boolean ; 
38+   disabled : boolean ; 
39+ } ; 
3440
3541export  const  TreeItem  =  component$ ( ( props : TreeItemProps )  =>  { 
3642  const  context  =  useContext ( TreeRootContextId ) ; 
3743  const  parentContext  =  useContext ( itemContextId ,  null ) ; 
3844  const  id  =  useId ( ) ; 
3945  const  itemRef  =  useSignal < HTMLElement > ( ) ; 
40-   const  isOpenSig  =  useBoundSignal ( props [ "bind:open" ] ,  false ) ; 
46+   const  {  openSig : isOpen ,  disabledSig : isDisabled  }  =  useBindings < TreeItemBinds > ( props ,  { 
47+     open : false , 
48+     disabled : false 
49+   } ) ; 
4150  const  {  getCurrentLevel }  =  useTree ( ) ; 
4251  const  isHighlightedSig  =  useSignal ( false ) ; 
4352  const  level  =  getCurrentLevel ( parentContext ?. level ) ; 
4453
4554  const  itemContext : TreeItemContext  =  { 
4655    id, 
4756    level, 
48-     isOpenSig
57+     isOpen, 
58+     isDisabled
4959  } ; 
5060
5161  useContextProvider ( itemContextId ,  itemContext ) ; 
@@ -92,14 +102,14 @@ export const TreeItem = component$((props: TreeItemProps) => {
92102      case  "ArrowRight" : { 
93103        const  isCollapsed  =  currentItem . hasAttribute ( "data-closed" ) ; 
94104        if  ( isCollapsed )  { 
95-           isOpenSig . value  =  true ; 
105+           isOpen . value  =  true ; 
96106        } 
97107        return ; 
98108      } 
99109      case  "ArrowLeft" : { 
100110        const  isExpanded  =  ! currentItem . hasAttribute ( "data-closed" ) ; 
101111        if  ( isExpanded )  { 
102-           isOpenSig . value  =  false ; 
112+           isOpen . value  =  false ; 
103113        } 
104114        return ; 
105115      } 
@@ -136,7 +146,8 @@ export const TreeItem = component$((props: TreeItemProps) => {
136146      id = { id } 
137147      ref = { itemRef } 
138148      role = "row" 
139-       bind :open = { isOpenSig } 
149+       open = { isOpen . value } 
150+       disabled = { isDisabled . value } 
140151      tabIndex = { 
141152        context . currentFocusEl . value  ===  itemRef . value  || 
142153        context . currentFocusEl . value  ===  null 
0 commit comments