{"version":3,"sources":["../src/elements/checkbox.ts","../src/styles/elements/checkbox.ts"],"sourcesContent":["import { html, LitElement } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\nimport { FormSubmitController } from '../utilities/form-controller';\nimport { emitEvent } from '../utilities/events';\nimport { stylesBase } from '../styles/elements/checkbox';\nimport { TypeStatus, EnumStatuses } from '../utilities/constants';\n\n/**\n * @since 1.0.0\n * @status stable\n *\n * @tagname kemet-checkbox\n * @summary An enhanced checkbox.\n *\n * @prop {string} label - Label text for the checkbox\n * @prop {boolean} checked - Determines if the checkbox is selected\n * @prop {boolean} indeterminate - An indeterminate selection status\n * @prop {string} name - Name of the checkbox\n * @prop {string} value - Value of the checkbox\n * @prop {boolean} disabled - Determines if a checkbox is disabled\n * @prop {boolean} required - Determines if a checkbox is required\n * @prop {boolean} focused - Is true when the checkbox is focused\n * @prop {boolean} rounded - Gives the checkbox rounded edges\n * @prop {boolean} filled - Fills the checkbox with color\n * @prop {TypeStatus} status - The status of the checkbox\n * @prop {string} message - Message associated with checkbox status\n *\n * @csspart label - The label element.\n * @csspart text - The label's text.\n * @csspart mark - The icon of the check mark.\n *\n * @cssproperty --kemet-checkbox-size - The width and height of the checkbox.\n * @cssproperty --kemet-checkbox-color - The color of the checkbox mark.\n * @cssproperty --kemet-checkbox-border - The border of the checkbox.\n * @cssproperty --kemet-checkbox-border-radius - The border radius of the checkbox.\n * @cssproperty --kemet-checkbox-filled-color - The filled color of the checkbox mark.\n * @cssproperty --kemet-checkbox-filled-background-color - The filled background color.\n *\n * @event kemet-change - Fires when the state of the checkbox changes\n * @event kemet-focus - Fires when the checkbox receives focus\n * @event kemet-blur - Fires when the checkbox loses focus\n *\n */\n\n@customElement('kemet-checkbox')\nexport default class KemetCheckbox extends LitElement {\n  /** @internal */\n  formSubmitController: FormSubmitController;\n\n  static styles = [stylesBase];\n\n  @property({ type: String })\n  label: string = '';\n\n  @property({ type: Boolean, reflect: true })\n  checked: boolean;\n\n  @property({ type: Boolean, reflect: true })\n  indeterminate: boolean;\n\n  @property({ type: String })\n  name: string = 'checkbox';\n\n  @property({ type: Boolean })\n  value: boolean;\n\n  @property({ type: Boolean, reflect: true })\n  disabled: boolean = false;\n\n  @property({ type: Boolean, reflect: true })\n  required: boolean = false;\n\n  @property({ type: Boolean, reflect: true })\n  focused: boolean;\n\n  @property({ type: Boolean, reflect: true })\n  rounded: boolean = false;\n\n  @property({ type: Boolean, reflect: true })\n  filled: boolean = false;\n\n  @property({ type: String, reflect: true })\n  status: TypeStatus = EnumStatuses.Standard;\n\n  @property({ type: String })\n  message: string;\n\n  @query('input')\n  input: HTMLInputElement;\n\n  constructor() {\n    super();\n\n    /** @internal */\n    this.formSubmitController = new FormSubmitController(this);\n  }\n\n  render() {\n    return html`\n      <label part=\"label\">\n        <input\n          type=\"checkbox\"\n          name=${ifDefined(this.name)}\n          .value=${this.value}\n          .indeterminate=${live(this.indeterminate)}\n          .checked=${live(this.checked)}\n          .disabled=${this.disabled}\n          .required=${this.required}\n          aria-checked=${this.checked ? 'true' : 'false'}\n          @click=${() => this.handleClick()}\n          @blur=${() => this.handleBlur()}\n          @focus=${() => this.handleFocus()}\n          @change=${() => this.handleChange()}\n        />\n        <button part=\"checkbox\" aria-label=${this.label}>\n          ${this.makeCheckMark()}\n        </button>\n        <span part=\"text\">${this.label}</span>\n      </label>\n      ${this.makeMessage()}\n    `;\n  }\n\n  /**\n   * Simulates a click on the input element.\n   * @public\n   * @method click\n   * @returns {void}\n   */\n  click(): void {\n    this.input.click();\n  }\n\n  handleClick() {\n    this.checked = !this.checked;\n    this.indeterminate = false;\n    emitEvent(this, 'kemet-change', this);\n  }\n\n  handleBlur() {\n    this.focused = false;\n    emitEvent(this, 'kemet-blur', true);\n  }\n\n  handleFocus() {\n    this.focused = true;\n    emitEvent(this, 'kemet-focus', true);\n  }\n\n  handleChange() {\n    this.value = this.checked;\n\n    if (this.input.checkValidity()) {\n      this.status = EnumStatuses.Standard;\n    }\n  }\n\n  makeMessage() {\n    if (this.status === EnumStatuses.Error || this.status === EnumStatuses.Warning) {\n      return html`<span part=\"message\">${this.message}</span>`;\n    }\n\n    return null;\n  }\n\n  makeCheckMark() {\n    if (this.checked) {\n      return html`\n        <span part=\"mark\">\n          <svg viewBox=\"0 0 16 16\">\n            <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" stroke-linecap=\"round\">\n              <g stroke=\"currentColor\" stroke-width=\"2\">\n                <g transform=\"translate(3.428571, 3.428571)\">\n                  <path d=\"M0,5.71428571 L3.42857143,9.14285714\"></path>\n                  <path d=\"M9.14285714,0 L3.42857143,9.14285714\"></path>\n                </g>\n              </g>\n            </g>\n          </svg>\n        </span>\n      `;\n    }\n\n    if (!this.checked && this.indeterminate) {\n      return html`\n        <span part=\"mark\">\n          <svg viewBox=\"0 0 16 16\">\n            <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" stroke-linecap=\"round\">\n              <g stroke=\"currentColor\" stroke-width=\"2\">\n                <g transform=\"translate(2.285714, 6.857143)\">\n                  <path d=\"M10.2857143,1.14285714 L1.14285714,1.14285714\"></path>\n                </g>\n              </g>\n            </g>\n          </svg>\n        </span>\n      `;\n    }\n\n    return null;\n  }\n\n  checkValidity() {\n    return this.input.checkValidity();\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'kemet-checkbox': KemetCheckbox\n  }\n}\n","import { css } from 'lit';\n\nexport const stylesBase = css`\n  *,\n  *::before,\n  *::after {\n    box-sizing: border-box;\n  }\n\n  :host {\n    --kemet-checkbox-size: 18px;\n    --kemet-checkbox-color: rgb(var(--kemet-color-foreground));\n    --kemet-checkbox-border: 1px solid rgb(var(--kemet-color-foreground));\n    --kemet-checkbox-border-radius: var(--kemet-border-radius-md);\n    --kemet-checkbox-filled-background-color: rgb(var(--kemet-color-primary));\n    --kemet-checkbox-filled-color: rgb(var(--kemet-color-white));\n\n    display: inline-block;\n  }\n\n  :host([disabled]) {\n    opacity: 0.5;\n  }\n\n  label {\n    display: inline-flex;\n    gap: 0.5rem;\n    align-items: center;\n  }\n\n  input {\n    cursor: pointer;\n    margin: 0;\n    padding: 0;\n    width: var(--kemet-checkbox-size);\n    height: var(--kemet-checkbox-size);\n    position: absolute;\n    opacity: 0;\n  }\n\n  button {\n    margin: 0;\n    border: none;\n    background: none;\n  }\n\n  [part='checkbox'] {\n    color: var(--kemet-checkbox-color);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: var(--kemet-checkbox-size);\n    height: var(--kemet-checkbox-size);\n    border: var(--kemet-checkbox-border);\n  }\n\n  :host([rounded]) [part='checkbox'] {\n    border-radius: var(--kemet-checkbox-border-radius);\n  }\n\n  :host([filled][checked]) [part='checkbox'],\n  :host([filled][indeterminate]) [part='checkbox'] {\n    border: none;\n    background-color: var(--kemet-checkbox-filled-background-color);\n  }\n\n  [part='mark'] {\n    display: flex;\n    width: calc(var(--kemet-checkbox-size) - 4px);\n    height: calc(var(--kemet-checkbox-size) - 4px);\n  }\n\n  :host([filled][checked]) [part='mark'],\n  :host([filled][indeterminate]) [part='mark'] {\n    color: var(--kemet-checkbox-filled-color);\n  }\n\n  [part='message'] {\n    display: block;\n    margin-top: 0.5rem;\n  }\n\n  :host([status='error']) [part='message'] {\n    color: rgb(var(--kemet-color-error));\n  }\n\n  :host([status='warning']) [part='message'] {\n    color: rgb(var(--kemet-color-error));\n  }\n`;\n"],"mappings":"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","names":[]}