@cas-smartdesign/radio-button-group 5.0.1 → 6.0.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.
- package/dist/docs/5_segmented_button.js +1 -1
- package/dist/docs/doc.css +1 -1
- package/dist/docs/doc.mjs +102 -165
- package/dist/docs/index.html +5 -0
- package/dist/radio-button-group.d.ts +2 -0
- package/dist/radio-button-group.d.ts.map +1 -1
- package/dist/radio-button-group.mjs +22 -19
- package/dist/radio-button-group.mjs.map +1 -1
- package/dist/radio-button.d.ts.map +1 -1
- package/npm-third-party-licenses.json +11 -1
- package/package.json +12 -4
- package/readme.md +10 -5
package/dist/docs/index.html
CHANGED
|
@@ -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;
|
|
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{
|
|
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="
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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:10!important}.buttons-container{align-items:start;gap:var(--sd-radio-button-group-gap,0);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))
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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: 10 !important;\n}\n\n.buttons-container {\n\tdisplay: inline-flex;\n\talign-items: start;\n\tgap: var(--sd-radio-button-group-gap, 0);\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;
|
|
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
|
|
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": "
|
|
3
|
+
"version": "6.0.1",
|
|
4
4
|
"description": "Radio button and radio button group elements with SmartDesign look & feel",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"files": [
|
|
@@ -21,9 +21,17 @@
|
|
|
21
21
|
"@cas-smartdesign/styles": "^3.9.0"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@cas-smartdesign/button": "^
|
|
25
|
-
"@cas-smartdesign/
|
|
26
|
-
"@cas-smartdesign/
|
|
24
|
+
"@cas-smartdesign/button": "^7.1.1",
|
|
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.2"
|
|
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`
|
|
@@ -65,11 +74,7 @@ The element could show validation messages via an `sd-field-validation-message`
|
|
|
65
74
|
|
|
66
75
|
- `--sd-radio-button-checked-color`
|
|
67
76
|
- 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
77
|
- `--sd-radio-button-unchecked-color`
|
|
71
78
|
- 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
79
|
- `--sd-radio-button-padding`
|
|
75
80
|
- 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`)
|