From cfe12013d0a726c69fed391f129560b765606598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BB=D1=8E=D0=B3=D0=B8=D0=BD?= <d.malygin@iqdev.digital> Date: Wed, 18 Dec 2024 17:30:42 +0500 Subject: [PATCH] refactor: change color logic and fix some problems of components --- src/App.vue | 4 +- src/assets/main.css | 9 + src/common/helpers/colors.ts | 276 +++++++++++++++++- src/common/helpers/common.ts | 28 ++ src/common/interfaces/common.ts | 10 +- src/common/interfaces/componentsProp.ts | 22 +- src/common/interfaces/componentsProps.ts | 39 ++- .../components/Button/Button.stories.ts | 12 +- src/stories/components/Button/Button.vue | 15 +- .../components/Divider/Divider.stories.ts | 3 +- src/stories/components/Divider/Divider.vue | 5 +- .../components/Drawer/Drawer.stories.ts | 3 +- src/stories/components/Drawer/Drawer.vue | 35 ++- .../components/MenuDial/MenuDial.stories.ts | 53 +++- src/stories/components/MenuDial/MenuDial.vue | 24 +- src/stories/components/Modal/Modal.stories.ts | 3 +- src/stories/components/Modal/Modal.vue | 31 +- src/stories/components/Popup/Popup.stories.ts | 3 +- src/stories/components/Popup/Popup.vue | 33 ++- .../SelectButton/SelectButton.stories.ts | 13 +- .../components/SelectButton/SelectButton.vue | 22 +- .../components/Slider/Slider.stories.ts | 9 +- src/stories/components/Slider/Slider.vue | 14 +- .../ToggleSwitch/ToggleSwitch.stories.ts | 14 +- .../components/ToggleSwitch/ToggleSwitch.vue | 11 +- src/stories/components/TreeList/TreeItems.vue | 12 +- .../components/TreeList/TreeList.stories.ts | 6 +- src/stories/components/TreeList/TreeList.vue | 11 +- 28 files changed, 592 insertions(+), 128 deletions(-) create mode 100644 src/common/helpers/common.ts diff --git a/src/App.vue b/src/App.vue index d7bf047..ad430e4 100644 --- a/src/App.vue +++ b/src/App.vue @@ -108,7 +108,7 @@ import ToggleSwitch from '@stories/components/ToggleSwitch/ToggleSwitch.vue'; import TriangleIcon from '@stories/icons/Mono/TriangleIcon.vue'; import Button from '@stories/components/Button/Button.vue'; import Slider from '@stories/components/Slider/Slider.vue'; -import type { ISBOption } from '@interfaces/componentsProp'; +import type { ISBOption, ISliderOptions } from '@interfaces/componentsProp'; import Modal from '@stories/components/Modal/Modal.vue'; import MenuDial from '@stories/components/MenuDial/MenuDial.vue'; import Popup from '@stories/components/Popup/Popup.vue'; @@ -219,7 +219,7 @@ const gentleIcons = [ UserIcon, ]; const visibleDrawer = ref(true); -const sliderOptions = [ +const sliderOptions: ISliderOptions[] = [ { label: 0, value: 0, diff --git a/src/assets/main.css b/src/assets/main.css index 7b91d0d..21b455a 100644 --- a/src/assets/main.css +++ b/src/assets/main.css @@ -82,6 +82,15 @@ --teal-700: #0f766e; --teal-800: #115e59; --teal-900: #134e4a; + --cyan-100: #cffafe; + --cyan-200: #a5f3fc; + --cyan-300: #67e8f9; + --cyan-400: #22d3ee; + --cyan-500: #06b6d4; + --cyan-600: #0891b2; + --cyan-700: #0e7490; + --cyan-800: #155e75; + --cyan-900: #164e63; --sky-100: #e0f2fe; --sky-200: #bae6fd; --sky-300: #7dd3fc; diff --git a/src/common/helpers/colors.ts b/src/common/helpers/colors.ts index 5ec5279..74a597b 100644 --- a/src/common/helpers/colors.ts +++ b/src/common/helpers/colors.ts @@ -1,13 +1,106 @@ -export const convert300ThemeToColor = (theme: string | undefined) => { +import type { TDarkness, TThemeColor } from '@interfaces/common'; + +export const convertWhiteOrBlackToColor = (theme: 'white' | 'black', darkness: TDarkness) => { + if (theme === 'white') { + if (darkness === 500 || darkness === 400 || darkness === 600) return '#cbd5e1'; + if (darkness === 300 || darkness === 700) return '#94a3b8'; + if (darkness === 200 || darkness === 800) return '#f1f5f9'; + if (darkness === 100 || darkness === 900) return '#e2e8f0'; + } + if (darkness === 500 || darkness === 400 || darkness === 600) return '#475569'; + if (darkness === 300 || darkness === 700) return '#64748b'; + if (darkness === 200 || darkness === 800) return '#94a3b8'; + if (darkness === 100 || darkness === 900) return '#cbd5e1'; +}; + +export const convert100ThemeToColor = (theme: TThemeColor) => { + switch (theme) { + case 'white': + return '#9ca3af'; + case 'blue': + return '#dbeafe'; + case 'sky': + return '#e0f2fe'; + case 'cyan': + return '#cffafe'; + case 'teal': + return '#ccfbf1'; + case 'lime': + return '#ecfccb'; + case 'green': + return '#dcfce7'; + case 'yellow': + return '#fef9c3'; + case 'amber': + return '#fef3c7'; + case 'orange': + return '#ffedd5'; + case 'pink': + return '#fce7f3'; + case 'fuchsia': + return '#fae8ff'; + case 'purple': + return '#f3e8ff'; + case 'indigo': + return '#e0e7ff'; + case 'rose': + return '#ffe4e6'; + case 'red': + return '#fee2e2'; + case 'black': + return '#4b5563'; + } +}; + +export const convert200ThemeToColor = (theme: TThemeColor) => { switch (theme) { case 'white': - return '#cbd5e1'; - case 'slate': - return '#cbd5e1'; + return '#d1d5db'; + case 'blue': + return '#bfdbfe'; + case 'sky': + return '#bae6fd'; + case 'cyan': + return '#a5f3fc'; + case 'teal': + return '#99f6e4'; + case 'lime': + return '#d9f99d'; + case 'green': + return '#bbf7d0'; + case 'yellow': + return '#fef08a'; + case 'amber': + return '#fde68a'; + case 'orange': + return '#fed7aa'; + case 'pink': + return '#fbcfe8'; + case 'fuchsia': + return '#f5d0fe'; + case 'purple': + return '#e9d5ff'; + case 'indigo': + return '#c7d2fe'; + case 'rose': + return '#fecdd3'; + case 'red': + return '#fecaca'; + case 'black': + return '#374151'; + } +}; + +export const convert300ThemeToColor = (theme: TThemeColor) => { + switch (theme) { + case 'white': + return '#e5e7eb'; case 'blue': return '#93c5fd'; case 'sky': return '#7dd3fc'; + case 'cyan': + return '#67e8f9'; case 'teal': return '#5eead4'; case 'lime': @@ -33,20 +126,59 @@ export const convert300ThemeToColor = (theme: string | undefined) => { case 'red': return '#fca5a5'; case 'black': - return '#334155'; + return '#1f2937'; + } +}; + +export const convert400ThemeToColor = (theme: TThemeColor) => { + switch (theme) { + case 'white': + return '#f3f4f6'; + case 'blue': + return '#60a5fa'; + case 'sky': + return '#38bdf8'; + case 'cyan': + return '#22d3ee'; + case 'teal': + return '#2dd4bf'; + case 'lime': + return '#a3e635'; + case 'green': + return '#4ade80'; + case 'yellow': + return '#facc15'; + case 'amber': + return '#fbbf24'; + case 'orange': + return '#fb923c'; + case 'pink': + return '#f472b6'; + case 'fuchsia': + return '#e879f9'; + case 'purple': + return '#c084fc'; + case 'indigo': + return '#818cf8'; + case 'rose': + return '#fb7185'; + case 'red': + return '#f87171'; + case 'black': + return '#111827'; } }; -export const convert500ThemeToColor = (theme: string | undefined) => { +export const convert500ThemeToColor = (theme: TThemeColor) => { switch (theme) { case 'white': return '#ffffff'; - case 'slate': - return '#64748b'; case 'blue': return '#3b82f6'; case 'sky': return '#0ea5e9'; + case 'cyan': + return '#06b6d4'; case 'teal': return '#14b8a6'; case 'lime': @@ -74,19 +206,96 @@ export const convert500ThemeToColor = (theme: string | undefined) => { case 'black': return '#000000'; } - return '#000000'; }; -export const convert800ThemeToColor = (theme: string | undefined) => { +export const convert600ThemeToColor = (theme: TThemeColor) => { switch (theme) { case 'white': - return '#ffffff'; - case 'slate': - return '#1e293b'; + return '#f3f4f6'; + case 'blue': + return '#2563eb'; + case 'sky': + return '#0284c7'; + case 'cyan': + return '#0891b2'; + case 'teal': + return '#0d9488'; + case 'lime': + return '#65a30d'; + case 'green': + return '#16a34a'; + case 'yellow': + return '#ca8a04'; + case 'amber': + return '#d97706'; + case 'orange': + return '#ea580c'; + case 'pink': + return '#db2777'; + case 'fuchsia': + return '#c026d3'; + case 'purple': + return '#9333ea'; + case 'indigo': + return '#4f46e5'; + case 'rose': + return '#e11d48'; + case 'red': + return '#dc2626'; + case 'black': + return '#111827'; + } +}; + +export const convert700ThemeToColor = (theme: TThemeColor) => { + switch (theme) { + case 'white': + return '#e5e7eb'; + case 'blue': + return '#1d4ed8'; + case 'sky': + return '#0369a1'; + case 'cyan': + return '#0e7490'; + case 'teal': + return '#0f766e'; + case 'lime': + return '#4d7c0f'; + case 'green': + return '#15803d'; + case 'yellow': + return '#a16207'; + case 'amber': + return '#b45309'; + case 'orange': + return '#c2410c'; + case 'pink': + return '#be185d'; + case 'fuchsia': + return '#a21caf'; + case 'purple': + return '#7e22ce'; + case 'indigo': + return '#4338ca'; + case 'rose': + return '#be123c'; + case 'red': + return '#b91c1c'; + case 'black': + return '#1f2937'; + } +}; + +export const convert800ThemeToColor = (theme: TThemeColor) => { + switch (theme) { + case 'white': + return '#d1d5db'; case 'blue': return '#1e40af'; case 'sky': return '#075985'; + case 'cyan': + return '#155e75'; case 'teal': return '#115e59'; case 'lime': @@ -112,6 +321,45 @@ export const convert800ThemeToColor = (theme: string | undefined) => { case 'red': return '#991b1b'; case 'black': - return '#000000'; + return '#374151'; + } +}; + +export const convert900ThemeToColor = (theme: TThemeColor) => { + switch (theme) { + case 'white': + return '#9ca3af'; + case 'blue': + return '#1e3a8a'; + case 'sky': + return '#0c4a6e'; + case 'cyan': + return '#164e63'; + case 'teal': + return '#134e4a'; + case 'lime': + return '#365314'; + case 'green': + return '#14532d'; + case 'yellow': + return '#713f12'; + case 'amber': + return '#78350f'; + case 'orange': + return '#7c2d12'; + case 'pink': + return '#831843'; + case 'fuchsia': + return '#701a75'; + case 'purple': + return '#581c87'; + case 'indigo': + return '#312e81'; + case 'rose': + return '#881337'; + case 'red': + return '#7f1d1d'; + case 'black': + return '#4b5563'; } }; diff --git a/src/common/helpers/common.ts b/src/common/helpers/common.ts new file mode 100644 index 0000000..e4ec1fb --- /dev/null +++ b/src/common/helpers/common.ts @@ -0,0 +1,28 @@ +import type { TDarkness, TThemeColor } from '@interfaces/common'; +import { + convert100ThemeToColor, + convert200ThemeToColor, + convert300ThemeToColor, + convert400ThemeToColor, + convert500ThemeToColor, + convert600ThemeToColor, + convert700ThemeToColor, + convert800ThemeToColor, + convert900ThemeToColor, +} from '@helpers/colors'; + +export const convertThemeToColor = ( + theme: TThemeColor, + darkness: TDarkness | number = 500, +): string => { + if (darkness === 500) return convert500ThemeToColor(theme); + if (darkness === 100) return convert100ThemeToColor(theme); + if (darkness === 200) return convert200ThemeToColor(theme); + if (darkness === 300) return convert300ThemeToColor(theme); + if (darkness === 400) return convert400ThemeToColor(theme); + if (darkness === 600) return convert600ThemeToColor(theme); + if (darkness === 700) return convert700ThemeToColor(theme); + if (darkness === 800) return convert800ThemeToColor(theme); + if (darkness === 900) return convert900ThemeToColor(theme); + return convert500ThemeToColor(theme); +}; diff --git a/src/common/interfaces/common.ts b/src/common/interfaces/common.ts index 7ff7e70..6a854a8 100644 --- a/src/common/interfaces/common.ts +++ b/src/common/interfaces/common.ts @@ -1,13 +1,17 @@ import type { iconsSet } from '@/common/constants/icons'; +export type TIcons = keyof typeof iconsSet; + export type TThemeColor = | 'white' - | 'slate' | 'blue' | 'sky' + | 'cyan' | 'teal' + | 'lime' | 'green' | 'yellow' + | 'amber' | 'orange' | 'pink' | 'fuchsia' @@ -17,6 +21,8 @@ export type TThemeColor = | 'red' | 'black'; +export type TDarkness = 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900; + export type TThemeColorNoWhite = Exclude<TThemeColor, 'white'>; export type TSize = 'small' | 'medium' | 'large' | 'huge'; @@ -30,5 +36,3 @@ export type TPosition = 'top' | 'right' | 'bottom' | 'left'; export type TExpandedPosition = TPosition | 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'; export type TBorder = 'solid' | 'dashed' | 'dotted'; - -export type TIcons = keyof typeof iconsSet; diff --git a/src/common/interfaces/componentsProp.ts b/src/common/interfaces/componentsProp.ts index 1f0e3c3..aa30d5c 100644 --- a/src/common/interfaces/componentsProp.ts +++ b/src/common/interfaces/componentsProp.ts @@ -1,4 +1,4 @@ -import type { TIcons, TPosition, TTextStyle, TThemeColor } from '@interfaces/common'; +import type { TDarkness, TIcons, TPosition, TTextStyle, TThemeColor } from '@interfaces/common'; export interface ITreeItem { label: string; @@ -11,22 +11,38 @@ export interface ITreeItem { iconAfter?: TIcons; iconColor?: TThemeColor; children?: ITreeItem[]; + darknessColor?: TDarkness; + darknessIconColor?: TDarkness; isLinkClicked?: boolean; } +export interface IMDItemProps { + label: string; + theme?: TThemeColor; + darknessTheme?: TDarkness; + textStyle?: TTextStyle; + link?: string; + linkBlank?: boolean; + onClick?: () => void; +} + export interface ISBOption { label: string; value?: never; color?: TThemeColor; activeColor?: TThemeColor; backgroundColor?: TThemeColor; + darknessColor?: TDarkness; + darknessActiveColor?: TDarkness; + darknessBackgroundColor?: TDarkness; isLabelHidden?: boolean; iconPosition?: TPosition; textStyle?: TTextStyle; } export interface ISliderOptions { - label: string | number; + label: string | number | boolean; value?: string | number; - color?: string; + color?: TThemeColor; + darknessColor?: TDarkness; } diff --git a/src/common/interfaces/componentsProps.ts b/src/common/interfaces/componentsProps.ts index 8a1459e..c80425a 100644 --- a/src/common/interfaces/componentsProps.ts +++ b/src/common/interfaces/componentsProps.ts @@ -1,5 +1,6 @@ import type { TBorder, + TDarkness, TDirection, TExpandedPosition, TIcons, @@ -9,13 +10,19 @@ import type { TThemeColor, TThemeColorNoWhite, } from '@interfaces/common'; -import type { ISBOption, ISliderOptions, ITreeItem } from '@interfaces/componentsProp'; +import type { + IMDItemProps, + ISBOption, + ISliderOptions, + ITreeItem, +} from '@interfaces/componentsProp'; export interface ITLProps { items: ITreeItem[]; maxWidth?: number; expand?: boolean; theme?: TThemeColor; + darknessTheme?: TDarkness; } export interface ITIProps { @@ -24,21 +31,15 @@ export interface ITIProps { label: string; }[]; items: ITreeItem[]; - textColor: TThemeColor; + textColor: string; themeColor: string; } export interface IMDProps { - items: { - label: string; - theme?: string; - textStyle?: TTextStyle; - link?: string; - linkBlank?: boolean; - onClick?: () => void; - }[]; + items: IMDItemProps[]; size?: TSize; - theme?: string; + theme?: TThemeColor; + darknessTheme?: TDarkness; direction?: TDirection; // direction?: TDirection | 'circle'; } @@ -51,6 +52,8 @@ export interface ISliderProps { size?: TSize; theme?: TThemeColor; backgroundColor?: TThemeColor; + darknessTheme?: TDarkness; + darknessBackgroundColor?: TDarkness; orientation?: 'horizontal' | 'vertical'; isSmooth?: boolean; options?: ISliderOptions[]; @@ -60,6 +63,7 @@ export interface IDrawerProps { position?: TPosition; width?: string | number; theme?: TThemeColor; + darknessTheme?: TDarkness; modal?: boolean; dismissible?: boolean; closeIcon?: TIcons; @@ -69,6 +73,7 @@ export interface IDrawerProps { export interface IModalProps { theme?: TThemeColor; + darknessTheme?: TDarkness; width?: string; height?: string; position?: TExpandedPosition; @@ -80,6 +85,7 @@ export interface IModalProps { export interface IPopupProps { parentSelector?: string; theme?: TThemeColor; + darknessTheme?: TDarkness; maxWidth?: string; maxHeight?: string; padding?: string; @@ -91,6 +97,8 @@ export interface ISBProps { rounded?: boolean; activeBackgroundColor?: TThemeColor; border?: TThemeColor; + darknessActiveBackgroundColor?: TDarkness; + darknessBorder?: TDarkness; disabled?: boolean; } @@ -100,17 +108,21 @@ export interface IButtonProps { textStyle?: TTextStyle; iconPos?: TPosition; width?: string | number; + iconOnly?: boolean; theme?: TThemeColor; textColor?: TThemeColor; border?: TThemeColor; - iconOnly?: boolean; + darknessTheme?: TDarkness; + darknessTextColor?: TDarkness; + darknessBorder?: TDarkness; } export interface ITSProps { size?: TSize; theme?: TThemeColorNoWhite; negativeTheme?: TThemeColor; - darkNegative?: boolean; + darknessTheme?: TDarkness; + darknessNegativeTheme?: TDarkness; disabled?: boolean; } @@ -118,4 +130,5 @@ export interface IDividerProps { height?: number; type?: TBorder; color?: TThemeColor; + darknessColor?: TDarkness; } diff --git a/src/stories/components/Button/Button.stories.ts b/src/stories/components/Button/Button.stories.ts index bdbacf4..337bc5b 100644 --- a/src/stories/components/Button/Button.stories.ts +++ b/src/stories/components/Button/Button.stories.ts @@ -19,13 +19,19 @@ const meta: Meta = { textStyle: { control: 'select', options: ['bold', 'italic'] }, iconPos: { control: 'select', options: ['left', 'top', 'right', 'bottom'] }, width: { control: 'text' }, + darknessTheme: { control: 'select', options: [100, 200, 300, 400, 500, 600, 700, 800, 900] }, + darknessTextColor: { + control: 'select', + options: [100, 200, 300, 400, 500, 600, 700, 800, 900], + }, + darknessBorder: { control: 'select', options: [100, 200, 300, 400, 500, 600, 700, 800, 900] }, theme: { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', @@ -43,9 +49,9 @@ const meta: Meta = { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', @@ -63,9 +69,9 @@ const meta: Meta = { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', diff --git a/src/stories/components/Button/Button.vue b/src/stories/components/Button/Button.vue index be2e174..45df8f5 100644 --- a/src/stories/components/Button/Button.vue +++ b/src/stories/components/Button/Button.vue @@ -1,18 +1,25 @@ <script setup lang="ts"> import { computed } from 'vue'; -import { convert500ThemeToColor } from '@helpers/colors'; import type { IButtonProps } from '@interfaces/componentsProps'; +import { convertThemeToColor } from '@helpers/common'; const props = withDefaults(defineProps<IButtonProps>(), { size: 'medium', theme: 'white', textColor: 'black', iconPos: 'left', + darknessTheme: 500, + darknessTextColor: 500, + darknessBorder: 500, }); -const themeColor = computed(() => convert500ThemeToColor(props.theme)); -const textColorComputed = computed(() => convert500ThemeToColor(props.textColor)); -const borderColor = computed(() => (props.border ? convert500ThemeToColor(props.border) : '')); +const themeColor = computed(() => convertThemeToColor(props.theme, props.darknessTheme)); +const textColorComputed = computed(() => + convertThemeToColor(props.textColor, props.darknessTextColor), +); +const borderColor = computed(() => + !props.border ? '' : convertThemeToColor(props.border, props.darknessBorder), +); const textSize = computed(() => { switch (props.size) { case 'small': diff --git a/src/stories/components/Divider/Divider.stories.ts b/src/stories/components/Divider/Divider.stories.ts index b7a6350..960e6f5 100644 --- a/src/stories/components/Divider/Divider.stories.ts +++ b/src/stories/components/Divider/Divider.stories.ts @@ -16,13 +16,14 @@ const meta: Meta = { argTypes: { height: { control: 'number' }, type: { control: 'select', options: ['solid', 'dashed', 'dotted'] }, + darknessColor: { control: 'select', options: [100, 200, 300, 400, 500, 600, 700, 800, 900] }, color: { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', diff --git a/src/stories/components/Divider/Divider.vue b/src/stories/components/Divider/Divider.vue index 54164cd..b195e97 100644 --- a/src/stories/components/Divider/Divider.vue +++ b/src/stories/components/Divider/Divider.vue @@ -1,14 +1,15 @@ <script setup lang="ts"> import { computed } from 'vue'; -import { convert500ThemeToColor } from '@helpers/colors'; import type { IDividerProps } from '@interfaces/componentsProps'; +import { convertThemeToColor } from '@helpers/common'; const props = withDefaults(defineProps<IDividerProps>(), { height: 1, type: 'solid', color: 'black', + darknessColor: 500, }); -const colorConverted = computed(() => convert500ThemeToColor(props.color)); +const colorConverted = computed(() => convertThemeToColor(props.color, props.darknessColor)); </script> <template> diff --git a/src/stories/components/Drawer/Drawer.stories.ts b/src/stories/components/Drawer/Drawer.stories.ts index cd0c0de..9cfdc30 100644 --- a/src/stories/components/Drawer/Drawer.stories.ts +++ b/src/stories/components/Drawer/Drawer.stories.ts @@ -26,13 +26,14 @@ const meta: Meta = { closeIcon: { control: 'select', options: Object.keys(iconsSet) }, headerDivider: { control: 'boolean' }, footerDivider: { control: 'boolean' }, + darknessTheme: { control: 'select', options: [100, 200, 300, 400, 500, 600, 700, 800, 900] }, theme: { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', diff --git a/src/stories/components/Drawer/Drawer.vue b/src/stories/components/Drawer/Drawer.vue index 913796f..1656f88 100644 --- a/src/stories/components/Drawer/Drawer.vue +++ b/src/stories/components/Drawer/Drawer.vue @@ -1,8 +1,9 @@ <script setup lang="ts"> -import { computed } from 'vue'; +import { computed, watch } from 'vue'; import { iconsSet } from '@/common/constants/icons'; -import { convert500ThemeToColor, convert300ThemeToColor } from '@helpers/colors'; +import { convertWhiteOrBlackToColor } from '@helpers/colors'; import type { IDrawerProps } from '@interfaces/componentsProps'; +import { convertThemeToColor } from '@helpers/common'; const props = withDefaults(defineProps<IDrawerProps>(), { visible: false, @@ -11,25 +12,37 @@ const props = withDefaults(defineProps<IDrawerProps>(), { modal: true, dismissible: true, theme: 'white', + darknessTheme: 500, closeIcon: 'CrossIcon', headerDivider: false, footerDivider: false, }); +const body = document.querySelector('body')!; const emit = defineEmits(['onClose']); const visible = defineModel<boolean>('visible', { set(value) { if (!value) { + body.style.overflow = 'auto'; emit('onClose'); } return value; }, }); - -const themeColor = computed(() => convert500ThemeToColor(props.theme)); -const scrollColor = computed(() => convert300ThemeToColor(props.theme)); +watch(visible, () => { + if (visible.value) { + body.style.overflow = 'hidden'; + } +}); +const themeColor = computed(() => convertThemeToColor(props.theme, props.darknessTheme)); +const scrollAndBorderColor = computed(() => + props.theme === 'white' || props.theme === 'black' + ? convertWhiteOrBlackToColor(props.theme, props.darknessTheme) + : convertThemeToColor(props.theme, 100 + ((props.darknessTheme + 600) % 900)), +); const textColor = computed(() => { - if (!props.theme || props.theme === 'white') return 'black'; - return 'white'; + if (props.theme === 'white' || (props.darknessTheme <= 600 && props.theme !== 'black')) + return '#000000'; + return '#ffffff'; }); const drawerWidth = computed(() => { if (+props.width < 200) return '200px'; @@ -46,7 +59,7 @@ const drawerWidth = computed(() => { drawerBackgroundOpened: visible, }, ]" - @click.prevent="dismissible ? (visible = false) : ''" + @pointerdown.stop="dismissible ? (visible = false) : ''" ></section> <section :style="`color: ${textColor}; background-color: ${themeColor}`" @@ -108,7 +121,7 @@ const drawerWidth = computed(() => { justify-content: space-between; padding: 20px; transition: transform ease-out 0.2s; - border-right: 2px solid #b1b1b1; + border-right: 2px solid v-bind(scrollAndBorderColor); } .drawerVertical { width: 100vw !important; @@ -158,7 +171,7 @@ const drawerWidth = computed(() => { } .divider { height: 2px; - background-color: v-bind(scrollColor); + background-color: v-bind(scrollAndBorderColor); } .divider-header { position: absolute; @@ -176,6 +189,6 @@ const drawerWidth = computed(() => { } ::-webkit-scrollbar-thumb { border-radius: 5px; - background-color: v-bind(scrollColor); + background-color: v-bind(scrollAndBorderColor); } </style> diff --git a/src/stories/components/MenuDial/MenuDial.stories.ts b/src/stories/components/MenuDial/MenuDial.stories.ts index a91196a..1fb7c18 100644 --- a/src/stories/components/MenuDial/MenuDial.stories.ts +++ b/src/stories/components/MenuDial/MenuDial.stories.ts @@ -16,14 +16,15 @@ const meta: Meta = { argTypes: { items: { control: 'object' }, size: { control: 'select', options: ['small', 'medium', 'large', 'huge'] }, - direction: { control: 'select', options: ['top', 'bottom', 'left', 'right'] }, + direction: { control: 'select', options: ['up', 'down', 'left', 'right'] }, + darknessTheme: { control: 'select', options: [100, 200, 300, 400, 500, 600, 700, 800, 900] }, theme: { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', @@ -79,3 +80,51 @@ export const Full: Story = { theme: 'sky', }, }; + +export const Down: Story = { + args: { + items: [ + { + label: 'font-family link', + theme: 'green', + darknessTheme: 700, + link: 'https://developer.mozilla.org/en-US/docs/Web/CSS/font-family', + linkBlank: true, + }, + { + label: 'Second', + theme: 'green', + darknessTheme: 800, + textStyle: 'italic', + }, + ], + theme: 'red', + darknessTheme: 700, + direction: 'down', + }, +}; + +export const Huge: Story = { + args: { + items: [ + { + label: 'font-family link', + theme: 'green', + darknessTheme: 700, + link: 'https://developer.mozilla.org/en-US/docs/Web/CSS/font-family', + linkBlank: true, + }, + { + label: 'Second', + theme: 'green', + darknessTheme: 800, + textStyle: 'italic', + }, + ], + + theme: 'red', + darknessTheme: 700, + direction: 'right', + size: 'medium', + }, +}; diff --git a/src/stories/components/MenuDial/MenuDial.vue b/src/stories/components/MenuDial/MenuDial.vue index 5b54129..933d5f1 100644 --- a/src/stories/components/MenuDial/MenuDial.vue +++ b/src/stories/components/MenuDial/MenuDial.vue @@ -1,21 +1,29 @@ <script setup lang="ts"> import { computed } from 'vue'; import type { IMDProps } from '@interfaces/componentsProps'; -import { convert500ThemeToColor } from '@helpers/colors'; import PlusIcon from '@stories/icons/Mono/PlusIcon.vue'; +import { convertThemeToColor } from '@helpers/common'; +import { convertWhiteOrBlackToColor } from '@helpers/colors'; const props = withDefaults(defineProps<IMDProps>(), { theme: 'white', + darknessTheme: 500, size: 'medium', direction: 'right', }); const active = defineModel('active'); -const themeColor = computed(() => convert500ThemeToColor(props.theme)); +const themeColor = computed(() => convertThemeToColor(props.theme, props.darknessTheme)); const textColor = computed(() => { - if (props.theme === 'white') return '#000000'; + if (props.theme === 'white' || (props.darknessTheme <= 600 && props.theme !== 'black')) + return '#000000'; return '#ffffff'; }); +const borderColor = computed(() => + props.theme === 'white' || props.theme === 'black' + ? convertWhiteOrBlackToColor(props.theme, props.darknessTheme) + : convertThemeToColor(props.theme, 100 + ((props.darknessTheme + 600) % 900)), +); const elementsSize = computed(() => { switch (props.size) { case 'small': @@ -34,7 +42,7 @@ const menuListStyles = computed(() => { case 'up': return `flex-direction: column-reverse; transform: translateY(-${active.value ? (0.5 + props.items.length) * elementsSize.value + 15 : 1.5 * elementsSize.value}px) translateX(calc(-50% + ${elementsSize.value / 2}px))`; case 'down': - return `flex-direction: column; transform: translateY(${active.value ? 25 : -20}px) translateX(calc(-50% + ${elementsSize.value / 2}px))`; + return `flex-direction: column; transform: translateY(${active.value ? elementsSize.value / 1.75 : -20}px) translateX(calc(-50% + ${elementsSize.value / 2}px))`; } return `transform: translateY(-${elementsSize.value / 2}px) translateX(${active.value ? elementsSize.value + 10 : -20}px)`; }); @@ -60,7 +68,7 @@ const openLink = (url: string, isBlank: boolean | undefined) => <template> <section class="menuContainer"> <button - :style="`border: ${theme === 'white' ? '2px solid black' : ''}; background-color: ${themeColor ?? 'white'}; width: ${elementsSize}px; height: ${elementsSize}px; transform: ${active ? 'rotate(135deg)' : ''};`" + :style="`border: 2px solid ${borderColor}; background-color: ${themeColor ?? 'white'}; width: ${elementsSize}px; height: ${elementsSize}px; transform: ${active ? 'rotate(135deg)' : ''};`" class="menuButton" @click.prevent="active = !active" > @@ -80,8 +88,8 @@ const openLink = (url: string, isBlank: boolean | undefined) => <li v-for="(item, index) of items" :key="item.label" - :style="`height: ${elementsSize}px; background-color: ${convert500ThemeToColor(item.theme ?? 'white')}; - color: ${!item.theme || item.theme === 'white' ? 'black' : 'white'}; border-color: ${!item.theme || item.theme === 'white' ? 'black' : 'white'};`" + :style="`height: ${elementsSize}px; background-color: ${convertThemeToColor(item.theme ?? 'white', item.darknessTheme ?? 500)}; + color: ${item.theme === 'white' || ((item.darknessTheme ?? 500) <= 600 && item.theme !== 'black') ? 'black' : 'white'}; border-color: ${borderColor};`" class="menuElement" @click=" () => { @@ -147,7 +155,7 @@ const openLink = (url: string, isBlank: boolean | undefined) => justify-content: center; align-items: center; padding: 10px; - border: 1px solid white; + border: 1px solid v-bind(borderColor); border-radius: 5px; user-select: none; cursor: pointer; diff --git a/src/stories/components/Modal/Modal.stories.ts b/src/stories/components/Modal/Modal.stories.ts index b23779a..d5c6d08 100644 --- a/src/stories/components/Modal/Modal.stories.ts +++ b/src/stories/components/Modal/Modal.stories.ts @@ -36,13 +36,14 @@ const meta: Meta = { 'bottomRight', ], }, + darknessTheme: { control: 'select', options: [100, 200, 300, 400, 500, 600, 700, 800, 900] }, theme: { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', diff --git a/src/stories/components/Modal/Modal.vue b/src/stories/components/Modal/Modal.vue index 1ebe15a..5c8e74c 100644 --- a/src/stories/components/Modal/Modal.vue +++ b/src/stories/components/Modal/Modal.vue @@ -1,32 +1,45 @@ <script setup lang="ts"> -import { computed } from 'vue'; -import { convert300ThemeToColor, convert500ThemeToColor } from '@helpers/colors'; +import { computed, watch } from 'vue'; +import { convertWhiteOrBlackToColor } from '@helpers/colors'; import type { IModalProps } from '@interfaces/componentsProps'; import { iconsSet } from '@/common/constants/icons'; +import { convertThemeToColor } from '@helpers/common'; const props = withDefaults(defineProps<IModalProps>(), { visible: false, dismissible: false, theme: 'white', + darknessTheme: 500, width: '30%', height: '30%', headerDivider: false, closeIcon: 'CrossIcon', }); +const body = document.querySelector('body')!; const emit = defineEmits(['onClose']); const visible = defineModel('visible', { set(value) { if (!value) { + body.style.overflow = 'auto'; emit('onClose'); } return value; }, }); -const themeColor = computed(() => convert500ThemeToColor(props.theme)); -const scrollColor = computed(() => convert300ThemeToColor(props.theme)); +watch(visible, () => { + if (visible.value) { + body.style.overflow = 'hidden'; + } +}); +const themeColor = computed(() => convertThemeToColor(props.theme, props.darknessTheme)); +const scrollAndBorderColor = computed(() => + props.theme === 'white' || props.theme === 'black' + ? convertWhiteOrBlackToColor(props.theme, props.darknessTheme) + : convertThemeToColor(props.theme, 100 + ((props.darknessTheme + 600) % 900)), +); const textColor = computed(() => { - if (!props.theme) return '#000000'; - if (props.theme === 'white') return '#000000'; + if (props.theme === 'white' || (props.darknessTheme <= 600 && props.theme !== 'black')) + return '#000000'; return '#ffffff'; }); const onKeydown = (event: KeyboardEvent) => { @@ -101,7 +114,7 @@ document.addEventListener('keydown', onKeydown); min-width: 250px; min-height: 100px; padding: 20px; - border: 2px solid gray; + border: 2px solid v-bind(scrollAndBorderColor); border-radius: 15px; opacity: 0; transform: scale(0.5); @@ -145,7 +158,7 @@ document.addEventListener('keydown', onKeydown); } .divider { height: 2px; - background-color: v-bind(scrollColor); + background-color: v-bind(scrollAndBorderColor); position: absolute; left: 20px; top: 60px; @@ -153,7 +166,7 @@ document.addEventListener('keydown', onKeydown); } ::-webkit-scrollbar-thumb { border-radius: 5px; - background-color: v-bind(scrollColor); + background-color: v-bind(scrollAndBorderColor); } .toTop { top: 10px !important; diff --git a/src/stories/components/Popup/Popup.stories.ts b/src/stories/components/Popup/Popup.stories.ts index c8d3e5c..7f515ed 100644 --- a/src/stories/components/Popup/Popup.stories.ts +++ b/src/stories/components/Popup/Popup.stories.ts @@ -20,13 +20,14 @@ const meta: Meta = { maxWidth: { control: 'text' }, maxHeight: { control: 'text' }, padding: { control: 'text' }, + darknessTheme: { control: 'select', options: [100, 200, 300, 400, 500, 600, 700, 800, 900] }, theme: { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', diff --git a/src/stories/components/Popup/Popup.vue b/src/stories/components/Popup/Popup.vue index a9eb103..e199b8b 100644 --- a/src/stories/components/Popup/Popup.vue +++ b/src/stories/components/Popup/Popup.vue @@ -1,18 +1,31 @@ <script setup lang="ts"> import type { IPopupProps } from '@interfaces/componentsProps'; import { computed, ref } from 'vue'; -import { convert300ThemeToColor, convert500ThemeToColor } from '@helpers/colors'; +import { convertThemeToColor } from '@helpers/common'; +import { convertWhiteOrBlackToColor } from '@helpers/colors'; const props = withDefaults(defineProps<IPopupProps>(), { parentSelector: 'body', theme: 'white', + border: 'black', maxWidth: '300px', maxHeight: '100px', padding: '5px', + darknessTheme: 500, + darknessBorder: 500, }); const active = defineModel<boolean>('active'); -const themeColor = computed(() => convert500ThemeToColor(props.theme)); -const scrollColor = computed(() => convert300ThemeToColor(props.theme)); +const themeColor = computed(() => convertThemeToColor(props.theme, props.darknessTheme)); +const scrollAndBorderColor = computed(() => + props.theme === 'white' || props.theme === 'black' + ? convertWhiteOrBlackToColor(props.theme, props.darknessTheme) + : convertThemeToColor(props.theme, 100 + ((props.darknessTheme + 600) % 900)), +); +const textColor = computed(() => { + if (props.theme === 'white' || (props.darknessTheme <= 600 && props.theme !== 'black')) + return '#000000'; + return '#ffffff'; +}); const top = ref(); const left = ref(); @@ -20,9 +33,9 @@ const isContainer = ref(); const container = document.querySelector(props.parentSelector); if (container) { - container.addEventListener('pointerdown', (e) => { + container.addEventListener('pointerdown', (event: Event) => { + const e = event as PointerEvent; if (e.button === 2) { - console.log('e.clientY, e.clientX ', e.clientY, e.clientX); isContainer.value = true; if (!active.value) active.value = true; top.value = e.clientY; @@ -45,9 +58,11 @@ document.addEventListener('pointerdown', (e) => { oncontextmenu="return false" id="popup" @pointerdown.stop="" - :style="`top: ${top}px; left: ${left}px; opacity: ${active ? 1 : 0}; pointer-events: ${active ? 'auto' : 'none'}; padding: ${padding}`" + :style="`top: ${top}px; left: ${left}px; opacity: ${active ? 1 : 0}; pointer-events: ${active ? 'auto' : 'none'}; padding: ${padding}; color: ${textColor}`" > - <div :style="`max-width: ${maxWidth}; max-height: ${maxHeight}; overflow: auto;`"> + <div + :style="`max-width: ${maxWidth}; max-height: ${maxHeight}; overflow: auto; padding-right: 5px`" + > <slot /> <p v-if="!$slots.default" style="background-color: black; color: white; padding: 10px"> Popup @@ -61,11 +76,11 @@ document.addEventListener('pointerdown', (e) => { position: fixed; transition: opacity 0.2s ease-in-out; background-color: v-bind(themeColor); - border: 1px solid #403e46; + border: 1px solid v-bind(scrollAndBorderColor); border-radius: 5px; } ::-webkit-scrollbar-thumb { border-radius: 5px; - background-color: v-bind(scrollColor); + background-color: v-bind(scrollAndBorderColor); } </style> diff --git a/src/stories/components/SelectButton/SelectButton.stories.ts b/src/stories/components/SelectButton/SelectButton.stories.ts index 0e7f8c8..03c49b6 100644 --- a/src/stories/components/SelectButton/SelectButton.stories.ts +++ b/src/stories/components/SelectButton/SelectButton.stories.ts @@ -19,13 +19,21 @@ const meta: Meta = { }, size: { control: 'select', options: ['small', 'medium', 'large', 'huge'] }, rounded: { control: 'boolean' }, + darknessActiveBackgroundColor: { + control: 'select', + options: [100, 200, 300, 400, 500, 600, 700, 800, 900], + }, + darknessBorder: { + control: 'select', + options: [100, 200, 300, 400, 500, 600, 700, 800, 900], + }, activeBackgroundColor: { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', @@ -43,9 +51,9 @@ const meta: Meta = { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', @@ -94,6 +102,7 @@ export const LargeFull: Story = { }, { label: 'Second', + color: 'red', activeColor: 'blue', backgroundColor: 'yellow', }, diff --git a/src/stories/components/SelectButton/SelectButton.vue b/src/stories/components/SelectButton/SelectButton.vue index 2f3761b..43ba74b 100644 --- a/src/stories/components/SelectButton/SelectButton.vue +++ b/src/stories/components/SelectButton/SelectButton.vue @@ -1,20 +1,25 @@ <script setup lang="ts"> import { computed } from 'vue'; -import { convert500ThemeToColor } from '@helpers/colors'; import type { ISBProps } from '@interfaces/componentsProps'; +import { convertThemeToColor } from '@helpers/common'; const props = withDefaults(defineProps<ISBProps>(), { size: 'medium', - border: 'black', activeBackgroundColor: 'sky', + darknessActiveBackgroundColor: 500, + darknessBorder: 500, }); const emit = defineEmits(['onClick']); const value = defineModel<never>('value'); const activeBackgroundColorComputed = computed(() => - props.activeBackgroundColor ? convert500ThemeToColor(props.activeBackgroundColor) : '', + props.activeBackgroundColor + ? convertThemeToColor(props.activeBackgroundColor, props.darknessActiveBackgroundColor) + : '', +); +const borderColor = computed(() => + !props.border ? '' : convertThemeToColor(props.border, props.darknessBorder), ); -const borderColor = computed(() => (props.border ? convert500ThemeToColor(props.border) : '')); const textSize = computed(() => { switch (props.size) { case 'small': @@ -79,7 +84,7 @@ const buttonHeight = computed(() => { " > <span - :style="`background-color: ${activeBackgroundColorComputed && ((value && value === item.value) || value === item.label) ? activeBackgroundColorComputed : convert500ThemeToColor(item.backgroundColor ?? 'white')}`" + :style="`background-color: ${activeBackgroundColorComputed && ((value && value === item.value) || value === item.label) ? activeBackgroundColorComputed : convertThemeToColor(item.backgroundColor ?? 'white', item.darknessBackgroundColor ?? 500)}`" :class="[ 'background', { @@ -92,7 +97,7 @@ const buttonHeight = computed(() => { ></span> <span v-if="!item.isLabelHidden" - :style="`color: ${value === item.value || value === item.label ? item.activeColor : convert500ThemeToColor(item.color ?? 'black')}; font-size: ${textSize}`" + :style="`color: ${(item.value && value === item.value) || value === item.label ? convertThemeToColor(item.activeColor ?? 'black', item.darknessActiveColor ?? 500) : convertThemeToColor(item.color ?? 'black', item.darknessColor ?? 500)}; font-size: ${textSize}`" :class="[ 'text', { @@ -102,7 +107,8 @@ const buttonHeight = computed(() => { ]" >{{ item.label ?? index }}</span > - <div + <span + v-if="$slots[`${index + 1}Icon`]" :class="[ 'icon', { @@ -111,7 +117,7 @@ const buttonHeight = computed(() => { ]" > <slot :name="`${index + 1}Icon`" /> - </div> + </span> </button> </div> </template> diff --git a/src/stories/components/Slider/Slider.stories.ts b/src/stories/components/Slider/Slider.stories.ts index d465efa..98211f2 100644 --- a/src/stories/components/Slider/Slider.stories.ts +++ b/src/stories/components/Slider/Slider.stories.ts @@ -22,13 +22,18 @@ const meta: Meta = { size: { control: 'select', options: ['small', 'medium', 'large', 'huge'] }, orientation: { control: 'select', options: ['horizontal', 'vertical'] }, isSmooth: { control: 'boolean' }, + darknessTheme: { control: 'select', options: [100, 200, 300, 400, 500, 600, 700, 800, 900] }, + darknessBackgroundColor: { + control: 'select', + options: [100, 200, 300, 400, 500, 600, 700, 800, 900], + }, theme: { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', @@ -46,9 +51,9 @@ const meta: Meta = { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', diff --git a/src/stories/components/Slider/Slider.vue b/src/stories/components/Slider/Slider.vue index 47b6fcb..5d57dc4 100644 --- a/src/stories/components/Slider/Slider.vue +++ b/src/stories/components/Slider/Slider.vue @@ -1,13 +1,15 @@ <script setup lang="ts"> import { computed, ref, watch } from 'vue'; -import { convert500ThemeToColor } from '@helpers/colors'; import type { ISliderProps } from '@interfaces/componentsProps'; +import { convertThemeToColor } from '@helpers/common'; const props = withDefaults(defineProps<ISliderProps>(), { width: '100', size: 'medium', theme: 'sky', backgroundColor: 'black', + darknessTheme: 500, + darknessBackgroundColor: 500, }); const value = defineModel('value'); const optionValue = ref( @@ -57,8 +59,10 @@ const widthHalf = computed(() => `${Math.floor(+props.width / 2)}px`); const sliderHeight = computed(() => `${Math.floor(+sliderButtonSize.value.slice(0, -2) / 2.5)}px`); const sliderBorderRadius = computed(() => (props.isSmooth ? sliderHeight.value : '0%')); const sliderButtonBorderRadius = computed(() => (props.isSmooth ? '50%' : '0%')); -const themeColor = computed(() => convert500ThemeToColor(props.theme)); -const themeBackground = computed(() => convert500ThemeToColor(props.backgroundColor)); +const themeColor = computed(() => convertThemeToColor(props.theme, props.darknessTheme)); +const themeBackground = computed(() => + convertThemeToColor(props.backgroundColor, props.darknessBackgroundColor), +); const marksListPadding = computed( () => `${Math.floor(+sliderButtonSize.value.slice(0, -2) / 2)}px`, ); @@ -86,9 +90,9 @@ const marksListPadding = computed( <ul class="marksList" :style="`width: ${width ?? 200}px`"> <li v-for="option of options" - :key="option.label" + :key="String(option.label)" class="mark" - :style="`color: ${convert500ThemeToColor(option?.color) ?? 'white'}; font-size: ${optionsFontSize}`" + :style="`color: ${convertThemeToColor(option.color ?? 'black', option.darknessColor ?? 500) ?? 'white'}; font-size: ${optionsFontSize}`" > {{ option.label }} </li> diff --git a/src/stories/components/ToggleSwitch/ToggleSwitch.stories.ts b/src/stories/components/ToggleSwitch/ToggleSwitch.stories.ts index c003e86..0fe5c11 100644 --- a/src/stories/components/ToggleSwitch/ToggleSwitch.stories.ts +++ b/src/stories/components/ToggleSwitch/ToggleSwitch.stories.ts @@ -20,9 +20,9 @@ const meta: Meta = { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', @@ -40,9 +40,9 @@ const meta: Meta = { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', @@ -56,7 +56,11 @@ const meta: Meta = { 'black', ], }, - darkNegative: { control: 'boolean' }, + darknessTheme: { control: 'select', options: [100, 200, 300, 400, 500, 600, 700, 800, 900] }, + darknessNegativeTheme: { + control: 'select', + options: [100, 200, 300, 400, 500, 600, 700, 800, 900], + }, disabled: { control: 'boolean' }, }, args: {}, @@ -68,14 +72,12 @@ type Story = StoryObj<typeof meta>; export const Primary: Story = { args: { - darkNegative: true, active: false, }, }; export const SmallLight: Story = { args: { - darkNegative: false, negativeTheme: 'yellow', theme: 'red', size: 'small', @@ -84,7 +86,6 @@ export const SmallLight: Story = { export const Large: Story = { args: { - darkNegative: true, negativeTheme: 'purple', theme: 'green', size: 'large', @@ -93,7 +94,6 @@ export const Large: Story = { export const Huge: Story = { args: { - darkNegative: true, negativeTheme: 'blue', theme: 'orange', size: 'huge', diff --git a/src/stories/components/ToggleSwitch/ToggleSwitch.vue b/src/stories/components/ToggleSwitch/ToggleSwitch.vue index 503feb5..7be5d7a 100644 --- a/src/stories/components/ToggleSwitch/ToggleSwitch.vue +++ b/src/stories/components/ToggleSwitch/ToggleSwitch.vue @@ -1,21 +1,20 @@ <script setup lang="ts"> import { computed } from 'vue'; -import { convert500ThemeToColor, convert800ThemeToColor } from '@helpers/colors'; import type { ITSProps } from '@interfaces/componentsProps'; +import { convertThemeToColor } from '@helpers/common'; const props = withDefaults(defineProps<ITSProps>(), { size: 'medium', theme: 'sky', negativeTheme: 'black', - darkNegative: true, + darknessTheme: 500, + darknessNegativeTheme: 500, }); const active = defineModel<boolean>('active'); -const themeColor = computed(() => convert500ThemeToColor(props.theme)); +const themeColor = computed(() => convertThemeToColor(props.theme, props.darknessTheme)); const inactiveColor = computed(() => - props.darkNegative - ? convert800ThemeToColor(props.negativeTheme) - : convert500ThemeToColor(props.negativeTheme), + convertThemeToColor(props.negativeTheme, props.darknessNegativeTheme), ); const sizes = computed(() => { if (!props?.size) { diff --git a/src/stories/components/TreeList/TreeItems.vue b/src/stories/components/TreeList/TreeItems.vue index 2dd704c..bbd871b 100644 --- a/src/stories/components/TreeList/TreeItems.vue +++ b/src/stories/components/TreeList/TreeItems.vue @@ -1,8 +1,8 @@ <script setup lang="ts"> import { iconsSet } from '@/common/constants/icons'; import TriangleIcon from '@stories/icons/Mono/TriangleIcon.vue'; -import { convert500ThemeToColor } from '@helpers/colors'; import type { ITIProps } from '@interfaces/componentsProps'; +import { convertThemeToColor } from '@helpers/common'; defineProps<ITIProps>(); const emit = defineEmits(['toggleIsOpen', 'onClick']); @@ -44,7 +44,9 @@ const emit = defineEmits(['toggleIsOpen', 'onClick']); }, ]" :color=" - item.color && item.isTriangleToColor ? convert500ThemeToColor(item.color) : textColor + item.color && item.isTriangleToColor + ? convertThemeToColor(item.color, item.darknessColor ?? 500) + : textColor " size="17" /> @@ -59,7 +61,7 @@ const emit = defineEmits(['toggleIsOpen', 'onClick']); isDarkerOnHover: item.link, }, ]" - :style="`color: ${item.color ? convert500ThemeToColor(item.color) : textColor}`" + :style="`color: ${item.color ? convertThemeToColor(item.color, item.darknessColor ?? 500) : textColor}`" @click=" () => { item.isLinkClicked = true; @@ -72,14 +74,14 @@ const emit = defineEmits(['toggleIsOpen', 'onClick']); ><component :is="iconsSet[item.iconBefore]" v-if="item.iconBefore" - :color="convert500ThemeToColor(item.iconColor)" + :color="convertThemeToColor(item.iconColor ?? 'black', item.darknessIconColor ?? 500)" style="min-width: 17px" size="17" /> <span>{{ item.label }}</span ><component :is="iconsSet[item.iconAfter]" v-if="item.iconAfter" - :color="convert500ThemeToColor(item.iconColor)" + :color="convertThemeToColor(item.iconColor ?? 'black', item.darknessIconColor ?? 500)" style="min-width: 17px" size="17" /></a> diff --git a/src/stories/components/TreeList/TreeList.stories.ts b/src/stories/components/TreeList/TreeList.stories.ts index 9be416a..8c2165e 100644 --- a/src/stories/components/TreeList/TreeList.stories.ts +++ b/src/stories/components/TreeList/TreeList.stories.ts @@ -18,13 +18,14 @@ const meta: Meta = { items: { control: 'object' }, maxWidth: { control: 'number' }, expand: { control: 'boolean' }, + darknessTheme: { control: 'select', options: [100, 200, 300, 400, 500, 600, 700, 800, 900] }, theme: { control: 'select', options: [ 'white', - 'slate', 'blue', 'sky', + 'cyan', 'teal', 'green', 'yellow', @@ -124,6 +125,8 @@ export const Full: Story = { color: 'red', iconAfter: 'DiceIcon', iconColor: 'red', + darknessColor: 400, + darknessIconColor: 400, children: [ { label: '1-1-1-1', @@ -160,5 +163,6 @@ export const Full: Story = { expand: true, theme: 'black', + darknessTheme: 800, }, }; diff --git a/src/stories/components/TreeList/TreeList.vue b/src/stories/components/TreeList/TreeList.vue index 061fe64..d4b1f5c 100644 --- a/src/stories/components/TreeList/TreeList.vue +++ b/src/stories/components/TreeList/TreeList.vue @@ -1,9 +1,9 @@ <script setup lang="ts"> import { computed, ref, watch } from 'vue'; import type { ITreeItem } from '@interfaces/componentsProp'; -import { convert500ThemeToColor } from '@helpers/colors'; import TreeItems from '@stories/components/TreeList/TreeItems.vue'; import type { ITLProps } from '@interfaces/componentsProps'; +import { convertThemeToColor } from '@helpers/common'; interface IStateItem { isOpen: boolean; @@ -13,14 +13,15 @@ interface IStateItem { const props = withDefaults(defineProps<ITLProps>(), { theme: 'white', maxWidth: 300, + darknessTheme: 500, }); const emit = defineEmits(['onClick']); const items = computed(() => props.items); -const themeColor = computed(() => convert500ThemeToColor(props.theme)); +const themeColor = computed(() => convertThemeToColor(props.theme, props.darknessTheme)); const textColor = computed(() => { - if (!props.theme) return 'black'; - if (props.theme === 'white') return 'black'; - return 'white'; + if (props.theme === 'white' || (props.darknessTheme <= 600 && props.theme !== 'black')) + return '#000000'; + return '#ffffff'; }); const state = ref<IStateItem[]>([]); -- GitLab