Skip to content
Snippets Groups Projects
Commit 5d51ed45 authored by Дмитрий Малюгин's avatar Дмитрий Малюгин :clock4:
Browse files

feat: finished - MenuDial (but only 4 direction options: 'up', 'right', 'down' and 'left')

parent b6df84cb
No related branches found
No related tags found
1 merge request!1Project setup and add 9 initial components
...@@ -38,10 +38,7 @@ const meta: Meta = { ...@@ -38,10 +38,7 @@ const meta: Meta = {
], ],
}, },
}, },
args: { args: {},
// primary: false,
// Use `fn` to spy on the onClick arg, which will appear in the actions panel once invoked: https://storybook.js.org/docs/essentials/actions#action-args
},
} satisfies Meta<typeof MenuDial>; } satisfies Meta<typeof MenuDial>;
export default meta; export default meta;
...@@ -67,12 +64,15 @@ export const Full: Story = { ...@@ -67,12 +64,15 @@ export const Full: Story = {
args: { args: {
items: [ items: [
{ {
label: 'First', label: 'font-family link',
theme: 'green', theme: 'green',
link: 'https://developer.mozilla.org/en-US/docs/Web/CSS/font-family',
linkBlank: true,
}, },
{ {
label: 'Second', label: 'Second',
theme: 'green', theme: 'green',
textStyle: 'italic',
}, },
], ],
......
<script setup lang="ts"> <script setup lang="ts">
import { computed, watch } from 'vue'; import { computed } from 'vue';
import type { IMDProps } from '@interfaces/componentsProps'; import type { IMDProps } from '@interfaces/componentsProps';
import { convert500ThemeToColor } from '@helpers/colors'; import { convert500ThemeToColor } from '@helpers/colors';
import PlusIcon from '@stories/icons/Mono/PlusIcon.vue'; import PlusIcon from '@stories/icons/Mono/PlusIcon.vue';
...@@ -13,7 +13,6 @@ const active = defineModel('active'); ...@@ -13,7 +13,6 @@ const active = defineModel('active');
const themeColor = computed(() => convert500ThemeToColor(props.theme)); const themeColor = computed(() => convert500ThemeToColor(props.theme));
const textColor = computed(() => { const textColor = computed(() => {
if (!props.theme) return '#000000';
if (props.theme === 'white') return '#000000'; if (props.theme === 'white') return '#000000';
return '#ffffff'; return '#ffffff';
}); });
...@@ -21,8 +20,6 @@ const elementsSize = computed(() => { ...@@ -21,8 +20,6 @@ const elementsSize = computed(() => {
switch (props.size) { switch (props.size) {
case 'small': case 'small':
return 30; return 30;
case 'medium':
return 40;
case 'large': case 'large':
return 55; return 55;
case 'huge': case 'huge':
...@@ -32,29 +29,32 @@ const elementsSize = computed(() => { ...@@ -32,29 +29,32 @@ const elementsSize = computed(() => {
}); });
const menuListStyles = computed(() => { const menuListStyles = computed(() => {
switch (props.direction) { switch (props.direction) {
case 'right':
return `transform: translateY(-${elementsSize.value / 2}px) translateX(${active.value ? elementsSize.value + 10 : 0}px)`;
case 'left': case 'left':
return `flex-direction: row-reverse; transform: translateY(-${elementsSize.value / 2}px) ${active.value ? `translateX(calc(-100% - 10px))` : ''}`; return `flex-direction: row-reverse; transform: translateY(-${elementsSize.value / 2}px) ${active.value ? `translateX(calc(-100% - 10px))` : 'translateX(calc(-100% + 60px))'}`;
case 'top': case 'up':
return `transform: translateY(-${active.value ? (0.5 + props.items.length) * elementsSize.value + 10 : elementsSize.value / 2}px)`; 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 'bottom': case 'down':
return `transform: translateY(${active.value ? 20 : 0}px)`; return `flex-direction: column; transform: translateY(${active.value ? 25 : -20}px) translateX(calc(-50% + ${elementsSize.value / 2}px))`;
}
return `transform: translateY(-${elementsSize.value / 2}px) translateX(${active.value ? elementsSize.value + 10 : 0}px)`;
});
const onClick = () => {
active.value = false;
};
watch(active, () => {
if (active.value) {
setTimeout(() => {
document.addEventListener('click', onClick);
}, 0);
} else {
document.removeEventListener('click', onClick);
} }
return `transform: translateY(-${elementsSize.value / 2}px) translateX(${active.value ? elementsSize.value + 10 : -20}px)`;
}); });
// const circleStylesItems = computed(() => {
// if (props.direction !== 'circle') {
// return '';
// }
// const styles = [];
// let deg = 0;
// const itemsCount = props.items.length;
// const degToItem = Math.round(360 / itemsCount);
// for (let i = 0; i < itemsCount; i++) {
// styles.push(`transform: rotate(${deg}deg) rotate(${-deg}deg)`);
// deg += degToItem;
// }
// console.log(styles);
// return styles;
// });
const openLink = (url: string, isBlank: boolean | undefined) =>
window.open(url, isBlank ? '_blank' : '_self');
</script> </script>
<template> <template>
...@@ -81,9 +81,14 @@ watch(active, () => { ...@@ -81,9 +81,14 @@ watch(active, () => {
v-for="(item, index) of items" v-for="(item, index) of items"
:key="item.label" :key="item.label"
:style="`height: ${elementsSize}px; background-color: ${convert500ThemeToColor(item.theme ?? 'white')}; :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'}`" color: ${!item.theme || item.theme === 'white' ? 'black' : 'white'}; border-color: ${!item.theme || item.theme === 'white' ? 'black' : 'white'};`"
class="menuElement" class="menuElement"
@click.prevent="() => (item.onClick ? item.onClick() : false)" @click="
() => {
if (item.link) openLink(item.link, item.linkBlank);
if (item.onClick) item.onClick();
}
"
> >
<slot :name="`${index + 1}IconBefore`" /> <slot :name="`${index + 1}IconBefore`" />
<p <p
...@@ -133,9 +138,6 @@ watch(active, () => { ...@@ -133,9 +138,6 @@ watch(active, () => {
opacity: 0; opacity: 0;
transition: 0.2s ease-in-out; transition: 0.2s ease-in-out;
} }
.menuListColumn {
flex-direction: column;
}
.menuListOpened { .menuListOpened {
pointer-events: auto; pointer-events: auto;
opacity: 1; opacity: 1;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment