Skip to content

Commit 2f24bc3

Browse files
committed
Refactor list headers into a reusable ListHeader component and introduce a new collapsible Fieldset component to organize and group preset editing fields
1 parent f9ca0f1 commit 2f24bc3

15 files changed

Lines changed: 423 additions & 296 deletions

File tree

‎packages/ui/src/components/editor/panel/Configurations/Configurations.module.scss‎

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,6 @@
22
display: flex;
33
flex-direction: column;
44
}
5-
6-
.header {
7-
height: var(--list-item-height);
8-
padding: 0 12px;
9-
display: flex;
10-
justify-content: space-between;
11-
align-items: center;
12-
cursor: pointer;
13-
14-
&:hover {
15-
background-color: var(--vscode-list-hoverBackground);
16-
}
17-
18-
&__left {
19-
display: flex;
20-
align-items: center;
21-
gap: 4px;
22-
}
23-
24-
&__right {
25-
display: flex;
26-
}
27-
}
28-
295
.missing-config {
306
padding: 2px 12px 0 12px;
317
font-weight: 500;

‎packages/ui/src/components/editor/panel/Configurations/Configurations.tsx‎

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import cn from 'classnames'
44
import { ReactSortable } from 'react-sortablejs'
55
import { IconButton } from '../IconButton/IconButton'
66
import { Button } from '../../common/Button'
7+
import { ListHeader } from '../ListHeader'
78

89
export namespace Configurations {
910
export type Configuration = {
@@ -105,21 +106,13 @@ export const Configurations: React.FC<Configurations.Props> = (props) => {
105106
{pinned_configurations.map((i) => render_configuration_item(i, true))}
106107
</div>
107108
)}
108-
<div
109-
className={styles.header}
110-
onClick={() => props.on_toggle_collapsed(!props.is_collapsed)}
111-
role="button"
112-
>
113-
<div className={styles.header__left}>
114-
<span
115-
className={cn('codicon', {
116-
'codicon-chevron-down': !props.is_collapsed,
117-
'codicon-chevron-right': props.is_collapsed
118-
})}
119-
/>
120-
<span>Configurations</span>
121-
</div>
122-
<div className={styles.header__right}>
109+
<ListHeader
110+
title="Configurations"
111+
is_collapsed={props.is_collapsed}
112+
on_toggle_collapsed={() =>
113+
props.on_toggle_collapsed(!props.is_collapsed)
114+
}
115+
actions={
123116
<IconButton
124117
codicon_icon="edit"
125118
on_click={(e) => {
@@ -128,8 +121,8 @@ export const Configurations: React.FC<Configurations.Props> = (props) => {
128121
}}
129122
title="Edit Configurations"
130123
/>
131-
</div>
132-
</div>
124+
}
125+
/>
133126
{!props.is_collapsed && (
134127
<>
135128
<div className={styles.configurations}>

‎packages/ui/src/components/editor/panel/Field/Field.module.scss‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
display: flex;
33
flex-direction: column;
44
gap: 4px;
5+
padding: 0 12px;
56

67
&__label {
78
font-size: 12px;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
.fieldset {
2+
display: flex;
3+
flex-direction: column;
4+
5+
&__label {
6+
padding: 8px 12px 4px;
7+
font-size: 11px;
8+
font-weight: 600;
9+
color: var(--vscode-descriptionForeground);
10+
text-transform: uppercase;
11+
}
12+
13+
&__header {
14+
height: var(--list-item-height);
15+
padding: 0 12px;
16+
display: flex;
17+
justify-content: space-between;
18+
align-items: center;
19+
cursor: pointer;
20+
21+
&:hover {
22+
background-color: var(--vscode-list-hoverBackground);
23+
}
24+
25+
&__left {
26+
display: flex;
27+
align-items: center;
28+
gap: 4px;
29+
}
30+
}
31+
32+
&__content {
33+
display: flex;
34+
flex-direction: column;
35+
gap: 8px;
36+
}
37+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import cn from 'classnames'
2+
import styles from './Fieldset.module.scss'
3+
4+
type Props = {
5+
label?: string
6+
children?: React.ReactNode
7+
is_collapsed?: boolean
8+
on_toggle_collapsed?: () => void
9+
}
10+
11+
export const Fieldset: React.FC<Props> = ({
12+
label,
13+
children,
14+
is_collapsed,
15+
on_toggle_collapsed
16+
}) => {
17+
if (is_collapsed !== undefined) {
18+
return (
19+
<div className={styles.fieldset}>
20+
<div
21+
className={styles.fieldset__header}
22+
onClick={on_toggle_collapsed}
23+
role="button"
24+
>
25+
<div className={styles.fieldset__header__left}>
26+
<span
27+
className={cn('codicon', {
28+
'codicon-chevron-down': !is_collapsed,
29+
'codicon-chevron-right': is_collapsed
30+
})}
31+
/>
32+
<span>{label}</span>
33+
</div>
34+
</div>
35+
{!is_collapsed && (
36+
<div className={styles.fieldset__content}>{children}</div>
37+
)}
38+
</div>
39+
)
40+
}
41+
42+
return (
43+
<div className={styles.fieldset}>
44+
{label && <div className={styles.fieldset__label}>{label}</div>}
45+
<div className={styles.fieldset__content}>{children}</div>
46+
</div>
47+
)
48+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './Fieldset'
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
.header {
2+
height: var(--list-item-height);
3+
padding: 0 12px;
4+
display: flex;
5+
justify-content: space-between;
6+
align-items: center;
7+
cursor: pointer;
8+
9+
&:hover {
10+
background-color: var(--vscode-list-hoverBackground);
11+
}
12+
13+
&__left {
14+
display: flex;
15+
align-items: center;
16+
gap: 4px;
17+
}
18+
19+
&__right {
20+
display: flex;
21+
}
22+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import styles from './ListHeader.module.scss'
2+
import cn from 'classnames'
3+
4+
export namespace ListHeader {
5+
export type Props = {
6+
title: string
7+
is_collapsed: boolean
8+
on_toggle_collapsed: () => void
9+
actions?: React.ReactNode
10+
}
11+
}
12+
13+
export const ListHeader: React.FC<ListHeader.Props> = (props) => {
14+
return (
15+
<div
16+
className={styles.header}
17+
onClick={props.on_toggle_collapsed}
18+
role="button"
19+
>
20+
<div className={styles.header__left}>
21+
<span
22+
className={cn('codicon', {
23+
'codicon-chevron-down': !props.is_collapsed,
24+
'codicon-chevron-right': props.is_collapsed
25+
})}
26+
/>
27+
<span>{props.title}</span>
28+
</div>
29+
{props.actions && (
30+
<div className={styles.header__right}>{props.actions}</div>
31+
)}
32+
</div>
33+
)
34+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { ListHeader } from './ListHeader'

‎packages/ui/src/components/editor/panel/Presets/Presets.module.scss‎

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,6 @@
22
display: flex;
33
flex-direction: column;
44
}
5-
6-
.header {
7-
height: var(--list-item-height);
8-
padding: 0 12px;
9-
display: flex;
10-
justify-content: space-between;
11-
align-items: center;
12-
cursor: pointer;
13-
14-
&:hover {
15-
background-color: var(--vscode-list-hoverBackground);
16-
}
17-
18-
&__left {
19-
display: flex;
20-
align-items: center;
21-
gap: 4px;
22-
}
23-
24-
&__right {
25-
display: flex;
26-
}
27-
}
28-
295
.presets {
306
display: flex;
317
flex-direction: column;

0 commit comments

Comments
 (0)