From 92bd83536fd1ca84e71d27c3682153cc8eb27d84 Mon Sep 17 00:00:00 2001 From: Corentin Thomasset Date: Sun, 23 Apr 2023 22:26:32 +0200 Subject: feat(ui-lib): demo pages for c-lib components --- src/ui/c-button/c-button.demo.vue | 29 ++++ src/ui/c-button/c-button.theme.ts | 292 +++++++++----------------------------- src/ui/c-button/c-button.vue | 5 +- src/ui/c-card/c-card.demo.vue | 13 ++ src/ui/c-link/c-link.demo.vue | 12 ++ src/ui/c-link/c-link.vue | 10 +- src/ui/color/color.models.test.ts | 40 ++++++ src/ui/color/color.models.ts | 33 +++++ src/ui/demo/demo-wrapper.vue | 33 +++++ src/ui/demo/demo.routes.ts | 25 ++++ src/ui/theme/themes.ts | 23 ++- 11 files changed, 277 insertions(+), 238 deletions(-) create mode 100644 src/ui/c-button/c-button.demo.vue create mode 100644 src/ui/c-card/c-card.demo.vue create mode 100644 src/ui/c-link/c-link.demo.vue create mode 100644 src/ui/color/color.models.test.ts create mode 100644 src/ui/color/color.models.ts create mode 100644 src/ui/demo/demo-wrapper.vue create mode 100644 src/ui/demo/demo.routes.ts (limited to 'src/ui') diff --git a/src/ui/c-button/c-button.demo.vue b/src/ui/c-button/c-button.demo.vue new file mode 100644 index 0000000..988659f --- /dev/null +++ b/src/ui/c-button/c-button.demo.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/ui/c-button/c-button.theme.ts b/src/ui/c-button/c-button.theme.ts index 2f25e6f..87ad89f 100644 --- a/src/ui/c-button/c-button.theme.ts +++ b/src/ui/c-button/c-button.theme.ts @@ -1,240 +1,76 @@ +import { darken, lighten } from '../color/color.models'; import { defineThemes } from '../theme/theme.models'; import { appThemes } from '../theme/themes'; -export const { useTheme } = defineThemes({ - dark: { - basic: { - default: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: 'rgba(255, 255, 255, 0.08)', - - hover: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: 'rgba(255, 255, 255, 0.12)', - }, - - pressed: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: 'rgba(255, 255, 255, 0.24)', - }, - - outline: { - color: appThemes.dark.primary.color, - }, - }, - - primary: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.dark.primary.color, - - hover: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.dark.primary.colorHover, - }, - - pressed: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.dark.primary.colorPressed, - }, - - outline: { - color: appThemes.dark.primary.color, - }, - }, - - warning: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.dark.warning.color, - - hover: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.dark.warning.colorHover, - }, - - pressed: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.dark.warning.colorPressed, - }, - - outline: { - color: appThemes.dark.warning.color, - }, - }, - }, - - text: { - default: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: 'transparent', - - hover: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: 'rgba(255, 255, 255, 0.12)', - }, - - pressed: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: 'rgba(255, 255, 255, 0.82)', - }, - - outline: { - color: appThemes.dark.primary.color, - }, - }, - - primary: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.dark.primary.color, - - hover: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.dark.primary.colorHover, - }, - - pressed: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.dark.primary.colorPressed, - }, - - outline: { - color: appThemes.dark.primary.color, - }, - }, - - warning: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.dark.warning.color, - - hover: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.dark.warning.colorHover, - }, +const createState = ({ + textColor, + backgroundColor, + hoverBackground, + hoveredTextColor = textColor, + pressedBackground, + pressedTextColor = textColor, +}: { + textColor: string; + backgroundColor: string; + hoverBackground: string; + hoveredTextColor?: string; + pressedBackground: string; + pressedTextColor?: string; +}) => ({ + textColor, + backgroundColor, + hover: { textColor: hoveredTextColor, backgroundColor: hoverBackground }, + pressed: { textColor: pressedTextColor, backgroundColor: pressedBackground }, +}); - pressed: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.dark.warning.colorPressed, - }, +const createTheme = ({ style }: { style: 'light' | 'dark' }) => { + const theme = appThemes[style]; - outline: { - color: appThemes.dark.warning.color, - }, - }, - }, - }, - light: { + return { basic: { - default: { - textColor: appThemes.light.text.baseColor, - backgroundColor: 'rgba(46, 51, 56, 0.05)', - - hover: { - textColor: appThemes.light.text.baseColor, - backgroundColor: 'rgba(46, 51, 56, 0.09)', - }, - - pressed: { - textColor: appThemes.light.text.baseColor, - backgroundColor: 'rgba(46, 51, 56, 0.22)', - }, - - outline: { - color: appThemes.light.primary.color, - }, - }, - - primary: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.light.primary.color, - - hover: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.light.primary.colorHover, - }, - - pressed: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.light.primary.colorPressed, - }, - - outline: { - color: appThemes.light.primary.color, - }, - }, - - warning: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.light.warning.color, - - hover: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.light.warning.colorHover, - }, - - pressed: { - textColor: appThemes.dark.text.baseColor, - backgroundColor: appThemes.light.warning.colorPressed, - }, - - outline: { - color: appThemes.light.warning.color, - }, - }, + default: createState({ + textColor: theme.text.baseColor, + backgroundColor: theme.default.color, + hoverBackground: theme.default.colorHover, + pressedBackground: theme.default.colorPressed, + }), + primary: createState({ + textColor: theme.primary.color, + backgroundColor: theme.primary.colorFaded, + hoverBackground: lighten(theme.primary.colorFaded, 30), + pressedBackground: darken(theme.primary.colorFaded, 30), + }), + warning: createState({ + textColor: theme.text.baseColor, + backgroundColor: theme.warning.color, + hoverBackground: theme.warning.colorHover, + pressedBackground: theme.warning.colorPressed, + }), }, text: { - default: { - textColor: appThemes.light.text.baseColor, + default: createState({ + textColor: theme.text.baseColor, backgroundColor: 'transparent', - - hover: { - textColor: appThemes.light.text.baseColor, - backgroundColor: 'rgba(46, 51, 56, 0.09)', - }, - - pressed: { - textColor: appThemes.light.text.baseColor, - backgroundColor: 'rgba(46, 51, 56, 0.13)', - }, - - outline: { - color: appThemes.light.primary.color, - }, - }, - primary: { - textColor: appThemes.light.primary.color, - backgroundColor: 'transparent', - - hover: { - textColor: appThemes.light.primary.colorHover, - backgroundColor: 'rgba(46, 51, 56, 0.09)', - }, - - pressed: { - textColor: appThemes.light.primary.colorPressed, - backgroundColor: 'rgba(46, 51, 56, 0.13)', - }, - - outline: { - color: appThemes.light.primary.color, - }, - }, - warning: { - textColor: appThemes.light.warning.color, + hoverBackground: theme.default.colorHover, + pressedBackground: theme.default.colorPressed, + }), + primary: createState({ + textColor: theme.primary.color, backgroundColor: 'transparent', - - hover: { - textColor: appThemes.light.warning.colorHover, - backgroundColor: 'rgba(46, 51, 56, 0.09)', - }, - - pressed: { - textColor: appThemes.light.warning.colorPressed, - backgroundColor: 'rgba(46, 51, 56, 0.13)', - }, - - outline: { - color: appThemes.light.warning.color, - }, - }, + hoverBackground: theme.primary.colorFaded, + pressedBackground: darken(theme.primary.colorFaded, 30), + }), + warning: createState({ + textColor: theme.text.baseColor, + backgroundColor: theme.warning.color, + hoverBackground: theme.warning.colorHover, + pressedBackground: theme.warning.colorPressed, + }), }, - }, + }; +}; + +export const { useTheme } = defineThemes({ + dark: createTheme({ style: 'dark' }), + light: createTheme({ style: 'light' }), }); diff --git a/src/ui/c-button/c-button.vue b/src/ui/c-button/c-button.vue index f52a069..2cbc4fd 100644 --- a/src/ui/c-button/c-button.vue +++ b/src/ui/c-button/c-button.vue @@ -14,6 +14,7 @@ diff --git a/src/ui/c-link/c-link.vue b/src/ui/c-link/c-link.vue index df10120..a7d1b83 100644 --- a/src/ui/c-link/c-link.vue +++ b/src/ui/c-link/c-link.vue @@ -16,7 +16,15 @@ const props = defineProps<{ const { href, to } = toRefs(props); const theme = useTheme(); -const tag = computed(() => (href?.value ? 'a' : RouterLink)); +const tag = computed(() => { + if (href?.value) { + return 'a'; + } + if (to?.value) { + return RouterLink; + } + return 'span'; +}); diff --git a/src/ui/demo/demo.routes.ts b/src/ui/demo/demo.routes.ts new file mode 100644 index 0000000..0e9a9e4 --- /dev/null +++ b/src/ui/demo/demo.routes.ts @@ -0,0 +1,25 @@ +import type { RouteRecordRaw } from 'vue-router'; + +const demoPages = import.meta.glob('../*/*.demo.vue'); + +export const demoRoutes = Object.keys(demoPages).map((path) => { + const [, , fileName] = path.split('/'); + const name = fileName.split('.').shift(); + + console.log(path); + + return { + path: name, + name, + component: () => import(/* @vite-ignore */ path), + } as RouteRecordRaw; +}); + +export const routes = [ + { + path: '/c-lib', + name: 'c-lib', + children: demoRoutes, + component: () => import('./demo-wrapper.vue'), + }, +]; diff --git a/src/ui/theme/themes.ts b/src/ui/theme/themes.ts index eca63db..18b2c8d 100644 --- a/src/ui/theme/themes.ts +++ b/src/ui/theme/themes.ts @@ -3,16 +3,20 @@ import { defineThemes } from './theme.models'; export const { themes: appThemes, useTheme: useAppTheme } = defineThemes({ light: { text: { - baseColor: 'rgb(51, 54, 57)', - mutedColor: 'rgba(118, 124, 130)', + baseColor: '#333639', + mutedColor: '#767c82', + }, + default: { + color: 'rgba(46, 51, 56, 0.05)', + colorHover: 'rgba(46, 51, 56, 0.09)', + colorPressed: 'rgba(46, 51, 56, 0.22)', }, - primary: { color: '#18a058', colorHover: '#1ea54c', colorPressed: '#0C7A43', + colorFaded: '#18a0582f', }, - warning: { color: '#f59e0b', colorHover: '#f59e0b', @@ -33,14 +37,19 @@ export const { themes: appThemes, useTheme: useAppTheme } = defineThemes({ }, dark: { text: { - baseColor: 'rgba(255, 255, 255, 0.82)', - mutedColor: 'rgba(255, 255, 255, 0.5)', + baseColor: '#ffffffd1', + mutedColor: '#ffffff80', + }, + default: { + color: 'rgba(255, 255, 255, 0.08)', + colorHover: 'rgba(255, 255, 255, 0.12)', + colorPressed: 'rgba(255, 255, 255, 0.24)', }, - primary: { color: '#1ea54c', colorHover: '#36AD6A', colorPressed: '#0C7A43', + colorFaded: '#18a0582f', }, warning: { color: '#f59e0b', -- cgit v1.2.3