Skip to content

Commit cfe1fe7

Browse files
committed
feat(ui): add dVerticalCenter to checkbox and radio
1 parent 032bca1 commit cfe1fe7

8 files changed

Lines changed: 56 additions & 4 deletions

File tree

packages/ui/src/components/checkbox/Checkbox.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export interface DCheckboxProps extends React.HTMLAttributes<HTMLElement> {
1919
};
2020
dFormControl?: DFormControl;
2121
dModel?: boolean;
22+
dVerticalCenter?: boolean;
2223
dDisabled?: boolean;
2324
dIndeterminate?: boolean;
2425
dInputRender?: DCloneHTMLElement<React.InputHTMLAttributes<HTMLInputElement>>;
@@ -36,6 +37,7 @@ export const DCheckbox: {
3637
dRef,
3738
dFormControl,
3839
dModel,
40+
dVerticalCenter = false,
3941
dDisabled = false,
4042
dIndeterminate = false,
4143
dInputRender,
@@ -64,6 +66,7 @@ export const DCheckbox: {
6466
<label
6567
{...restProps}
6668
className={getClassName(restProps.className, `${dPrefix}checkbox`, {
69+
[`${dPrefix}checkbox--vertical-center`]: dVerticalCenter,
6770
'is-indeterminate': dIndeterminate,
6871
'is-checked': checked,
6972
'is-disabled': disabled,

packages/ui/src/components/checkbox/CheckboxGroup.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface DCheckboxGroupProps<V extends DId> extends Omit<React.HTMLAttri
1212
dFormControl?: DFormControl;
1313
dModel?: V[];
1414
dList: DCheckboxItem<V>[];
15+
dVerticalCenter?: boolean;
1516
dDisabled?: boolean;
1617
dVertical?: boolean;
1718
onModelChange?: (values: V[]) => void;
@@ -23,6 +24,7 @@ export function DCheckboxGroup<V extends DId>(props: DCheckboxGroupProps<V>): JS
2324
dFormControl,
2425
dList,
2526
dModel,
27+
dVerticalCenter = false,
2628
dDisabled = false,
2729
dVertical = false,
2830
onModelChange,
@@ -39,6 +41,7 @@ export function DCheckboxGroup<V extends DId>(props: DCheckboxGroupProps<V>): JS
3941
dFormControl={dFormControl}
4042
dList={dList}
4143
dModel={dModel}
44+
dVerticalCenter={dVerticalCenter}
4245
dDisabled={dDisabled}
4346
dRender={(nodes) => (
4447
<div

packages/ui/src/components/checkbox/CheckboxGroupRenderer.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,23 @@ export interface DCheckboxGroupRendererProps<V extends DId> {
1616
dFormControl?: DFormControl;
1717
dModel?: V[];
1818
dList: DCheckboxItem<V>[];
19+
dVerticalCenter?: boolean;
1920
dDisabled?: boolean;
2021
dRender: (nodes: React.ReactElement[]) => JSX.Element | null;
2122
onModelChange?: (values: V[]) => void;
2223
}
2324

2425
const { COMPONENT_NAME } = registerComponentMate({ COMPONENT_NAME: 'DCheckbox.GroupRenderer' as const });
2526
export function DCheckboxGroupRenderer<V extends DId>(props: DCheckboxGroupRendererProps<V>): JSX.Element | null {
26-
const { dFormControl, dList, dModel, dDisabled = false, dRender, onModelChange } = useComponentConfig(COMPONENT_NAME, props);
27+
const {
28+
dFormControl,
29+
dList,
30+
dModel,
31+
dVerticalCenter = false,
32+
dDisabled = false,
33+
dRender,
34+
onModelChange,
35+
} = useComponentConfig(COMPONENT_NAME, props);
2736

2837
//#region Context
2938
const { gDisabled } = useGeneralContext();
@@ -38,6 +47,7 @@ export function DCheckboxGroupRenderer<V extends DId>(props: DCheckboxGroupRende
3847
dList.map((item, index) => (
3948
<DCheckbox
4049
key={item.value}
50+
dVerticalCenter={dVerticalCenter}
4151
dDisabled={item.disabled || disabled}
4252
dInputRender={(el) =>
4353
cloneHTMLElement(el, {

packages/ui/src/components/radio/Radio.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export interface DRadioProps extends React.HTMLAttributes<HTMLElement> {
2222
};
2323
dFormControl?: DFormControl;
2424
dModel?: boolean;
25+
dVerticalCenter?: boolean;
2526
dDisabled?: boolean;
2627
dInputRender?: DCloneHTMLElement<React.InputHTMLAttributes<HTMLInputElement>>;
2728
onModelChange?: (checked: boolean) => void;
@@ -42,6 +43,7 @@ export const DRadio: {
4243
dRef,
4344
dFormControl,
4445
dModel,
46+
dVerticalCenter = false,
4547
dDisabled = false,
4648
dInputRender,
4749
onModelChange,
@@ -81,6 +83,7 @@ export const DRadio: {
8183
<label
8284
{...restProps}
8385
className={getClassName(restProps.className, `${dPrefix}radio`, {
86+
[`${dPrefix}radio--vertical-center`]: dVerticalCenter,
8487
[`${dPrefix}radio--button`]: __type,
8588
[`${dPrefix}radio--button-${__type}`]: __type,
8689
[`${dPrefix}radio--${gSize}`]: gSize,

packages/ui/src/components/radio/RadioGroup.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export interface DRadioGroupProps<V extends DId> extends Omit<React.HTMLAttribut
1919
dList: DRadioItem<V>[];
2020
dModel?: V | null;
2121
dName?: string;
22+
dVerticalCenter?: boolean;
2223
dDisabled?: boolean;
2324
dType?: 'outline' | 'fill';
2425
dSize?: DSize;
@@ -33,6 +34,7 @@ export function DRadioGroup<V extends DId>(props: DRadioGroupProps<V>): JSX.Elem
3334
dList,
3435
dModel,
3536
dName,
37+
dVerticalCenter = false,
3638
dDisabled = false,
3739
dType,
3840
dSize,
@@ -63,6 +65,7 @@ export function DRadioGroup<V extends DId>(props: DRadioGroupProps<V>): JSX.Elem
6365
dList={dList}
6466
dModel={dModel}
6567
dName={dName}
68+
dVerticalCenter={dVerticalCenter}
6669
dDisabled={dDisabled}
6770
dRender={(nodes) => (
6871
<DCompose

packages/ui/src/components/radio/RadioGroupRenderer.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,24 @@ export interface DRadioGroupRendererProps<V extends DId> {
2323
dList: DRadioItem<V>[];
2424
dModel?: V | null;
2525
dName?: string;
26+
dVerticalCenter?: boolean;
2627
dDisabled?: boolean;
2728
dRender: (nodes: React.ReactElement[]) => JSX.Element | null;
2829
onModelChange?: (value: V) => void;
2930
}
3031

3132
const { COMPONENT_NAME } = registerComponentMate({ COMPONENT_NAME: 'DRadio.GroupRenderer' as const });
3233
export function DRadioGroupRenderer<V extends DId>(props: DRadioGroupRendererProps<V>): JSX.Element | null {
33-
const { dFormControl, dList, dModel, dName, dDisabled = false, dRender, onModelChange } = useComponentConfig(COMPONENT_NAME, props);
34+
const {
35+
dFormControl,
36+
dList,
37+
dModel,
38+
dName,
39+
dVerticalCenter = false,
40+
dDisabled = false,
41+
dRender,
42+
onModelChange,
43+
} = useComponentConfig(COMPONENT_NAME, props);
3444

3545
//#region Context
3646
const { gDisabled } = useGeneralContext();
@@ -57,6 +67,7 @@ export function DRadioGroupRenderer<V extends DId>(props: DRadioGroupRendererPro
5767
<DRadio
5868
key={item.value}
5969
dModel={item.value === value}
70+
dVerticalCenter={dVerticalCenter}
6071
dDisabled={item.disabled || disabled}
6172
dInputRender={(el) =>
6273
cloneHTMLElement(el, {

packages/ui/src/styles/components/checkbox.scss

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
position: relative;
2121
display: inline-flex;
22-
align-items: center;
22+
line-height: 1.25;
2323

2424
&:hover {
2525
@include e(input) {
@@ -96,8 +96,17 @@
9696
}
9797
}
9898

99+
@include m(vertical-center) {
100+
align-items: center;
101+
102+
@include e(state-container) {
103+
top: unset;
104+
}
105+
}
106+
99107
@include e(state-container) {
100108
position: relative;
109+
top: calc((1.25em - 16px) / 2);
101110
flex-shrink: 0;
102111
width: 16px;
103112
height: 16px;

packages/ui/src/styles/components/radio.scss

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
@include b(radio) {
55
position: relative;
66
display: inline-flex;
7-
align-items: center;
7+
line-height: 1.25;
88

99
&:hover {
1010
@include e(input) {
@@ -50,6 +50,7 @@
5050
}
5151

5252
@include m(button) {
53+
align-items: center;
5354
height: var(--#{$rd-prefix}size);
5455
white-space: nowrap;
5556
cursor: pointer;
@@ -114,8 +115,17 @@
114115
}
115116
}
116117

118+
@include m(vertical-center) {
119+
align-items: center;
120+
121+
@include e(state-container) {
122+
top: unset;
123+
}
124+
}
125+
117126
@include e(input-wrapper) {
118127
position: relative;
128+
top: calc((1.25em - 16px) / 2);
119129
flex-shrink: 0;
120130
width: 16px;
121131
height: 16px;

0 commit comments

Comments
 (0)