@cas-smartdesign/radio-button-group 5.0.1 → 6.0.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.
@@ -4,6 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
7
+ <link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
7
8
  <title>Radio button</title>
8
9
  <style>
9
10
  .markdown-body {
@@ -13,6 +14,10 @@
13
14
  margin: 0 auto !important;
14
15
  padding-bottom: 45px;
15
16
  }
17
+ .example-root,
18
+ sd-radio-button-group {
19
+ padding: 3px;
20
+ }
16
21
  </style>
17
22
  <script type="module" crossorigin src="./doc.mjs"></script>
18
23
  <link rel="stylesheet" crossorigin href="./doc.css">
@@ -49,6 +49,8 @@ export declare class RadioButtonGroup extends LitElement {
49
49
  private toggleButton;
50
50
  private updateValue;
51
51
  private updateFocused;
52
+ private isRadioButton;
53
+ private isChecked;
52
54
  private checkButton;
53
55
  private uncheckButton;
54
56
  private get buttonsSlot();
@@ -1 +1 @@
1
- {"version":3,"file":"radio-button-group.d.ts","sourceRoot":"","sources":["../radio-button-group.ts"],"names":[],"mappings":"AAAA,OAAiC,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EACH,UAAU,EACV,KAAK,cAAc,EAEnB,KAAK,cAAc,EAItB,MAAM,KAAK,CAAC;AAIb,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAI7D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,mBAAmB,SAAS,CAAC;AAI7B,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;KAC3C;IACD,UAAU,mBAAmB;QACzB,oCAAoC,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;KACxE;CACJ;AAED,qBAAa,gBAAiB,SAAQ,UAAU;IAC5C,gBAAuB,EAAE,2BAA2B;IACpD,OAAc,aAAa,QAAO,IAAI,CAKpC;IAEK,MAAM,EAAE,UAAU,CAAgB;IAElC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAM;IAE/B,cAAc,UAAS;IAEvB,QAAQ,UAAS;IAEjB,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAEtC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAYtC,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAEpD,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,cAAc,CAAsC;IAE5D,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED,IAAW,UAAU,CAAC,KAAK,EAAE,MAAM,EAUlC;cAEkB,YAAY,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;cAQrD,OAAO,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IAWnE,WAAoB,MAAM,8BAMzB;IACe,MAAM,IAAI,cAAc;IAqBxC,OAAO,CAAC,gBAAgB,CAWtB;IAEF,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,aAAa,CAKnB;IAEF,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,iBAAiB,CASvB;IAEF,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,aAAa,CA6BnB;IAEF,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,aAAa;IAIrB,OAAO,KAAK,WAAW,GAKtB;IAED,OAAO,KAAK,aAAa,GAKxB;CACJ"}
1
+ {"version":3,"file":"radio-button-group.d.ts","sourceRoot":"","sources":["../radio-button-group.ts"],"names":[],"mappings":"AAAA,OAAiC,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EACH,UAAU,EACV,KAAK,cAAc,EAEnB,KAAK,cAAc,EAItB,MAAM,KAAK,CAAC;AAIb,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAI7D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,mBAAmB,SAAS,CAAC;AAI7B,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;KAC3C;IACD,UAAU,mBAAmB;QACzB,oCAAoC,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;KACxE;CACJ;AAED,qBAAa,gBAAiB,SAAQ,UAAU;IAC5C,gBAAuB,EAAE,2BAA2B;IACpD,OAAc,aAAa,QAAO,IAAI,CAKpC;IAEK,MAAM,EAAE,UAAU,CAAgB;IAElC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAM;IAE/B,cAAc,UAAS;IAEvB,QAAQ,UAAS;IAEjB,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAEtC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAYtC,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAEpD,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,cAAc,CAAsC;IAE5D,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED,IAAW,UAAU,CAAC,KAAK,EAAE,MAAM,EAUlC;cAEkB,YAAY,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;cAQrD,OAAO,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IAWnE,WAAoB,MAAM,8BAMzB;IACe,MAAM,IAAI,cAAc;IAsBxC,OAAO,CAAC,gBAAgB,CAWtB;IAEF,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,aAAa,CAKnB;IAEF,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,iBAAiB,CAYvB;IAEF,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,aAAa,CA6BnB;IAEF,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,aAAa;IAQrB,OAAO,KAAK,WAAW,GAKtB;IAED,OAAO,KAAK,aAAa,GAKxB;CACJ"}
@@ -3,7 +3,7 @@ import { LitElement as t, css as n, html as r, unsafeCSS as i } from "lit";
3
3
  import { property as a } from "lit/decorators/property.js";
4
4
  import { ifDefined as o } from "lit/directives/if-defined.js";
5
5
  //#region scss/button.scss?inline
6
- var s = ":host{display:block}:host,.label,.checkbox{outline:none}:host([disabled]){pointer-events:none}:host([disabled]) .root{opacity:.6;cursor:default;filter:grayscale()}:host(:not([disabled])[focused]) .highlight,:host([checked]) circle.inner{display:block!important}:host([checked]) circle.outer{stroke:var(--sd-radio-button-checked-color,#1467ba)!important}:host([oneline]) .label{white-space:pre;text-overflow:ellipsis;overflow:hidden}.root{vertical-align:middle;width:100%;padding:var(--sd-radio-button-padding,6px 0px);align-items:center;display:inline-flex}.root .radio-button-container{box-sizing:border-box;cursor:pointer;flex-shrink:0;width:28px;height:28px;margin-right:5px;display:inline-block;position:relative}.root .radio-button-container input{opacity:0;position:absolute;top:0;left:0}.root .radio-button-container circle.highlight{stroke:var(--sd-radio-button-highlight-color,#1467ba4d)}.root .radio-button-container circle.inner{fill:var(--sd-radio-button-checked-color,#1467ba)}.root .radio-button-container circle.outer{stroke:var(--sd-radio-button-unchecked-color,#767676)}.root .label{font-family:var(--sd-radio-button-font-family,\"Segoe UI\", \"Lucida Sans\", Arial, sans-serif);text-overflow:ellipsis;-webkit-user-select:none;user-select:none;cursor:pointer;padding-top:2px;padding-bottom:2px;overflow-x:hidden}";
6
+ var s = ":host{display:block}:host,.label,.checkbox{outline:none}:host([disabled]){pointer-events:none}:host([disabled]) .root{cursor:default}:host([disabled]) .root circle.inner-bg{fill:var(--color-bg-interaction-disabled,#e7e7e7)}:host([disabled]) .root circle.inner{fill:var(--color-fg-interaction-disabled,#999)}:host([disabled]) .root circle.outer{stroke:var(--color-border-interaction-disabled,#c6c6c6)!important}:host([disabled]) .root .label{color:var(--color-fg-interaction-disabled,#999)}:host([checked]) circle.inner{display:block!important}:host([checked]) circle.outer{stroke:var(--sd-radio-button-checked-color,#1467ba)!important}:host([oneline]){max-width:100%}:host([oneline]) .label{white-space:pre;text-overflow:ellipsis;overflow:hidden}.root{vertical-align:middle;width:100%;padding:var(--sd-radio-button-padding,0px);align-items:center;gap:var(--spacing-x4,8px);display:inline-flex}.root .radio-button-container{box-sizing:border-box;cursor:pointer;flex-shrink:0;width:28px;height:28px;display:inline-block;position:relative}.root .radio-button-container input{opacity:0;position:absolute;top:0;left:0}.root .radio-button-container circle.inner{fill:var(--sd-radio-button-checked-color,#1467ba)}.root .radio-button-container circle.outer{stroke:var(--sd-radio-button-unchecked-color,#767676)}.root .label{font:var(--text-body);color:var(--color-fg-selection-neutral-default,#111);text-overflow:ellipsis;-webkit-user-select:none;user-select:none;cursor:pointer;padding-top:2px;padding-bottom:2px;padding-right:var(--spacing-x4,8px);overflow-x:hidden}";
7
7
  //#endregion
8
8
  //#region \0@oxc-project+runtime@0.122.0/helpers/decorateMetadata.js
9
9
  function c(e, t) {
@@ -52,11 +52,10 @@ var u = 0, d = class e extends t {
52
52
  />
53
53
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="-14 -14 28 28">
54
54
  <circle
55
- class="highlight"
56
- style="display:none"
57
- r="11px"
58
- fill="transparent"
59
- stroke-width="6px"
55
+ class="inner-bg"
56
+ r="8px"
57
+ style="${this.disabled ? "" : "display:none"}"
58
+ stroke="none"
60
59
  ></circle>
61
60
  <circle class="inner" r="6px" style="display:none" stroke="none"></circle>
62
61
  <circle class="outer" r="9px" fill="transparent" stroke-width="2px"></circle>
@@ -86,7 +85,7 @@ l([a({
86
85
  }), c("design:type", Object)], d.prototype, "label", void 0);
87
86
  //#endregion
88
87
  //#region scss/group.scss?inline
89
- var f = ":host(:focus){outline:none}.buttons-container{gap:var(--sd-radio-button-group-gap,0);display:flex}.buttons-container.vertical{flex-direction:column}.validation-message{margin-left:5px}", p = class e extends t {
88
+ var f = ":host{display:block}:host(:focus){outline:none}:host(:focus-visible) ::slotted([focused]){outline:1px solid var(--color-border-interaction-focus,#111);outline-offset:var(--spacing-x1,2px);border-radius:var(--radius-s,4px);z-index:1}.buttons-container{align-items:start;gap:var(--sd-radio-button-group-gap,0);background:var(--sd-radio-button-container-background);border-radius:var(--radius-s,4px);max-width:100%;display:inline-flex}.buttons-container.vertical{flex-direction:column}.validation-message{margin-left:5px}", p = class e extends t {
90
89
  constructor(...e) {
91
90
  super(...e), this.layout = "horizontal", this.value = "", this.uncheckAllowed = !1, this.disabled = !1, this._buttons = [], this._focusIndex = -1, this._checkedButton = void 0, this.handleSlotChange = () => {
92
91
  this._buttons = this.buttonsSlot.assignedElements(), this._buttons.forEach((e) => {
@@ -99,7 +98,9 @@ var f = ":host(:focus){outline:none}.buttons-container{gap:var(--sd-radio-button
99
98
  this.updateFocused(this._buttons[this.focusIndex]);
100
99
  }, this.handleButtonClick = (e) => {
101
100
  this.focus();
102
- let t = this._buttons.find((t) => t.contains(e.target)), n = this._buttons.findIndex((e) => e == t);
101
+ let t = this._buttons.find((t) => t.contains(e.target));
102
+ if (t?.matches("[disabled], [aria-disabled='true']")) return;
103
+ let n = this._buttons.findIndex((e) => e == t);
103
104
  n >= 0 && (this.focusIndex = n, this.updateChecked());
104
105
  }, this.handleKeyDown = (e) => {
105
106
  let t = !0;
@@ -164,6 +165,7 @@ var f = ":host(:focus){outline:none}.buttons-container{gap:var(--sd-radio-button
164
165
  <slot></slot>
165
166
  </div>
166
167
  ${this.validationMessage && r`
168
+ <br />
167
169
  <sd-field-validation-message
168
170
  class="validation-message"
169
171
  .message=${this.validationMessage}
@@ -175,12 +177,7 @@ var f = ":host(:focus){outline:none}.buttons-container{gap:var(--sd-radio-button
175
177
  `;
176
178
  }
177
179
  updateCheckedButton(e) {
178
- if (this._checkedButton && this._checkedButton !== e) this.uncheckButton(e);
179
- else if (e.hasAttribute("checked")) {
180
- this._checkedButton = e;
181
- let t = e.getAttribute("value");
182
- this.updateValue(t);
183
- }
180
+ !this._checkedButton && this.isChecked(e) ? (this._checkedButton = e, this.updateValue(e.getAttribute("value"))) : this._checkedButton !== e && this.uncheckButton(e);
184
181
  }
185
182
  disableButtons() {
186
183
  this._buttons?.forEach((e) => {
@@ -221,14 +218,14 @@ var f = ":host(:focus){outline:none}.buttons-container{gap:var(--sd-radio-button
221
218
  return -1;
222
219
  }
223
220
  isFocusable(e) {
224
- return !e.hasAttribute("disabled");
221
+ return !e.matches("[disabled], [aria-disabled='true']");
225
222
  }
226
223
  updateChecked() {
227
224
  let e = this._checkedButton, t = this._buttons[this.focusIndex];
228
- this._checkedButton = t, e && e !== t && this.uncheckButton(e), t && this.toggleButton(t);
225
+ !t || t.matches("[disabled], [aria-disabled='true']") || (this._checkedButton = t, e && e !== t && this.uncheckButton(e), t && this.toggleButton(t));
229
226
  }
230
227
  toggleButton(e) {
231
- e.hasAttribute("checked") ? this.uncheckAllowed && (this.uncheckButton(e), this._checkedButton = void 0, this.updateValue("")) : (this.checkButton(e), this.updateValue(e.getAttribute("value")));
228
+ this.isChecked(e) ? this.uncheckAllowed && (this.uncheckButton(e), this._checkedButton = void 0, this.updateValue("")) : (this.checkButton(e), this.updateValue(e.getAttribute("value")));
232
229
  }
233
230
  updateValue(e) {
234
231
  this.value = e ?? void 0, this.fireValueChangeEvent();
@@ -236,11 +233,17 @@ var f = ":host(:focus){outline:none}.buttons-container{gap:var(--sd-radio-button
236
233
  updateFocused(e, t) {
237
234
  e?.removeAttribute?.("focused"), t?.setAttribute?.("focused", "");
238
235
  }
236
+ isRadioButton(e) {
237
+ return e.localName === d.ID;
238
+ }
239
+ isChecked(e) {
240
+ return this.isRadioButton(e) ? e.hasAttribute("checked") : e.getAttribute("aria-pressed") === "true";
241
+ }
239
242
  checkButton(e) {
240
- e.setAttribute("checked", "");
243
+ this.isRadioButton(e) ? e.setAttribute("checked", "") : e.setAttribute("aria-pressed", "true");
241
244
  }
242
245
  uncheckButton(e) {
243
- e.removeAttribute("checked");
246
+ this.isRadioButton(e) ? e.removeAttribute("checked") : e.setAttribute("aria-pressed", "false");
244
247
  }
245
248
  get buttonsSlot() {
246
249
  return this.shadowRoot && !this._buttonsSlot && (this._buttonsSlot = this.shadowRoot.querySelector("slot") ?? void 0), this._buttonsSlot;
@@ -1 +1 @@
1
- {"version":3,"file":"radio-button-group.mjs","names":[],"sources":["../scss/button.scss?inline","../radio-button.ts","../scss/group.scss?inline","../radio-button-group.ts"],"sourcesContent":["@use \"@cas-smartdesign/styles/scss/variables/colors\";\n@use \"@cas-smartdesign/styles/scss/variables/typography\";\n\n:host {\n\tdisplay: block;\n}\n\n:host,\n.label,\n.checkbox {\n\toutline: none;\n}\n\n:host([disabled]) {\n\tpointer-events: none;\n\n\t.root {\n\t\topacity: 0.6;\n\t\tcursor: default;\n\t\tfilter: grayscale(100%);\n\t}\n}\n\n:host(:not([disabled])[focused]) .highlight {\n\tdisplay: block !important;\n}\n\n:host([checked]) {\n\tcircle.inner {\n\t\tdisplay: block !important;\n\t}\n\tcircle.outer {\n\t\tstroke: var(--sd-radio-button-checked-color, colors.$sd-blue) !important;\n\t}\n}\n\n:host([oneline]) .label {\n\twhite-space: pre;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.root {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tvertical-align: middle;\n\twidth: 100%;\n\tpadding: var(--sd-radio-button-padding, 6px 0px);\n\n\t.radio-button-container {\n\t\tposition: relative;\n\t\tdisplay: inline-block;\n\t\twidth: 28px;\n\t\theight: 28px;\n\t\tbox-sizing: border-box;\n\t\tcursor: pointer;\n\t\tmargin-right: 5px;\n\t\tflex-shrink: 0;\n\n\t\tinput {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\topacity: 0;\n\t\t}\n\n\t\tcircle.highlight {\n\t\t\tstroke: var(--sd-radio-button-highlight-color, rgba(colors.$sd-blue, 0.3));\n\t\t}\n\t\tcircle.inner {\n\t\t\tfill: var(--sd-radio-button-checked-color, colors.$sd-blue);\n\t\t}\n\t\tcircle.outer {\n\t\t\tstroke: var(--sd-radio-button-unchecked-color, colors.$sd-grey);\n\t\t}\n\t}\n\n\t.label {\n\t\tfont-family: var(--sd-radio-button-font-family, typography.$sd-font-family);\n\t\ttext-overflow: ellipsis;\n\t\toverflow-x: hidden;\n\t\tuser-select: none;\n\t\tcursor: pointer;\n\t\tpadding-top: 2px;\n\t\tpadding-bottom: 2px;\n\t}\n}\n","import { LitElement, type TemplateResult, html, unsafeCSS, css } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [RadioButton.ID]: RadioButton;\n }\n}\n\nimport style from \"./scss/button.scss?inline\";\nlet idCounter = 0;\n\nexport class RadioButton extends LitElement {\n public static readonly ID = \"sd-radio-button\";\n public static ensureDefined = (): void => {\n if (!customElements.get(RadioButton.ID)) {\n customElements.define(RadioButton.ID, RadioButton);\n }\n };\n @property({ type: Boolean, reflect: true, attribute: true })\n public checked = false;\n @property({ type: String, reflect: true, attribute: true })\n public value = \"\";\n @property({ type: Boolean, reflect: true, attribute: true })\n public disabled = false;\n @property({ type: String, reflect: true, attribute: true })\n public label = \"\";\n\n private a11yID;\n\n constructor() {\n super();\n this.a11yID = RadioButton.ID + \"_\" + idCounter++;\n }\n\n static override get styles() {\n return [\n css`\n ${unsafeCSS(style)}\n `,\n ];\n }\n\n public override render(): TemplateResult {\n return html`\n <div class=\"root\">\n <div class=\"radio-button-container\">\n <input\n type=\"radio\"\n id=\"${this.a11yID}\"\n .checked=\"${this.checked}\"\n ?disabled=\"${this.disabled}\"\n @click=\"${this.handleClick}\"\n class=\"radio-button\"\n />\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-14 -14 28 28\">\n <circle\n class=\"highlight\"\n style=\"display:none\"\n r=\"11px\"\n fill=\"transparent\"\n stroke-width=\"6px\"\n ></circle>\n <circle class=\"inner\" r=\"6px\" style=\"display:none\" stroke=\"none\"></circle>\n <circle class=\"outer\" r=\"9px\" fill=\"transparent\" stroke-width=\"2px\"></circle>\n </svg>\n </div>\n <label class=\"label\" for=\"${this.a11yID}\" @click=\"${this.handleClick}\">${this.label}</label>\n </div>\n `;\n }\n\n private handleClick = (event: MouseEvent): void => {\n event.preventDefault();\n };\n}\n",":host(:focus) {\n\toutline: none;\n}\n\n.buttons-container {\n\tdisplay: flex;\n\tgap: var(--sd-radio-button-group-gap, 0);\n}\n\n.buttons-container.vertical {\n\tflex-direction: column;\n}\n\n.validation-message {\n\tmargin-left: 5px;\n}\n","import SDFieldValidationMessage, { ValidationLevel } from \"@cas-smartdesign/field-validation-message\";\nimport {\n LitElement,\n type TemplateResult,\n html,\n type PropertyValues,\n type ComplexAttributeConverter,\n unsafeCSS,\n css,\n} from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\n\nimport type { LayoutType, IValueChangeEvent } from \"./types\";\n\nimport { RadioButton } from \"./radio-button\";\n\nexport { RadioButton } from \"./radio-button\";\nexport type * from \"./types\";\n\nimport style from \"./scss/group.scss?inline\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [RadioButtonGroup.ID]: RadioButtonGroup;\n }\n interface HTMLElementEventMap {\n \"sd-radio-button-group-value-change\": CustomEvent<IValueChangeEvent>;\n }\n}\n\nexport class RadioButtonGroup extends LitElement {\n public static readonly ID = \"sd-radio-button-group\";\n public static ensureDefined = (): void => {\n RadioButton.ensureDefined();\n if (!customElements.get(RadioButtonGroup.ID)) {\n customElements.define(RadioButtonGroup.ID, RadioButtonGroup);\n }\n };\n @property({ type: String, reflect: true, attribute: true })\n public layout: LayoutType = \"horizontal\";\n @property({ type: String })\n public value: string | undefined = \"\";\n @property({ type: Boolean, reflect: true, attribute: \"uncheck-allowed\" })\n public uncheckAllowed = false;\n @property({ type: Boolean, reflect: true, attribute: true })\n public disabled = false;\n @property({ type: String })\n public validationMessage: string | undefined;\n @property({ type: String })\n public validationIconSrc: string | undefined;\n @property({\n type: {\n fromAttribute(value: string): ValidationLevel | undefined {\n return SDFieldValidationMessage.parseLevel(value);\n },\n toAttribute(value: ValidationLevel | undefined): string | undefined {\n return value != null ? value.toLowerCase() : undefined;\n },\n } as ComplexAttributeConverter,\n reflect: true,\n })\n public validationLevel: ValidationLevel | undefined;\n\n private _buttonsSlot: HTMLSlotElement | undefined;\n private _buttons: HTMLElement[] = [];\n private _focusIndex = -1;\n private _checkedButton: HTMLElement | undefined = undefined;\n\n public get focusIndex(): number {\n return this._focusIndex;\n }\n\n public set focusIndex(index: number) {\n if (index >= -1 && index < this.childElementCount) {\n const oldValue = this._focusIndex;\n this._focusIndex = index;\n if (oldValue !== index) {\n const previousButton = this._buttons[oldValue];\n const currentButton = this._buttons[this.focusIndex];\n this.updateFocused(previousButton, currentButton);\n }\n }\n }\n\n protected override firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n this.buttonsSlot!.addEventListener(\"slotchange\", this.handleSlotChange);\n this.addEventListener(\"focusin\", this.handleFocusIn);\n this.addEventListener(\"focusout\", this.handleFocusOut);\n this.addEventListener(\"keydown\", this.handleKeyDown);\n }\n\n protected override updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n if (changedProperties.has(\"disabled\")) {\n if (this.disabled) {\n this.disableButtons();\n } else {\n this.enableButtons();\n }\n }\n }\n\n static override get styles() {\n return [\n css`\n ${unsafeCSS(style)}\n `,\n ];\n }\n public override render(): TemplateResult {\n return html`\n <div\n class=\"buttons-container ${this.layout === \"vertical\" ? \"vertical\" : \"horizontal\"}\"\n @click=\"${ifDefined(this.disabled ? undefined : this.handleButtonClick)}\"\n >\n <slot></slot>\n </div>\n ${this.validationMessage &&\n html`\n <sd-field-validation-message\n class=\"validation-message\"\n .message=${this.validationMessage}\n .icon=${this.validationIconSrc}\n .level=${this.validationLevel}\n >\n </sd-field-validation-message>\n `}\n `;\n }\n\n private handleSlotChange = (): void => {\n this._buttons = this.buttonsSlot!.assignedElements() as HTMLElement[];\n this._buttons.forEach((button) => {\n if (!button.hasAttribute(\"disabled\") && this.disabled) {\n button.setAttribute(\"disabled\", \"\");\n }\n // prevent radio buttons to be able to get focus by tabbing\n // as focus is handled by this element\n button.setAttribute(\"tabIndex\", \"-1\");\n this.updateCheckedButton(button);\n });\n };\n\n private updateCheckedButton(button: HTMLElement): void {\n if (this._checkedButton && this._checkedButton !== button) {\n this.uncheckButton(button);\n } else if (button.hasAttribute(\"checked\")) {\n this._checkedButton = button;\n const value = button.getAttribute(\"value\");\n this.updateValue(value);\n }\n }\n\n private handleFocusIn = (event: FocusEvent): void => {\n const target = event.target as HTMLElement;\n const ind = this._buttons.findIndex((button) => button == target);\n this.focusIndex = this.focusIndex >= 0 ? this.focusIndex : this.getNextFocusIndex(ind !== -1 ? ind : 0);\n this.updateFocused(undefined, this._buttons[this.focusIndex]);\n };\n\n private handleFocusOut = (): void => {\n this.updateFocused(this._buttons[this.focusIndex]);\n };\n\n private disableButtons(): void {\n this._buttons?.forEach((button) => {\n button.setAttribute(\"disabled\", \"\");\n });\n }\n\n private enableButtons(): void {\n this._buttons?.forEach((button) => {\n button.removeAttribute(\"disabled\");\n });\n }\n\n private handleButtonClick = (event: MouseEvent): void => {\n // the individual buttons are not focusable\n this.focus();\n const target = this._buttons.find((button) => button.contains(event.target as Node));\n const targetIndex = this._buttons.findIndex((button) => button == target);\n if (targetIndex >= 0) {\n this.focusIndex = targetIndex;\n this.updateChecked();\n }\n };\n\n private fireValueChangeEvent(): void {\n this.dispatchEvent(\n new CustomEvent<IValueChangeEvent>(\"sd-radio-button-group-value-change\", {\n detail: {\n value: this.value,\n selectedIndex: this.selectedIndex,\n },\n }),\n );\n }\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n let shouldPrevent = true;\n switch (event.key) {\n case \"Down\":\n case \"ArrowDown\":\n case \"Right\":\n case \"ArrowRight\": {\n this.focusNext();\n break;\n }\n case \"Up\":\n case \"ArrowUp\":\n case \"Left\":\n case \"ArrowLeft\": {\n this.focusPrevious();\n break;\n }\n case \"Enter\": {\n this.updateChecked();\n break;\n }\n default: {\n shouldPrevent = false;\n }\n }\n if (shouldPrevent) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n private focusNext() {\n const newIndex = this.getNextFocusIndex(this.focusIndex + 1);\n this.focusIndex = newIndex !== -1 ? newIndex : this.getNextFocusIndex(0);\n if (!this.uncheckAllowed) {\n this.updateChecked();\n }\n }\n\n private focusPrevious() {\n const newIndex = this.getPreviousFocusIndex(this.focusIndex - 1);\n this.focusIndex = newIndex !== -1 ? newIndex : this.getPreviousFocusIndex(this.childElementCount - 1);\n if (!this.uncheckAllowed) {\n this.updateChecked();\n }\n }\n\n private getNextFocusIndex(index: number): number {\n for (let i = index; i < this.childElementCount; i++) {\n const button = this._buttons[i];\n if (button != null && this.isFocusable(button)) {\n return i;\n }\n }\n\n return -1;\n }\n\n private getPreviousFocusIndex(index: number): number {\n for (let i = index; i >= 0; i--) {\n const button = this._buttons[i];\n if (button != null && this.isFocusable(button)) {\n return i;\n }\n }\n\n return -1;\n }\n\n private isFocusable(button: HTMLElement): boolean {\n return !button.hasAttribute(\"disabled\");\n }\n\n private updateChecked(): void {\n const previousChecked = this._checkedButton;\n const currentChecked = this._buttons[this.focusIndex];\n this._checkedButton = currentChecked;\n if (previousChecked && previousChecked !== currentChecked) {\n this.uncheckButton(previousChecked);\n }\n if (currentChecked) {\n this.toggleButton(currentChecked);\n }\n }\n\n private toggleButton(button: HTMLElement): void {\n const checked = button.hasAttribute(\"checked\");\n if (checked) {\n if (this.uncheckAllowed) {\n this.uncheckButton(button);\n this._checkedButton = undefined;\n this.updateValue(\"\");\n }\n } else {\n this.checkButton(button);\n this.updateValue(button.getAttribute(\"value\"));\n }\n }\n\n private updateValue(newValue: string | null | undefined): void {\n this.value = newValue ?? undefined;\n this.fireValueChangeEvent();\n }\n\n private updateFocused(previousFocused?: HTMLElement, currentFocused?: HTMLElement): void {\n previousFocused?.removeAttribute?.(\"focused\");\n currentFocused?.setAttribute?.(\"focused\", \"\");\n }\n\n private checkButton(button: HTMLElement): void {\n button.setAttribute(\"checked\", \"\");\n }\n\n private uncheckButton(button: HTMLElement): void {\n button.removeAttribute(\"checked\");\n }\n\n private get buttonsSlot(): HTMLSlotElement | undefined {\n if (this.shadowRoot && !this._buttonsSlot) {\n this._buttonsSlot = this.shadowRoot.querySelector(\"slot\") ?? undefined;\n }\n return this._buttonsSlot;\n }\n\n private get selectedIndex(): number {\n if (this._buttons == undefined || this._checkedButton == undefined) {\n return -1;\n }\n return this._buttons.indexOf(this._checkedButton);\n }\n}\n\nRadioButtonGroup.ensureDefined();\n"],"mappings":"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"}
1
+ {"version":3,"file":"radio-button-group.mjs","names":[],"sources":["../scss/button.scss?inline","../radio-button.ts","../scss/group.scss?inline","../radio-button-group.ts"],"sourcesContent":["@use \"@cas-smartdesign/styles/scss/variables/colors\";\n\n:host {\n\tdisplay: block;\n}\n\n:host,\n.label,\n.checkbox {\n\toutline: none;\n}\n\n:host([disabled]) {\n\tpointer-events: none;\n\n\t.root {\n\t\tcursor: default;\n\n\t\tcircle.inner-bg {\n\t\t\tfill: var(--color-bg-interaction-disabled, #e7e7e7);\n\t\t}\n\n\t\tcircle.inner {\n\t\t\tfill: var(--color-fg-interaction-disabled, #999999);\n\t\t}\n\n\t\tcircle.outer {\n\t\t\tstroke: var(--color-border-interaction-disabled, #c6c6c6) !important;\n\t\t}\n\n\t\t.label {\n\t\t\tcolor: var(--color-fg-interaction-disabled, #999999);\n\t\t}\n\t}\n}\n\n:host([checked]) {\n\tcircle.inner {\n\t\tdisplay: block !important;\n\t}\n\tcircle.outer {\n\t\tstroke: var(--sd-radio-button-checked-color, colors.$sd-blue) !important;\n\t}\n}\n\n:host([oneline]) {\n\tmax-width: 100%;\n}\n\n:host([oneline]) .label {\n\twhite-space: pre;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.root {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tvertical-align: middle;\n\twidth: 100%;\n\tpadding: var(--sd-radio-button-padding, 0px);\n\tgap: var(--spacing-x4, 8px);\n\n\t.radio-button-container {\n\t\tposition: relative;\n\t\tdisplay: inline-block;\n\t\twidth: 28px;\n\t\theight: 28px;\n\t\tbox-sizing: border-box;\n\t\tcursor: pointer;\n\t\tflex-shrink: 0;\n\n\t\tinput {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\topacity: 0;\n\t\t}\n\t\tcircle.inner {\n\t\t\tfill: var(--sd-radio-button-checked-color, colors.$sd-blue);\n\t\t}\n\t\tcircle.outer {\n\t\t\tstroke: var(--sd-radio-button-unchecked-color, colors.$sd-grey);\n\t\t}\n\t}\n\n\t.label {\n\t\tfont: var(--text-body);\n\t\tcolor: var(--color-fg-selection-neutral-default, #111111);\n\t\ttext-overflow: ellipsis;\n\t\toverflow-x: hidden;\n\t\tuser-select: none;\n\t\tcursor: pointer;\n\t\tpadding-top: 2px;\n\t\tpadding-bottom: 2px;\n\t\tpadding-right: var(--spacing-x4, 8px);\n\t}\n}\n","import { LitElement, type TemplateResult, html, unsafeCSS, css } from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [RadioButton.ID]: RadioButton;\n }\n}\n\nimport style from \"./scss/button.scss?inline\";\nlet idCounter = 0;\n\nexport class RadioButton extends LitElement {\n public static readonly ID = \"sd-radio-button\";\n public static ensureDefined = (): void => {\n if (!customElements.get(RadioButton.ID)) {\n customElements.define(RadioButton.ID, RadioButton);\n }\n };\n @property({ type: Boolean, reflect: true, attribute: true })\n public checked = false;\n @property({ type: String, reflect: true, attribute: true })\n public value = \"\";\n @property({ type: Boolean, reflect: true, attribute: true })\n public disabled = false;\n @property({ type: String, reflect: true, attribute: true })\n public label = \"\";\n\n private a11yID;\n\n constructor() {\n super();\n this.a11yID = RadioButton.ID + \"_\" + idCounter++;\n }\n\n static override get styles() {\n return [\n css`\n ${unsafeCSS(style)}\n `,\n ];\n }\n\n public override render(): TemplateResult {\n return html`\n <div class=\"root\">\n <div class=\"radio-button-container\">\n <input\n type=\"radio\"\n id=\"${this.a11yID}\"\n .checked=\"${this.checked}\"\n ?disabled=\"${this.disabled}\"\n @click=\"${this.handleClick}\"\n class=\"radio-button\"\n />\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"-14 -14 28 28\">\n <circle\n class=\"inner-bg\"\n r=\"8px\"\n style=\"${this.disabled ? \"\" : \"display:none\"}\"\n stroke=\"none\"\n ></circle>\n <circle class=\"inner\" r=\"6px\" style=\"display:none\" stroke=\"none\"></circle>\n <circle class=\"outer\" r=\"9px\" fill=\"transparent\" stroke-width=\"2px\"></circle>\n </svg>\n </div>\n <label class=\"label\" for=\"${this.a11yID}\" @click=\"${this.handleClick}\">${this.label}</label>\n </div>\n `;\n }\n\n private handleClick = (event: MouseEvent): void => {\n event.preventDefault();\n };\n}\n",":host {\n\tdisplay: block;\n}\n\n:host(:focus) {\n\toutline: none;\n}\n\n:host(:focus-visible) ::slotted([focused]) {\n\toutline: 1px solid var(--color-border-interaction-focus, #111);\n\toutline-offset: var(--spacing-x1, 2px);\n\tborder-radius: var(--radius-s, 4px);\n\tz-index: 1;\n}\n\n.buttons-container {\n\tdisplay: inline-flex;\n\talign-items: start;\n\tgap: var(--sd-radio-button-group-gap, 0);\n\tbackground: var(--sd-radio-button-container-background);\n\tborder-radius: var(--radius-s, 4px);\n\tmax-width: 100%;\n}\n\n.buttons-container.vertical {\n\tflex-direction: column;\n}\n\n.validation-message {\n\tmargin-left: 5px;\n}\n","import SDFieldValidationMessage, { ValidationLevel } from \"@cas-smartdesign/field-validation-message\";\nimport {\n LitElement,\n type TemplateResult,\n html,\n type PropertyValues,\n type ComplexAttributeConverter,\n unsafeCSS,\n css,\n} from \"lit\";\nimport { property } from \"lit/decorators/property.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\n\nimport type { LayoutType, IValueChangeEvent } from \"./types\";\n\nimport { RadioButton } from \"./radio-button\";\n\nexport { RadioButton } from \"./radio-button\";\nexport type * from \"./types\";\n\nimport style from \"./scss/group.scss?inline\";\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [RadioButtonGroup.ID]: RadioButtonGroup;\n }\n interface HTMLElementEventMap {\n \"sd-radio-button-group-value-change\": CustomEvent<IValueChangeEvent>;\n }\n}\n\nexport class RadioButtonGroup extends LitElement {\n public static readonly ID = \"sd-radio-button-group\";\n public static ensureDefined = (): void => {\n RadioButton.ensureDefined();\n if (!customElements.get(RadioButtonGroup.ID)) {\n customElements.define(RadioButtonGroup.ID, RadioButtonGroup);\n }\n };\n @property({ type: String, reflect: true, attribute: true })\n public layout: LayoutType = \"horizontal\";\n @property({ type: String })\n public value: string | undefined = \"\";\n @property({ type: Boolean, reflect: true, attribute: \"uncheck-allowed\" })\n public uncheckAllowed = false;\n @property({ type: Boolean, reflect: true, attribute: true })\n public disabled = false;\n @property({ type: String })\n public validationMessage: string | undefined;\n @property({ type: String })\n public validationIconSrc: string | undefined;\n @property({\n type: {\n fromAttribute(value: string): ValidationLevel | undefined {\n return SDFieldValidationMessage.parseLevel(value);\n },\n toAttribute(value: ValidationLevel | undefined): string | undefined {\n return value != null ? value.toLowerCase() : undefined;\n },\n } as ComplexAttributeConverter,\n reflect: true,\n })\n public validationLevel: ValidationLevel | undefined;\n\n private _buttonsSlot: HTMLSlotElement | undefined;\n private _buttons: HTMLElement[] = [];\n private _focusIndex = -1;\n private _checkedButton: HTMLElement | undefined = undefined;\n\n public get focusIndex(): number {\n return this._focusIndex;\n }\n\n public set focusIndex(index: number) {\n if (index >= -1 && index < this.childElementCount) {\n const oldValue = this._focusIndex;\n this._focusIndex = index;\n if (oldValue !== index) {\n const previousButton = this._buttons[oldValue];\n const currentButton = this._buttons[this.focusIndex];\n this.updateFocused(previousButton, currentButton);\n }\n }\n }\n\n protected override firstUpdated(changedProperties: PropertyValues): void {\n super.firstUpdated(changedProperties);\n this.buttonsSlot!.addEventListener(\"slotchange\", this.handleSlotChange);\n this.addEventListener(\"focusin\", this.handleFocusIn);\n this.addEventListener(\"focusout\", this.handleFocusOut);\n this.addEventListener(\"keydown\", this.handleKeyDown);\n }\n\n protected override updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n if (changedProperties.has(\"disabled\")) {\n if (this.disabled) {\n this.disableButtons();\n } else {\n this.enableButtons();\n }\n }\n }\n\n static override get styles() {\n return [\n css`\n ${unsafeCSS(style)}\n `,\n ];\n }\n public override render(): TemplateResult {\n return html`\n <div\n class=\"buttons-container ${this.layout === \"vertical\" ? \"vertical\" : \"horizontal\"}\"\n @click=\"${ifDefined(this.disabled ? undefined : this.handleButtonClick)}\"\n >\n <slot></slot>\n </div>\n ${this.validationMessage &&\n html`\n <br />\n <sd-field-validation-message\n class=\"validation-message\"\n .message=${this.validationMessage}\n .icon=${this.validationIconSrc}\n .level=${this.validationLevel}\n >\n </sd-field-validation-message>\n `}\n `;\n }\n\n private handleSlotChange = (): void => {\n this._buttons = this.buttonsSlot!.assignedElements() as HTMLElement[];\n this._buttons.forEach((button) => {\n if (!button.hasAttribute(\"disabled\") && this.disabled) {\n button.setAttribute(\"disabled\", \"\");\n }\n // prevent radio buttons to be able to get focus by tabbing\n // as focus is handled by this element\n button.setAttribute(\"tabIndex\", \"-1\");\n this.updateCheckedButton(button);\n });\n };\n\n private updateCheckedButton(button: HTMLElement): void {\n if (!this._checkedButton && this.isChecked(button)) {\n this._checkedButton = button;\n this.updateValue(button.getAttribute(\"value\"));\n } else if (this._checkedButton !== button) {\n // single selection: the first checked button wins; this also\n // initializes aria-pressed=\"false\" on plain (non-radio) buttons\n this.uncheckButton(button);\n }\n }\n\n private handleFocusIn = (event: FocusEvent): void => {\n const target = event.target as HTMLElement;\n const ind = this._buttons.findIndex((button) => button == target);\n this.focusIndex = this.focusIndex >= 0 ? this.focusIndex : this.getNextFocusIndex(ind !== -1 ? ind : 0);\n this.updateFocused(undefined, this._buttons[this.focusIndex]);\n };\n\n private handleFocusOut = (): void => {\n this.updateFocused(this._buttons[this.focusIndex]);\n };\n\n private disableButtons(): void {\n this._buttons?.forEach((button) => {\n button.setAttribute(\"disabled\", \"\");\n });\n }\n\n private enableButtons(): void {\n this._buttons?.forEach((button) => {\n button.removeAttribute(\"disabled\");\n });\n }\n\n private handleButtonClick = (event: MouseEvent): void => {\n // the individual buttons are not focusable\n this.focus();\n const target = this._buttons.find((button) => button.contains(event.target as Node));\n if (target?.matches(\"[disabled], [aria-disabled='true']\")) {\n return;\n }\n const targetIndex = this._buttons.findIndex((button) => button == target);\n if (targetIndex >= 0) {\n this.focusIndex = targetIndex;\n this.updateChecked();\n }\n };\n\n private fireValueChangeEvent(): void {\n this.dispatchEvent(\n new CustomEvent<IValueChangeEvent>(\"sd-radio-button-group-value-change\", {\n detail: {\n value: this.value,\n selectedIndex: this.selectedIndex,\n },\n }),\n );\n }\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n let shouldPrevent = true;\n switch (event.key) {\n case \"Down\":\n case \"ArrowDown\":\n case \"Right\":\n case \"ArrowRight\": {\n this.focusNext();\n break;\n }\n case \"Up\":\n case \"ArrowUp\":\n case \"Left\":\n case \"ArrowLeft\": {\n this.focusPrevious();\n break;\n }\n case \"Enter\": {\n this.updateChecked();\n break;\n }\n default: {\n shouldPrevent = false;\n }\n }\n if (shouldPrevent) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n private focusNext() {\n const newIndex = this.getNextFocusIndex(this.focusIndex + 1);\n this.focusIndex = newIndex !== -1 ? newIndex : this.getNextFocusIndex(0);\n if (!this.uncheckAllowed) {\n this.updateChecked();\n }\n }\n\n private focusPrevious() {\n const newIndex = this.getPreviousFocusIndex(this.focusIndex - 1);\n this.focusIndex = newIndex !== -1 ? newIndex : this.getPreviousFocusIndex(this.childElementCount - 1);\n if (!this.uncheckAllowed) {\n this.updateChecked();\n }\n }\n\n private getNextFocusIndex(index: number): number {\n for (let i = index; i < this.childElementCount; i++) {\n const button = this._buttons[i];\n if (button != null && this.isFocusable(button)) {\n return i;\n }\n }\n\n return -1;\n }\n\n private getPreviousFocusIndex(index: number): number {\n for (let i = index; i >= 0; i--) {\n const button = this._buttons[i];\n if (button != null && this.isFocusable(button)) {\n return i;\n }\n }\n\n return -1;\n }\n\n private isFocusable(button: HTMLElement): boolean {\n return !button.matches(\"[disabled], [aria-disabled='true']\");\n }\n\n private updateChecked(): void {\n const previousChecked = this._checkedButton;\n const currentChecked = this._buttons[this.focusIndex];\n if (!currentChecked || currentChecked.matches(\"[disabled], [aria-disabled='true']\")) {\n return;\n }\n this._checkedButton = currentChecked;\n if (previousChecked && previousChecked !== currentChecked) {\n this.uncheckButton(previousChecked);\n }\n if (currentChecked) {\n this.toggleButton(currentChecked);\n }\n }\n\n private toggleButton(button: HTMLElement): void {\n const checked = this.isChecked(button);\n if (checked) {\n if (this.uncheckAllowed) {\n this.uncheckButton(button);\n this._checkedButton = undefined;\n this.updateValue(\"\");\n }\n } else {\n this.checkButton(button);\n this.updateValue(button.getAttribute(\"value\"));\n }\n }\n\n private updateValue(newValue: string | null | undefined): void {\n this.value = newValue ?? undefined;\n this.fireValueChangeEvent();\n }\n\n private updateFocused(previousFocused?: HTMLElement, currentFocused?: HTMLElement): void {\n previousFocused?.removeAttribute?.(\"focused\");\n currentFocused?.setAttribute?.(\"focused\", \"\");\n }\n\n private isRadioButton(button: HTMLElement): boolean {\n return button.localName === RadioButton.ID;\n }\n\n private isChecked(button: HTMLElement): boolean {\n return this.isRadioButton(button)\n ? button.hasAttribute(\"checked\")\n : button.getAttribute(\"aria-pressed\") === \"true\";\n }\n\n private checkButton(button: HTMLElement): void {\n if (this.isRadioButton(button)) {\n button.setAttribute(\"checked\", \"\");\n } else {\n button.setAttribute(\"aria-pressed\", \"true\");\n }\n }\n\n private uncheckButton(button: HTMLElement): void {\n if (this.isRadioButton(button)) {\n button.removeAttribute(\"checked\");\n } else {\n button.setAttribute(\"aria-pressed\", \"false\");\n }\n }\n\n private get buttonsSlot(): HTMLSlotElement | undefined {\n if (this.shadowRoot && !this._buttonsSlot) {\n this._buttonsSlot = this.shadowRoot.querySelector(\"slot\") ?? undefined;\n }\n return this._buttonsSlot;\n }\n\n private get selectedIndex(): number {\n if (this._buttons == undefined || this._checkedButton == undefined) {\n return -1;\n }\n return this._buttons.indexOf(this._checkedButton);\n }\n}\n\nRadioButtonGroup.ensureDefined();\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"radio-button.d.ts","sourceRoot":"","sources":["../radio-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAwB,MAAM,KAAK,CAAC;AAG5E,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;KACjC;CACJ;AAKD,qBAAa,WAAY,SAAQ,UAAU;IACvC,gBAAuB,EAAE,qBAAqB;IAC9C,OAAc,aAAa,QAAO,IAAI,CAIpC;IAEK,OAAO,UAAS;IAEhB,KAAK,SAAM;IAEX,QAAQ,UAAS;IAEjB,KAAK,SAAM;IAElB,OAAO,CAAC,MAAM,CAAC;;IAOf,WAAoB,MAAM,8BAMzB;IAEe,MAAM,IAAI,cAAc;IA6BxC,OAAO,CAAC,WAAW,CAEjB;CACL"}
1
+ {"version":3,"file":"radio-button.d.ts","sourceRoot":"","sources":["../radio-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAwB,MAAM,KAAK,CAAC;AAG5E,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;KACjC;CACJ;AAKD,qBAAa,WAAY,SAAQ,UAAU;IACvC,gBAAuB,EAAE,qBAAqB;IAC9C,OAAc,aAAa,QAAO,IAAI,CAIpC;IAEK,OAAO,UAAS;IAEhB,KAAK,SAAM;IAEX,QAAQ,UAAS;IAEjB,KAAK,SAAM;IAElB,OAAO,CAAC,MAAM,CAAC;;IAOf,WAAoB,MAAM,8BAMzB;IAEe,MAAM,IAAI,cAAc;IA4BxC,OAAO,CAAC,WAAW,CAEjB;CACL"}
@@ -1,5 +1,5 @@
1
1
  {
2
- "@cypress/vite-dev-server@7.2.1": {
2
+ "@cypress/vite-dev-server@7.3.2": {
3
3
  "licenses": "MIT",
4
4
  "repository": "https://github.com/cypress-io/cypress",
5
5
  "licenseUrl": "https://github.com/cypress-io/cypress/tree/develop/npm/vite-dev-server#readme"
@@ -19,6 +19,11 @@
19
19
  "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped",
20
20
  "licenseUrl": "https://unpkg.com/@types/postcss-prefix-selector@1.16.3/LICENSE"
21
21
  },
22
+ "@types/trusted-types@2.0.7": {
23
+ "licenses": "MIT",
24
+ "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped",
25
+ "licenseUrl": "https://unpkg.com/@types/trusted-types@2.0.7/LICENSE"
26
+ },
22
27
  "@types/yargs@17.0.35": {
23
28
  "licenses": "MIT",
24
29
  "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped",
@@ -49,6 +54,11 @@
49
54
  "repository": "https://github.com/cypress-io/cypress",
50
55
  "licenseUrl": "https://cypress.io"
51
56
  },
57
+ "dompurify@3.4.7": {
58
+ "licenses": "(MPL-2.0 OR Apache-2.0)",
59
+ "repository": "https://github.com/cure53/DOMPurify",
60
+ "licenseUrl": "https://unpkg.com/dompurify@3.4.7/LICENSE"
61
+ },
52
62
  "github-markdown-css@5.9.0": {
53
63
  "licenses": "MIT",
54
64
  "repository": "https://github.com/sindresorhus/github-markdown-css",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cas-smartdesign/radio-button-group",
3
- "version": "5.0.1",
3
+ "version": "6.0.0",
4
4
  "description": "Radio button and radio button group elements with SmartDesign look & feel",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "files": [
@@ -17,13 +17,21 @@
17
17
  },
18
18
  "dependencies": {
19
19
  "lit": "^3.3.2",
20
- "@cas-smartdesign/field-validation-message": "^6.0.0",
21
- "@cas-smartdesign/styles": "^3.9.0"
20
+ "@cas-smartdesign/styles": "^3.9.0",
21
+ "@cas-smartdesign/field-validation-message": "^6.0.0"
22
22
  },
23
23
  "devDependencies": {
24
- "@cas-smartdesign/button": "^6.0.0",
25
- "@cas-smartdesign/license-generator": "^1.10.0",
26
- "@cas-smartdesign/element-preview": "^1.0.0"
24
+ "@cas-smartdesign/button": "^7.0.0",
25
+ "@cas-smartdesign/element-preview": "^1.1.0",
26
+ "@cas-smartdesign/license-generator": "^1.10.0"
27
+ },
28
+ "peerDependencies": {
29
+ "@cas-smartdesign/design-tokens": "^3.0.1"
30
+ },
31
+ "peerDependenciesMeta": {
32
+ "@cas-smartdesign/design-tokens": {
33
+ "optional": true
34
+ }
27
35
  },
28
36
  "scripts": {
29
37
  "version": "pnpm version",
package/readme.md CHANGED
@@ -1,9 +1,18 @@
1
1
  # @cas-smartdesign/radio-button-group
2
2
 
3
- A radio-button-group and a radio-button element based on [lit-element](https://github.com/Polymer/lit-element) with SmartDesign look & feel.
3
+ A radio-button-group and a radio-button element based on [lit-element](https://github.com/Polymer/lit-element) with SmartDesign 3.0 look & feel.
4
+
5
+ This element must be used together with the design tokens of SmartDesign.
6
+ For an independent application, make sure to include the @cas-smartdesign/design-tokens package.
7
+ For a web app / web widget, refer to the official documentation about design token usage.
4
8
 
5
9
  ## radio-button-group
6
10
 
11
+ The group accepts any element as a button, not just `sd-radio-button`. The checked state is reflected on the slotted elements as follows:
12
+
13
+ - `sd-radio-button` children are toggled via their `checked` attribute.
14
+ - Any other element (e.g. `sd-button variant="selection"` for a segmented control) is toggled via the standard `aria-pressed` attribute (`"true"`/`"false"`).
15
+
7
16
  ### Attributes
8
17
 
9
18
  - `layout`
@@ -38,6 +47,8 @@ The element could show validation messages via an `sd-field-validation-message`
38
47
 
39
48
  - `--sd-radio-button-group-gap`
40
49
  - Defines the gap between the radio buttons in the group.
50
+ - `--sd-radio-button-container-background`
51
+ - Defines the background of the buttons container. Useful for segmented controls: set it to the border color so sub-pixel rounding seams between buttons are invisible.
41
52
 
42
53
  ## radio-button
43
54
 
@@ -65,11 +76,7 @@ The element could show validation messages via an `sd-field-validation-message`
65
76
 
66
77
  - `--sd-radio-button-checked-color`
67
78
  - Defines the color of the inner & outer circle when the button is checked
68
- - `--sd-radio-button-highlight-color`
69
- - Defines the color of the circle which is only visible when the button is focused
70
79
  - `--sd-radio-button-unchecked-color`
71
80
  - Defines the color of the outer circle and the inner circle when the button is unchecked
72
- - `--sd-radio-button-font-family`
73
- - Defines the font-family of the radio button
74
81
  - `--sd-radio-button-padding`
75
82
  - Defines the padding of the radio button. It is a shorthand property, so you can set all four paddings at once. (e.g. `10px 5px`)