@justeattakeaway/pie-switch 2.0.6 → 2.1.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.
@@ -139,6 +139,15 @@
139
139
  },
140
140
  "privacy": "public"
141
141
  },
142
+ {
143
+ "kind": "field",
144
+ "name": "_isAnimationAllowed",
145
+ "type": {
146
+ "text": "boolean"
147
+ },
148
+ "privacy": "private",
149
+ "default": "false"
150
+ },
142
151
  {
143
152
  "kind": "method",
144
153
  "name": "handleFormAssociation",
@@ -265,10 +274,6 @@
265
274
  {
266
275
  "name": "FormControlMixin",
267
276
  "package": "@justeattakeaway/pie-webc-core"
268
- },
269
- {
270
- "name": "RtlMixin",
271
- "package": "@justeattakeaway/pie-webc-core"
272
277
  }
273
278
  ],
274
279
  "superclass": {
package/dist/index.d.ts CHANGED
@@ -4,7 +4,6 @@ import { FormControlInterface } from '@justeattakeaway/pie-webc-core';
4
4
  import { GenericConstructor } from '@justeattakeaway/pie-webc-core';
5
5
  import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
6
6
  import { PIEInputElement } from '@justeattakeaway/pie-webc-core';
7
- import { RTLInterface } from '@justeattakeaway/pie-webc-core';
8
7
  import { TemplateResult } from 'lit-html';
9
8
 
10
9
  declare type AriaProps = {
@@ -40,6 +39,7 @@ export declare class PieSwitch extends PieSwitch_base implements SwitchProps, PI
40
39
  disabled: boolean;
41
40
  private input;
42
41
  focusTarget: HTMLElement;
42
+ private _isAnimationAllowed;
43
43
  protected firstUpdated(): void;
44
44
  protected updated(): void;
45
45
  static styles: CSSResult;
@@ -91,7 +91,7 @@ export declare class PieSwitch extends PieSwitch_base implements SwitchProps, PI
91
91
  render(): TemplateResult<1>;
92
92
  }
93
93
 
94
- declare const PieSwitch_base: GenericConstructor<FormControlInterface> & GenericConstructor<RTLInterface> & typeof PieElement;
94
+ declare const PieSwitch_base: GenericConstructor<FormControlInterface> & typeof PieElement;
95
95
 
96
96
  export declare interface SwitchProps {
97
97
  /**
package/dist/index.js CHANGED
@@ -1,15 +1,15 @@
1
1
  import { LitElement as Ft, nothing as L, html as N, unsafeCSS as It } from "lit";
2
- import { property as y, query as dt } from "lit/decorators.js";
3
- import { classMap as St } from "lit/directives/class-map.js";
4
- import { ifDefined as Vt } from "lit/directives/if-defined.js";
5
- import { FormControlMixin as Tt, RtlMixin as Lt, wrapNativeEvent as Nt, validPropertyValues as Ot, safeCustomElement as Pt } from "@justeattakeaway/pie-webc-core";
2
+ import { property as y, query as dt, state as St } from "lit/decorators.js";
3
+ import { classMap as Vt } from "lit/directives/class-map.js";
4
+ import { ifDefined as Tt } from "lit/directives/if-defined.js";
5
+ import { FormControlMixin as Lt, wrapNativeEvent as Nt, validPropertyValues as Ot, safeCustomElement as Pt } from "@justeattakeaway/pie-webc-core";
6
6
  import "@justeattakeaway/pie-icons-webc/dist/IconCheck.js";
7
7
  const O = class O extends Ft {
8
8
  willUpdate() {
9
9
  this.getAttribute("v") || this.setAttribute("v", O.v);
10
10
  }
11
11
  };
12
- O.v = "2.0.6";
12
+ O.v = "2.1.0";
13
13
  let q = O;
14
14
  (function() {
15
15
  (function(n) {
@@ -65,8 +65,8 @@ let q = O;
65
65
  get() {
66
66
  return a;
67
67
  },
68
- set(s) {
69
- a = s, e.isConnected ? e.setAttribute(r, s) : A.set(e, t);
68
+ set(o) {
69
+ a = o, e.isConnected ? e.setAttribute(r, o) : A.set(e, t);
70
70
  }
71
71
  });
72
72
  }
@@ -77,18 +77,18 @@ let q = O;
77
77
  }
78
78
  const J = (e, t = !1) => {
79
79
  const i = document.createTreeWalker(e, NodeFilter.SHOW_ELEMENT, {
80
- acceptNode(s) {
81
- return c.has(s) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
80
+ acceptNode(o) {
81
+ return c.has(o) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
82
82
  }
83
83
  });
84
84
  let a = i.nextNode();
85
85
  const r = !t || e.disabled;
86
86
  for (; a; )
87
- a.formDisabledCallback && r && R(a, e.disabled), a = i.nextNode();
87
+ a.formDisabledCallback && r && D(a, e.disabled), a = i.nextNode();
88
88
  }, Q = { attributes: !0, attributeFilter: ["disabled", "name"] }, I = T() ? new MutationObserver((e) => {
89
89
  for (const t of e) {
90
90
  const i = t.target;
91
- if (t.attributeName === "disabled" && (i.constructor.formAssociated ? R(i, i.hasAttribute("disabled")) : i.localName === "fieldset" && J(i)), t.attributeName === "name" && i.constructor.formAssociated) {
91
+ if (t.attributeName === "disabled" && (i.constructor.formAssociated ? D(i, i.hasAttribute("disabled")) : i.localName === "fieldset" && J(i)), t.attributeName === "name" && i.constructor.formAssociated) {
92
92
  const a = c.get(i), r = B.get(i);
93
93
  a.setFormValue(r);
94
94
  }
@@ -96,21 +96,21 @@ let q = O;
96
96
  }) : {};
97
97
  function _(e) {
98
98
  e.forEach((t) => {
99
- const { addedNodes: i, removedNodes: a } = t, r = Array.from(i), s = Array.from(a);
100
- r.forEach((o) => {
99
+ const { addedNodes: i, removedNodes: a } = t, r = Array.from(i), o = Array.from(a);
100
+ r.forEach((s) => {
101
101
  var u;
102
- if (c.has(o) && o.constructor.formAssociated && Y(o), A.has(o)) {
103
- const d = A.get(o);
102
+ if (c.has(s) && s.constructor.formAssociated && Y(s), A.has(s)) {
103
+ const d = A.get(s);
104
104
  Object.keys(F).filter((b) => d[b] !== null).forEach((b) => {
105
- o.setAttribute(F[b], d[b]);
106
- }), A.delete(o);
105
+ s.setAttribute(F[b], d[b]);
106
+ }), A.delete(s);
107
107
  }
108
- if (C.has(o)) {
109
- const d = C.get(o);
110
- o.setAttribute("internals-valid", d.validity.valid.toString()), o.setAttribute("internals-invalid", (!d.validity.valid).toString()), o.setAttribute("aria-invalid", (!d.validity.valid).toString()), C.delete(o);
108
+ if (C.has(s)) {
109
+ const d = C.get(s);
110
+ s.setAttribute("internals-valid", d.validity.valid.toString()), s.setAttribute("internals-invalid", (!d.validity.valid).toString()), s.setAttribute("aria-invalid", (!d.validity.valid).toString()), C.delete(s);
111
111
  }
112
- if (o.localName === "form") {
113
- const d = g.get(o), w = document.createTreeWalker(o, NodeFilter.SHOW_ELEMENT, {
112
+ if (s.localName === "form") {
113
+ const d = g.get(s), w = document.createTreeWalker(s, NodeFilter.SHOW_ELEMENT, {
114
114
  acceptNode(z) {
115
115
  return c.has(z) && z.constructor.formAssociated && !(d && d.has(z)) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
116
116
  }
@@ -119,10 +119,10 @@ let q = O;
119
119
  for (; b; )
120
120
  Y(b), b = w.nextNode();
121
121
  }
122
- o.localName === "fieldset" && ((u = I.observe) === null || u === void 0 || u.call(I, o, Q), J(o, !0));
123
- }), s.forEach((o) => {
124
- const u = c.get(o);
125
- u && m.get(u) && X(u), P.has(o) && P.get(o).disconnect();
122
+ s.localName === "fieldset" && ((u = I.observe) === null || u === void 0 || u.call(I, s, Q), J(s, !0));
123
+ }), o.forEach((s) => {
124
+ const u = c.get(s);
125
+ u && m.get(u) && X(u), P.has(s) && P.get(s).disconnect();
126
126
  });
127
127
  });
128
128
  }
@@ -144,7 +144,7 @@ let q = O;
144
144
  const $ = {
145
145
  childList: !0,
146
146
  subtree: !0
147
- }, R = (e, t) => {
147
+ }, D = (e, t) => {
148
148
  e.toggleAttribute("internals-disabled", t), t ? e.setAttribute("aria-disabled", "true") : e.removeAttribute("aria-disabled"), e.formDisabledCallback && e.formDisabledCallback.apply(e, [t]);
149
149
  }, X = (e) => {
150
150
  m.get(e).forEach((i) => {
@@ -163,7 +163,7 @@ let q = O;
163
163
  t[0].id || (i = `${t[0].htmlFor}_Label`, t[0].id = i), e.setAttribute("aria-labelledby", i);
164
164
  }
165
165
  }, S = (e) => {
166
- const t = Array.from(e.elements).filter((s) => !s.tagName.includes("-") && s.validity).map((s) => s.validity.valid), i = g.get(e) || [], a = Array.from(i).filter((s) => s.isConnected).map((s) => c.get(s).validity.valid), r = [...t, ...a].includes(!1);
166
+ const t = Array.from(e.elements).filter((o) => !o.tagName.includes("-") && o.validity).map((o) => o.validity.valid), i = g.get(e) || [], a = Array.from(i).filter((o) => o.isConnected).map((o) => c.get(o).validity.valid), r = [...t, ...a].includes(!1);
167
167
  e.toggleAttribute("internals-invalid", r), e.toggleAttribute("internals-valid", !r);
168
168
  }, ft = (e) => {
169
169
  S(V(e.target));
@@ -227,7 +227,7 @@ let q = O;
227
227
  for (let i in e)
228
228
  i !== "valid" && e[i] !== !1 && (t = !1);
229
229
  return t;
230
- }, D = /* @__PURE__ */ new WeakMap();
230
+ }, R = /* @__PURE__ */ new WeakMap();
231
231
  function rt(e, t) {
232
232
  e.toggleAttribute(t, !0), e.part && e.part.add(t);
233
233
  }
@@ -238,12 +238,12 @@ let q = O;
238
238
  constructor(t) {
239
239
  if (super(), !t || !t.tagName || t.tagName.indexOf("-") === -1)
240
240
  throw new TypeError("Illegal constructor");
241
- D.set(this, t);
241
+ R.set(this, t);
242
242
  }
243
243
  add(t) {
244
244
  if (!/^--/.test(t) || typeof t != "string")
245
245
  throw new DOMException(`Failed to execute 'add' on 'CustomStateSet': The specified value ${t} must start with '--'.`);
246
- const i = super.add(t), a = D.get(this), r = `state${t}`;
246
+ const i = super.add(t), a = R.get(this), r = `state${t}`;
247
247
  return a.isConnected ? rt(a, r) : setTimeout(() => {
248
248
  rt(a, r);
249
249
  }), i;
@@ -254,13 +254,13 @@ let q = O;
254
254
  super.clear();
255
255
  }
256
256
  delete(t) {
257
- const i = super.delete(t), a = D.get(this);
257
+ const i = super.delete(t), a = R.get(this);
258
258
  return a.isConnected ? (a.toggleAttribute(`state${t}`, !1), a.part && a.part.remove(`state${t}`)) : setTimeout(() => {
259
259
  a.toggleAttribute(`state${t}`, !1), a.part && a.part.remove(`state${t}`);
260
260
  }), i;
261
261
  }
262
262
  }
