Skip to content

Theme

Компонент со слотом, предоставляющий переключение между цветовыми темами Дизайн-Системы.

Выбранное пользователем значение, сохраняется в использующем localStorage хранилище, синхронизирующемся между вкладками браузера.

ts
enum Themes {
  default = 'default', // Значение по умолчанию
  dark = 'dark',
}

Использование

WARNING

Не забывайте указывать slot="main" на дочернем элементе-триггере!

При необходимости вы можете передать правила стилевой разметки в хост компонента через атрибут styles. Внимание!!! Это небезопасно!

HTML

Значение атрибута value передавать в разметку не надо.

html
<ds-theme styles="display: block" id="theme">
  <ds-icon
    id="button"
    icon="ecology"
    color="fargo"
    size="32"
    slot="main"
  ></ds-icon>
</ds-theme>

<script>
  const button = document.getElementById('button');
  if (button) {
    button.addEventListener('click', function () {
      const theme = document.getElementById('theme');
      if (theme) {
        if (theme.value === 'dark') theme.value = 'default';
        else theme.value = 'dark';
      }
    });
  }
</script>

React

js
import { useState, useCallback } from 'react';
import { Icon, Theme } from '@rir/ds-library';
import DS from '@rir/ds-library';

function Component() {
  const ds = new DS();

  const [theme, setTheme] = useState(ds.getState().theme);

  const onClick = useCallback(() => {
    if (theme === 'dark') {
      setTheme('default');
      return;
    }
    setTheme('dark');
  }, [theme]);

  return (
    <>
      <Theme value={theme} styles="display: block;">
        <Icon
          icon="ecology"
          color="fargo"
          size={32}
          slot="main"
          onClick={onClick}
        ></Icon>
      </Theme>
    </>
  );
}

export default Component;

Angular

ts
import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';

@Component({
  template: `
<ds-theme styles="display: block" [value]="theme">
  <ds-icon
    icon="ecology"
    color="fargo"
    size="32"
    slot="main"
    (click)="click()"
  ></ds-icon>
</ds-theme>`,
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppComponent {
  theme = 'default';

  click() {
    if (this.theme === 'dark') this.theme = 'default';
    else this.theme = 'dark';
  }
}

Vue3

vue
<script lang="ts">
import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup() {
    const theme = ref('default');

    const setTheme = () => {
      if (theme.value === 'default') theme.value = 'dark';
      else theme.value = 'default';
    };

    return {
      theme,
      setTheme,
    };
  },
});
</script>

<template>
  <ds-theme styles="display: block;" :value="theme">
    <ds-icon
      icon="ecology"
      color="fargo"
      :size="32"
      slot="main"
      @click.prevent="setTheme()"
    ></ds-icon>
  </ds-theme>
</template>

API

Props

NameTypeDescriptionDefault
valueenum ThemesТема которую использует ДС в данный момент'default'
stylesString"Небезопастная" строка для передачи правил CSS в компонент''

Slots

NameDescription
mainОсновной слот

Примеры проектов

React

Angular

Vue