@@ -6,30 +6,43 @@ import type {
66 Preference ,
77 TBooleanProperty ,
88 TNumberProperty ,
9+ TProperty ,
910 TPropertyValueType ,
1011 TStringProperty ,
1112} from "../core" ;
1213
14+ type PropertyValues = {
15+ [ key : string ] : TPropertyValueType ;
16+ } ;
17+
1318export function PreferenceItem ( {
1419 identifier,
1520 title,
1621 properties,
22+ values,
23+ onChange,
1724} : Preference & {
25+ values : PropertyValues ;
1826 onChange ?: OnPropertyChange ;
1927} ) {
2028 return (
2129 < PreferenceItemContainer data-preference-id = { identifier } >
22- < h3 > { title } </ h3 >
30+ < span className = "title" > { title } </ span >
2331 < div className = "properties" >
2432 { Object . keys ( properties ) . map ( ( k ) => {
2533 const property = properties [ k ] ;
34+ const value = values [ k ] ;
35+ const cb = ( v ) => {
36+ onChange ?.( k , v ) ;
37+ } ;
2638 switch ( property . type ) {
2739 case "boolean" : {
2840 return (
2941 < PreferenceCheckboxItem
3042 key = { k }
3143 { ...property }
32- onChange = { ( ) => { } }
44+ onChange = { cb }
45+ value = { value as boolean }
3346 />
3447 ) ;
3548 }
@@ -38,7 +51,8 @@ export function PreferenceItem({
3851 < PreferenceTextFieldItem
3952 key = { k }
4053 { ...property }
41- onChange = { ( ) => { } }
54+ onChange = { cb }
55+ value = { value as number | string }
4256 />
4357 ) ;
4458 }
@@ -48,15 +62,17 @@ export function PreferenceItem({
4862 < PreferenceSelectItem
4963 key = { k }
5064 { ...property }
51- onChange = { ( ) => { } }
65+ onChange = { cb }
66+ value = { value as string }
5267 />
5368 ) ;
5469 }
5570 return (
5671 < PreferenceTextFieldItem
5772 key = { k }
5873 { ...property }
59- onChange = { ( ) => { } }
74+ onChange = { cb }
75+ value = { value as string }
6076 />
6177 ) ;
6278 }
@@ -68,7 +84,11 @@ export function PreferenceItem({
6884}
6985
7086type TOnChange < T > = ( value : T ) => void ;
71- type OnPropertyChange = ( identifier : string , value : TPropertyValueType ) => void ;
87+ type Properties = { [ key : string ] : TProperty } ;
88+ type OnPropertyChange = < K extends keyof Properties > (
89+ key : K ,
90+ value : Properties [ K ] [ "default" ]
91+ ) => void ;
7292
7393function PropertyDescription ( {
7494 description,
@@ -82,26 +102,45 @@ function PropertyDescription({
82102 { markdownDescription ? (
83103 < ReactMarkdown > { markdownDescription } </ ReactMarkdown >
84104 ) : (
85- < p > { description } </ p >
105+ < span > { description } </ span >
86106 ) }
87107 </ div >
88108 ) ;
89109}
90110
91111function PreferenceCheckboxItem ( {
112+ value,
113+ onChange,
92114 ...props
93- } : TBooleanProperty & { onChange ?: TOnChange < boolean > } ) {
115+ } : TBooleanProperty & {
116+ onChange ?: TOnChange < boolean > ;
117+ value ?: boolean | "indeterminate" ;
118+ } ) {
94119 return (
95120 < div className = "checkbox" >
96- < Checkbox />
121+ < Checkbox
122+ style = { {
123+ color : "white" ,
124+ } }
125+ // defaultChecked={props.default}
126+ checked = { value }
127+ onCheckedChange = { ( checked ) => {
128+ if ( typeof checked === "boolean" ) {
129+ onChange ?.( checked ) ;
130+ }
131+ } }
132+ />
97133 < PropertyDescription { ...props } />
98134 </ div >
99135 ) ;
100136}
101137
102138function PreferenceTextFieldItem ( {
103139 ...props
104- } : ( TStringProperty | TNumberProperty ) & { onChange ?: TOnChange < string > } ) {
140+ } : ( TStringProperty | TNumberProperty ) & {
141+ onChange ?: TOnChange < string > ;
142+ value ?: string | number ;
143+ } ) {
105144 return (
106145 < >
107146 < PropertyDescription { ...props } />
@@ -110,21 +149,40 @@ function PreferenceTextFieldItem({
110149}
111150
112151function PreferenceSelectItem (
113- props : TStringProperty & { onChange ?: TOnChange < string > }
152+ props : TStringProperty & {
153+ onChange ?: TOnChange < string > ;
154+ value ?: string ;
155+ }
114156) {
115157 return < > </ > ;
116158}
117159
118160const PreferenceItemContainer = styled . div `
119161 /* */
162+ cursor: default;
120163 display: flex;
164+ flex-direction: column;
165+ gap: 8px;
166+ padding: 16px;
167+ border-radius: 4px;
168+
169+ &:hover {
170+ background: rgba(255, 255, 255, 0.04);
171+ }
172+
173+ .title {
174+ color: rgba(255, 255, 255, 0.8);
175+ font-weight: 500;
176+ }
121177
122178 .properties {
123179 display: flex;
124180 flex-direction: column;
125181 }
126182
127183 .description {
184+ color: rgba(255, 255, 255, 0.7);
185+ font-size: 14px;
128186 }
129187
130188 .checkbox {
@@ -134,4 +192,6 @@ const PreferenceItemContainer = styled.div`
134192 align-items: center;
135193 justify-content: flex-start;
136194 }
195+
196+ transition: background 0.1s ease-in-out;
137197` ;
0 commit comments