@justeattakeaway/pie-radio 0.11.5 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +18 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +13 -8
- package/dist/react.d.ts +1 -0
- package/package.json +4 -4
- package/src/index.ts +25 -1
- package/src/radio.scss +1 -1
package/custom-elements.json
CHANGED
|
@@ -168,6 +168,24 @@
|
|
|
168
168
|
"name": "formResetCallback",
|
|
169
169
|
"privacy": "public",
|
|
170
170
|
"description": "Called when the form that contains this component is reset.\nIf the current checked state is different to the default checked state,\nthe checked state is reset to the default checked state and a `change` event is emitted."
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"kind": "method",
|
|
174
|
+
"name": "_handleClick",
|
|
175
|
+
"privacy": "private",
|
|
176
|
+
"return": {
|
|
177
|
+
"type": {
|
|
178
|
+
"text": "void"
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
"parameters": [
|
|
182
|
+
{
|
|
183
|
+
"name": "event",
|
|
184
|
+
"type": {
|
|
185
|
+
"text": "MouseEvent"
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
]
|
|
171
189
|
}
|
|
172
190
|
],
|
|
173
191
|
"events": [
|
package/dist/index.d.ts
CHANGED
|
@@ -49,6 +49,7 @@ export declare class PieRadio extends PieRadio_base implements RadioProps {
|
|
|
49
49
|
* the checked state is reset to the default checked state and a `change` event is emitted.
|
|
50
50
|
*/
|
|
51
51
|
formResetCallback(): void;
|
|
52
|
+
private _handleClick;
|
|
52
53
|
updated(): void;
|
|
53
54
|
render(): TemplateResult<1>;
|
|
54
55
|
static styles: CSSResult;
|
package/dist/index.js
CHANGED
|
@@ -3,13 +3,13 @@ import { state as u, property as c, query as x } from "lit/decorators.js";
|
|
|
3
3
|
import { ifDefined as w } from "lit/directives/if-defined.js";
|
|
4
4
|
import { live as _ } from "lit/directives/live.js";
|
|
5
5
|
import { classMap as C } from "lit/directives/class-map.js";
|
|
6
|
-
import { FormControlMixin as A, RtlMixin as z, wrapNativeEvent as P, requiredProperty as
|
|
6
|
+
import { FormControlMixin as A, RtlMixin as z, wrapNativeEvent as P, requiredProperty as B, validPropertyValues as $, safeCustomElement as q } from "@justeattakeaway/pie-webc-core";
|
|
7
7
|
const b = class b extends k {
|
|
8
8
|
willUpdate() {
|
|
9
9
|
this.getAttribute("v") || this.setAttribute("v", b.v);
|
|
10
10
|
}
|
|
11
11
|
};
|
|
12
|
-
b.v = "0.
|
|
12
|
+
b.v = "0.12.0";
|
|
13
13
|
let h = b;
|
|
14
14
|
const E = ["default", "error"], l = {
|
|
15
15
|
checked: !1,
|
|
@@ -17,7 +17,7 @@ const E = ["default", "error"], l = {
|
|
|
17
17
|
disabled: !1,
|
|
18
18
|
required: !1,
|
|
19
19
|
status: "default"
|
|
20
|
-
}, S = '*,*:after,*:before{box-sizing:inherit}:host{display:block}.c-radio{--radio-dot-bg-color: var(--dt-color-content-interactive-primary);--radio-bg-color: transparent;--radio-bg-color--checked: var(--dt-color-interactive-brand);--radio-border-color: var(--dt-color-border-form);--radio-font-size: calc(var(--dt-font-body-l-size) * 1px);--radio-line-height: calc(var(--dt-font-body-l-line-height) * 1px);--radio-font-weight: var(--dt-font-weight-regular);--radio-text-color: var(--dt-color-content-default);--radio-size: 24px;--radio-dot-size: 8px;--radio-cursor: pointer;--radio-motion-easing: var(--dt-motion-easing-persistent-functional);--radio-border-width: 1px;display:flex;align-items:center;gap:var(--dt-spacing-b);cursor:var(--radio-cursor);font-size:var(--radio-font-size);line-height:var(--radio-line-height);font-weight:var(--radio-font-weight);color:var(--radio-text-color)}.c-radio .c-radio-input:hover:not(:checked,:disabled){--radio-bg-color: hsl(var(--dt-color-black-h), var(--dt-color-black-s), var(--dt-color-black-l), var(--dt-color-hover-01))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio .c-radio-input:hover:not(:checked,:disabled){--radio-bg-color: color-mix(in srgb, var(--dt-color-hover-01-bg) var(--dt-color-hover-01), transparent)}}.c-radio .c-radio-input:active:not(:checked,:disabled){--radio-bg-color: hsl(var(--dt-color-black-h), var(--dt-color-black-s), var(--dt-color-black-l), var(--dt-color-active-01))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio .c-radio-input:active:not(:checked,:disabled){--radio-bg-color: color-mix(in srgb, var(--dt-color-active-01-bg) var(--dt-color-active-01), transparent)}}.c-radio .c-radio-input:hover:checked:not(:disabled):before{--radio-bg-color--checked: hsl(var(--dt-color-interactive-brand-h), var(--dt-color-interactive-brand-s), calc(var(--dt-color-interactive-brand-l) - var(--dt-color-hover-01)));--radio-border-color: hsl(var(--dt-color-interactive-brand-h), var(--dt-color-interactive-brand-s), calc(var(--dt-color-interactive-brand-l) - var(--dt-color-hover-01)))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio .c-radio-input:hover:checked:not(:disabled):before{--radio-bg-color--checked: color-mix(in srgb, var(--dt-color-hover-01-bg) var(--dt-color-hover-01), var(dt-color-interactive-brand))}}.c-radio .c-radio-input:active:checked:not(:disabled):before{--radio-bg-color--checked: hsl(var(--dt-color-interactive-brand-h), var(--dt-color-interactive-brand-s), calc(var(--dt-color-interactive-brand-l) - var(--dt-color-active-01)));--radio-border-color: hsl(var(--dt-color-interactive-brand-h), var(--dt-color-interactive-brand-s), calc(var(--dt-color-interactive-brand-l) - var(--dt-color-active-01)))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio .c-radio-input:active:checked:not(:disabled):before{--radio-bg-color--checked: color-mix(in srgb, var(--dt-color-active-01-bg) var(--dt-color-active-01), var(dt-color-interactive-brand))}}.c-radio.is-disabled{--radio-cursor: not-allowed}.c-radio.c-radio--status-error{--radio-bg-color--checked: var(--dt-color-support-error);--radio-border-color: var(--dt-color-support-error)}.c-radio.c-radio--status-error .c-radio-input:hover:not(:checked,:disabled){--radio-bg-color: hsl(var(--dt-color-black-h), var(--dt-color-black-s), var(--dt-color-black-l), var(--dt-color-hover-01))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio.c-radio--status-error .c-radio-input:hover:not(:checked,:disabled){--radio-bg-color: color-mix(in srgb, var(--dt-color-hover-01-bg) var(--dt-color-hover-01), transparent)}}.c-radio.c-radio--status-error .c-radio-input:active:not(:checked,:disabled){--radio-bg-color: hsl(var(--dt-color-black-h), var(--dt-color-black-s), var(--dt-color-black-l), var(--dt-color-active-01))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio.c-radio--status-error .c-radio-input:active:not(:checked,:disabled){--radio-bg-color: color-mix(in srgb, var(--dt-color-active-01-bg) var(--dt-color-active-01), transparent)}}.c-radio.c-radio--status-error .c-radio-input:hover:checked:not(:disabled):before{--radio-bg-color--checked: hsl(var(--dt-color-support-error-h), var(--dt-color-support-error-s), calc(var(--dt-color-support-error-l) - var(--dt-color-hover-01)));--radio-border-color: hsl(var(--dt-color-support-error-h), var(--dt-color-support-error-s), calc(var(--dt-color-support-error-l) - var(--dt-color-hover-01)))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio.c-radio--status-error .c-radio-input:hover:checked:not(:disabled):before{--radio-bg-color--checked: color-mix(in srgb, var(--dt-color-hover-01-bg) var(--dt-color-hover-01), var(dt-color-support-error))}}.c-radio.c-radio--status-error .c-radio-input:active:checked:not(:disabled):before{--radio-bg-color--checked: hsl(var(--dt-color-support-error-h), var(--dt-color-support-error-s), calc(var(--dt-color-support-error-l) - var(--dt-color-active-01)));--radio-border-color: hsl(var(--dt-color-support-error-h), var(--dt-color-support-error-s), calc(var(--dt-color-support-error-l) - var(--dt-color-active-01)))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio.c-radio--status-error .c-radio-input:active:checked:not(:disabled):before{--radio-bg-color--checked: color-mix(in srgb, var(--dt-color-active-01-bg) var(--dt-color-active-01), var(dt-color-support-error))}}.c-radio .c-radio-input{align-self:flex-start;-webkit-appearance:none;-moz-appearance:none;appearance:none;display:block;position:relative;inline-size:var(--radio-size);block-size:var(--radio-size);border:var(--radio-border-width) solid var(--radio-border-color);border-radius:50%;margin:0;cursor:var(--radio-cursor);background-color:var(--radio-bg-color);flex-shrink:0}.c-radio .c-radio-input:before{--circle-size: calc(var(--radio-border-width) * -1);content:"";display:block;inset:var(--circle-size);border-radius:inherit;background-color:var(--radio-bg-color--checked);position:absolute;transform:scale(0)}.c-radio .c-radio-input:after{content:"";position:absolute;top:50%;left:50%;width:var(--radio-dot-size);height:var(--radio-dot-size);background-color:var(--radio-dot-bg-color);border-radius:50%;transform:translate(-50%,-50%) scale(0)}.c-radio .c-radio-input:checked:after{transform:translate(-50%,-50%) scale(1)}.c-radio .c-radio-input:checked:before{transform:scale(1)}.c-radio .c-radio-input:disabled{--radio-bg-color: var(--dt-color-disabled-01);--radio-border-color: var(--dt-color-border-default)}.c-radio .c-radio-input:checked:disabled{--radio-dot-bg-color: var(--dt-color-content-disabled);--radio-bg-color--checked: var(--dt-color-disabled-01)}.c-radio--allow-animation .c-radio-input{transition:background-color var(--dt-motion-timing-100) var(--radio-motion-easing)}@media (prefers-reduced-motion: no-preference){.c-radio--allow-animation .c-radio-input:not(:disabled):before{transition:all var(--dt-motion-timing-100) var(--radio-motion-easing)}}@media (prefers-reduced-motion: no-preference){.c-radio--allow-animation .c-radio-input:not(:disabled):after{transition:all var(--dt-motion-timing-100) var(--radio-motion-easing)}}@media (prefers-reduced-motion: no-preference){.c-radio--allow-animation .c-radio-input:not(:disabled):checked:after{transition:all var(--dt-motion-timing-150) var(--radio-motion-easing)}}:host(:focus-visible){outline:none}:host(:focus-visible) .c-radio .c-radio-input{box-shadow:0 0 0 2px var(--dt-color-focus-inner),0 0 0 4px var(--dt-color-focus-outer);outline:none}';
|
|
20
|
+
}, S = '*,*:after,*:before{box-sizing:inherit}:host{display:block}.c-radio{--radio-dot-bg-color: var(--dt-color-content-interactive-primary);--radio-bg-color: transparent;--radio-bg-color--checked: var(--dt-color-interactive-brand);--radio-border-color: var(--dt-color-border-form);--radio-font-size: calc(var(--dt-font-body-l-size) * 1px);--radio-line-height: calc(var(--dt-font-body-l-line-height) * 1px);--radio-font-weight: var(--dt-font-weight-regular);--radio-text-color: var(--dt-color-content-default-solid);--radio-size: 24px;--radio-dot-size: 8px;--radio-cursor: pointer;--radio-motion-easing: var(--dt-motion-easing-persistent-functional);--radio-border-width: 1px;display:flex;align-items:center;gap:var(--dt-spacing-b);cursor:var(--radio-cursor);font-size:var(--radio-font-size);line-height:var(--radio-line-height);font-weight:var(--radio-font-weight);color:var(--radio-text-color)}.c-radio .c-radio-input:hover:not(:checked,:disabled){--radio-bg-color: hsl(var(--dt-color-black-h), var(--dt-color-black-s), var(--dt-color-black-l), var(--dt-color-hover-01))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio .c-radio-input:hover:not(:checked,:disabled){--radio-bg-color: color-mix(in srgb, var(--dt-color-hover-01-bg) var(--dt-color-hover-01), transparent)}}.c-radio .c-radio-input:active:not(:checked,:disabled){--radio-bg-color: hsl(var(--dt-color-black-h), var(--dt-color-black-s), var(--dt-color-black-l), var(--dt-color-active-01))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio .c-radio-input:active:not(:checked,:disabled){--radio-bg-color: color-mix(in srgb, var(--dt-color-active-01-bg) var(--dt-color-active-01), transparent)}}.c-radio .c-radio-input:hover:checked:not(:disabled):before{--radio-bg-color--checked: hsl(var(--dt-color-interactive-brand-h), var(--dt-color-interactive-brand-s), calc(var(--dt-color-interactive-brand-l) - var(--dt-color-hover-01)));--radio-border-color: hsl(var(--dt-color-interactive-brand-h), var(--dt-color-interactive-brand-s), calc(var(--dt-color-interactive-brand-l) - var(--dt-color-hover-01)))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio .c-radio-input:hover:checked:not(:disabled):before{--radio-bg-color--checked: color-mix(in srgb, var(--dt-color-hover-01-bg) var(--dt-color-hover-01), var(dt-color-interactive-brand))}}.c-radio .c-radio-input:active:checked:not(:disabled):before{--radio-bg-color--checked: hsl(var(--dt-color-interactive-brand-h), var(--dt-color-interactive-brand-s), calc(var(--dt-color-interactive-brand-l) - var(--dt-color-active-01)));--radio-border-color: hsl(var(--dt-color-interactive-brand-h), var(--dt-color-interactive-brand-s), calc(var(--dt-color-interactive-brand-l) - var(--dt-color-active-01)))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio .c-radio-input:active:checked:not(:disabled):before{--radio-bg-color--checked: color-mix(in srgb, var(--dt-color-active-01-bg) var(--dt-color-active-01), var(dt-color-interactive-brand))}}.c-radio.is-disabled{--radio-cursor: not-allowed}.c-radio.c-radio--status-error{--radio-bg-color--checked: var(--dt-color-support-error);--radio-border-color: var(--dt-color-support-error)}.c-radio.c-radio--status-error .c-radio-input:hover:not(:checked,:disabled){--radio-bg-color: hsl(var(--dt-color-black-h), var(--dt-color-black-s), var(--dt-color-black-l), var(--dt-color-hover-01))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio.c-radio--status-error .c-radio-input:hover:not(:checked,:disabled){--radio-bg-color: color-mix(in srgb, var(--dt-color-hover-01-bg) var(--dt-color-hover-01), transparent)}}.c-radio.c-radio--status-error .c-radio-input:active:not(:checked,:disabled){--radio-bg-color: hsl(var(--dt-color-black-h), var(--dt-color-black-s), var(--dt-color-black-l), var(--dt-color-active-01))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio.c-radio--status-error .c-radio-input:active:not(:checked,:disabled){--radio-bg-color: color-mix(in srgb, var(--dt-color-active-01-bg) var(--dt-color-active-01), transparent)}}.c-radio.c-radio--status-error .c-radio-input:hover:checked:not(:disabled):before{--radio-bg-color--checked: hsl(var(--dt-color-support-error-h), var(--dt-color-support-error-s), calc(var(--dt-color-support-error-l) - var(--dt-color-hover-01)));--radio-border-color: hsl(var(--dt-color-support-error-h), var(--dt-color-support-error-s), calc(var(--dt-color-support-error-l) - var(--dt-color-hover-01)))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio.c-radio--status-error .c-radio-input:hover:checked:not(:disabled):before{--radio-bg-color--checked: color-mix(in srgb, var(--dt-color-hover-01-bg) var(--dt-color-hover-01), var(dt-color-support-error))}}.c-radio.c-radio--status-error .c-radio-input:active:checked:not(:disabled):before{--radio-bg-color--checked: hsl(var(--dt-color-support-error-h), var(--dt-color-support-error-s), calc(var(--dt-color-support-error-l) - var(--dt-color-active-01)));--radio-border-color: hsl(var(--dt-color-support-error-h), var(--dt-color-support-error-s), calc(var(--dt-color-support-error-l) - var(--dt-color-active-01)))}@supports (background-color: color-mix(in srgb,black,white)){.c-radio.c-radio--status-error .c-radio-input:active:checked:not(:disabled):before{--radio-bg-color--checked: color-mix(in srgb, var(--dt-color-active-01-bg) var(--dt-color-active-01), var(dt-color-support-error))}}.c-radio .c-radio-input{align-self:flex-start;-webkit-appearance:none;-moz-appearance:none;appearance:none;display:block;position:relative;inline-size:var(--radio-size);block-size:var(--radio-size);border:var(--radio-border-width) solid var(--radio-border-color);border-radius:50%;margin:0;cursor:var(--radio-cursor);background-color:var(--radio-bg-color);flex-shrink:0}.c-radio .c-radio-input:before{--circle-size: calc(var(--radio-border-width) * -1);content:"";display:block;inset:var(--circle-size);border-radius:inherit;background-color:var(--radio-bg-color--checked);position:absolute;transform:scale(0)}.c-radio .c-radio-input:after{content:"";position:absolute;top:50%;left:50%;width:var(--radio-dot-size);height:var(--radio-dot-size);background-color:var(--radio-dot-bg-color);border-radius:50%;transform:translate(-50%,-50%) scale(0)}.c-radio .c-radio-input:checked:after{transform:translate(-50%,-50%) scale(1)}.c-radio .c-radio-input:checked:before{transform:scale(1)}.c-radio .c-radio-input:disabled{--radio-bg-color: var(--dt-color-disabled-01);--radio-border-color: var(--dt-color-border-default)}.c-radio .c-radio-input:checked:disabled{--radio-dot-bg-color: var(--dt-color-content-disabled);--radio-bg-color--checked: var(--dt-color-disabled-01)}.c-radio--allow-animation .c-radio-input{transition:background-color var(--dt-motion-timing-100) var(--radio-motion-easing)}@media (prefers-reduced-motion: no-preference){.c-radio--allow-animation .c-radio-input:not(:disabled):before{transition:all var(--dt-motion-timing-100) var(--radio-motion-easing)}}@media (prefers-reduced-motion: no-preference){.c-radio--allow-animation .c-radio-input:not(:disabled):after{transition:all var(--dt-motion-timing-100) var(--radio-motion-easing)}}@media (prefers-reduced-motion: no-preference){.c-radio--allow-animation .c-radio-input:not(:disabled):checked:after{transition:all var(--dt-motion-timing-150) var(--radio-motion-easing)}}:host(:focus-visible){outline:none}:host(:focus-visible) .c-radio .c-radio-input{box-shadow:0 0 0 2px var(--dt-color-focus-inner),0 0 0 4px var(--dt-color-focus-outer);outline:none}';
|
|
21
21
|
var F = Object.defineProperty, D = Object.getOwnPropertyDescriptor, e = (r, a, i, d) => {
|
|
22
22
|
for (var t = d > 1 ? void 0 : d ? D(a, i) : a, s = r.length - 1, n; s >= 0; s--)
|
|
23
23
|
(n = r[s]) && (t = (d ? n(a, i, t) : n(t)) || t);
|
|
@@ -33,7 +33,7 @@ let o = class extends A(z(h)) {
|
|
|
33
33
|
const { signal: r } = this._abortController;
|
|
34
34
|
this.setAttribute("role", "radio"), this.addEventListener("pie-radio-group-disabled", (a) => {
|
|
35
35
|
this._disabledByParent = a.detail.disabled;
|
|
36
|
-
}, { signal: r });
|
|
36
|
+
}, { signal: r }), this.addEventListener("click", this._handleClick, { signal: r });
|
|
37
37
|
}
|
|
38
38
|
disconnectedCallback() {
|
|
39
39
|
super.disconnectedCallback(), this._abortController.abort();
|
|
@@ -73,6 +73,11 @@ let o = class extends A(z(h)) {
|
|
|
73
73
|
const r = new Event("change", { bubbles: !0, composed: !0 });
|
|
74
74
|
this.dispatchEvent(r), this._handleFormAssociation();
|
|
75
75
|
}
|
|
76
|
+
// Triggers a programmatic click on the underlying radio input.
|
|
77
|
+
// This is primarily used to ensure that the radio input is selected when using screenreaders like Apple VoiceOver.
|
|
78
|
+
_handleClick(r) {
|
|
79
|
+
r.composedPath()[0] !== this._radio && (this.disabled || this._disabledByParent || this._radio.click());
|
|
80
|
+
}
|
|
76
81
|
updated() {
|
|
77
82
|
this.setAttribute("aria-checked", String(this.checked)), this._handleFormAssociation();
|
|
78
83
|
}
|
|
@@ -93,7 +98,7 @@ let o = class extends A(z(h)) {
|
|
|
93
98
|
"c-radio--allow-animation": d
|
|
94
99
|
};
|
|
95
100
|
return m`
|
|
96
|
-
<label class=${C(f)}
|
|
101
|
+
<label class=${C(f)}>
|
|
97
102
|
<input
|
|
98
103
|
tabindex="-1"
|
|
99
104
|
class="c-radio-input"
|
|
@@ -135,17 +140,17 @@ e([
|
|
|
135
140
|
], o.prototype, "required", 2);
|
|
136
141
|
e([
|
|
137
142
|
c({ type: String }),
|
|
138
|
-
|
|
143
|
+
B(g)
|
|
139
144
|
], o.prototype, "value", 2);
|
|
140
145
|
e([
|
|
141
146
|
c({ type: String }),
|
|
142
|
-
|
|
147
|
+
$(g, E, l.status)
|
|
143
148
|
], o.prototype, "status", 2);
|
|
144
149
|
e([
|
|
145
150
|
x('input[type="radio"]')
|
|
146
151
|
], o.prototype, "_radio", 2);
|
|
147
152
|
o = e([
|
|
148
|
-
|
|
153
|
+
q("pie-radio")
|
|
149
154
|
], o);
|
|
150
155
|
export {
|
|
151
156
|
o as PieRadio,
|
package/dist/react.d.ts
CHANGED
|
@@ -52,6 +52,7 @@ declare class PieRadio_2 extends PieRadio_base implements RadioProps {
|
|
|
52
52
|
* the checked state is reset to the default checked state and a `change` event is emitted.
|
|
53
53
|
*/
|
|
54
54
|
formResetCallback(): void;
|
|
55
|
+
private _handleClick;
|
|
55
56
|
updated(): void;
|
|
56
57
|
render(): TemplateResult<1>;
|
|
57
58
|
static styles: CSSResult;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@justeattakeaway/pie-radio",
|
|
3
3
|
"description": "PIE Design System Radio built using Web Components",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.12.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/justeattakeaway/pie",
|
|
@@ -40,12 +40,12 @@
|
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@custom-elements-manifest/analyzer": "0.9.0",
|
|
42
42
|
"@justeattakeaway/pie-components-config": "0.21.0",
|
|
43
|
-
"@justeattakeaway/pie-css": "0.
|
|
44
|
-
"@justeattakeaway/pie-monorepo-utils": "0.
|
|
43
|
+
"@justeattakeaway/pie-css": "0.22.0",
|
|
44
|
+
"@justeattakeaway/pie-monorepo-utils": "0.7.0",
|
|
45
45
|
"cem-plugin-module-file-extensions": "0.0.5"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@justeattakeaway/pie-webc-core": "
|
|
48
|
+
"@justeattakeaway/pie-webc-core": "2.0.0"
|
|
49
49
|
},
|
|
50
50
|
"volta": {
|
|
51
51
|
"extends": "../../../package.json"
|
package/src/index.ts
CHANGED
|
@@ -71,6 +71,11 @@ export class PieRadio extends FormControlMixin(RtlMixin(PieElement)) implements
|
|
|
71
71
|
const { signal } = this._abortController;
|
|
72
72
|
this.setAttribute('role', 'radio');
|
|
73
73
|
this.addEventListener('pie-radio-group-disabled', (e: CustomEventInit) => { this._disabledByParent = e.detail.disabled; }, { signal });
|
|
74
|
+
|
|
75
|
+
// This is required to ensure that programmatic clicks correctly select the radio input in the template. This is primarily
|
|
76
|
+
// how screen readers such as Apple VoiceOver interact with the component.
|
|
77
|
+
// Without this, double tapping the radio input would not select it when using VoiceOver.
|
|
78
|
+
this.addEventListener('click', this._handleClick, { signal });
|
|
74
79
|
}
|
|
75
80
|
|
|
76
81
|
disconnectedCallback () : void {
|
|
@@ -133,6 +138,22 @@ export class PieRadio extends FormControlMixin(RtlMixin(PieElement)) implements
|
|
|
133
138
|
this._handleFormAssociation();
|
|
134
139
|
}
|
|
135
140
|
|
|
141
|
+
// Triggers a programmatic click on the underlying radio input.
|
|
142
|
+
// This is primarily used to ensure that the radio input is selected when using screenreaders like Apple VoiceOver.
|
|
143
|
+
private _handleClick (event: MouseEvent): void {
|
|
144
|
+
// This guard prevents an infinite loop by ignoring the programmatic click
|
|
145
|
+
// that this handler generates as it bubbles back up from the internal input.
|
|
146
|
+
if (event.composedPath()[0] === this._radio) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (this.disabled || this._disabledByParent) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
this._radio.click();
|
|
155
|
+
}
|
|
156
|
+
|
|
136
157
|
updated () {
|
|
137
158
|
// Ensure aria-checked reflects the checked state
|
|
138
159
|
this.setAttribute('aria-checked', String(this.checked));
|
|
@@ -161,8 +182,11 @@ export class PieRadio extends FormControlMixin(RtlMixin(PieElement)) implements
|
|
|
161
182
|
'c-radio--allow-animation': _isAnimationAllowed,
|
|
162
183
|
};
|
|
163
184
|
|
|
185
|
+
// NOTE: The label element here does not require a `for` attribute. This is because the click logic is handled by the component itself.
|
|
186
|
+
// Adding a `for` attribute would cause multiple click events to be fired which could lead to unexpected behaviour that might impact accessibility, performance and analytics.
|
|
187
|
+
// We still use a label element for good semantics.
|
|
164
188
|
return html`
|
|
165
|
-
<label class=${classMap(classes)}
|
|
189
|
+
<label class=${classMap(classes)}>
|
|
166
190
|
<input
|
|
167
191
|
tabindex="-1"
|
|
168
192
|
class="c-radio-input"
|
package/src/radio.scss
CHANGED
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
--radio-font-size: #{p.font-size(--dt-font-body-l-size)};
|
|
55
55
|
--radio-line-height: #{p.font-size(--dt-font-body-l-line-height)};
|
|
56
56
|
--radio-font-weight: var(--dt-font-weight-regular);
|
|
57
|
-
--radio-text-color: var(--dt-color-content-default);
|
|
57
|
+
--radio-text-color: var(--dt-color-content-default-solid);
|
|
58
58
|
--radio-size: 24px;
|
|
59
59
|
--radio-dot-size: 8px;
|
|
60
60
|
--radio-cursor: pointer;
|