@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.
@@ -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 $, validPropertyValues as q, safeCustomElement as B } from "@justeattakeaway/pie-webc-core";
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.11.5";
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)} for="radioId">
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
- $(g)
143
+ B(g)
139
144
  ], o.prototype, "value", 2);
140
145
  e([
141
146
  c({ type: String }),
142
- q(g, E, l.status)
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
- B("pie-radio")
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.11.5",
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.19.0",
44
- "@justeattakeaway/pie-monorepo-utils": "0.6.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": "1.0.0"
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)} for="radioId">
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;