1
1
import type { ButtonProps , CheckboxProps } from '@invoke-ai/ui-library' ;
2
- import { Button , Checkbox , Flex , Text } from '@invoke-ai/ui-library' ;
2
+ import { Box , Button , Checkbox , Collapse , Flex , Spacer , Text } from '@invoke-ai/ui-library' ;
3
3
import { useStore } from '@nanostores/react' ;
4
4
import { $workflowCategories } from 'app/store/nanostores/workflowCategories' ;
5
5
import { useAppDispatch , useAppSelector } from 'app/store/storeHooks' ;
@@ -65,66 +65,85 @@ export const WorkflowLibrarySideNav = () => {
65
65
} , [ categories ] ) ;
66
66
67
67
return (
68
- < Flex flexDir = "column" gap = { 2 } h = "full" >
69
- < CategoryButton isSelected = { isYourWorkflowsSelected } onClick = { selectYourWorkflows } >
70
- { t ( 'workflows.yourWorkflows' ) }
71
- </ CategoryButton >
72
- { categoryOptions . includes ( 'project' ) && (
73
- < Flex flexDir = "column" gap = { 2 } pl = { 4 } >
74
- < CategoryButton size = "sm" onClick = { selectPrivateWorkflows } isSelected = { isPrivateWorkflowsExclusivelySelected } >
75
- { t ( 'workflows.private' ) }
76
- </ CategoryButton >
77
- < CategoryButton
78
- size = "sm"
79
- rightIcon = { < PiUsersBold /> }
80
- onClick = { selectSharedWorkflows }
81
- isSelected = { isSharedWorkflowsExclusivelySelected }
68
+ < Flex flexDir = "column" h = "full" >
69
+ < Box w = "full" pb = { 2 } >
70
+ < CategoryButton isSelected = { isYourWorkflowsSelected } onClick = { selectYourWorkflows } >
71
+ { t ( 'workflows.yourWorkflows' ) }
72
+ </ CategoryButton >
73
+ { categoryOptions . includes ( 'project' ) && (
74
+ < Collapse
75
+ in = {
76
+ isYourWorkflowsSelected || isPrivateWorkflowsExclusivelySelected || isSharedWorkflowsExclusivelySelected
77
+ }
82
78
>
83
- { t ( 'workflows.shared' ) }
84
- </ CategoryButton >
85
- </ Flex >
86
- ) }
87
- < CategoryButton isSelected = { isDefaultWorkflowsExclusivelySelected } onClick = { selectDefaultWorkflows } >
88
- { t ( 'workflows.browseWorkflows' ) }
89
- </ CategoryButton >
90
-
91
- < Flex flexDir = "column" gap = { 2 } pl = { 4 } overflow = "hidden" >
92
- < Button
93
- isDisabled = { ! isDefaultWorkflowsExclusivelySelected || selectedTags . length === 0 }
94
- onClick = { resetTags }
95
- size = "sm"
96
- variant = "link"
97
- fontWeight = "bold"
98
- justifyContent = "flex-start"
99
- flexGrow = { 0 }
100
- leftIcon = { < PiArrowCounterClockwiseBold /> }
101
- h = { 8 }
102
- >
103
- { t ( 'workflows.resetTags' ) }
104
- </ Button >
105
- < Flex flexDir = "column" gap = { 2 } overflow = "auto" >
106
- { WORKFLOW_TAGS . map ( ( tagCategory ) => (
107
- < TagCategory
108
- key = { tagCategory . category }
109
- tagCategory = { tagCategory }
110
- isDisabled = { ! isDefaultWorkflowsExclusivelySelected }
111
- />
112
- ) ) }
113
- </ Flex >
114
- </ Flex >
79
+ < Flex flexDir = "column" gap = { 2 } pl = { 4 } pt = { 2 } >
80
+ < CategoryButton
81
+ size = "sm"
82
+ onClick = { selectPrivateWorkflows }
83
+ isSelected = { isPrivateWorkflowsExclusivelySelected }
84
+ >
85
+ { t ( 'workflows.private' ) }
86
+ </ CategoryButton >
87
+ < CategoryButton
88
+ size = "sm"
89
+ rightIcon = { < PiUsersBold /> }
90
+ onClick = { selectSharedWorkflows }
91
+ isSelected = { isSharedWorkflowsExclusivelySelected }
92
+ >
93
+ { t ( 'workflows.shared' ) }
94
+ < Spacer />
95
+ </ CategoryButton >
96
+ </ Flex >
97
+ </ Collapse >
98
+ ) }
99
+ </ Box >
100
+ < Box w = "full" >
101
+ < CategoryButton isSelected = { isDefaultWorkflowsExclusivelySelected } onClick = { selectDefaultWorkflows } >
102
+ { t ( 'workflows.browseWorkflows' ) }
103
+ </ CategoryButton >
104
+ < Collapse in = { isDefaultWorkflowsExclusivelySelected } >
105
+ < Flex flexDir = "column" gap = { 2 } pl = { 4 } py = { 2 } overflow = "hidden" >
106
+ < Button
107
+ isDisabled = { ! isDefaultWorkflowsExclusivelySelected || selectedTags . length === 0 }
108
+ onClick = { resetTags }
109
+ size = "sm"
110
+ variant = "link"
111
+ fontWeight = "bold"
112
+ justifyContent = "flex-start"
113
+ flexGrow = { 0 }
114
+ flexShrink = { 0 }
115
+ leftIcon = { < PiArrowCounterClockwiseBold /> }
116
+ h = { 8 }
117
+ >
118
+ { t ( 'workflows.resetTags' ) }
119
+ </ Button >
120
+ < Flex flexDir = "column" gap = { 2 } overflow = "auto" >
121
+ { WORKFLOW_TAGS . map ( ( tagCategory ) => (
122
+ < TagCategory
123
+ key = { tagCategory . category }
124
+ tagCategory = { tagCategory }
125
+ isDisabled = { ! isDefaultWorkflowsExclusivelySelected }
126
+ />
127
+ ) ) }
128
+ </ Flex >
129
+ </ Flex >
130
+ </ Collapse >
131
+ </ Box >
115
132
</ Flex >
116
133
) ;
117
134
} ;
118
135
119
136
const CategoryButton = memo ( ( { isSelected, ...rest } : ButtonProps & { isSelected : boolean } ) => {
120
137
return (
121
138
< Button
122
- colorScheme = { isSelected ? 'invokeBlue' : 'base' }
123
139
variant = "ghost"
124
- fontWeight = "bold"
125
140
justifyContent = "flex-start"
126
141
size = "md"
142
+ flexShrink = { 0 }
143
+ w = "full"
127
144
{ ...rest }
145
+ bg = { isSelected ? 'base.700' : undefined }
146
+ color = { isSelected ? 'base.50' : undefined }
128
147
/>
129
148
) ;
130
149
} ) ;
@@ -143,7 +162,7 @@ const TagCategory = memo(
143
162
144
163
return (
145
164
< Flex flexDir = "column" gap = { 2 } >
146
- < Text fontWeight = "semibold" color = "base.300" opacity = { isDisabled ? 0.5 : 1 } >
165
+ < Text fontWeight = "semibold" color = "base.300" opacity = { isDisabled ? 0.5 : 1 } flexShrink = { 0 } >
147
166
{ tagCategory . category }
148
167
</ Text >
149
168
< Flex flexDir = "column" gap = { 2 } pl = { 4 } >
@@ -176,7 +195,7 @@ const TagCheckbox = memo(({ tag, ...rest }: CheckboxProps & { tag: WorkflowTag }
176
195
}
177
196
178
197
return (
179
- < Checkbox isChecked = { isSelected } onChange = { onChange } { ...rest } >
198
+ < Checkbox isChecked = { isSelected } onChange = { onChange } { ...rest } flexShrink = { 0 } >
180
199
< Text > { `${ tag } (${ count } )` } </ Text >
181
200
</ Checkbox >
182
201
) ;
0 commit comments