@synergy-design-system/components
Version:
This package provides the base of the Synergy Design System as native web components. It uses [lit](https://www.lit.dev) and parts of [shoelace](https://shoelace.style/). Synergy officially supports the latest two versions of all major browsers (as define
271 lines (265 loc) • 8.31 kB
JavaScript
import {
defaultValue
} from "./chunk.3NXKLKWH.js";
import {
form_control_custom_styles_default,
form_control_styles_default
} from "./chunk.G4URZQCL.js";
import {
checkbox_custom_styles_default
} from "./chunk.Y3LNC7J6.js";
import {
checkbox_styles_default
} from "./chunk.6OX2AX3Z.js";
import {
FormControlController
} from "./chunk.HP2LEQRU.js";
import {
SynIcon
} from "./chunk.WFJVDRQR.js";
import {
HasSlotController
} from "./chunk.WVVQK5TE.js";
import {
enableDefaultSettings
} from "./chunk.E5UUNP6E.js";
import {
watch
} from "./chunk.BVZQ6QSY.js";
import {
component_styles_default
} from "./chunk.NLYVOJGK.js";
import {
SynergyElement
} from "./chunk.3AZFEB6D.js";
import {
__decorateClass
} from "./chunk.Z4XV3SMG.js";
// src/components/checkbox/checkbox.component.ts
import { classMap } from "lit/directives/class-map.js";
import { html } from "lit";
import { ifDefined } from "lit/directives/if-defined.js";
import { live } from "lit/directives/live.js";
import { property, query, state } from "lit/decorators.js";
var SynCheckbox = class extends SynergyElement {
constructor() {
super(...arguments);
this.formControlController = new FormControlController(this, {
value: (control) => control.checked ? control.value || "on" : void 0,
defaultValue: (control) => control.defaultChecked,
setValue: (control, checked) => control.checked = checked
});
this.hasSlotController = new HasSlotController(this, "help-text");
this.hasFocus = false;
this.title = "";
this.name = "";
this.size = "medium";
this.disabled = false;
this.checked = false;
this.indeterminate = false;
this.defaultChecked = false;
this.form = "";
this.required = false;
this.helpText = "";
}
/** Gets the validity state object */
get validity() {
return this.input.validity;
}
/** Gets the validation message */
get validationMessage() {
return this.input.validationMessage;
}
firstUpdated() {
this.formControlController.updateValidity();
}
handleClick() {
this.checked = !this.checked;
this.indeterminate = false;
this.emit("syn-change");
}
handleBlur() {
this.hasFocus = false;
this.emit("syn-blur");
}
handleInput() {
this.emit("syn-input");
}
handleInvalid(event) {
this.formControlController.setValidity(false);
this.formControlController.emitInvalidEvent(event);
}
handleFocus() {
this.hasFocus = true;
this.emit("syn-focus");
}
handleDisabledChange() {
this.formControlController.setValidity(this.disabled);
}
handleStateChange() {
this.input.checked = this.checked;
this.input.indeterminate = this.indeterminate;
this.formControlController.updateValidity();
}
/** Simulates a click on the checkbox. */
click() {
this.input.click();
}
/** Sets focus on the checkbox. */
focus(options) {
this.input.focus(options);
}
/** Removes focus from the checkbox. */
blur() {
this.input.blur();
}
/** Checks for validity but does not show a validation message. Returns `true` when valid and `false` when invalid. */
checkValidity() {
return this.input.checkValidity();
}
/** Gets the associated form, if one exists. */
getForm() {
return this.formControlController.getForm();
}
/** Checks for validity and shows the browser's validation message if the control is invalid. */
reportValidity() {
return this.input.reportValidity();
}
/**
* Sets a custom validation message. The value provided will be shown to the user when the form is submitted. To clear
* the custom validation message, call this method with an empty string.
*/
setCustomValidity(message) {
this.input.setCustomValidity(message);
this.formControlController.updateValidity();
}
render() {
const hasHelpTextSlot = this.hasSlotController.test("help-text");
const hasHelpText = this.helpText ? true : !!hasHelpTextSlot;
return html`
<div
class=${classMap({
"form-control": true,
"form-control--small": this.size === "small",
"form-control--medium": this.size === "medium",
"form-control--large": this.size === "large",
"form-control--has-help-text": hasHelpText
})}
>
<label
part="base"
class=${classMap({
checkbox: true,
"checkbox--checked": this.checked,
"checkbox--disabled": this.disabled,
"checkbox--focused": this.hasFocus,
"checkbox--indeterminate": this.indeterminate,
"checkbox--small": this.size === "small",
"checkbox--medium": this.size === "medium",
"checkbox--large": this.size === "large"
})}
>
<input
class="checkbox__input"
type="checkbox"
title=${this.title}
name=${this.name}
value=${ifDefined(this.value)}
.indeterminate=${live(this.indeterminate)}
.checked=${live(this.checked)}
.disabled=${this.disabled}
.required=${this.required}
aria-checked=${this.checked ? "true" : "false"}
aria-describedby="help-text"
=${this.handleClick}
=${this.handleInput}
=${this.handleInvalid}
=${this.handleBlur}
=${this.handleFocus}
/>
<span
part="control${this.checked ? " control--checked" : ""}${this.indeterminate ? " control--indeterminate" : ""}"
class="checkbox__control"
>
${this.checked ? html`
<syn-icon part="checked-icon" class="checkbox__checked-icon" library="system" name="check"></syn-icon>
` : ""}
${!this.checked && this.indeterminate ? html`
<syn-icon
part="indeterminate-icon"
class="checkbox__indeterminate-icon"
library="system"
name="indeterminate"
></syn-icon>
` : ""}
</span>
<div part="label" class="checkbox__label">
<slot></slot>
</div>
</label>
<div
aria-hidden=${hasHelpText ? "false" : "true"}
class="form-control__help-text"
id="help-text"
part="form-control-help-text"
>
<slot name="help-text">${this.helpText}</slot>
</div>
</div>
`;
}
};
SynCheckbox.styles = [component_styles_default, form_control_styles_default, checkbox_styles_default, form_control_custom_styles_default, checkbox_custom_styles_default];
SynCheckbox.dependencies = { "syn-icon": SynIcon };
__decorateClass([
query('input[type="checkbox"]')
], SynCheckbox.prototype, "input", 2);
__decorateClass([
state()
], SynCheckbox.prototype, "hasFocus", 2);
__decorateClass([
property({ reflect: true })
], SynCheckbox.prototype, "title", 2);
__decorateClass([
property()
], SynCheckbox.prototype, "name", 2);
__decorateClass([
property()
], SynCheckbox.prototype, "value", 2);
__decorateClass([
property({ reflect: true })
], SynCheckbox.prototype, "size", 2);
__decorateClass([
property({ type: Boolean, reflect: true })
], SynCheckbox.prototype, "disabled", 2);
__decorateClass([
property({ type: Boolean, reflect: true })
], SynCheckbox.prototype, "checked", 2);
__decorateClass([
property({ type: Boolean, reflect: true })
], SynCheckbox.prototype, "indeterminate", 2);
__decorateClass([
defaultValue("checked")
], SynCheckbox.prototype, "defaultChecked", 2);
__decorateClass([
property({ reflect: true })
], SynCheckbox.prototype, "form", 2);
__decorateClass([
property({ type: Boolean, reflect: true })
], SynCheckbox.prototype, "required", 2);
__decorateClass([
property({ attribute: "help-text" })
], SynCheckbox.prototype, "helpText", 2);
__decorateClass([
watch("disabled", { waitUntilFirstUpdate: true })
], SynCheckbox.prototype, "handleDisabledChange", 1);
__decorateClass([
watch(["checked", "indeterminate"], { waitUntilFirstUpdate: true })
], SynCheckbox.prototype, "handleStateChange", 1);
SynCheckbox = __decorateClass([
enableDefaultSettings("SynCheckbox")
], SynCheckbox);
export {
SynCheckbox
};
//# sourceMappingURL=chunk.Q476ENNF.js.map