Skip to content

Temperature Converter

Live islandRuns locally in this page

Page shell

<article>
  <h1>Temperature Converter</h1>
  <temperature-converter></temperature-converter>
</article>
<script src="https://unpkg.com/cami@0.4/build/cami.cdn.js"></script>
<script type="module" src="./island.js"></script>

Island source

const { html, ReactiveElement } = cami
class TemperatureConverterElement extends ReactiveElement {
    celsius = '';
    fahrenheit = '';
    convertToFahrenheit(celsius) {
        const value = Number(celsius);
        if (celsius !== '' && Number.isFinite(value)) {
            this.fahrenheit = String(value * (9 / 5) + 32);
        }
    }
    convertToCelsius(fahrenheit) {
        const value = Number(fahrenheit);
        if (fahrenheit !== '' && Number.isFinite(value)) {
            this.celsius = String((value - 32) * (5 / 9));
        }
    }
    template() {
        return html `
      <label>
        Celsius:
        <input type="number" .value=${this.celsius} @input=${(event) => this.convertToFahrenheit(event.currentTarget.value)}>
      </label>
      <label>
        Fahrenheit:
        <input type="number" .value=${this.fahrenheit} @input=${(event) => this.convertToCelsius(event.currentTarget.value)}>
      </label>
    `;
    }
}
customElements.define('temperature-converter', TemperatureConverterElement);
import { html, ReactiveElement } from 'cami'

class TemperatureConverterElement extends ReactiveElement {
  celsius: string = ''
  fahrenheit: string = ''

  convertToFahrenheit(celsius: string): void {
    const value = Number(celsius)
    if (celsius !== '' && Number.isFinite(value)) {
      this.fahrenheit = String(value * (9 / 5) + 32)
    }
  }

  convertToCelsius(fahrenheit: string): void {
    const value = Number(fahrenheit)
    if (fahrenheit !== '' && Number.isFinite(value)) {
      this.celsius = String((value - 32) * (5 / 9))
    }
  }

  template(): ReturnType<typeof html> {
    return html`
      <label>
        Celsius:
        <input type="number" .value=${this.celsius} @input=${(event: InputEvent) =>
          this.convertToFahrenheit((event.currentTarget as HTMLInputElement).value)}>
      </label>
      <label>
        Fahrenheit:
        <input type="number" .value=${this.fahrenheit} @input=${(event: InputEvent) =>
          this.convertToCelsius((event.currentTarget as HTMLInputElement).value)}>
      </label>
    `
  }
}

declare global {
  interface HTMLElementTagNameMap {
    'temperature-converter': TemperatureConverterElement
  }
}

customElements.define('temperature-converter', TemperatureConverterElement)