Loading src/App.vue +25 −6 Original line number Diff line number Diff line Loading @@ -208,14 +208,33 @@ const gentleIcons = [ TrashIcon, UserIcon, ]; const visibleDrawer = ref(false); const visibleDrawer = ref(true); </script> <template> <Drawer v-model:visible="visibleDrawer" ><p>pizdwertyukilokl,kmjhgfwewesrdtyukilo,kmjngeartyukikdhgfgjhklj.,kga</p> <template #footer ><div style="height: 1px; background-color: black"></div> <Drawer v-model:visible="visibleDrawer" theme="sky" closeIcon="CropIcon"> <template #header>Это - Drawer</template> <p> pizdwertyuki lokl,kmjhgfwewesrdty ukilo,kmjngeartyukikdhgfgjhklj.,kga Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet deleniti, esse in ipsam quis sapiente tempore voluptas. Aperiam dignissimos enim, fuga fugit, modi, nam necessitatibus numquam obcaecati omnis recusandae voluptatibus! Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque blanditiis consectetur cum delectus ducimus eius est hic incidunt iusto molestiae odio optio reiciendis reprehenderit saepe tempora vel, veniam veritatis voluptates. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ducimus expedita laboriosam nesciunt voluptatum! Ab animi illum impedit iusto libero magni maxime molestias nisi nobis possimus provident quia repellat, rerum suscipit. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Autem modi ratione reiciendis. Cupiditate deserunt eaque eum labore qui rem? Consequatur corporis, dolorem doloremque eveniet facilis obcaecati quasi repellat vel velit. pizdwertyuki lokl,kmjhgfwewesrdty ukilo,kmjngeartyukikdhgfgjhklj.,kga Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet deleniti, esse in ipsam quis sapiente tempore voluptas. Aperiam dignissimos enim, fuga fugit, modi, nam necessitatibus numquam obcaecati omnis recusandae voluptatibus! Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque blanditiis consectetur cum delectus ducimus eius est hic incidunt iusto molestiae odio optio reiciendis reprehenderit saepe tempora vel, veniam veritatis voluptates. Lorem ipsum dolor sit amet, consectetur adipisicing elit. </p> <template #footer> pizdwertyukilokl,kmjhgfw ewesrdtyukilo,kmjng eartyukikdhgfgjhklj.,kga</template ></Drawer > Loading src/common/helpers/colors.ts +15 −16 Original line number Diff line number Diff line export const convert200ThemeToColor = (theme: string | undefined) => { export const convert300ThemeToColor = (theme: string | undefined) => { switch (theme) { case 'white': return '#ffffff'; return '#cbd5e1'; case 'slate': return '#64748b'; return '#cbd5e1'; case 'blue': return '#3b82f6'; return '#93c5fd'; case 'sky': return '#7dd3fc'; case 'teal': return '#14b8a6'; return '#5eead4'; case 'lime': return '#84cc16'; return '#bef264'; case 'green': return '#22c55e'; return '#86efac'; case 'yellow': return '#eab308'; return '#fde047'; case 'amber': return '#f59e0b'; return '#fcd34d'; case 'orange': return '#f97316'; return '#fdba74'; case 'pink': return '#ec4899'; case 'fuchsia': return '#d946ef'; return '#f0abfc'; case 'purple': return '#a855f7'; return '#d8b4fe'; case 'indigo': return '#6366f1'; return '#a5b4fc'; case 'rose': return '#f43f5e'; return '#fda4af'; case 'red': return '#fca5a5'; case 'black': return '#000000'; return '#334155'; } }; Loading Loading @@ -77,7 +77,6 @@ export const convert500ThemeToColor = (theme: string | undefined) => { }; export const convert800ThemeToColor = (theme: string | undefined) => { if (!theme) return '#9294a1'; switch (theme) { case 'white': return '#ffffff'; Loading src/common/helpers/icons.ts 0 → 100644 +8 −0 Original line number Diff line number Diff line import CrossCircleIcon from '@stories/icons/Mono/CrossCircleIcon.vue'; import CropIcon from '@stories/icons/Mono/CropIcon.vue'; import type { Component } from 'vue'; export const iconsSet: Record<string, Component> = { CrossCircleIcon: CrossCircleIcon, CropIcon: CropIcon, }; src/stories/components/Drawer/Drawer.vue +23 −27 Original line number Diff line number Diff line <script setup lang="ts"> import { convert500ThemeToColor, convert200ThemeToColor } from '@helpers/colors'; import { convert500ThemeToColor, convert300ThemeToColor } from '@helpers/colors'; import type { TThemeColor } from '@interfaces/common'; import { computed } from 'vue'; import { iconsSet } from '@helpers/icons'; const props = withDefaults( defineProps<{ width?: string | number; theme?: TThemeColor; closeIcon?: string; }>(), { visible: false, width: 400, theme: 'white', closeIcon: 'CrossCircleIcon', }, ); const emit = defineEmits(['onClose']); const visible = defineModel('visible'); const visible = defineModel<boolean>('visible'); const themeColor = computed(() => convert500ThemeToColor(props.theme)); const scrollColor = computed(() => convert200ThemeToColor(props.theme)); const scrollColor = computed(() => convert300ThemeToColor(props.theme)); const textColor = computed(() => { if (!props.theme || props.theme === 'white') return 'black'; return 'white'; Loading Loading @@ -60,28 +63,18 @@ const drawerWidth = computed(() => { } " > <svg width="40px" height="40px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" > <path fill-rule="evenodd" clip-rule="evenodd" d="M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12ZM8.96963 8.96965C9.26252 8.67676 9.73739 8.67676 10.0303 8.96965L12 10.9393L13.9696 8.96967C14.2625 8.67678 14.7374 8.67678 15.0303 8.96967C15.3232 9.26256 15.3232 9.73744 15.0303 10.0303L13.0606 12L15.0303 13.9696C15.3232 14.2625 15.3232 14.7374 15.0303 15.0303C14.7374 15.3232 14.2625 15.3232 13.9696 15.0303L12 13.0607L10.0303 15.0303C9.73742 15.3232 9.26254 15.3232 8.96965 15.0303C8.67676 14.7374 8.67676 14.2625 8.96965 13.9697L10.9393 12L8.96963 10.0303C8.67673 9.73742 8.67673 9.26254 8.96963 8.96965Z" :fill="textColor ?? '#1C274C'" /> </svg> <component :is="iconsSet[closeIcon]" :color="textColor" /> </button> </header> <div class="main"> <slot /> </div> <div v-if="$slots.footer"> <div class="divider"></div> <footer class="drawerFooter"> <slot name="footer" /> </footer> </div> </section> </article> </template> Loading Loading @@ -122,18 +115,24 @@ const drawerWidth = computed(() => { } .drawerHeader { font-weight: bold; font-size: 1.5rem; font-size: 2rem; padding-right: 50px; margin-bottom: 20px; margin-bottom: 10px; min-height: 1rem; overflow: auto; } .main { flex: 1 1 auto; overflow: auto; padding: 10px; } .drawerFooter { overflow: auto; padding: 10px 10px 0 10px; } .divider { height: 2px; background-color: v-bind(scrollColor); } .buttonClose { position: absolute; Loading @@ -142,11 +141,8 @@ const drawerWidth = computed(() => { width: 30px; } ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-track { background: v-bind(textColor); width: 8px; height: 8px; } ::-webkit-scrollbar-thumb { border-radius: 5px; Loading Loading
src/App.vue +25 −6 Original line number Diff line number Diff line Loading @@ -208,14 +208,33 @@ const gentleIcons = [ TrashIcon, UserIcon, ]; const visibleDrawer = ref(false); const visibleDrawer = ref(true); </script> <template> <Drawer v-model:visible="visibleDrawer" ><p>pizdwertyukilokl,kmjhgfwewesrdtyukilo,kmjngeartyukikdhgfgjhklj.,kga</p> <template #footer ><div style="height: 1px; background-color: black"></div> <Drawer v-model:visible="visibleDrawer" theme="sky" closeIcon="CropIcon"> <template #header>Это - Drawer</template> <p> pizdwertyuki lokl,kmjhgfwewesrdty ukilo,kmjngeartyukikdhgfgjhklj.,kga Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet deleniti, esse in ipsam quis sapiente tempore voluptas. Aperiam dignissimos enim, fuga fugit, modi, nam necessitatibus numquam obcaecati omnis recusandae voluptatibus! Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque blanditiis consectetur cum delectus ducimus eius est hic incidunt iusto molestiae odio optio reiciendis reprehenderit saepe tempora vel, veniam veritatis voluptates. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ducimus expedita laboriosam nesciunt voluptatum! Ab animi illum impedit iusto libero magni maxime molestias nisi nobis possimus provident quia repellat, rerum suscipit. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Autem modi ratione reiciendis. Cupiditate deserunt eaque eum labore qui rem? Consequatur corporis, dolorem doloremque eveniet facilis obcaecati quasi repellat vel velit. pizdwertyuki lokl,kmjhgfwewesrdty ukilo,kmjngeartyukikdhgfgjhklj.,kga Lorem ipsum dolor sit amet, consectetur adipisicing elit. Amet deleniti, esse in ipsam quis sapiente tempore voluptas. Aperiam dignissimos enim, fuga fugit, modi, nam necessitatibus numquam obcaecati omnis recusandae voluptatibus! Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque blanditiis consectetur cum delectus ducimus eius est hic incidunt iusto molestiae odio optio reiciendis reprehenderit saepe tempora vel, veniam veritatis voluptates. Lorem ipsum dolor sit amet, consectetur adipisicing elit. </p> <template #footer> pizdwertyukilokl,kmjhgfw ewesrdtyukilo,kmjng eartyukikdhgfgjhklj.,kga</template ></Drawer > Loading
src/common/helpers/colors.ts +15 −16 Original line number Diff line number Diff line export const convert200ThemeToColor = (theme: string | undefined) => { export const convert300ThemeToColor = (theme: string | undefined) => { switch (theme) { case 'white': return '#ffffff'; return '#cbd5e1'; case 'slate': return '#64748b'; return '#cbd5e1'; case 'blue': return '#3b82f6'; return '#93c5fd'; case 'sky': return '#7dd3fc'; case 'teal': return '#14b8a6'; return '#5eead4'; case 'lime': return '#84cc16'; return '#bef264'; case 'green': return '#22c55e'; return '#86efac'; case 'yellow': return '#eab308'; return '#fde047'; case 'amber': return '#f59e0b'; return '#fcd34d'; case 'orange': return '#f97316'; return '#fdba74'; case 'pink': return '#ec4899'; case 'fuchsia': return '#d946ef'; return '#f0abfc'; case 'purple': return '#a855f7'; return '#d8b4fe'; case 'indigo': return '#6366f1'; return '#a5b4fc'; case 'rose': return '#f43f5e'; return '#fda4af'; case 'red': return '#fca5a5'; case 'black': return '#000000'; return '#334155'; } }; Loading Loading @@ -77,7 +77,6 @@ export const convert500ThemeToColor = (theme: string | undefined) => { }; export const convert800ThemeToColor = (theme: string | undefined) => { if (!theme) return '#9294a1'; switch (theme) { case 'white': return '#ffffff'; Loading
src/common/helpers/icons.ts 0 → 100644 +8 −0 Original line number Diff line number Diff line import CrossCircleIcon from '@stories/icons/Mono/CrossCircleIcon.vue'; import CropIcon from '@stories/icons/Mono/CropIcon.vue'; import type { Component } from 'vue'; export const iconsSet: Record<string, Component> = { CrossCircleIcon: CrossCircleIcon, CropIcon: CropIcon, };
src/stories/components/Drawer/Drawer.vue +23 −27 Original line number Diff line number Diff line <script setup lang="ts"> import { convert500ThemeToColor, convert200ThemeToColor } from '@helpers/colors'; import { convert500ThemeToColor, convert300ThemeToColor } from '@helpers/colors'; import type { TThemeColor } from '@interfaces/common'; import { computed } from 'vue'; import { iconsSet } from '@helpers/icons'; const props = withDefaults( defineProps<{ width?: string | number; theme?: TThemeColor; closeIcon?: string; }>(), { visible: false, width: 400, theme: 'white', closeIcon: 'CrossCircleIcon', }, ); const emit = defineEmits(['onClose']); const visible = defineModel('visible'); const visible = defineModel<boolean>('visible'); const themeColor = computed(() => convert500ThemeToColor(props.theme)); const scrollColor = computed(() => convert200ThemeToColor(props.theme)); const scrollColor = computed(() => convert300ThemeToColor(props.theme)); const textColor = computed(() => { if (!props.theme || props.theme === 'white') return 'black'; return 'white'; Loading Loading @@ -60,28 +63,18 @@ const drawerWidth = computed(() => { } " > <svg width="40px" height="40px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" > <path fill-rule="evenodd" clip-rule="evenodd" d="M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12ZM8.96963 8.96965C9.26252 8.67676 9.73739 8.67676 10.0303 8.96965L12 10.9393L13.9696 8.96967C14.2625 8.67678 14.7374 8.67678 15.0303 8.96967C15.3232 9.26256 15.3232 9.73744 15.0303 10.0303L13.0606 12L15.0303 13.9696C15.3232 14.2625 15.3232 14.7374 15.0303 15.0303C14.7374 15.3232 14.2625 15.3232 13.9696 15.0303L12 13.0607L10.0303 15.0303C9.73742 15.3232 9.26254 15.3232 8.96965 15.0303C8.67676 14.7374 8.67676 14.2625 8.96965 13.9697L10.9393 12L8.96963 10.0303C8.67673 9.73742 8.67673 9.26254 8.96963 8.96965Z" :fill="textColor ?? '#1C274C'" /> </svg> <component :is="iconsSet[closeIcon]" :color="textColor" /> </button> </header> <div class="main"> <slot /> </div> <div v-if="$slots.footer"> <div class="divider"></div> <footer class="drawerFooter"> <slot name="footer" /> </footer> </div> </section> </article> </template> Loading Loading @@ -122,18 +115,24 @@ const drawerWidth = computed(() => { } .drawerHeader { font-weight: bold; font-size: 1.5rem; font-size: 2rem; padding-right: 50px; margin-bottom: 20px; margin-bottom: 10px; min-height: 1rem; overflow: auto; } .main { flex: 1 1 auto; overflow: auto; padding: 10px; } .drawerFooter { overflow: auto; padding: 10px 10px 0 10px; } .divider { height: 2px; background-color: v-bind(scrollColor); } .buttonClose { position: absolute; Loading @@ -142,11 +141,8 @@ const drawerWidth = computed(() => { width: 30px; } ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-track { background: v-bind(textColor); width: 8px; height: 8px; } ::-webkit-scrollbar-thumb { border-radius: 5px; Loading