@justeattakeaway/pie-chip 0.8.6 → 0.9.1

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.
@@ -126,6 +126,20 @@
126
126
  "privacy": "public",
127
127
  "attribute": "aria"
128
128
  },
129
+ {
130
+ "kind": "method",
131
+ "name": "onClickHandler",
132
+ "privacy": "private",
133
+ "parameters": [
134
+ {
135
+ "name": "event",
136
+ "type": {
137
+ "text": "Event"
138
+ }
139
+ }
140
+ ],
141
+ "description": "Hander to prevent click events\nwhen the chip is disabled or dismissible"
142
+ },
129
143
  {
130
144
  "kind": "method",
131
145
  "name": "renderSpinner",
package/dist/index.d.ts CHANGED
@@ -60,6 +60,13 @@ export declare class PieChip extends LitElement implements ChipProps {
60
60
  isLoading: boolean;
61
61
  isDismissible: boolean;
62
62
  aria: ChipProps['aria'];
63
+ /**
64
+ * Hander to prevent click events
65
+ * when the chip is disabled or dismissible
66
+ *
67
+ * @private
68
+ */
69
+ private onClickHandler;
63
70
  /**
64
71
  * Template for the loading state
65
72
  *
package/dist/index.js CHANGED
@@ -1,25 +1,34 @@
1
- import { LitElement as f, html as n, nothing as b, unsafeCSS as u } from "lit";
1
+ import { LitElement as f, html as p, nothing as m, unsafeCSS as y } from "lit";
2
2
  import { property as t } from "lit/decorators.js";
3
- import { ifDefined as g } from "lit/directives/if-defined.js";
4
- import { classMap as y } from "lit/directives/class-map.js";
5
- import { dispatchCustomEvent as k, validPropertyValues as x, defineCustomElement as w } from "@justeattakeaway/pie-webc-core";
3
+ import { ifDefined as n } from "lit/directives/if-defined.js";
4
+ import { classMap as k } from "lit/directives/class-map.js";
5
+ import { dispatchCustomEvent as x, validPropertyValues as w, defineCustomElement as $ } from "@justeattakeaway/pie-webc-core";
6
6
  import "@justeattakeaway/pie-icons-webc/dist/IconCloseCircleFilled.js";
7
7
  import "@justeattakeaway/pie-spinner";
8
- const S = "*,*:after,*:before{box-sizing:inherit}.c-chip{--chip-bg-color: var(--dt-color-interactive-secondary);--chip-color: var(--dt-color-content-interactive-secondary);--chip-border-width: 1px;--chip-border-color: transparent;--chip-padding-block: calc(6px - var(--chip-border-width));--chip-padding-inline: calc(var(--dt-spacing-c) - var(--chip-border-width));--chip-padding-dismissible: calc(var(--dt-spacing-a) - var(--chip-border-width));--chip-min-width: calc(var(--dt-spacing-g) + var(--dt-spacing-b));--chip-gap: var(--dt-spacing-b);--chip-dismissible-offset: calc(var(--chip-gap) / -2);--icon-display-override: block;position:relative;display:inline-flex;align-items:center;justify-content:center;gap:var(--chip-gap);padding-block-start:var(--chip-padding-block);padding-block-end:var(--chip-padding-block);padding-inline-start:var(--chip-padding-inline);padding-inline-end:var(--chip-padding-inline);background-color:var(--chip-bg-color);color:var(--chip-color);border-radius:var(--dt-radius-rounded-e);border:1px solid;border-color:var(--chip-border-color);cursor:pointer;min-width:var(--chip-min-width);font-size:calc(var(--dt-font-interactive-xs-size) * 1px);line-height:calc(var(--dt-font-interactive-xs-line-height) * 1px);font-weight:var(--dt-font-weight-bold)}.c-chip:hover:not([disabled]){--hover-modifier: calc(-1 * var(--dt-color-hover-01));--chip-bg-color: hsl(var(--dt-color-interactive-secondary-h), var(--dt-color-interactive-secondary-s), calc(var(--dt-color-interactive-secondary-l) + var(--hover-modifier)))}.c-chip:active:not([disabled]),.c-chip.is-loading:not([disabled]){--active-modifier: calc(-1 * var(--dt-color-active-01));--chip-bg-color: hsl(var(--dt-color-interactive-secondary-h), var(--dt-color-interactive-secondary-s), calc(var(--dt-color-interactive-secondary-l) + var(--active-modifier)))}.c-chip.c-chip--outline:not([disabled],.c-chip--selected){--chip-border-color: var(--dt-color-border-strong)}.c-chip.c-chip--outline,.c-chip.c-chip--ghost{--chip-bg-color: transparent}.c-chip.c-chip--outline:hover:not([disabled]),.c-chip.c-chip--ghost:hover:not([disabled]){--hover-modifier: calc(-1 * var(--dt-color-hover-01));--hover-modifier: var(--dt-color-hover-01);--chip-bg-color: hsl(var(--dt-color-black-h), var(--dt-color-black-s), var(--dt-color-black-l), var(--hover-modifier))}.c-chip.c-chip--outline:active:not([disabled]),.c-chip.c-chip--outline.is-loading:not([disabled]),.c-chip.c-chip--ghost:active:not([disabled]),.c-chip.c-chip--ghost.is-loading:not([disabled]){--active-modifier: calc(-1 * var(--dt-color-active-01));--active-modifier: var(--dt-color-active-01);--chip-bg-color: hsl(var(--dt-color-black-h), var(--dt-color-black-s), var(--dt-color-black-l), var(--active-modifier))}.c-chip.c-chip--selected{--chip-bg-color: var(--dt-color-interactive-primary);--chip-color: var(--dt-color-content-interactive-primary)}.c-chip.c-chip--selected:hover:not([disabled]){--hover-modifier: var(--dt-color-hover-02);--chip-bg-color: hsl(var(--dt-color-interactive-primary-h), var(--dt-color-interactive-primary-s), calc(var(--dt-color-interactive-primary-l) + var(--hover-modifier)))}.c-chip.c-chip--selected:active:not([disabled]),.c-chip.c-chip--selected.is-loading:not([disabled]){--active-modifier: var(--dt-color-active-02);--chip-bg-color: hsl(var(--dt-color-interactive-primary-h), var(--dt-color-interactive-primary-s), calc(var(--dt-color-interactive-primary-l) + var(--active-modifier)))}.c-chip.c-chip--dismissible.c-chip--selected{padding-inline-end:var(--chip-padding-dismissible);padding-block-start:var(--chip-padding-dismissible);padding-block-end:var(--chip-padding-dismissible)}.c-chip.c-chip--dismissible.c-chip--selected .c-chip-closeBtn{display:inline-flex;-webkit-user-select:none;user-select:none;outline:none;border:none;color:inherit;background-color:inherit;border-radius:inherit;cursor:pointer;padding:0;margin-inline-start:var(--chip-dismissible-offset)}.c-chip.is-loading>*:not(.c-chip-spinner){visibility:hidden}.c-chip.is-loading .c-chip-spinner{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.c-chip[disabled]{--chip-bg-color: var(--dt-color-disabled-01);--chip-color: var(--dt-color-content-disabled);cursor:not-allowed}.c-chip[disabled].c-chip--ghost{--chip-bg-color: transparent}.c-chip:focus-visible{box-shadow:0 0 0 2px var(--dt-color-focus-inner),0 0 0 4px var(--dt-color-focus-outer);outline:none}::slotted(svg){display:block;height:var(--icon-size-override);width:var(--icon-size-override)}", $ = ["default", "outline", "ghost"], B = "pie-chip-close", o = {
8
+ const C = "*,*:after,*:before{box-sizing:inherit}.c-chip{--chip-bg-color: var(--dt-color-interactive-secondary);--chip-color: var(--dt-color-content-interactive-secondary);--chip-border-width: 1px;--chip-border-color: transparent;--chip-padding-block: calc(6px - var(--chip-border-width));--chip-padding-inline: calc(var(--dt-spacing-c) - var(--chip-border-width));--chip-padding-dismissible: calc(var(--dt-spacing-a) - var(--chip-border-width));--chip-min-width: calc(var(--dt-spacing-g) + var(--dt-spacing-b));--chip-gap: var(--dt-spacing-b);--chip-dismissible-offset: calc(var(--chip-gap) / -2);--chip-cursor: pointer;--chip-close-btn-cursor: pointer;--icon-display-override: block;position:relative;display:inline-flex;align-items:center;justify-content:center;gap:var(--chip-gap);padding-block-start:var(--chip-padding-block);padding-block-end:var(--chip-padding-block);padding-inline-start:var(--chip-padding-inline);padding-inline-end:var(--chip-padding-inline);background-color:var(--chip-bg-color);color:var(--chip-color);border-radius:var(--dt-radius-rounded-e);border:1px solid;border-color:var(--chip-border-color);cursor:var(--chip-cursor);-webkit-user-select:none;user-select:none;min-width:var(--chip-min-width);font-size:calc(var(--dt-font-interactive-xs-size) * 1px);line-height:calc(var(--dt-font-interactive-xs-line-height) * 1px);font-weight:var(--dt-font-weight-bold)}.c-chip:hover:not(.c-chip--disabled,.c-chip--dismissible){--hover-modifier: calc(-1 * var(--dt-color-hover-01));--chip-bg-color: hsl(var(--dt-color-interactive-secondary-h), var(--dt-color-interactive-secondary-s), calc(var(--dt-color-interactive-secondary-l) + var(--hover-modifier)))}.c-chip:active:not(.c-chip--disabled,.c-chip--dismissible),.c-chip.is-loading:not(.c-chip--disabled,.c-chip--dismissible){--active-modifier: calc(-1 * var(--dt-color-active-01));--chip-bg-color: hsl(var(--dt-color-interactive-secondary-h), var(--dt-color-interactive-secondary-s), calc(var(--dt-color-interactive-secondary-l) + var(--active-modifier)))}.c-chip.c-chip--outline:not(.c-chip--disabled,.c-chip--selected){--chip-border-color: var(--dt-color-border-strong)}.c-chip.c-chip--outline,.c-chip.c-chip--ghost{--chip-bg-color: transparent}.c-chip.c-chip--outline:hover:not(.c-chip--disabled,.c-chip--dismissible),.c-chip.c-chip--ghost:hover:not(.c-chip--disabled,.c-chip--dismissible){--hover-modifier: calc(-1 * var(--dt-color-hover-01));--hover-modifier: var(--dt-color-hover-01);--chip-bg-color: hsl(var(--dt-color-black-h), var(--dt-color-black-s), var(--dt-color-black-l), var(--hover-modifier))}.c-chip.c-chip--outline:active:not(.c-chip--disabled,.c-chip--dismissible),.c-chip.c-chip--outline.is-loading:not(.c-chip--disabled,.c-chip--dismissible),.c-chip.c-chip--ghost:active:not(.c-chip--disabled,.c-chip--dismissible),.c-chip.c-chip--ghost.is-loading:not(.c-chip--disabled,.c-chip--dismissible){--active-modifier: calc(-1 * var(--dt-color-active-01));--active-modifier: var(--dt-color-active-01);--chip-bg-color: hsl(var(--dt-color-black-h), var(--dt-color-black-s), var(--dt-color-black-l), var(--active-modifier))}.c-chip.c-chip--selected{--chip-bg-color: var(--dt-color-interactive-primary);--chip-color: var(--dt-color-content-interactive-primary)}.c-chip.c-chip--selected:hover:not(.c-chip--disabled,.c-chip--dismissible){--hover-modifier: var(--dt-color-hover-02);--chip-bg-color: hsl(var(--dt-color-interactive-primary-h), var(--dt-color-interactive-primary-s), calc(var(--dt-color-interactive-primary-l) + var(--hover-modifier)))}.c-chip.c-chip--selected:active:not(.c-chip--disabled,.c-chip--dismissible),.c-chip.c-chip--selected.is-loading:not(.c-chip--disabled,.c-chip--dismissible){--active-modifier: var(--dt-color-active-02);--chip-bg-color: hsl(var(--dt-color-interactive-primary-h), var(--dt-color-interactive-primary-s), calc(var(--dt-color-interactive-primary-l) + var(--active-modifier)))}.c-chip.is-loading>*:not(.c-chip-spinner){visibility:hidden}.c-chip.is-loading .c-chip-spinner{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.c-chip.c-chip--disabled{--chip-bg-color: var(--dt-color-disabled-01);--chip-color: var(--dt-color-content-disabled);--chip-cursor: not-allowed;--chip-close-btn-cursor: not-allowed}.c-chip.c-chip--disabled.c-chip--ghost{--chip-bg-color: transparent}.c-chip.c-chip--dismissible{--chip-cursor: text;padding-inline-end:var(--chip-padding-dismissible);padding-block-start:var(--chip-padding-dismissible);padding-block-end:var(--chip-padding-dismissible);-webkit-user-select:auto;user-select:auto}.c-chip.c-chip--dismissible .c-chip-closeBtn{display:inline-flex;-webkit-user-select:none;user-select:none;outline:none;border:none;color:inherit;background-color:inherit;border-radius:inherit;cursor:var(--chip-close-btn-cursor);padding:0;margin-inline-start:var(--chip-dismissible-offset)}.c-chip.c-chip--dismissible .c-chip-closeBtn: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-chip:focus-visible{box-shadow:0 0 0 2px var(--dt-color-focus-inner),0 0 0 4px var(--dt-color-focus-outer);outline:none}::slotted(svg){display:block;height:var(--icon-size-override);width:var(--icon-size-override)}", B = ["default", "outline", "ghost"], S = "pie-chip-close", r = {
9
9
  variant: "default",
10
10
  disabled: !1,
11
11
  isSelected: !1,
12
12
  isLoading: !1,
13
13
  isDismissible: !1
14
14
  };
15
- var C = Object.defineProperty, a = (h, e, l, s) => {
16
- for (var i = void 0, r = h.length - 1, d; r >= 0; r--)
17
- (d = h[r]) && (i = d(e, l, i) || i);
18
- return i && C(e, l, i), i;
15
+ var D = Object.defineProperty, s = (v, i, a, d) => {
16
+ for (var c = void 0, l = v.length - 1, o; l >= 0; l--)
17
+ (o = v[l]) && (c = o(i, a, c) || c);
18
+ return c && D(i, a, c), c;
19
19
  };
20
- const m = "pie-chip", p = class p extends f {
20
+ const g = "pie-chip", h = class h extends f {
21
21
  constructor() {
22
- super(...arguments), this.variant = o.variant, this.disabled = o.disabled, this.isSelected = o.isSelected, this.isLoading = o.isLoading, this.isDismissible = o.isDismissible;
22
+ super(...arguments), this.variant = r.variant, this.disabled = r.disabled, this.isSelected = r.isSelected, this.isLoading = r.isLoading, this.isDismissible = r.isDismissible;
23
+ }
24
+ /**
25
+ * Hander to prevent click events
26
+ * when the chip is disabled or dismissible
27
+ *
28
+ * @private
29
+ */
30
+ onClickHandler(i) {
31
+ (this.disabled || this.isDismissible) && (i.preventDefault(), i.stopPropagation());
23
32
  }
24
33
  /**
25
34
  * Template for the loading state
@@ -27,12 +36,12 @@ const m = "pie-chip", p = class p extends f {
27
36
  * @private
28
37
  */
29
38
  renderSpinner() {
30
- const { isSelected: e } = this;
31
- return n`
39
+ const { isSelected: i } = this;
40
+ return p`
32
41
  <pie-spinner
33
42
  class="c-chip-spinner"
34
43
  size="small"
35
- variant="${e ? "inverse" : "secondary"}">
44
+ variant="${i ? "inverse" : "secondary"}">
36
45
  </pie-spinner>`;
37
46
  }
38
47
  /**
@@ -41,7 +50,7 @@ const m = "pie-chip", p = class p extends f {
41
50
  * @private
42
51
  */
43
52
  _handleCloseButtonClick() {
44
- k(this, B);
53
+ x(this, S);
45
54
  }
46
55
  /**
47
56
  * Template for the dismissible state
@@ -49,76 +58,77 @@ const m = "pie-chip", p = class p extends f {
49
58
  * @private
50
59
  */
51
60
  renderCloseButton() {
52
- var e;
53
- return n`
61
+ var i;
62
+ return p`
54
63
  <button
55
64
  @click="${this._handleCloseButtonClick}"
56
65
  ?disabled=${this.disabled}
57
- aria-label="${g((e = this.aria) == null ? void 0 : e.close)}"
66
+ aria-label="${n((i = this.aria) == null ? void 0 : i.close)}"
58
67
  class="c-chip-closeBtn"
59
68
  data-test-id="chip-close-button">
60
69
  <icon-close-circle-filled size="m"></icon-close-circle-filled>
61
70
  </button>`;
62
71
  }
63
72
  render() {
64
- var v;
73
+ var b;
65
74
  const {
66
- variant: e,
67
- disabled: l,
68
- isSelected: s,
69
- isLoading: i,
70
- isDismissible: r
71
- } = this, d = {
75
+ variant: i,
76
+ disabled: a,
77
+ isSelected: d,
78
+ isLoading: c,
79
+ isDismissible: l
80
+ } = this, o = l && d, u = {
72
81
  "c-chip": !0,
73
- [`c-chip--${e}`]: !0,
74
- "c-chip--selected": s,
75
- "c-chip--dismissible": r,
76
- "is-loading": i
82
+ [`c-chip--${i}`]: !0,
83
+ "c-chip--selected": d,
84
+ "c-chip--dismissible": o,
85
+ "c-chip--disabled": a,
86
+ "is-loading": c
77
87
  };
78
- return n`
88
+ return p`
79
89
  <div
90
+ role="${n(o ? void 0 : "button")}"
91
+ tabindex="${n(o ? void 0 : "0")}"
80
92
  aria-atomic="true"
81
- aria-busy="${i}"
82
- aria-current="${s}"
83
- aria-label="${g((v = this.aria) == null ? void 0 : v.label)}"
93
+ aria-busy="${c}"
94
+ aria-current="${d}"
95
+ aria-label="${n((b = this.aria) == null ? void 0 : b.label)}"
84
96
  aria-live="polite"
85
- class=${y(d)}
97
+ class=${k(u)}
86
98
  data-test-id="pie-chip"
87
- tabindex="0"
88
- role="button"
89
- ?disabled="${l}">
99
+ @click="${this.onClickHandler}">
90
100
  <slot name="icon"></slot>
91
- ${i ? this.renderSpinner() : b}
101
+ ${c ? this.renderSpinner() : m}
92
102
  <slot></slot>
93
- ${r && s ? this.renderCloseButton() : b}
103
+ ${o ? this.renderCloseButton() : m}
94
104
  </div>`;
95
105
  }
96
106
  };
97
- p.styles = u(S);
98
- let c = p;
99
- a([
107
+ h.styles = y(C);
108
+ let e = h;
109
+ s([
100
110
  t(),
101
- x(m, $, o.variant)
102
- ], c.prototype, "variant");
103
- a([
111
+ w(g, B, r.variant)
112
+ ], e.prototype, "variant");
113
+ s([
104
114
  t({ type: Boolean })
105
- ], c.prototype, "disabled");
106
- a([
115
+ ], e.prototype, "disabled");
116
+ s([
107
117
  t({ type: Boolean })
108
- ], c.prototype, "isSelected");
109
- a([
118
+ ], e.prototype, "isSelected");
119
+ s([
110
120
  t({ type: Boolean })
111
- ], c.prototype, "isLoading");
112
- a([
121
+ ], e.prototype, "isLoading");
122
+ s([
113
123
  t({ type: Boolean })
114
- ], c.prototype, "isDismissible");
115
- a([
124
+ ], e.prototype, "isDismissible");
125
+ s([
116
126
  t({ type: Object })
117
- ], c.prototype, "aria");
118
- w(m, c);
127
+ ], e.prototype, "aria");
128
+ $(g, e);
119
129
  export {
120
- B as ON_CHIP_CLOSE_EVENT,
121
- c as PieChip,
122
- o as defaultProps,
123
- $ as variants
130
+ S as ON_CHIP_CLOSE_EVENT,
131
+ e as PieChip,
132
+ r as defaultProps,
133
+ B as variants
124
134
  };
package/dist/react.d.ts CHANGED
@@ -63,6 +63,13 @@ declare class PieChip_2 extends LitElement implements ChipProps {
63
63
  isLoading: boolean;
64
64
  isDismissible: boolean;
65
65
  aria: ChipProps['aria'];
66
+ /**
67
+ * Hander to prevent click events
68
+ * when the chip is disabled or dismissible
69
+ *
70
+ * @private
71
+ */
72
+ private onClickHandler;
66
73
  /**
67
74
  * Template for the loading state
68
75
  *
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@justeattakeaway/pie-chip",
3
3
  "description": "PIE Design System Chip built using Web Components",
4
- "version": "0.8.6",
4
+ "version": "0.9.1",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -41,7 +41,7 @@
41
41
  "cem-plugin-module-file-extensions": "0.0.5"
42
42
  },
43
43
  "dependencies": {
44
- "@justeattakeaway/pie-icons-webc": "1.0.0",
44
+ "@justeattakeaway/pie-icons-webc": "1.1.0",
45
45
  "@justeattakeaway/pie-spinner": "0.7.2",
46
46
  "@justeattakeaway/pie-webc-core": "0.24.2"
47
47
  },
package/src/chip.scss CHANGED
@@ -1,7 +1,7 @@
1
1
  @use '@justeattakeaway/pie-css/scss' as p;
2
2
 
3
3
  @mixin chip-interactive-states($bg-color, $mode: 'default') {
4
- &:hover:not([disabled]) {
4
+ &:hover:not(.c-chip--disabled, .c-chip--dismissible) {
5
5
  @if $mode == 'inverse' {
6
6
  --hover-modifier: var(--dt-color-hover-02);
7
7
  } @else {
@@ -16,8 +16,8 @@
16
16
  }
17
17
  }
18
18
 
19
- &:active:not([disabled]),
20
- &.is-loading:not([disabled]) {
19
+ &:active:not(.c-chip--disabled, .c-chip--dismissible),
20
+ &.is-loading:not(.c-chip--disabled, .c-chip--dismissible) {
21
21
  @if $mode == 'inverse' {
22
22
  --active-modifier: var(--dt-color-active-02);
23
23
  } @else {
@@ -44,6 +44,8 @@
44
44
  --chip-min-width: calc(var(--dt-spacing-g) + var(--dt-spacing-b));
45
45
  --chip-gap: var(--dt-spacing-b);
46
46
  --chip-dismissible-offset: calc(var(--chip-gap) / -2); // ensures the spacing between the text and close icon is 4px
47
+ --chip-cursor: pointer;
48
+ --chip-close-btn-cursor: pointer;
47
49
 
48
50
  // Pie Webc Icon var that is used to ensure the correctly sized icon passed in a slot
49
51
  --icon-display-override: block;
@@ -62,7 +64,8 @@
62
64
  border-radius: var(--dt-radius-rounded-e);
63
65
  border: 1px solid;
64
66
  border-color: var(--chip-border-color);
65
- cursor: pointer;
67
+ cursor: var(--chip-cursor);
68
+ user-select: none;
66
69
  min-width: var(--chip-min-width);
67
70
 
68
71
  @include p.font-size(--dt-font-interactive-xs-size);
@@ -75,7 +78,7 @@
75
78
  // same as default styles
76
79
  }
77
80
 
78
- &.c-chip--outline:not([disabled], .c-chip--selected) {
81
+ &.c-chip--outline:not(.c-chip--disabled, .c-chip--selected) {
79
82
  --chip-border-color: var(--dt-color-border-strong);
80
83
  }
81
84
 
@@ -93,25 +96,6 @@
93
96
  @include chip-interactive-states('--dt-color-interactive-primary', 'inverse');
94
97
  }
95
98
 
96
- &.c-chip--dismissible.c-chip--selected {
97
- padding-inline-end: var(--chip-padding-dismissible);
98
- padding-block-start: var(--chip-padding-dismissible);
99
- padding-block-end: var(--chip-padding-dismissible);
100
-
101
- .c-chip-closeBtn {
102
- display: inline-flex;
103
- user-select: none;
104
- outline: none;
105
- border: none;
106
- color: inherit;
107
- background-color: inherit;
108
- border-radius: inherit;
109
- cursor: pointer;
110
- padding: 0;
111
- margin-inline-start: var(--chip-dismissible-offset);
112
- }
113
- }
114
-
115
99
  &.is-loading {
116
100
  & > *:not(.c-chip-spinner) {
117
101
  visibility: hidden;
@@ -125,15 +109,40 @@
125
109
  }
126
110
  }
127
111
 
128
- &[disabled] {
112
+ &.c-chip--disabled {
129
113
  --chip-bg-color: var(--dt-color-disabled-01);
130
114
  --chip-color: var(--dt-color-content-disabled);
115
+ --chip-cursor: not-allowed;
116
+ --chip-close-btn-cursor: not-allowed;
131
117
 
132
118
  &.c-chip--ghost {
133
119
  --chip-bg-color: transparent;
134
120
  }
121
+ }
122
+
123
+ &.c-chip--dismissible {
124
+ --chip-cursor: text;
125
+ padding-inline-end: var(--chip-padding-dismissible);
126
+ padding-block-start: var(--chip-padding-dismissible);
127
+ padding-block-end: var(--chip-padding-dismissible);
128
+ user-select: auto;
135
129
 
136
- cursor: not-allowed;
130
+ .c-chip-closeBtn {
131
+ display: inline-flex;
132
+ user-select: none;
133
+ outline: none;
134
+ border: none;
135
+ color: inherit;
136
+ background-color: inherit;
137
+ border-radius: inherit;
138
+ cursor: var(--chip-close-btn-cursor);
139
+ padding: 0;
140
+ margin-inline-start: var(--chip-dismissible-offset);
141
+
142
+ &:focus-visible {
143
+ @include p.focus;
144
+ }
145
+ }
137
146
  }
138
147
 
139
148
  &:focus-visible {
package/src/index.ts CHANGED
@@ -46,6 +46,19 @@ export class PieChip extends LitElement implements ChipProps {
46
46
  @property({ type: Object })
47
47
  public aria: ChipProps['aria'];
48
48
 
49
+ /**
50
+ * Hander to prevent click events
51
+ * when the chip is disabled or dismissible
52
+ *
53
+ * @private
54
+ */
55
+ private onClickHandler (event: Event) {
56
+ if (this.disabled || this.isDismissible) {
57
+ event.preventDefault();
58
+ event.stopPropagation();
59
+ }
60
+ }
61
+
49
62
  /**
50
63
  * Template for the loading state
51
64
  *
@@ -97,17 +110,21 @@ export class PieChip extends LitElement implements ChipProps {
97
110
  isLoading,
98
111
  isDismissible,
99
112
  } = this;
113
+ const showCloseButton = isDismissible && isSelected;
100
114
 
101
115
  const classes = {
102
116
  'c-chip': true,
103
117
  [`c-chip--${variant}`]: true,
104
118
  'c-chip--selected': isSelected,
105
- 'c-chip--dismissible': isDismissible,
119
+ 'c-chip--dismissible': showCloseButton,
120
+ 'c-chip--disabled': disabled,
106
121
  'is-loading': isLoading,
107
122
  };
108
123
 
109
124
  return html`
110
125
  <div
126
+ role="${ifDefined(showCloseButton ? undefined : 'button')}"
127
+ tabindex="${ifDefined(showCloseButton ? undefined : '0')}"
111
128
  aria-atomic="true"
112
129
  aria-busy="${isLoading}"
113
130
  aria-current="${isSelected}"
@@ -115,13 +132,11 @@ export class PieChip extends LitElement implements ChipProps {
115
132
  aria-live="polite"
116
133
  class=${classMap(classes)}
117
134
  data-test-id="pie-chip"
118
- tabindex="0"
119
- role="button"
120
- ?disabled="${disabled}">
135
+ @click="${this.onClickHandler}">
121
136
  <slot name="icon"></slot>
122
137
  ${isLoading ? this.renderSpinner() : nothing}
123
138
  <slot></slot>
124
- ${isDismissible && isSelected ? this.renderCloseButton() : nothing}
139
+ ${showCloseButton ? this.renderCloseButton() : nothing}
125
140
  </div>`;
126
141
  }
127
142