From 3e79d6619be7544355c218e7ec6d77bb7723becd Mon Sep 17 00:00:00 2001 From: "polosatov.alexander" Date: Wed, 14 Jun 2023 13:55:00 +0400 Subject: [PATCH] RadioGroup: The radio button's dot should be centered when the browser window is zoomed out and the compact Material theme is used [T1165339] (#24867) --- scss/widgets/generic/list/_index.scss | 4 +- scss/widgets/generic/radioButton/_index.scss | 63 ++++++++---------- scss/widgets/generic/radioGroup/_index.scss | 2 +- scss/widgets/material/list/_index.scss | 2 +- scss/widgets/material/radioButton/_index.scss | 55 ++++++--------- .../tests/editors/radioGroup/common.ts | 21 ++++++ ...up in scaled container (generic-light).png | Bin 0 -> 2751 bytes ...aled container (generic-light-compact).png | Bin 0 -> 2193 bytes ...scaled container (material-blue-light).png | Bin 0 -> 2991 bytes ...ontainer (material-blue-light-compact).png | Bin 0 -> 2428 bytes 10 files changed, 74 insertions(+), 73 deletions(-) create mode 100644 testing/testcafe/tests/editors/radioGroup/etalons/RadioGroup in scaled container (generic-light).png create mode 100644 testing/testcafe/tests/editors/radioGroup/etalons/RadioGroup in scaled container (generic-light-compact).png create mode 100644 testing/testcafe/tests/editors/radioGroup/etalons/RadioGroup in scaled container (material-blue-light).png create mode 100644 testing/testcafe/tests/editors/radioGroup/etalons/RadioGroup in scaled container (material-blue-light-compact).png diff --git a/scss/widgets/generic/list/_index.scss b/scss/widgets/generic/list/_index.scss index 07732f2d93af..3138371f7fab 100644 --- a/scss/widgets/generic/list/_index.scss +++ b/scss/widgets/generic/list/_index.scss @@ -141,14 +141,14 @@ $generic-list-search-editor-height: round($generic-base-line-height * $generic-b .dx-list-item, .dx-list-select-all { &.dx-state-hover { - .dx-radiobutton-icon::before, + .dx-radiobutton-icon, .dx-checkbox-icon { border-color: $checkbox-hover-border-color; } } &.dx-state-focused { - .dx-radiobutton-icon::before, + .dx-radiobutton-icon, .dx-checkbox-icon { border: 1px solid $checkbox-focused-borderd-color; } diff --git a/scss/widgets/generic/radioButton/_index.scss b/scss/widgets/generic/radioButton/_index.scss index f1ed306cfbde..151dc994ab58 100644 --- a/scss/widgets/generic/radioButton/_index.scss +++ b/scss/widgets/generic/radioButton/_index.scss @@ -10,62 +10,61 @@ // adduse $generic-radiobutton-border-width: 1px; -$generic-radiobutton-inner-size: $generic-radiobutton-size - $generic-radiobutton-border-width * 2; +$dot-icon-border-width: math.div($generic-radiobutton-size - $generic-radiobutton-border-width * 2 - $generic-radiobutton-dot-size, 2); .dx-radiobutton-icon { width: $generic-radiobutton-size; height: $generic-radiobutton-size; -} - -.dx-radiobutton-icon::before { - display: block; - width: $generic-radiobutton-inner-size; - height: $generic-radiobutton-inner-size; border: $generic-radiobutton-border-width solid $radiogroup-border-color; background-color: $radiogroup-bg; - content: ""; border-radius: math.div($generic-radiobutton-size, 2); - box-sizing: content-box; } -.dx-radiobutton-icon-checked .dx-radiobutton-icon-dot { - display: block; - margin-top: math.div(-$generic-radiobutton-size, 2) - math.div($generic-radiobutton-dot-size, 2); - margin-left: math.div($generic-radiobutton-size, 2) - math.div($generic-radiobutton-dot-size, 2); - width: $generic-radiobutton-dot-size; - height: $generic-radiobutton-dot-size; - background: $radiogroup-checked-bg; - content: ""; - border-radius: math.div($generic-radiobutton-dot-size, 2); +.dx-radiobutton-icon-dot { + width: 100%; + height: 100%; + border-radius: 50%; + border-width: 0; + border-color: $radiogroup-bg; + border-style: solid; +} + +.dx-radiobutton-icon-checked { + .dx-radiobutton-icon-dot { + background-color: $radiogroup-checked-bg; + border-width: $dot-icon-border-width; + } } .dx-radiobutton { line-height: $generic-radiobutton-size; &.dx-state-readonly { - .dx-radiobutton-icon::before { + .dx-radiobutton-icon { border-color: $radiogroup-readonly-border-color; background-color: $radiogroup-readonly-bg; } } &.dx-state-hover { - .dx-radiobutton-icon::before { + .dx-radiobutton-icon { border-color: $radiogroup-hover-border-color; } } &.dx-state-active { - .dx-radiobutton-icon::before { + .dx-radiobutton-icon { background-color: $radiobutton-active-bg; } + + .dx-radiobutton-icon-dot { + border-color: $radiogroup-border-color; + } } &.dx-state-focused { - &:not(.dx-state-active) { - .dx-radiobutton-icon::before { - border: $generic-radiobutton-border-width solid $radiobutton-focused-border-color; - } + .dx-radiobutton-icon { + border-color: $radiobutton-focused-border-color; } } @@ -75,19 +74,19 @@ $generic-radiobutton-inner-size: $generic-radiobutton-size - $generic-radiobutto } .dx-invalid { - .dx-radiobutton-icon::before { + .dx-radiobutton-icon { border-color: $radiobutton-invalid-faded-border-color; } .dx-state-hover { - &.dx-radiobutton .dx-radiobutton-icon::before { + &.dx-radiobutton .dx-radiobutton-icon { border-color: $radiobutton-invalid-hover-border-color; } } .dx-state-focused { &.dx-radiobutton { - .dx-radiobutton-icon::before { + .dx-radiobutton-icon { border-color: $radiobutton-invalid-focused-border-color; } } @@ -101,11 +100,3 @@ $generic-radiobutton-inner-size: $generic-radiobutton-size - $generic-radiobutto } } } - -.dx-rtl .dx-radiobutton, -.dx-rtl.dx-radiobutton { - &.dx-radiobutton-checked .dx-radiobutton-icon-dot { - margin-right: math.div($generic-radiobutton-inner-size, 4) + $generic-radiobutton-border-width; - margin-left: 0; - } -} diff --git a/scss/widgets/generic/radioGroup/_index.scss b/scss/widgets/generic/radioGroup/_index.scss index a1b3c6492d18..432c24dddda5 100644 --- a/scss/widgets/generic/radioGroup/_index.scss +++ b/scss/widgets/generic/radioGroup/_index.scss @@ -20,7 +20,7 @@ } &.dx-state-readonly { - .dx-radiobutton-icon::before { + .dx-radiobutton-icon { border-color: $radiogroup-readonly-border-color; background-color: $radiogroup-readonly-bg; } diff --git a/scss/widgets/material/list/_index.scss b/scss/widgets/material/list/_index.scss index 3854950d788c..f14f594a8817 100644 --- a/scss/widgets/material/list/_index.scss +++ b/scss/widgets/material/list/_index.scss @@ -125,7 +125,7 @@ $material-list-searchbox-padding-top: $material-list-searchbox-vertical-padding .dx-list-select-all, .dx-list-item { &.dx-state-hover { - .dx-radiobutton-icon::before { + .dx-radiobutton-icon { border-color: $checkbox-hover-border-color; } } diff --git a/scss/widgets/material/radioButton/_index.scss b/scss/widgets/material/radioButton/_index.scss index 860ac7a0143c..4452f513b854 100644 --- a/scss/widgets/material/radioButton/_index.scss +++ b/scss/widgets/material/radioButton/_index.scss @@ -10,8 +10,8 @@ // adduse $material-radiobutton-border-width: 2px; -$material-radiobutton-inner-size: $material-radiobutton-size - $material-radiobutton-border-width * 2; $material-radiobutton-ripple-transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1); +$dot-icon-border-width: math.div($material-radiobutton-size - $material-radiobutton-border-width * 2 - $material-radiobutton-dot-size, 2); .dx-radiobutton-icon { width: $material-radiobutton-size; @@ -34,32 +34,29 @@ $material-radiobutton-ripple-transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1) transition: $material-radiobutton-ripple-transition; } - &::before { - display: block; - width: $material-radiobutton-inner-size; - height: $material-radiobutton-inner-size; - border: $material-radiobutton-border-width solid $radiogroup-border-color; - background-color: $radiogroup-bg; - content: ""; - border-radius: math.div($material-radiobutton-size, 2); - box-sizing: content-box; - } + border: $material-radiobutton-border-width solid $radiogroup-border-color; + background-color: $radiogroup-bg; + border-radius: math.div($material-radiobutton-size, 2); +} + +.dx-radiobutton-icon-dot { + width: 100%; + height: 100%; + border-radius: 50%; + border-width: 0; + border-color: $radiogroup-bg; + background-color: $radiogroup-bg; + border-style: solid; + transform: scale(0); } .dx-radiobutton-icon-checked { - &::before { - border-color: $radiogroup-checked-bg; - } + border-color: $radiogroup-checked-bg; .dx-radiobutton-icon-dot { - display: block; - margin-top: math.div(-$material-radiobutton-size, 2) - math.div($material-radiobutton-dot-size, 2); - margin-left: math.div($material-radiobutton-size, 2) - math.div($material-radiobutton-dot-size, 2); - width: $material-radiobutton-dot-size; - height: $material-radiobutton-dot-size; - background: $radiogroup-checked-bg; - content: ""; - border-radius: math.div($material-radiobutton-dot-size, 2); + background-color: $radiogroup-checked-bg; + border-width: $dot-icon-border-width; + transform: scale(1); } } @@ -95,13 +92,13 @@ $material-radiobutton-ripple-transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1) background-color: $radiogroup-border-color; } - .dx-radiobutton-icon::before { + .dx-radiobutton-icon { border-color: $radiogroup-border-color; } } .dx-invalid { - .dx-radiobutton-icon::before { + .dx-radiobutton-icon { border-color: $radiobutton-invalid-faded-border-color; } @@ -112,7 +109,7 @@ $material-radiobutton-ripple-transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1) .dx-state-active, .dx-state-focused { &.dx-radiobutton { - .dx-radiobutton-icon::before { + .dx-radiobutton-icon { border-color: $radiobutton-invalid-focused-border-color; } @@ -135,11 +132,3 @@ $material-radiobutton-ripple-transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1) } } } - -.dx-rtl .dx-radiobutton, -.dx-rtl.dx-radiobutton { - &.dx-radiobutton-checked .dx-radiobutton-icon-dot { - margin-right: math.div($material-radiobutton-size, 2) - math.div($material-radiobutton-dot-size, 2); - margin-left: 0; - } -} diff --git a/testing/testcafe/tests/editors/radioGroup/common.ts b/testing/testcafe/tests/editors/radioGroup/common.ts index e422796cac42..4b3d33759aea 100644 --- a/testing/testcafe/tests/editors/radioGroup/common.ts +++ b/testing/testcafe/tests/editors/radioGroup/common.ts @@ -1,6 +1,10 @@ +import { createScreenshotsComparer } from 'devextreme-screenshot-comparer'; +import { Selector } from 'testcafe'; +import { testScreenshot } from '../../../helpers/themeUtils'; import url from '../../../helpers/getPageUrl'; import RadioGroup from '../../../model/radioGroup'; import createWidget from '../../../helpers/createWidget'; +import { setStyleAttribute } from '../../../helpers/domUtils'; fixture.disablePageReloads`Radio Group` .page(url(__dirname, '../../container.html')); @@ -71,3 +75,20 @@ test('Radio buttons placed into the template should not be selected after clicki layout: 'horizontal', }), })); + +test('Dot of Radio button placed in scaled container should have valid centering(T1165339)', async (t) => { + const { takeScreenshot, compareResults } = createScreenshotsComparer(t); + + await testScreenshot(t, takeScreenshot, 'RadioGroup in scaled container.png', { element: '#container', shouldTestInCompact: true }); + + await t + .expect(compareResults.isValid()) + .ok(compareResults.errorMessages()); +}).before(async () => { + await setStyleAttribute(Selector('#container'), 'transform: scale(0.7);'); + + await createWidget('dxRadioGroup', { + items: ['One', 'Two', 'Three'], + value: 'Two', + }, '#container'); +}); diff --git a/testing/testcafe/tests/editors/radioGroup/etalons/RadioGroup in scaled container (generic-light).png b/testing/testcafe/tests/editors/radioGroup/etalons/RadioGroup in scaled container (generic-light).png new file mode 100644 index 0000000000000000000000000000000000000000..3bf87f17ad399088342de99d78266f3111796e8d GIT binary patch literal 2751 zcmdT``CHO?9;fLt(~e0yT+6l`^QcTk^FSRdHMGnF!3)vVJV0$Ubkszrdd#O(S~X(B zgHcj31T&-(6+51l#*37INr!Pq^MZ`L!ZY^+I6v(E1-sAlefS=q_x*moUvF;v`grPU z8)!oy5MB8BbN&#>#xLO6OKS`G-Mt{-gWEUob8d+A4Id4%`ymkRbk*C`OSibN`6~YO z&?0rs!6w$)%E3m6>%l#`H$1`{aBqD6`DrHMa1-yyaL2%n=UjZ{;d9zp|G&Yd3;i+= zv=(w7kK}u5CnL@5MBEu-0pfu`9xnzlpR~5t=jLv9_cIpEMl(gj!&Uvzz+IbU3dKIP%&)L|Ry@=I z3pLPw?aPv5ImYmJSPtSOIq>-2%LThNGU*-`l%AR@Q~x?dv7E~-vhrvS^T|EqM)Gop z7i+0y5@5nf{JS`)-mS{)d^y*^&=A21(O*|ji;Q#w;?KH57zuWa%r;h*OG9XL`gE1c z(!@~*A`NZs%!ZVbhFitdy$6H_s^Q0YzVDwWusnY8kx6XB0w#Q{>hr^2}`aF$9+bvsvzNTnH4H1;( zE~|3^y1KgY2?-aXqM{rLOHJw+UkoIel=NjDi2AV18@9jCLE?hL!^J(%SqxT-f)|Q@ zpMdn!i%&~Kx~_b_*}>P(liImBhD;`N!jlcVW?|CKFH?i5D+|fx z_Q_`|#?9d0>gT(c!!rDF4)}?`o0yo)Ey)`gAxv2#|B#S)&`Dz7|-Y&O?iZ5ES*R;WFQ%J zLB~~N0f8jIX!>ruOiO;Dhn=(_MoCTK-`bX56k%;aEDpq@8ujUV)-R(eGXzY2e*T@R z^Wu<2UIUU*%{r`wFehokvfIfBtmgnUqRV|e;l=cZhD$8@x(gR1?lbI?+Em0w`T}ef(l9lH-C%zLr-+aeh}6v9a2r5Y@WMrE~05zCSsVAysSGWkSWb& zSwoWk{$kBx2OFdVB4(_H;beo}`aL2FcdepjPU5--mjF{9v`Ty8pUwZ(-i{d6%wouE zzAB6i);>5f(*zMeuVqYIcE&QfTefUbq4woVH|FJ(6n~*mNGUBXvGNFgmL%#ecbf0_ zw%n$6x?-gQA9iiEJx5ZQ&9a@Jme?!}=6phsN9<*IM=q(TXm@J4^ED(-A%9bJltQ8O zzh}qJugnT?z;2<(Srw9h{8V=T{(UGE`mnCfEH{!4TCwMt&l@FSgUZKGr8X7glUyq9 zqA0X6X$&OBj9~^+YC`Vj8D$3zWz80H$HvA~;j;4gSz_0|t~y>FEAT0ItnTacOO$d0 zF4NZS!{5Xdnk3bWPbT$8IPva%)lq;?-5+PVa$0%;4E}h=6Y)B- zkJI!)Nl>gXzhYx92~3SDGi%wSG_lE=^a)Vw-LOKUj_) zzj6IbG^cZB=E>f@d-dFlV1g135+ED+bK6C4Z^x)*B4!_RYx?5oeQ~BbX912yfW#Og z|K>0xpb{$&jm*daW}ICqm~fC3OD^;1*gu-$0J;n)r>{8cpzxazKhLKPtpF0+@!< zK1Fw=qM0B%z*g;Ku=x%i6x9XP;y?Z7koq0G>TKSQ$;n!(*h$e!i=`5f4XrbGD$<9y z5f=W)qda)fC&A<}Pye2NcF&$YOCQ++1QV&o%!~5w80!N}vXuu<0mw8M#|a;Nb_Inx zNe<9+=O(462cg+)_R@!vOHf9Yu)4+ z^ON7%!eI5P+ literal 0 HcmV?d00001 diff --git a/testing/testcafe/tests/editors/radioGroup/etalons/RadioGroup in scaled container (generic-light-compact).png b/testing/testcafe/tests/editors/radioGroup/etalons/RadioGroup in scaled container (generic-light-compact).png new file mode 100644 index 0000000000000000000000000000000000000000..a969b42e388017157b134992c912309f125598c1 GIT binary patch literal 2193 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 literal 0 HcmV?d00001