263
- function st(e, t, i, a) {
263
+ function ot(e, t, i, a) {
264
264
  if (typeof t == "function" ? e !== t || !a : !t.has(e)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
265
265
  return i === "m" ? a : i === "a" ? a.call(e) : a ? a.value : t.get(e);
266
266
  }
@@ -279,10 +279,10 @@ let q = O;
279
279
  Object.freeze(this);
280
280
  }
281
281
  get length() {
282
- return st(this, x, "f").length;
282
+ return ot(this, x, "f").length;
283
283
  }
284
284
  [(x = /* @__PURE__ */ new WeakMap(), Symbol.iterator)]() {
285
- return st(this, x, "f")[Symbol.iterator]();
285
+ return ot(this, x, "f")[Symbol.iterator]();
286
286
  }
287
287
  item(t) {
288
288
  return this[t] == null ? null : this[t];
@@ -296,26 +296,26 @@ let q = O;
296
296
  HTMLFormElement.prototype.checkValidity = i;
297
297
  const t = HTMLFormElement.prototype.reportValidity;
298
298
  HTMLFormElement.prototype.reportValidity = a;
299
- function i(...s) {
300
- let o = e.apply(this, s);
301
- return it(this, o, "checkValidity");
299
+ function i(...o) {
300
+ let s = e.apply(this, o);
301
+ return it(this, s, "checkValidity");
302
302
  }
303
- function a(...s) {
304
- let o = t.apply(this, s);
305
- return it(this, o, "reportValidity");
303
+ function a(...o) {
304
+ let s = t.apply(this, o);
305
+ return it(this, s, "reportValidity");
306
306
  }
307
307
  const { get: r } = Object.getOwnPropertyDescriptor(HTMLFormElement.prototype, "elements");
308
308
  Object.defineProperty(HTMLFormElement.prototype, "elements", {
309
- get(...s) {
310
- const o = r.call(this, ...s), u = Array.from(g.get(this) || []);
309
+ get(...o) {
310
+ const s = r.call(this, ...o), u = Array.from(g.get(this) || []);
311
311
  if (u.length === 0)
312
- return o;
313
- const d = Array.from(o).concat(u).sort((w, b) => w.compareDocumentPosition ? w.compareDocumentPosition(b) & 2 ? 1 : -1 : 0);
312
+ return s;
313
+ const d = Array.from(s).concat(u).sort((w, b) => w.compareDocumentPosition ? w.compareDocumentPosition(b) & 2 ? 1 : -1 : 0);
314
314
  return new xt(d);
315
315
  }
316
316
  });
317
317
  }
318
- class ot {
318
+ class st {
319
319
  static get isPolyfilled() {
320
320
  return !0;
321
321
  }
@@ -370,8 +370,8 @@ let q = O;
370
370
  }
371
371
  } else t != null && t instanceof FormData && Array.from(t).reverse().forEach(([a, r]) => {
372
372
  if (typeof r == "string") {
373
- const s = Z(i, this);
374
- s.name = a, s.value = r;
373
+ const o = Z(i, this);
374
+ o.name = a, o.value = r;
375
375
  }
376
376
  });
377
377
  B.set(i, t);
@@ -381,13 +381,13 @@ let q = O;
381
381
  if (v(r, "Failed to execute 'setValidity' on 'ElementInternals': The target element is not a form-associated custom element."), !t)
382
382
  throw new TypeError("Failed to execute 'setValidity' on 'ElementInternals': 1 argument required, but only 0 present.");
383
383
  j.set(this, a);
384
- const s = h.get(this), o = {};
384
+ const o = h.get(this), s = {};
385
385
  for (const w in t)
386
- o[w] = t[w];
387
- Object.keys(o).length === 0 && yt(s);
388
- const u = Object.assign(Object.assign({}, s), o);
386
+ s[w] = t[w];
387
+ Object.keys(s).length === 0 && yt(o);
388
+ const u = Object.assign(Object.assign({}, o), s);
389
389
  delete u.valid;
390
- const { valid: d } = Et(s, u, this.form);
390
+ const { valid: d } = Et(o, u, this.form);
391
391
  if (!d && !i)
392
392
  throw new DOMException("Failed to execute 'setValidity' on 'ElementInternals': The second argument should not be empty if one or more flags in the first argument are true.");
393
393
  E.set(this, d ? "" : i), r.isConnected ? (r.toggleAttribute("internals-invalid", !d), r.toggleAttribute("internals-valid", d), r.setAttribute("aria-invalid", `${!d}`)) : C.set(r, this);
@@ -442,13 +442,13 @@ let q = O;
442
442
  }
443
443
  function ct(e = !0) {
444
444
  if (!nt) {
445
- if (nt = !0, typeof window < "u" && (window.ElementInternals = ot), typeof CustomElementRegistry < "u") {
445
+ if (nt = !0, typeof window < "u" && (window.ElementInternals = st), typeof CustomElementRegistry < "u") {
446
446
  const t = CustomElementRegistry.prototype.define;
447
447
  CustomElementRegistry.prototype.define = function(i, a, r) {
448
448
  if (a.formAssociated) {
449
- const s = a.prototype.connectedCallback;
449
+ const o = a.prototype.connectedCallback;
450
450
  a.prototype.connectedCallback = function() {
451
- G.has(this) || (G.set(this, !0), this.hasAttribute("disabled") && R(this, !0)), s != null && s.apply(this), at(this);
451
+ G.has(this) || (G.set(this, !0), this.hasAttribute("disabled") && D(this, !0)), o != null && o.apply(this), at(this);
452
452
  };
453
453
  }
454
454
  t.call(this, i, a, r);
@@ -461,13 +461,13 @@ let q = O;
461
461
  } else return {};
462
462
  if (c.has(this))
463
463
  throw new DOMException("DOMException: Failed to execute 'attachInternals' on 'HTMLElement': ElementInternals for the specified element was already attached.");
464
- return new ot(this);
464
+ return new st(this);
465
465
  }), typeof Element < "u") {
466
466
  let t = function(...a) {
467
467
  const r = i.apply(this, a);
468
468
  if (U.set(this, r), T()) {
469
- const s = new MutationObserver(_);
470
- window.ShadyDOM ? s.observe(this, $) : s.observe(r, $), P.set(this, s);
469
+ const o = new MutationObserver(_);
470
+ window.ShadyDOM ? o.observe(this, $) : o.observe(r, $), P.set(this, o);
471
471
  }
472
472
  return r;
473
473
  };
@@ -480,22 +480,22 @@ let q = O;
480
480
  return !!customElements.polyfillWrapFlushCallback || (Ct() ? typeof window < "u" && !window.CustomStateSet && W(HTMLElement.prototype.attachInternals) : ct(!1)), n.forceCustomStateSetPolyfill = W, n.forceElementInternalsPolyfill = ct, Object.defineProperty(n, "__esModule", { value: !0 }), n;
481
481
  })({});
482
482
  })();
483
- const _t = "*,*:after,*:before{box-sizing:inherit}:host{display:block}*,*:before,*:after{cursor:inherit}.c-switch-wrapper{display:inline-flex;align-items:center;gap:var(--dt-spacing-b);vertical-align:top;font-family:var(--dt-font-body-l-family);cursor:pointer}.c-switch-wrapper[disabled]{cursor:not-allowed}.c-switch{--int-states-mixin-bg-color: var(--dt-color-interactive-form);--switch-bg-color--checked: var(--dt-color-interactive-brand);--switch-bg-color--disabled: var(--dt-color-disabled-01);--switch-width: 48px;--switch-height: 24px;--switch-control-size: 20px;--switch-padding: 2px;--switch-radius: var(--dt-radius-rounded-e);--switch-translation: calc(var(--switch-width) - var(--switch-control-size) - 2 * var(--switch-padding));position:relative;display:flex;width:var(--switch-width);height:var(--switch-height);flex-shrink:0;padding:var(--switch-padding);border-radius:var(--switch-radius);background-color:var(--int-states-mixin-bg-color)}@media (prefers-reduced-motion: no-preference){.c-switch{transition:background-color .15s cubic-bezier(.4,0,.9,1) 0s}}.c-switch:hover:not(:disabled,.is-disabled,.is-dismissible){--hover-modifier: calc(-1 * var(--dt-color-hover-01));--int-states-mixin-bg-color: hsl(var(--dt-color-interactive-form-h), var(--dt-color-interactive-form-s), calc(var(--dt-color-interactive-form-l) + var(--hover-modifier)))}.c-switch:active:not(:disabled,.is-disabled,.is-dismissible),.c-switch.is-loading:not(:disabled,.is-disabled){--active-modifier: calc(-1 * var(--dt-color-active-01));--int-states-mixin-bg-color: hsl(var(--dt-color-interactive-form-h), var(--dt-color-interactive-form-s), calc(var(--dt-color-interactive-form-l) + var(--active-modifier)))}@supports (background-color: color-mix(in srgb,black,white)){.c-switch:hover:not(:disabled,.is-disabled,.is-dismissible){--int-states-mixin-bg-color: color-mix(in srgb, var(--dt-color-hover-01-bg) var(--dt-color-hover-01), var(--dt-color-interactive-form))}.c-switch:active:not(:disabled,.is-disabled,.is-dismissible),.c-switch.is-loading:not(:disabled,.is-disabled){--int-states-mixin-bg-color: color-mix(in srgb, var(--dt-color-active-01-bg) var(--dt-color-active-01), var(--dt-color-interactive-form))}}.c-switch[checked]{--int-states-mixin-bg-color: var(--dt-color-interactive-brand)}@media (prefers-reduced-motion: no-preference){.c-switch[checked]{transition:background-color .15s cubic-bezier(.4,0,.9,1) 0s}}.c-switch[checked]:hover:not(:disabled,.is-disabled,.is-dismissible){--hover-modifier: calc(-1 * var(--dt-color-hover-01));--int-states-mixin-bg-color: hsl(var(--dt-color-interactive-brand-h), var(--dt-color-interactive-brand-s), calc(var(--dt-color-interactive-brand-l) + var(--hover-modifier)))}.c-switch[checked]:active:not(:disabled,.is-disabled,.is-dismissible),.c-switch[checked].is-loading:not(:disabled,.is-disabled){--active-modifier: calc(-1 * var(--dt-color-active-01));--int-states-mixin-bg-color: hsl(var(--dt-color-interactive-brand-h), var(--dt-color-interactive-brand-s), calc(var(--dt-color-interactive-brand-l) + var(--active-modifier)))}@supports (background-color: color-mix(in srgb,black,white)){.c-switch[checked]:hover:not(:disabled,.is-disabled,.is-dismissible){--int-states-mixin-bg-color: color-mix(in srgb, var(--dt-color-hover-01-bg) var(--dt-color-hover-01), var(--dt-color-interactive-brand))}.c-switch[checked]:active:not(:disabled,.is-disabled,.is-dismissible),.c-switch[checked].is-loading:not(:disabled,.is-disabled){--int-states-mixin-bg-color: color-mix(in srgb, var(--dt-color-active-01-bg) var(--dt-color-active-01), var(--dt-color-interactive-brand))}}[disabled] .c-switch{--int-states-mixin-bg-color: var(--switch-bg-color--disabled);pointer-events:none}.c-switch:has(.c-switch-input:focus-visible){box-shadow:0 0 0 2px var(--dt-color-focus-inner),0 0 0 4px var(--dt-color-focus-outer);outline:none}.c-switch-input{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;left:50%;transform:translate(-50%) translateY(-50%);bottom:0}.c-switch-input:disabled{background-color:transparent}.c-switch-control{position:absolute;left:2px;width:var(--switch-control-size);height:var(--switch-control-size);border-radius:var(--switch-radius);background-color:var(--dt-color-interactive-light);padding:var(--switch-padding)}@media (prefers-reduced-motion: no-preference){.c-switch-control{transition:transform .15s cubic-bezier(.4,0,.9,1) 0s}}.c-switch-wrapper--rtl .c-switch-control{position:absolute;left:initial;right:2px}.c-switch-control .c-pieIcon--check{vertical-align:top}.c-switch-input:checked+.c-switch-control{transform:translate(var(--switch-translation))}@media (prefers-reduced-motion: no-preference){.c-switch-input:checked+.c-switch-control{transition:transform .15s cubic-bezier(.4,0,.9,1) 0s}}.c-switch-input:checked+.c-switch-control .c-pieIcon--check{color:var(--dt-color-interactive-brand)}@media (prefers-reduced-motion: no-preference){.c-switch-input:checked+.c-switch-control .c-pieIcon--check{transition:color .15s cubic-bezier(.4,0,.9,1) 0s}}.c-switch-input:disabled~.c-switch-control{color:var(--switch-bg-color--disabled)}.c-switch-input:disabled~.c-switch-control .c-pieIcon--check{color:var(--switch-bg-color--disabled)}@media (prefers-reduced-motion: no-preference){.c-switch-input:disabled~.c-switch-control .c-pieIcon--check{transition:color .15s cubic-bezier(.4,0,.9,1) 0s}}.c-switch-label{color:var(--dt-color-content-default)}.c-switch-description{position:absolute;display:block;height:1px;width:1px;overflow:hidden;padding:1px;white-space:nowrap}.c-switch-wrapper--rtl .c-switch-input:checked+.c-switch-control{transform:translate(calc(-1 * var(--switch-translation)))}@media (prefers-reduced-motion: no-preference){.c-switch-wrapper--rtl .c-switch-input:checked+.c-switch-control{transition:transform .15s cubic-bezier(.4,0,.9,1) 0s}}", $t = ["leading", "trailing"], Gt = "change", k = {
483
+ const _t = "*,*:after,*:before{box-sizing:inherit}:host{display:block}*,*:before,*:after{cursor:inherit}.c-switch-wrapper{display:inline-flex;align-items:center;gap:var(--dt-spacing-b);vertical-align:top;font-family:var(--dt-font-body-l-family);cursor:pointer}.c-switch-wrapper[disabled]{cursor:not-allowed}.c-switch{--int-states-mixin-bg-color: var(--dt-color-interactive-form);--switch-bg-color--checked: var(--dt-color-interactive-brand);--switch-bg-color--disabled: var(--dt-color-disabled-01);--switch-width: 48px;--switch-height: 24px;--switch-control-size: 20px;--switch-padding: 2px;--switch-radius: var(--dt-radius-rounded-e);--switch-translation: calc(var(--switch-width) - var(--switch-control-size) - 2 * var(--switch-padding));position:relative;display:flex;width:var(--switch-width);height:var(--switch-height);flex-shrink:0;padding:var(--switch-padding);border-radius:var(--switch-radius);background-color:var(--int-states-mixin-bg-color)}.c-switch:hover:not(:disabled,.is-disabled,.is-dismissible){--hover-modifier: calc(-1 * var(--dt-color-hover-01));--int-states-mixin-bg-color: hsl(var(--dt-color-interactive-form-h), var(--dt-color-interactive-form-s), calc(var(--dt-color-interactive-form-l) + var(--hover-modifier)))}.c-switch:active:not(:disabled,.is-disabled,.is-dismissible),.c-switch.is-loading:not(:disabled,.is-disabled){--active-modifier: calc(-1 * var(--dt-color-active-01));--int-states-mixin-bg-color: hsl(var(--dt-color-interactive-form-h), var(--dt-color-interactive-form-s), calc(var(--dt-color-interactive-form-l) + var(--active-modifier)))}@supports (background-color: color-mix(in srgb,black,white)){.c-switch:hover:not(:disabled,.is-disabled,.is-dismissible){--int-states-mixin-bg-color: color-mix(in srgb, var(--dt-color-hover-01-bg) var(--dt-color-hover-01), var(--dt-color-interactive-form))}.c-switch:active:not(:disabled,.is-disabled,.is-dismissible),.c-switch.is-loading:not(:disabled,.is-disabled){--int-states-mixin-bg-color: color-mix(in srgb, var(--dt-color-active-01-bg) var(--dt-color-active-01), var(--dt-color-interactive-form))}}.c-switch[checked]{--int-states-mixin-bg-color: var(--dt-color-interactive-brand)}.c-switch[checked]:hover:not(:disabled,.is-disabled,.is-dismissible){--hover-modifier: calc(-1 * var(--dt-color-hover-01));--int-states-mixin-bg-color: hsl(var(--dt-color-interactive-brand-h), var(--dt-color-interactive-brand-s), calc(var(--dt-color-interactive-brand-l) + var(--hover-modifier)))}.c-switch[checked]:active:not(:disabled,.is-disabled,.is-dismissible),.c-switch[checked].is-loading:not(:disabled,.is-disabled){--active-modifier: calc(-1 * var(--dt-color-active-01));--int-states-mixin-bg-color: hsl(var(--dt-color-interactive-brand-h), var(--dt-color-interactive-brand-s), calc(var(--dt-color-interactive-brand-l) + var(--active-modifier)))}@supports (background-color: color-mix(in srgb,black,white)){.c-switch[checked]:hover:not(:disabled,.is-disabled,.is-dismissible){--int-states-mixin-bg-color: color-mix(in srgb, var(--dt-color-hover-01-bg) var(--dt-color-hover-01), var(--dt-color-interactive-brand))}.c-switch[checked]:active:not(:disabled,.is-disabled,.is-dismissible),.c-switch[checked].is-loading:not(:disabled,.is-disabled){--int-states-mixin-bg-color: color-mix(in srgb, var(--dt-color-active-01-bg) var(--dt-color-active-01), var(--dt-color-interactive-brand))}}[disabled] .c-switch{--int-states-mixin-bg-color: var(--switch-bg-color--disabled);pointer-events:none}.c-switch:has(.c-switch-input:focus-visible){box-shadow:0 0 0 2px var(--dt-color-focus-inner),0 0 0 4px var(--dt-color-focus-outer);outline:none}.c-switch-input{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0;left:50%;transform:translate(-50%) translateY(-50%);bottom:0}.c-switch-input:disabled{background-color:transparent}.c-switch-control{position:absolute;left:2px;width:var(--switch-control-size);height:var(--switch-control-size);border-radius:var(--switch-radius);background-color:var(--dt-color-interactive-light);padding:var(--switch-padding)}.c-switch-wrapper:dir(rtl) .c-switch-control{position:absolute;left:initial;right:2px}.c-switch-control .c-pieIcon--check{vertical-align:top}.c-switch-input:checked+.c-switch-control{transform:translate(var(--switch-translation))}.c-switch-input:checked+.c-switch-control .c-pieIcon--check{color:var(--dt-color-interactive-brand)}.c-switch-input:disabled~.c-switch-control{color:var(--switch-bg-color--disabled)}.c-switch-input:disabled~.c-switch-control .c-pieIcon--check{color:var(--switch-bg-color--disabled)}.c-switch-label{color:var(--dt-color-content-default)}.c-switch-description{position:absolute;display:block;height:1px;width:1px;overflow:hidden;padding:1px;white-space:nowrap}@media (prefers-reduced-motion: no-preference){.c-switch-wrapper--allow-animation .c-switch{transition:background-color .15s cubic-bezier(.4,0,.9,1) 0s}}@media (prefers-reduced-motion: no-preference){.c-switch-wrapper--allow-animation .c-switch[checked]{transition:background-color .15s cubic-bezier(.4,0,.9,1) 0s}}@media (prefers-reduced-motion: no-preference){.c-switch-wrapper--allow-animation .c-switch-control{transition:transform .15s cubic-bezier(.4,0,.9,1) 0s}}@media (prefers-reduced-motion: no-preference){.c-switch-input:checked+.c-switch-wrapper--allow-animation .c-switch-control{transition:transform .15s cubic-bezier(.4,0,.9,1) 0s}}@media (prefers-reduced-motion: no-preference){.c-switch-input:checked+.c-switch-wrapper--allow-animation .c-switch-control .c-pieIcon--check{transition:color .15s cubic-bezier(.4,0,.9,1) 0s}}@media (prefers-reduced-motion: no-preference){.c-switch-input:disabled~.c-switch-wrapper--allow-animation .c-switch-control .c-pieIcon--check{transition:color .15s cubic-bezier(.4,0,.9,1) 0s}}.c-switch-wrapper:dir(rtl) .c-switch-input:checked+.c-switch-control{transform:translate(calc(-1 * var(--switch-translation)))}", $t = ["leading", "trailing"], Gt = "change", k = {
484
484
  checked: !1,
485
485
  disabled: !1,
486
486
  labelPlacement: "leading",
487
487
  required: !1,
488
488
  value: "on"
489
489
  };
490
- var Rt = Object.defineProperty, Dt = Object.getOwnPropertyDescriptor, f = (n, l, h, m) => {
491
- for (var c = m > 1 ? void 0 : m ? Dt(l, h) : l, E = n.length - 1, M; E >= 0; E--)
490
+ var Dt = Object.defineProperty, Rt = Object.getOwnPropertyDescriptor, f = (n, l, h, m) => {
491
+ for (var c = m > 1 ? void 0 : m ? Rt(l, h) : l, E = n.length - 1, M; E >= 0; E--)
492
492
  (M = n[E]) && (c = (m ? M(l, h, c) : M(c)) || c);
493
- return m && c && Rt(l, h, c), c;
493
+ return m && c && Dt(l, h, c), c;
494
494
  };
495
495
  const Ht = "pie-switch";
496
- let p = class extends Tt(Lt(q)) {
496
+ let p = class extends Lt(q) {
497
497
  constructor() {
498
- super(...arguments), this.labelPlacement = k.labelPlacement, this.checked = k.checked, this.required = k.required, this.value = k.value, this.disabled = k.disabled;
498
+ super(...arguments), this.labelPlacement = k.labelPlacement, this.checked = k.checked, this.required = k.required, this.value = k.value, this.disabled = k.disabled, this._isAnimationAllowed = !1;
499
499
  }
500
500
  firstUpdated() {
501
501
  this.handleFormAssociation(), this.input.addEventListener("invalid", (n) => {
@@ -519,7 +519,7 @@ let p = class extends Tt(Lt(q)) {
519
519
  const { checked: l } = n == null ? void 0 : n.currentTarget;
520
520
  this.checked = l;
521
521
  const h = Nt(n);
522
- this.dispatchEvent(h), this.handleFormAssociation();
522
+ this._isAnimationAllowed || (this._isAnimationAllowed = !0), this.dispatchEvent(h), this.handleFormAssociation();
523
523
  }
524
524
  /**
525
525
  * Returns a boolean value which indicates validity of the value of the component. If the value is invalid, this method also fires the invalid event on the component.
@@ -589,14 +589,14 @@ let p = class extends Tt(Lt(q)) {
589
589
  aria: n,
590
590
  checked: l,
591
591
  disabled: h,
592
- isRTL: m,
593
- required: c
592
+ required: m,
593
+ _isAnimationAllowed: c
594
594
  } = this;
595
595
  return N`
596
596
  <label
597
- class="${St({
597
+ class="${Vt({
598
598
  "c-switch-wrapper": !0,
599
- "c-switch-wrapper--rtl": m
599
+ "c-switch-wrapper--allow-animation": c
600
600
  })}"
601
601
  ?disabled=${h}>
602
602
  ${this.renderSwitchLabel("leading")}
@@ -609,11 +609,11 @@ let p = class extends Tt(Lt(q)) {
609
609
  role="switch"
610
610
  type="checkbox"
611
611
  class="c-switch-input"
612
- .required=${c}
612
+ .required=${m}
613
613
  .checked="${l}"
614
614
  .disabled="${h}"
615
615
  @change="${this.handleChange}"
616
- aria-label="${Vt(n == null ? void 0 : n.label)}"
616
+ aria-label="${Tt(n == null ? void 0 : n.label)}"
617
617
  aria-describedby="${n != null && n.describedBy ? "switch-description" : L}">
618
618
  <div class="c-switch-control">
619
619
  ${l ? N`<icon-check></icon-check>` : L}
@@ -656,6 +656,9 @@ f([
656
656
  f([
657
657
  dt("label")
658
658
  ], p.prototype, "focusTarget", 2);
659
+ f([
660
+ St()
661
+ ], p.prototype, "_isAnimationAllowed", 2);
659
662
  p = f([
660
663
  Pt("pie-switch")
661
664
  ], p);
package/dist/react.d.ts CHANGED
@@ -5,7 +5,6 @@ import { GenericConstructor } from '@justeattakeaway/pie-webc-core';
5
5
  import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
6
6
  import { PIEInputElement } from '@justeattakeaway/pie-webc-core';
7
7
  import * as React_2 from 'react';
8
- import { RTLInterface } from '@justeattakeaway/pie-webc-core';
9
8
  import { TemplateResult } from 'lit-html';
10
9
 
11
10
  declare type AriaProps = {
@@ -43,6 +42,7 @@ declare class PieSwitch_2 extends PieSwitch_base implements SwitchProps, PIEInpu
43
42
  disabled: boolean;
44
43
  private input;
45
44
  focusTarget: HTMLElement;
45
+ private _isAnimationAllowed;
46
46
  protected firstUpdated(): void;
47
47
  protected updated(): void;
48
48
  static styles: CSSResult;
@@ -94,7 +94,7 @@ declare class PieSwitch_2 extends PieSwitch_base implements SwitchProps, PIEInpu
94
94
  render(): TemplateResult<1>;
95
95
  }
96
96
 
97
- declare const PieSwitch_base: GenericConstructor<FormControlInterface> & GenericConstructor<RTLInterface> & typeof PieElement;
97
+ declare const PieSwitch_base: GenericConstructor<FormControlInterface> & typeof PieElement;
98
98
 
99
99
  declare type PieSwitchEvents = {
100
100
  onInvalid?: (event: Event) => void;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@justeattakeaway/pie-switch",
3
3
  "description": "PIE Design System Switch built using Web Components",
4
- "version": "2.0.6",
4
+ "version": "2.1.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/justeattakeaway/pie",
@@ -41,13 +41,13 @@
41
41
  "@custom-elements-manifest/analyzer": "0.9.0",
42
42
  "@justeattakeaway/pie-components-config": "0.21.0",
43
43
  "@justeattakeaway/pie-css": "0.19.0",
44
- "@justeattakeaway/pie-monorepo-utils": "0.6.0",
44
+ "@justeattakeaway/pie-monorepo-utils": "0.7.0",
45
45
  "@justeattakeaway/pie-wrapper-react": "0.14.3",
46
46
  "cem-plugin-module-file-extensions": "0.0.5"
47
47
  },
48
48
  "dependencies": {
49
- "@justeattakeaway/pie-icons-webc": "1.14.1",
50
- "@justeattakeaway/pie-webc-core": "1.0.0",
49
+ "@justeattakeaway/pie-icons-webc": "1.14.2",
50
+ "@justeattakeaway/pie-webc-core": "1.1.0",
51
51
  "element-internals-polyfill": "1.3.11"
52
52
  },
53
53
  "volta": {
package/src/index.ts CHANGED
@@ -2,14 +2,17 @@ import {
2
2
  html, unsafeCSS, nothing,
3
3
  } from 'lit';
4
4
  import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
5
- import { property, query } from 'lit/decorators.js';
5
+ import { property, query, state } from 'lit/decorators.js';
6
6
  import { classMap } from 'lit/directives/class-map.js';
7
7
  import { ifDefined } from 'lit/directives/if-defined.js';
8
8
  import 'element-internals-polyfill';
9
9
 
10
10
  import {
11
- RtlMixin, validPropertyValues, FormControlMixin, wrapNativeEvent, type PIEInputElement,
11
+ validPropertyValues,
12
+ FormControlMixin,
13
+ wrapNativeEvent,
12
14
  safeCustomElement,
15
+ type PIEInputElement,
13
16
  } from '@justeattakeaway/pie-webc-core';
14
17
  import '@justeattakeaway/pie-icons-webc/dist/IconCheck.js';
15
18
 
@@ -26,7 +29,7 @@ const componentSelector = 'pie-switch';
26
29
  * @event {CustomEvent} change - when the switch checked state is changed.
27
30
  */
28
31
  @safeCustomElement('pie-switch')
29
- export class PieSwitch extends FormControlMixin(RtlMixin(PieElement)) implements SwitchProps, PIEInputElement {
32
+ export class PieSwitch extends FormControlMixin(PieElement) implements SwitchProps, PIEInputElement {
30
33
  @property({ type: String })
31
34
  public label: SwitchProps['label'];
32
35
 
@@ -58,6 +61,9 @@ export class PieSwitch extends FormControlMixin(RtlMixin(PieElement)) implements
58
61
  @query('label')
59
62
  public focusTarget!: HTMLElement;
60
63
 
64
+ @state()
65
+ private _isAnimationAllowed = false;
66
+
61
67
  protected firstUpdated (): void {
62
68
  this.handleFormAssociation();
63
69
  // This ensures that invalid events triggered by checkValidity() are propagated to the custom element
@@ -101,6 +107,10 @@ export class PieSwitch extends FormControlMixin(RtlMixin(PieElement)) implements
101
107
  this.checked = checked;
102
108
  const changedEvent = wrapNativeEvent(event);
103
109
 
110
+ if (!this._isAnimationAllowed) {
111
+ this._isAnimationAllowed = true;
112
+ }
113
+
104
114
  this.dispatchEvent(changedEvent);
105
115
  this.handleFormAssociation();
106
116
  }
@@ -189,13 +199,13 @@ export class PieSwitch extends FormControlMixin(RtlMixin(PieElement)) implements
189
199
  aria,
190
200
  checked,
191
201
  disabled,
192
- isRTL,
193
202
  required,
203
+ _isAnimationAllowed,
194
204
  } = this;
195
205
 
196
206
  const classes = {
197
207
  'c-switch-wrapper': true,
198
- 'c-switch-wrapper--rtl': isRTL,
208
+ 'c-switch-wrapper--allow-animation': _isAnimationAllowed,
199
209
  };
200
210
 
201
211
  return html`
package/src/switch.scss CHANGED
@@ -49,15 +49,11 @@
49
49
  border-radius: var(--switch-radius);
50
50
  background-color: var(--int-states-mixin-bg-color);
51
51
 
52
- @include switch-transition(background-color);
53
-
54
52
  @include p.interactive-states('--dt-color-interactive-form');
55
53
 
56
54
  &[checked] {
57
55
  --int-states-mixin-bg-color: var(--dt-color-interactive-brand);
58
56
 
59
- @include switch-transition(background-color);
60
-
61
57
  @include p.interactive-states('--dt-color-interactive-brand');
62
58
  }
63
59
 
@@ -93,14 +89,13 @@
93
89
  .c-switch-control {
94
90
  position: absolute;
95
91
  left: 2px;
96
- @include switch-transition(transform);
97
92
  width: var(--switch-control-size);
98
93
  height: var(--switch-control-size);
99
94
  border-radius: var(--switch-radius);
100
95
  background-color: var(--dt-color-interactive-light);
101
96
  padding: var(--switch-padding);
102
97
 
103
- .c-switch-wrapper--rtl & {
98
+ .c-switch-wrapper:dir(rtl) & {
104
99
  position: absolute;
105
100
  left: initial;
106
101
  right: 2px;
@@ -111,11 +106,9 @@
111
106
  }
112
107
 
113
108
  .c-switch-input:checked + & {
114
- @include switch-transition(transform);
115
109
  transform: translateX(var(--switch-translation));
116
110
 
117
111
  .c-pieIcon--check {
118
- @include switch-transition(color);
119
112
  color: var(--dt-color-interactive-brand);
120
113
  }
121
114
  }
@@ -124,7 +117,6 @@
124
117
  color: var(--switch-bg-color--disabled);
125
118
 
126
119
  .c-pieIcon--check {
127
- @include switch-transition(color);
128
120
  color: var(--switch-bg-color--disabled);
129
121
  }
130
122
  }
@@ -139,9 +131,39 @@
139
131
  @include p.visually-hidden;
140
132
  }
141
133
 
142
- .c-switch-wrapper--rtl {
143
- .c-switch-input:checked + .c-switch-control {
134
+
135
+ .c-switch-wrapper--allow-animation {
136
+ /* stylelint-disable-next-line no-descending-specificity */
137
+ .c-switch {
138
+ @include switch-transition(background-color);
139
+
140
+ &[checked] {
141
+ @include switch-transition(background-color);
142
+ }
143
+ }
144
+
145
+ /* stylelint-disable-next-line no-descending-specificity */
146
+ .c-switch-control {
144
147
  @include switch-transition(transform);
145
- transform: translateX(calc(-1 * var(--switch-translation)));
148
+
149
+ .c-switch-input:checked + & {
150
+ @include switch-transition(transform);
151
+
152
+ .c-pieIcon--check {
153
+ @include switch-transition(color);
154
+ }
155
+ }
156
+
157
+ .c-switch-input:disabled ~ & {
158
+ .c-pieIcon--check {
159
+ @include switch-transition(color);
160
+ }
161
+ }
146
162
  }
147
163
  }
164
+
165
+ .c-switch-wrapper:dir(rtl) {
166
+ .c-switch-input:checked + .c-switch-control {
167
+ transform: translateX(calc(-1 * var(--switch-translation)));
168
+ }
169
+ }