diff --git a/.github/workflows/todos-to-issue.yml b/.github/workflows/todos-to-issue.yml index 77409f1c..eaee2cc1 100644 --- a/.github/workflows/todos-to-issue.yml +++ b/.github/workflows/todos-to-issue.yml @@ -3,9 +3,7 @@ name: Create issues from TODOs on: push: branches: - - 'dev' - - 'client' - - 'server' + - dev jobs: todo: diff --git a/core/client/.storybook/main.ts b/core/client/.storybook/main.ts index 651a6b2b..b833aaf7 100644 --- a/core/client/.storybook/main.ts +++ b/core/client/.storybook/main.ts @@ -14,6 +14,10 @@ const config: StorybookConfig = { docgen: 'vue-component-meta', }, }, + viteFinal: async config => ({ + ...config, + ...(await import('unocss/vite')).default, + }), staticDirs: ['./-static'], } export default config diff --git a/core/client/.storybook/preview.ts b/core/client/.storybook/preview.ts index 5a64de45..a3e5ccc7 100644 --- a/core/client/.storybook/preview.ts +++ b/core/client/.storybook/preview.ts @@ -4,7 +4,8 @@ import { INITIAL_VIEWPORTS } from '@storybook/addon-viewport' import { themes } from '@storybook/theming' import { useColorMode } from '@vueuse/core' -import '@/app/styles/primary/index.scss' +import 'virtual:uno.css' +import '@/app/styles/primary/index.css' const preview: Preview = { decorators: [ diff --git a/core/client/components.json b/core/client/components.json new file mode 100644 index 00000000..dd561e9e --- /dev/null +++ b/core/client/components.json @@ -0,0 +1,16 @@ +{ + "style": "new-york", + "typescript": true, + "tsConfigPath": "./tsconfig.json", + "tailwind": { + "config": "tailwind.config.js", + "css": "@/app/styles/primary/index.scss", + "baseColor": "neutral", + "cssVariables": false + }, + "framework": "vite", + "aliases": { + "components": "@/shared/ui", + "utils": "@/shared/lib/shadcn/utils" + } +} diff --git a/core/client/package.json b/core/client/package.json index 97e41050..2fb1283e 100644 --- a/core/client/package.json +++ b/core/client/package.json @@ -20,18 +20,23 @@ "@formkit/auto-animate": "^0.8.2", "@noction/hippie-nav": "^0.7.7", "@unhead/vue": "^1.9.14", + "@unocss/core": "0.65.1", + "@unocss/reset": "0.65.1", "@vee-validate/zod": "^4.13.1", "@vitest/eslint-plugin": "^1.1.7", - "@vueuse/core": "^10.11.0", + "@vueuse/core": "^10.11.1", "@vueuse/integrations": "^10.10.0", "axios": "^1.7.2", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", "floating-vue": "^5.2.2", - "lucide-vue-next": "^0.396.0", "pinia": "^2.1.7", + "radix-vue": "1.9.11", "splitpanes": "^3.1.5", + "tailwind-merge": "2.5.5", "universal-cookie": "^6.1.3", + "unocss": "0.65.1", "vee-validate": "^4.13.1", - "vite-svg-loader": "^5.1.0", "vue": "^3.5.8", "vue-data-ui": "^2.3.44", "vue-i18n": "9", @@ -43,6 +48,9 @@ "zod": "^3.23.8" }, "devDependencies": { + "@iconify-json/hugeicons": "1.2.1", + "@iconify-json/lucide": "1.2.17", + "@iconify/vue": "4.1.2", "@mnenie/prettier": "^1.0.4", "@rushstack/eslint-patch": "^1.8.0", "@storybook/addon-essentials": "^8.1.10", @@ -74,11 +82,12 @@ "lint-staged": "^15.2.7", "npm-run-all2": "^6.2.0", "prettier": "^3.2.5", - "sass": "^1.77.6", "storybook": "^8.1.10", "stylelint": "^16.6.1", "stylelint-config-standard-scss": "^13.1.0", "typescript": "~5.4.0", + "unocss-preset-animations": "1.1.0", + "unocss-preset-shadcn": "0.3.1", "vite": "^5.3.1", "vite-plugin-vue-devtools": "^7.3.1", "vitest": "^1.6.0", diff --git a/core/client/src/app/App.vue b/core/client/src/app/App.vue index d07f9783..3fff7af6 100644 --- a/core/client/src/app/App.vue +++ b/core/client/src/app/App.vue @@ -21,5 +21,5 @@ const toasterTheme = computed(() => { - + diff --git a/core/client/src/app/index.ts b/core/client/src/app/index.ts index 6d7e0c63..680f6423 100644 --- a/core/client/src/app/index.ts +++ b/core/client/src/app/index.ts @@ -3,15 +3,18 @@ import { createHead } from '@unhead/vue' import { vTooltip } from 'floating-vue' import { createApp } from 'vue' import Vue3Marquee from 'vue3-marquee' - import { VueUiRadar } from 'vue-data-ui' + // @ts-expect-error: unresolved type definitions for vue-writer import VueWriter from 'vue-writer' import App from './App.vue' - import autoAnimatePlugin from './plugins/formkit' + import { pinia, router } from './providers' -import './styles/primary/index.scss' + +import './styles/primary/index.css' +import 'virtual:uno.css' +import '@unocss/reset/tailwind.css' import 'floating-vue/dist/style.css' import 'vue-data-ui/style.css' diff --git a/core/client/src/app/providers/router/index.ts b/core/client/src/app/providers/router/index.ts index 09d7688d..2a63ffda 100644 --- a/core/client/src/app/providers/router/index.ts +++ b/core/client/src/app/providers/router/index.ts @@ -50,19 +50,6 @@ const routes = [ name: RouteNames.members, path: '/members', component: () => import('@/pages/MembersPage.vue'), - redirect: { name: `${RouteNames.members}.all` }, - children: [ - { - name: `${RouteNames.members}.all`, - path: '', - component: () => import('@/pages/MainTeamPage.vue'), - }, - { - name: `${RouteNames.members}.guests`, - path: 'guests', - component: () => import('@/pages/GuestsPage.vue'), - }, - ], meta: { requiresAuth: true, }, diff --git a/core/client/src/app/styles/mixins/index.scss b/core/client/src/app/styles/mixins/index.scss deleted file mode 100644 index 0e858266..00000000 --- a/core/client/src/app/styles/mixins/index.scss +++ /dev/null @@ -1,4 +0,0 @@ -@forward './on-hover'; -@forward './on-focus'; -@forward './on-spin'; -@forward './transition'; diff --git a/core/client/src/app/styles/mixins/on-focus.scss b/core/client/src/app/styles/mixins/on-focus.scss deleted file mode 100644 index 61edafdd..00000000 --- a/core/client/src/app/styles/mixins/on-focus.scss +++ /dev/null @@ -1,7 +0,0 @@ -@mixin on-focus { - & { - &:focus-visible { - @content; - } - } -} \ No newline at end of file diff --git a/core/client/src/app/styles/mixins/on-hover.scss b/core/client/src/app/styles/mixins/on-hover.scss deleted file mode 100644 index dc3914e4..00000000 --- a/core/client/src/app/styles/mixins/on-hover.scss +++ /dev/null @@ -1,7 +0,0 @@ -@mixin on-hover { - @media (hover: hover) { - &:hover { - @content; - } - } -} diff --git a/core/client/src/app/styles/mixins/on-spin.scss b/core/client/src/app/styles/mixins/on-spin.scss deleted file mode 100644 index 9a895570..00000000 --- a/core/client/src/app/styles/mixins/on-spin.scss +++ /dev/null @@ -1,13 +0,0 @@ -@keyframes spin { - from { - transform: rotate(0deg); - } - - to { - transform: rotate(360deg); - } -} - -@mixin on-spin { - animation: spin 1s linear infinite; -} diff --git a/core/client/src/app/styles/mixins/transition.scss b/core/client/src/app/styles/mixins/transition.scss deleted file mode 100644 index bc3fbde2..00000000 --- a/core/client/src/app/styles/mixins/transition.scss +++ /dev/null @@ -1,13 +0,0 @@ -@mixin transition { - & { - transition-property: color, background-color, text-decoration-color, fill, stroke, opacity; - } - - & { - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - } - - & { - transition-duration: 150ms; - } -} \ No newline at end of file diff --git a/core/client/src/app/styles/primary/_base.scss b/core/client/src/app/styles/primary/_base.css similarity index 92% rename from core/client/src/app/styles/primary/_base.scss rename to core/client/src/app/styles/primary/_base.css index e1bcccd2..e12d1945 100644 --- a/core/client/src/app/styles/primary/_base.scss +++ b/core/client/src/app/styles/primary/_base.css @@ -12,8 +12,8 @@ html { text-size-adjust: 100%; } -html.dark { - background-color: var(--zinc-700); +.dark { + background-color: var(--custom-jenda-dark); color-scheme: dark; } @@ -26,7 +26,7 @@ body { overscroll-behavior: none; } -.container { +.ui-container { width: 100%; max-width: 1600px; margin-right: auto; @@ -51,4 +51,4 @@ body { .dropdown-leave-to { opacity: 0; transform: translateY(-10px); -} \ No newline at end of file +} diff --git a/core/client/src/app/styles/primary/_exceptions.scss b/core/client/src/app/styles/primary/_exceptions.css similarity index 66% rename from core/client/src/app/styles/primary/_exceptions.scss rename to core/client/src/app/styles/primary/_exceptions.css index 427a0231..08e675d8 100644 --- a/core/client/src/app/styles/primary/_exceptions.scss +++ b/core/client/src/app/styles/primary/_exceptions.css @@ -1,21 +1,3 @@ -button { - cursor: pointer; - border: none; -} - -button:disabled, input:disabled { - cursor: not-allowed; -} - -ul { - list-style: none; -} - -a { - color: inherit; - text-decoration: none; -} - .v-popper__inner { font-size: 12px; padding: 4px 10px !important; @@ -39,11 +21,11 @@ canvas { } [data-sonner-toaster][data-theme='dark'] { - --normal-bg: var(--zinc-700) !important; + --normal-bg: var(--custom-jenda-dark) !important; --normal-border: hsl(0deg 0% 20%); --normal-text: var(--gray1); --success-border: hsl(147deg 100% 12%); - --info-bg: var(--zinc-700); + --info-bg: var(--custom-jenda-dark); } .vue-ui-kpi { @@ -51,7 +33,7 @@ canvas { } .vue-ui-kpi-value { - color: var(--blue-secondary) !important; + @apply text-blue-500 } .vue-data-ui-fulscreen--off { @@ -62,8 +44,7 @@ canvas { html.dark { .v-popper__inner { - background-color: var(--zinc-600) !important; - color: var(--zinc-200) !important; + @apply bg-neutral-100 text-neutral-800 } .vue-data-ui-fulscreen--off { diff --git a/core/client/src/app/styles/primary/_families.scss b/core/client/src/app/styles/primary/_families.css similarity index 100% rename from core/client/src/app/styles/primary/_families.scss rename to core/client/src/app/styles/primary/_families.css diff --git a/core/client/src/app/styles/primary/_fonts.scss b/core/client/src/app/styles/primary/_fonts.css similarity index 100% rename from core/client/src/app/styles/primary/_fonts.scss rename to core/client/src/app/styles/primary/_fonts.css diff --git a/core/client/src/app/styles/primary/_hippie-nav.css b/core/client/src/app/styles/primary/_hippie-nav.css new file mode 100644 index 00000000..0419b340 --- /dev/null +++ b/core/client/src/app/styles/primary/_hippie-nav.css @@ -0,0 +1,185 @@ +.hippie-nav { + @apply box-border; +} + +.search-results ul { + @apply p-0; +} + +.search-results .recent-title { + @apply px-4 py-2 text-[12px] font-bold opacity-50; +} + +.no-result { + @apply flex items-center justify-center px-8 py-10 text-neutral-200 dark:text-neutral-600; +} + +.key-caps { + @apply sticky bottom-0 z-60 flex gap-4 items-center justify-start px-4 py-2; +} + +.key-cap-content { + @apply flex gap-2 items-center text-[13px]; +} + +.key-cap-btn { + @apply flex px-2 text-neutral-300 rounded-md; +} + +.key-cap-content span { + @apply text-neutral-300; +} + +.modal { + @apply fixed inset-0 z-[9999] flex items-start px-36 py-30 bg-black/30; +} + +.modal-content { + @apply relative min-w-[560px] max-h-full mx-auto overflow-hidden-auto bg-white rounded-xl shadow-md dark:bg-neutral-800; +} + +.search-panel { + @apply sticky top-0 z-60 grid grid-cols-[auto_1fr_auto] gap-4 items-center w-full px-4 py-2; +} + +.search-panel-icon { + @apply flex-none h-[15px] text-neutral-500 opacity-50 dark:text-neutral-300; +} + +.search-panel-input { + @apply text-[15px] text-neutral-700 placeholder:text-neutral-500 dark:placeholder:text-neutral-300 bg-transparent border-0 outline-none dark:text-neutral-200 mt-px; +} + +.clear-btn { + @apply h-[9px] h-[9px] text-neutral-400 bg-transparent border-0 opacity-100 transition-opacity duration-200 flex items-center justify-center dark:text-neutral-300; +} + +.clear-btn:hover { + @apply opacity-100; +} + +.hippie-result-item { + @apply flex items-center justify-between px-4 py-2 leading-[1.5] cursor-pointer transition duration-75 ease-in text-neutral-700 dark:text-neutral-300; +} + +.hippie-result-item .highlighted { + @apply underline decoration-2 underline-offset-2; +} + +.hippie-result-item .title { + @apply text-[14px] text-neutral-700 lowercase dark:text-neutral-300; +} + +.hippie-result-item .type-icon { + @apply text-[16px] text-neutral-500; +} + +.hippie-result-item .sub-title { + @apply text-[12px] opacity-50; +} + +.hippie-result-item.selected { + @apply bg-neutral-100 dark:bg-neutral-700/40; +} + +.hippie-result-item.selected > span { + @apply text-neutral-600; +} + +.hippie-result-item.selected .type-icon { + @apply text-blue-500; +} + +.hippie-result-item.selected .highlighted { + @apply text-inherit underline; +} + +.hippie-result-item-content { + @apply grid grid-cols-[12px_1fr] gap-4 items-center w-[95%]; +} + +.hippie-result-item-content .item-info { + @apply flex flex-col; +} + +.hippie-result-item .clear-btn { + @apply h-[8px] border-0 opacity-100 transition-opacity duration-200 flex items-center justify-center; +} + +.hippie-result-item .clear-btn:hover { + @apply opacity-100; +} + +.hippie-enter-active { + animation: fade calc(var(--hippie-animate-duration) / 2); +} + +.hippie-enter-active .modal-content { + animation: pulse var(--hippie-animate-duration); +} + +.hippie-leave-active { + animation: fade calc(var(--hippie-animate-duration) / 2) reverse; +} + +.hippie-leave-active .modal-content { + animation: pulse calc(var(--hippie-animate-duration)) reverse; +} + +.hippie-enter-from, +.hippie-leave-to { + @apply opacity-0; +} + +@keyframes pulse { + 0% { + transform: scale3d(0.9, 0.9, 0.9); + } + + 55% { + transform: scale3d(0.98, 0.98, 0.98); + } + + 100% { + transform: scale3d(1, 1, 1); + } +} + +@keyframes fade { + 0% { + opacity: 0; + } + + 50% { + opacity: 0.75; + } + + 100% { + opacity: 1; + } +} + +.list-enter-active, +.list-leave-active { + @apply transition-all duration-200 ease; +} + +.list-enter-from, +.list-leave-to { + @apply opacity-0 translate-x-8; +} + +.hippie-expand-enter-active, +.hippie-expand-leave-active { + @apply overflow-hidden transition-all duration-200 ease-in-out delay-100; +} + +.hippie-expand-enter, +.hippie-expand-leave-to { + @apply h-0; +} + +.hippie-expand-enter-from, +.hippie-expand-leave-to { + @apply opacity-0; +} diff --git a/core/client/src/app/styles/primary/_hippie-nav.scss b/core/client/src/app/styles/primary/_hippie-nav.scss deleted file mode 100644 index 98afaf86..00000000 --- a/core/client/src/app/styles/primary/_hippie-nav.scss +++ /dev/null @@ -1,336 +0,0 @@ -.hippie-nav { - --hippie-animate-duration: 0.225s; - - box-sizing: border-box; - - .search-results { - ul { - padding: 0; - } - - .recent-title { - padding: var(--hippie-spacing-s) var(--hippie-spacing-l); - font-size: 12px; - font-weight: 700; - opacity: 0.5; - } - } - - .no-result { - display: flex; - align-items: center; - justify-content: center; - padding: var(--hippie-spacing-2xl); - color: var(--zinc-200); - } - - .key-caps { - position: sticky; - bottom: 0; - z-index: 60; - display: flex; - column-gap: 1rem; - align-items: center; - justify-content: flex-start; - padding: 10px var(--hippie-spacing-l); - - .key-cap-content { - display: flex; - column-gap: var(--hippie-spacing-xs); - align-items: center; - font-size: 13px; - - .key-cap-btn { - display: flex; - padding: var(--hippie-spacing-xs); - color: var(--zinc-300); - border-radius: 5px; - } - - span { - color: var(--zinc-300); - } - } - } - - .modal { - position: fixed; - inset: 0; - z-index: 9999; - display: flex; - align-items: flex-start; - padding: 120px 150px; - background-color: #0000004d; - - .modal-content { - position: relative; - min-width: 560px; - min-height: 50px; - max-height: 100%; - margin: 0 auto; - overflow: hidden auto; - background-color: var(--hippie-bg-color); - border-radius: 1rem; - box-shadow: - 0 1px 3px 0 rgb(0 0 0 / 10%), - 0 1px 2px -1px rgb(0 0 0 / 10%); - } - } - - .search-panel { - position: sticky; - top: 0; - z-index: 60; - display: grid; - grid-template: 1fr / auto 1fr auto; - column-gap: var(--hippie-spacing-l); - place-content: center center; - align-items: center; - width: 100%; - padding: var(--hippie-spacing-l); - - .search-panel-icon { - flex: none; - height: 15px; - color: var(--zinc-500); - opacity: 0.5; - } - - .search-panel-input { - font-size: 15px; - color: var(--zinc-600); - background-color: inherit; - border: 0; - outline: none; - } - - .clear-btn { - height: 9px; - color: var(--zinc-400); - background-color: transparent; - border: 0; - opacity: 0.5; - transition: opacity 0.2s; - display: flex; - align-items: center; - justify-content: center; - - > * { - height: 9px; - } - - &:hover { - opacity: 1; - } - } - } - - .hippie-result-item { - display: flex; - align-items: center; - justify-content: space-between; - padding: var(--hippie-spacing-m) var(--hippie-spacing-l); - line-height: 1.5; - cursor: pointer; - transition: 0.07s ease-in; - transition-property: background-color; - color: var(--zinc-700); - - .highlighted { - text-decoration-thickness: 2px; - text-underline-offset: 2px; - } - - .title { - color: var(--zinc-700); - text-transform: lowercase; - } - - .title { - font-size: 14px; - } - - .type-icon { - font-size: 16px; - color: var(--zinc-500); - } - - .sub-title { - font-size: 12px; - opacity: 0.5; - } - - &.selected { - background-color: var(--zinc-100); - - & > span { - color: var(--zinc-600); - } - - .type-icon { - color: var(--blue-secondary) !important; - } - - .highlighted { - color: inherit; - text-decoration-line: underline; - } - } - - .hippie-result-item-content { - display: grid; - grid: 1fr / 12px 1fr; - column-gap: var(--hippie-spacing-m); - align-items: center; - width: 95%; - - .item-info { - display: flex; - flex-direction: column; - } - } - - .clear-btn { - height: 8px; - color: inherit; - background-color: transparent; - border: 0; - opacity: 0.5; - transition: opacity 0.2s; - display: flex; - align-items: center; - justify-content: center; - - > * { - height: 8px; - } - - &:hover { - opacity: 0.75; - } - } - } -} - -.hippie-enter-active { - animation: fade calc(var(--hippie-animate-duration) / 2); - - .modal-content { - animation: pulse var(--hippie-animate-duration); - } -} - -.hippie-leave-active { - animation: fade calc(var(--hippie-animate-duration) / 2) reverse; - - .modal-content { - animation: pulse calc(var(--hippie-animate-duration)) reverse; - } -} - -.hippie-enter-from, -.hippie-leave-to { - opacity: 0; -} - -@keyframes pulse { - 0% { - transform: scale3d(0.9, 0.9, 0.9); - } - - 55% { - transform: scale3d(0.98, 0.98, 0.98); - } - - 100% { - transform: scale3d(1, 1, 1); - } -} - -@keyframes fade { - 0% { - opacity: 0; - } - - 50% { - opacity: 0.75; - } - - 100% { - opacity: 1; - } -} - -.list-enter-active, -.list-leave-active { - transition: all 0.2s ease; -} - -.list-enter-from, -.list-leave-to { - opacity: 0; - transform: translateX(30px); -} - -.hippie-expand-enter-active, -.hippie-expand-leave-active { - overflow: hidden; - transition: - 0.2s ease-in-out 0.1s, - 0.2s ease-in-out; - transition-property: height, opacity; -} - -.hippie-expand-enter, -.hippie-expand-leave-to { - height: 0; -} - -.hippie-expand-enter-from, -.hippie-expand-leave-to { - opacity: 0; -} - -html.dark { - .hippie-nav { - .modal { - .modal-content { - background-color: var(--zinc-700); - } - } - - .hippie-result-item.selected { - background-color: #323232; - } - - .hippie-result-item { - color: var(--zinc-300); - - .title { - color: var(--zinc-200); - } - - .type-icon{ - color: var(--zinc-300); - } - } - - .search-panel { - .search-panel-icon { - color: var(--zinc-200); - } - - .search-panel-input { - color: var(--zinc-200); - } - - .clear-btn { - color: var(--zinc-300); - } - } - - .no-result { - color: var(--zinc-500); - } - } -} diff --git a/core/client/src/app/styles/primary/_properties.css b/core/client/src/app/styles/primary/_properties.css new file mode 100644 index 00000000..5a87ab2c --- /dev/null +++ b/core/client/src/app/styles/primary/_properties.css @@ -0,0 +1,24 @@ +:root { + /* priorities */ + --low-color: 34, 197, 94; + --medium-color: 245, 158, 11; + --high-color: 239, 68, 68; + + --custom-jenda-dark: rgb(38 38 38); + + /* hippie */ + --hippie-primary-color: #42b983; + --hippie-bg-color: hsl(0deg 0% 100%); + --hippie-text-color: hsl(215deg 16% 50%); + --hippie-backdrop-color: hsla(215deg 16% 50% / 50%); + --hippie-hit-color: hsl(215deg 16% 50%); + --hippie-hit-active-color: #fff; + --hippie-hit-highlighted-text-color: #42b983; + --hippie-footer-color: hsla(215deg 16% 50% / 70%); + --hippie-spacing-xs: .25rem; + --hippie-spacing-s: .5rem; + --hippie-spacing-m: .75rem; + --hippie-spacing-l: 1rem; + --hippie-spacing-xl: 1.25rem; + --hippie-spacing-2xl: 2rem; +} diff --git a/core/client/src/app/styles/primary/_properties.scss b/core/client/src/app/styles/primary/_properties.scss deleted file mode 100644 index 56264baf..00000000 --- a/core/client/src/app/styles/primary/_properties.scss +++ /dev/null @@ -1,87 +0,0 @@ -// tw https://tailwindcss.com/docs/customizing-colors -$zinc-colors: ( - 950: rgb(10 10 10), - 900: rgb(23 23 23), - 800: rgb(28 28 28), - 700: rgb(38 38 38), - 600: rgb(64 64 64), - 500: rgb(82 82 82), - 400: rgb(115 115 115), - 300: rgb(163 163 163), - 200: rgb(229 229 229), - 100: rgb(245 245 245), - 50: rgb(250 250 250) -); - -:root { - @each $key, $value in $zinc-colors { - --zinc-#{$key}: #{$value}; - } - - --destructive: rgb(239 68 68); - --purple-main: rgb(136 133 226); - --dark-border: rgb(28 28 28); - --dark-destructive: rgb(135 34 34); - - // rgb for hover - --zinc-rgb-900: 24, 24, 27; - --zinc-rgb-800: 28, 28, 28; - --zinc-rgb-700: 38, 38, 38; - --zinc-rgb-600: 64, 64, 64; - --zinc-rgb-300: 163, 163, 163; - --zinc-rgb-200: 229, 229, 229; - --zinc-rgb-50: 250, 250, 250; - --purple-rgb: 136, 133, 226; - --dark-rgb-destructive: 135, 34, 34; - - // priorities - --low-color: 34, 197, 94; - --medium-color: 245, 158, 11; - --high-color: 239, 68, 68; - - // hippie - --hippie-primary-color: #42b983; - --hippie-bg-color: hsl(0deg 0% 100%); - --hippie-text-color: hsl(215deg 16% 50%); - --hippie-backdrop-color: hsla(215deg 16% 50% / 50%); - --hippie-hit-color: hsl(215deg 16% 50%); - --hippie-hit-active-color: #fff; - --hippie-hit-highlighted-text-color: #42b983; - --hippie-footer-color: hsla(215deg 16% 50% / 70%); - --hippie-spacing-xs: .25rem; - --hippie-spacing-s: .5rem; - --hippie-spacing-m: .75rem; - --hippie-spacing-l: 1rem; - --hippie-spacing-xl: 1.25rem; - --hippie-spacing-2xl: 2rem; -} - -@property --sidebar-bg-color { - syntax: ''; - inherits: true; - initial-value: #fafafa; -} - -@property --sidebar-text-color { - syntax: ''; - inherits: true; - initial-value: #26262a; -} - -@property --main-slotted { - syntax: ''; - inherits: true; - initial-value: #fff; -} - -@property --blue-basic { - syntax: ''; - inherits: true; - initial-value: #266DF0; -} - -@property --blue-secondary { - syntax: ''; - inherits: true; - initial-value: #538bf3; -} diff --git a/core/client/src/app/styles/primary/_scrollbar.css b/core/client/src/app/styles/primary/_scrollbar.css new file mode 100644 index 00000000..178f91d9 --- /dev/null +++ b/core/client/src/app/styles/primary/_scrollbar.css @@ -0,0 +1,13 @@ +::-webkit-scrollbar { + background-color: transparent; + height: 0.6em; + width: 0.6em; +} + +::-webkit-scrollbar-track { + @apply bg-neutral-100 dark:bg-neutral-700/20 +} + +::-webkit-scrollbar-thumb { + @apply bg-neutral-300 rounded-xl dark:bg-neutral-700 +} diff --git a/core/client/src/app/styles/primary/_scrollbar.scss b/core/client/src/app/styles/primary/_scrollbar.scss deleted file mode 100644 index 38761abc..00000000 --- a/core/client/src/app/styles/primary/_scrollbar.scss +++ /dev/null @@ -1,24 +0,0 @@ -::-webkit-scrollbar { - background-color: transparent; - height: 0.6em; - width: 0.6em; -} - -::-webkit-scrollbar-track { - background-color: var(--zinc-100); -} - -::-webkit-scrollbar-thumb { - border-radius: 0.6em; - background-color: rgba(var(--zinc-rgb-300), 0.5); -} - -html.dark { - ::-webkit-scrollbar-track { - background-color: rgba(var(--zinc-rgb-600), 0.2); - } - - ::-webkit-scrollbar-thumb { - background-color: var(--zinc-600) - } -} diff --git a/core/client/src/app/styles/primary/_themes.scss b/core/client/src/app/styles/primary/_themes.scss deleted file mode 100644 index 548d2a65..00000000 --- a/core/client/src/app/styles/primary/_themes.scss +++ /dev/null @@ -1,15 +0,0 @@ -html.light { - --sidebar-bg-color: #fafafa; - --sidebar-text-color: #26262a; - --sidebar-section-color: #e5e5e5; - --main-slotted: #fff; - --blue-basic: #266DF0; - --blue-secondary: #538BF3; -} - -html.dark { - --sidebar-bg-color: #1c1c1c66; - --sidebar-text-color: #f5f5f5; - --sidebar-section-color: #e5e5e5; - --main-slotted: #262626; -} diff --git a/core/client/src/app/styles/primary/_typography.scss b/core/client/src/app/styles/primary/_typography.scss deleted file mode 100644 index c7241cb5..00000000 --- a/core/client/src/app/styles/primary/_typography.scss +++ /dev/null @@ -1,333 +0,0 @@ -.heading-1 { - font-size: 36px; - line-height: 44px; - font-weight: 600; -} - -.heading-2 { - font-size: 32px; - line-height: 40px; - font-weight: 600; -} - -.heading-3 { - font-size: 28px; - line-height: 32px; - font-weight: 600; -} - -.heading-4 { - font-size: 24px; - line-height: 32px; - font-weight: 500; -} - -.text-xl { - font-size: 20px; - line-height: 28px; - font-weight: 500; -} - -.text-lg { - font-size: 18px; - line-height: 28px; - font-weight: 400; -} - -.text-base { - font-size: 16px; - line-height: 24px; - font-weight: 400; -} - -.text-sm { - font-size: 14px; - line-height: 20px; - font-weight: 400; -} - -.text-xs { - font-size: 12px; - line-height: 16px; - font-weight: 400; -} - -@media screen and (width <= 1440px) { - .heading-1 { - font-size: 32px; - line-height: 40px; - font-weight: 600; - } - - .heading-2 { - font-size: 30px; - line-height: 36px; - font-weight: 600; - } - - .heading-3 { - font-size: 26px; - line-height: 30px; - font-weight: 600; - } - - .heading-4 { - font-size: 22px; - line-height: 28px; - font-weight: 500; - } - - .text-xl { - font-size: 20px; - line-height: 24px; - font-weight: 500; - } - - .text-lg { - font-size: 18px; - line-height: 26px; - font-weight: 400; - } - - .text-base { - font-size: 14px; - line-height: 22px; - font-weight: 400; - } - - .text-sm { - font-size: 13px; - line-height: 18px; - font-weight: 400; - } - - .text-xs { - font-size: 11px; - line-height: 14px; - font-weight: 400; - } -} - -@media screen and (width <= 1280px) { - .heading-1 { - font-size: 30px; - line-height: 38px; - font-weight: 600; - } - - .heading-2 { - font-size: 28px; - line-height: 34px; - font-weight: 600; - } - - .heading-3 { - font-size: 24px; - line-height: 28px; - font-weight: 600; - } - - .heading-4 { - font-size: 20px; - line-height: 26px; - font-weight: 500; - } - - .text-xl { - font-size: 18px; - line-height: 24px; - font-weight: 500; - } - - .text-lg { - font-size: 16px; - line-height: 22px; - font-weight: 400; - } - - .text-base { - font-size: 14px; - line-height: 22px; - font-weight: 400; - } - - .text-sm { - font-size: 13px; - line-height: 18px; - font-weight: 400; - } - - .text-xs { - font-size: 11px; - line-height: 14px; - font-weight: 400; - } -} - -@media screen and (width <= 1160px) { - .heading-1 { - font-size: 28px; - line-height: 38px; - font-weight: 600; - } - - .heading-2 { - font-size: 26px; - line-height: 34px; - font-weight: 600; - } - - .heading-3 { - font-size: 22px; - line-height: 28px; - font-weight: 600; - } - - .heading-4 { - font-size: 18px; - line-height: 26px; - font-weight: 500; - } - - .text-xl { - font-size: 16px; - line-height: 24px; - font-weight: 500; - } - - .text-lg { - font-size: 16px; - line-height: 22px; - font-weight: 400; - } - - .text-base { - font-size: 14px; - line-height: 22px; - font-weight: 400; - } - - .text-sm { - font-size: 13px; - line-height: 18px; - font-weight: 400; - } - - .text-xs { - font-size: 10px; - line-height: 14px; - font-weight: 400; - } -} - -@media screen and (width <= 1024px) { - .heading-1 { - font-size: 26px; - line-height: 38px; - font-weight: 600; - } - - .heading-2 { - font-size: 22px; - line-height: 34px; - font-weight: 600; - } - - .heading-3 { - font-size: 22px; - line-height: 28px; - font-weight: 600; - } - - .heading-4 { - font-size: 18px; - line-height: 26px; - font-weight: 500; - } - - .text-xl { - font-size: 16px; - line-height: 24px; - font-weight: 500; - } - - .text-lg { - font-size: 15px; - line-height: 22px; - font-weight: 400; - } - - .text-base { - font-size: 14px; - line-height: 22px; - font-weight: 400; - } - - .text-sm { - font-size: 12px; - line-height: 18px; - font-weight: 400; - } - - .text-xs { - font-size: 10px; - line-height: 14px; - font-weight: 400; - } -} - -@media screen and (width <= 420px) { - .heading-1 { - font-size: 24px; - line-height: 38px; - font-weight: 600; - } - - .heading-2 { - font-size: 20px; - line-height: 34px; - font-weight: 600; - } - - .heading-3 { - font-size: 18px; - line-height: 28px; - font-weight: 600; - } - - .heading-4 { - font-size: 16px; - line-height: 26px; - font-weight: 500; - } - - .text-xl { - font-size: 15px; - line-height: 24px; - font-weight: 500; - } - - .text-lg { - font-size: 14px; - line-height: 22px; - font-weight: 400; - } - - .text-base { - font-size: 13px; - line-height: 22px; - font-weight: 400; - } - - .text-sm { - font-size: 12px; - line-height: 18px; - font-weight: 400; - } - - .text-xs { - font-size: 9px; - line-height: 14px; - font-weight: 400; - } -} \ No newline at end of file diff --git a/core/client/src/app/styles/primary/index.css b/core/client/src/app/styles/primary/index.css new file mode 100644 index 00000000..7f260414 --- /dev/null +++ b/core/client/src/app/styles/primary/index.css @@ -0,0 +1,7 @@ +@import './_properties'; +@import './_fonts'; +@import './_base'; +@import './_exceptions'; +@import './_families'; +@import './_scrollbar'; +@import './_hippie-nav'; diff --git a/core/client/src/app/styles/primary/index.scss b/core/client/src/app/styles/primary/index.scss deleted file mode 100644 index 39076db5..00000000 --- a/core/client/src/app/styles/primary/index.scss +++ /dev/null @@ -1,9 +0,0 @@ -@use './_properties'; -@use './_fonts'; -@use './_base'; -@use './_themes'; -@use './_typography'; -@use './_exceptions'; -@use './_families'; -@use './_scrollbar'; -@use './hippie-nav'; diff --git a/core/client/src/entities/board/index.ts b/core/client/src/entities/board/index.ts index 551001f1..116e6686 100644 --- a/core/client/src/entities/board/index.ts +++ b/core/client/src/entities/board/index.ts @@ -1,2 +1 @@ export * from './model' -export * from './ui' diff --git a/core/client/src/entities/board/ui/BoardPreviewCard.vue b/core/client/src/entities/board/ui/BoardPreviewCard.vue deleted file mode 100644 index 24749d85..00000000 --- a/core/client/src/entities/board/ui/BoardPreviewCard.vue +++ /dev/null @@ -1,115 +0,0 @@ - - - - - diff --git a/core/client/src/entities/board/ui/CardItem.vue b/core/client/src/entities/board/ui/CardItem.vue deleted file mode 100644 index 91c9b892..00000000 --- a/core/client/src/entities/board/ui/CardItem.vue +++ /dev/null @@ -1,161 +0,0 @@ - - - - - diff --git a/core/client/src/entities/board/ui/ColumnItem.vue b/core/client/src/entities/board/ui/ColumnItem.vue deleted file mode 100644 index 58fc733b..00000000 --- a/core/client/src/entities/board/ui/ColumnItem.vue +++ /dev/null @@ -1,131 +0,0 @@ - - - - - diff --git a/core/client/src/entities/board/ui/__tests__/BoardPreviewCard.spec.ts b/core/client/src/entities/board/ui/__tests__/BoardPreviewCard.spec.ts deleted file mode 100644 index 14bed38b..00000000 --- a/core/client/src/entities/board/ui/__tests__/BoardPreviewCard.spec.ts +++ /dev/null @@ -1,45 +0,0 @@ -import i18n from '@/shared/lib/i18n' -import { mount } from '@vue/test-utils' -import { describe, expect, it, vi } from 'vitest' -import BoardPreviewCard from '../BoardPreviewCard.vue' -import '@/shared/lib/vitest-utils/cookiesI18n-mock' - -const mockRouter = { - push: vi.fn(), - beforeEach: vi.fn(), -} - -describe('tests for BoardPreviewCard.vue', () => { - const wrapper = mount(BoardPreviewCard, { - global: { - plugins: [i18n], - - mocks: { - $router: mockRouter, - }, - }, - props: { - board: { - _id: '0', - name: 'test title', - description: 'test description', - users: [], - }, - }, - }) - - it('should render correctly', () => { - expect(wrapper.html()).toMatchSnapshot() - }) - - it('should correctly works with i18n', () => { - const date = wrapper.find('.bottom_part') - expect(date.text()).toContain('Updated: May 2024') - }) - - it('should redirect to "/board/1"', async () => { - await wrapper.find('.active_board').trigger('click') - expect(mockRouter.push).toHaveBeenCalledTimes(1) - expect(mockRouter.push).toHaveBeenCalledWith('/board/1') - }) -}) diff --git a/core/client/src/entities/board/ui/__tests__/CardItem.spec.ts b/core/client/src/entities/board/ui/__tests__/CardItem.spec.ts deleted file mode 100644 index b12292a1..00000000 --- a/core/client/src/entities/board/ui/__tests__/CardItem.spec.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { mount } from '@vue/test-utils' -import { describe, expect, it } from 'vitest' -import CardItem from '../CardItem.vue' - -describe('tests for CardItem.vue', () => { - const wrapper = mount(CardItem, { - props: { - card: { - _id: '0', - title: 'Test Card', - priority: 'low', - users: [], - chat: true, - chatCount: 2, - tags: [{ _id: '0', name: 'test' }], - }, - }, - }) - - it('should render correctly', () => { - expect(wrapper.html()).toMatchSnapshot() - }) - - it('should has correct number of tags', () => { - const tags = wrapper.findAll('.tags > .badge') - expect(tags.length).toBe(1) - expect(tags[0].text()).toBe('test') - }) - - it('should has correct chat counts', () => { - const chat = wrapper.find('.messages > span') - expect(chat.text()).toBe('2') - }) -}) diff --git a/core/client/src/entities/board/ui/__tests__/ColumnItem.spec.ts b/core/client/src/entities/board/ui/__tests__/ColumnItem.spec.ts deleted file mode 100644 index 204925a2..00000000 --- a/core/client/src/entities/board/ui/__tests__/ColumnItem.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import i18n from '@/shared/lib/i18n' -import { mount } from '@vue/test-utils' -import { describe, expect, it } from 'vitest' -import ColumnItem from '../ColumnItem.vue' -import '@/shared/lib/vitest-utils/cookiesI18n-mock' - -describe('tests for ColumnItem.vue', () => { - const wrapper = mount(ColumnItem, { - global: { - plugins: [i18n], - mocks: { - t: (key: string) => { - const translations: Record = { - 'kanban.cards.add': 'Add card (test)', - } - return translations[key] - }, - }, - }, - props: { - column: { - _id: '0', - title: 'test', - cards: [], - }, - }, - slots: { - default: 'test name of column', - content: 'test content', - }, - }) - - it('should render correctly', () => { - expect(wrapper.html()).toMatchSnapshot() - }) - - it('should correctly works with i18n', () => { - const date = wrapper.find('.add') - expect(date.text()).toContain('Add card (test)') - }) -}) diff --git a/core/client/src/entities/board/ui/__tests__/__snapshots__/BoardPreviewCard.spec.ts.snap b/core/client/src/entities/board/ui/__tests__/__snapshots__/BoardPreviewCard.spec.ts.snap deleted file mode 100644 index eed9b73a..00000000 --- a/core/client/src/entities/board/ui/__tests__/__snapshots__/BoardPreviewCard.spec.ts.snap +++ /dev/null @@ -1,12 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`tests for BoardPreviewCard.vue > should render correctly 1`] = ` -"
-
-

test title

test description -
-
Updated: May 2024 -
-
-
" -`; diff --git a/core/client/src/entities/board/ui/__tests__/__snapshots__/CardItem.spec.ts.snap b/core/client/src/entities/board/ui/__tests__/__snapshots__/CardItem.spec.ts.snap deleted file mode 100644 index 607fd4a1..00000000 --- a/core/client/src/entities/board/ui/__tests__/__snapshots__/CardItem.spec.ts.snap +++ /dev/null @@ -1,49 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`tests for CardItem > should render correctly 1`] = ` -"
-
-
Test Card
-
-
test
-
-
-
-
#0 -
- - - 2
-
-
-
-
-
-
-
-
" -`; - -exports[`tests for CardItem.vue > should render correctly 1`] = ` -"
-
-
Test Card
-
-
test
-
-
-
-
#0 -
- - - 2
-
-
-
-
-
-
-
-
" -`; diff --git a/core/client/src/entities/board/ui/__tests__/__snapshots__/ColumnItem.spec.ts.snap b/core/client/src/entities/board/ui/__tests__/__snapshots__/ColumnItem.spec.ts.snap deleted file mode 100644 index bf20550b..00000000 --- a/core/client/src/entities/board/ui/__tests__/__snapshots__/ColumnItem.spec.ts.snap +++ /dev/null @@ -1,58 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`test ColumnItem > should render correctly 1`] = ` -"
-
-
test name of column0
- - - - -
-
test content
-
-
- - - Add card (test)
-
-
" -`; - -exports[`tests for ColumnItem > should render correctly 1`] = ` -"
-
-
test name of column0
- - - - -
-
test content
-
-
- - - Add card (test)
-
-
" -`; - -exports[`tests for ColumnItem.vue > should render correctly 1`] = ` -"
-
-
test name of column0
- - - - -
-
test content
-
-
- - - Add card (test)
-
-
" -`; diff --git a/core/client/src/entities/board/ui/index.ts b/core/client/src/entities/board/ui/index.ts deleted file mode 100644 index 414f36c2..00000000 --- a/core/client/src/entities/board/ui/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import BoardPreviewCard from './BoardPreviewCard.vue' -import CardItem from './CardItem.vue' -import ColumnItem from './ColumnItem.vue' - -export { BoardPreviewCard, CardItem, ColumnItem } diff --git a/core/client/src/entities/chart/ui/ChartItemWrapper.vue b/core/client/src/entities/chart/ui/ChartItemWrapper.vue index fe34206f..3525a092 100644 --- a/core/client/src/entities/chart/ui/ChartItemWrapper.vue +++ b/core/client/src/entities/chart/ui/ChartItemWrapper.vue @@ -1,6 +1,5 @@ - - diff --git a/core/client/src/entities/template/ui/ImportTemplate.vue b/core/client/src/entities/template/ui/ImportTemplate.vue index f8a560f7..4dc5e8b5 100644 --- a/core/client/src/entities/template/ui/ImportTemplate.vue +++ b/core/client/src/entities/template/ui/ImportTemplate.vue @@ -1,13 +1,12 @@ - - diff --git a/core/client/src/entities/template/ui/TemplateItem.vue b/core/client/src/entities/template/ui/TemplateItem.vue index 5a67b9e7..562da91c 100644 --- a/core/client/src/entities/template/ui/TemplateItem.vue +++ b/core/client/src/entities/template/ui/TemplateItem.vue @@ -8,96 +8,36 @@ defineProps<{ - - diff --git a/core/client/src/entities/template/ui/__tests__/__snapshots__/TemplateItem.spec.ts.snap b/core/client/src/entities/template/ui/__tests__/__snapshots__/TemplateItem.spec.ts.snap index 2687ac1e..6533970c 100644 --- a/core/client/src/entities/template/ui/__tests__/__snapshots__/TemplateItem.spec.ts.snap +++ b/core/client/src/entities/template/ui/__tests__/__snapshots__/TemplateItem.spec.ts.snap @@ -1,25 +1,13 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`tests for TemplateItem.vue > should render correctly 1`] = ` -"
-
- -
-

Base Kanban

Create a basic project with "Base Kanban" template -
-
June 12, 2024
-
-
" -`; - exports[`tests for TemplateItem.vue > should render correctly 1`] = ` -"
-
- -
-

Base Kanban

Create a basic project with "Base Kanban" template +"
+
+ +
+

Base Kanban

Create a basic project with "Base Kanban" template
-
June 12, 2024
+
June 12, 2024
" `; diff --git a/core/client/src/entities/user/ui/UserAvatar.vue b/core/client/src/entities/user/ui/UserAvatar.vue index cc1a8adf..e655f191 100644 --- a/core/client/src/entities/user/ui/UserAvatar.vue +++ b/core/client/src/entities/user/ui/UserAvatar.vue @@ -1,21 +1,8 @@ - - diff --git a/core/client/src/entities/user/ui/__tests__/__snapshots__/UserAvatar.spec.ts.snap b/core/client/src/entities/user/ui/__tests__/__snapshots__/UserAvatar.spec.ts.snap deleted file mode 100644 index c38e27b4..00000000 --- a/core/client/src/entities/user/ui/__tests__/__snapshots__/UserAvatar.spec.ts.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`tests for UserAvatar.vue > should render correctly 1`] = `"
user
"`; diff --git a/core/client/src/features/auth/ui/BgPanel.vue b/core/client/src/features/auth/ui/BgPanel.vue index 6fda4533..45722985 100644 --- a/core/client/src/features/auth/ui/BgPanel.vue +++ b/core/client/src/features/auth/ui/BgPanel.vue @@ -15,20 +15,31 @@ const { width } = useWindowSize()