diff --git a/components.d.ts b/components.d.ts index 139e2cab76cf09152dddbc49590c12cde6022201..2fd7373521a26f042c3f51940074c04aa60ae595 100644 --- a/components.d.ts +++ b/components.d.ts @@ -10,17 +10,22 @@ declare module 'vue' { Avatar: typeof import('primevue/avatar')['default'] Button: typeof import('primevue/button')['default'] CreateEntityMenu: typeof import('./src/components/CreateEntityMenu.vue')['default'] + Dialog: typeof import('primevue/dialog')['default'] Divider: typeof import('primevue/divider')['default'] Drawer: typeof import('primevue/drawer')['default'] ImageItem: typeof import('@/modules/entities/ImageItem.vue')['default'] LogoAndLabel: typeof import('./src/components/LogoAndLabel.vue')['default'] - MoveMenu: typeof import('./src/components/editEntityMenu/image/MoveMenu.vue')['default'] + MoveImageMenu: typeof import('./src/components/editEntityMenu/image/MoveImageMenu.vue')['default'] + MoveMenu: typeof import('./src/components/editEntityMenu/text/MoveMenu.vue')['default'] + MoveTextMenu: typeof import('./src/components/editEntityMenu/text/MoveTextMenu.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] SpeedDial: typeof import('primevue/speeddial')['default'] Splitter: typeof import('primevue/splitter')['default'] SplitterPanel: typeof import('primevue/splitterpanel')['default'] - StateMenu: typeof import('./src/components/editEntityMenu/image/StateMenu.vue')['default'] + StateImageMenu: typeof import('./src/components/editEntityMenu/image/StateImageMenu.vue')['default'] + StateMenu: typeof import('./src/components/editEntityMenu/text/StateMenu.vue')['default'] + StateTextMenu: typeof import('./src/components/editEntityMenu/text/StateTextMenu.vue')['default'] TextItem: typeof import('@/modules/entities/TextItem.vue')['default'] Tree: typeof import('primevue/tree')['default'] UserInfoHeaderWithSettings: typeof import('./src/components/UserInfoHeaderWithSettings.vue')['default'] diff --git a/env.d.ts b/env.d.ts index 11f02fe2a0061d6e6e1f271b21da95423b448b32..910435b463b19b55228ca6e4d77b9d0213ee30f8 100644 --- a/env.d.ts +++ b/env.d.ts @@ -1 +1,2 @@ /// +// npx tailwindcss -i ./src/input.css -o ./src/output.css --watch diff --git a/package.json b/package.json index 15be68437e82dca77bc43ba3806ab559e7188210..2001c5d999707e6e25d9424e27aeca97b1d65271 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,9 @@ }, "dependencies": { "@primevue/themes": "^4.0.4", - "@vueuse/components": "^10.11.1", "@vueuse/core": "^10.11.0", "@vueuse/integrations": "^10.11.0", + "cropperjs": "^1.6.2", "pinia": "^2.1.7", "primeicons": "^7.0.0", "primevue": "^4.0.4", @@ -24,6 +24,7 @@ "universal-cookie": "^7", "uuid": "^10.0.0", "vue": "^3.4.29", + "vue-advanced-cropper": "^2.8.9", "vue-router": "^4.3.3" }, "devDependencies": { @@ -36,6 +37,7 @@ "@vue/eslint-config-prettier": "^9.0.0", "@vue/eslint-config-typescript": "^13.0.0", "@vue/tsconfig": "^0.5.1", + "cost-of-modules": "^1.0.1", "eslint": "^8.57.0", "eslint-plugin-vue": "^9.23.0", "npm-run-all2": "^6.2.0", diff --git a/src/app/App.vue b/src/app/App.vue index df298a2f11b3e8ede53c033d188615b659efdd2e..c863b2c212458cc0de23afef931de2ba3cd308a7 100644 --- a/src/app/App.vue +++ b/src/app/App.vue @@ -1,6 +1,6 @@ @@ -18,7 +18,7 @@ const visible = ref(false); diff --git a/src/app/interfaces/index.ts b/src/app/interfaces/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..424456135f391e911ae5f730ca6edcd14aad0bea --- /dev/null +++ b/src/app/interfaces/index.ts @@ -0,0 +1,5 @@ +export interface IImageMainInfo { + url: string; + width: number; + height: number; +} diff --git a/src/components/CreateEntityMenu.vue b/src/components/CreateEntityMenu.vue index eaf9bad5895bd5a18d354554d16e1a5067de4ed2..63759b78a265b3483b2f649f98765a5efd31f141 100644 --- a/src/components/CreateEntityMenu.vue +++ b/src/components/CreateEntityMenu.vue @@ -10,7 +10,8 @@ const { reset, onChange } = useFileDialog({ - accept: 'image/*' + accept: 'image/*', + reset: true }); const addImage = (files: FileList) => { diff --git a/src/components/editEntityMenu/image/MoveMenu.vue b/src/components/editEntityMenu/image/MoveImageMenu.vue similarity index 100% rename from src/components/editEntityMenu/image/MoveMenu.vue rename to src/components/editEntityMenu/image/MoveImageMenu.vue diff --git a/src/components/editEntityMenu/image/StateMenu.vue b/src/components/editEntityMenu/image/StateImageMenu.vue similarity index 100% rename from src/components/editEntityMenu/image/StateMenu.vue rename to src/components/editEntityMenu/image/StateImageMenu.vue diff --git a/src/components/editEntityMenu/text/MoveMenu.vue b/src/components/editEntityMenu/text/MoveTextMenu.vue similarity index 100% rename from src/components/editEntityMenu/text/MoveMenu.vue rename to src/components/editEntityMenu/text/MoveTextMenu.vue diff --git a/src/components/editEntityMenu/text/StateMenu.vue b/src/components/editEntityMenu/text/StateTextMenu.vue similarity index 100% rename from src/components/editEntityMenu/text/StateMenu.vue rename to src/components/editEntityMenu/text/StateTextMenu.vue diff --git a/src/modules/BaseModal.vue b/src/modules/BaseModal.vue new file mode 100644 index 0000000000000000000000000000000000000000..c3038b752ff0ca6895532468ab3d9e5c6492c2e9 --- /dev/null +++ b/src/modules/BaseModal.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/src/modules/BaseMenu.vue b/src/modules/BaseSidebarMenu.vue similarity index 100% rename from src/modules/BaseMenu.vue rename to src/modules/BaseSidebarMenu.vue diff --git a/src/modules/entities/ImageItem.vue b/src/modules/entities/ImageItem.vue index dd8a0ec1089dda02c7490c71803606a9209c2e54..12d4ce16c1dc29e8673fd169d6caecd1b03c7796 100644 --- a/src/modules/entities/ImageItem.vue +++ b/src/modules/entities/ImageItem.vue @@ -3,8 +3,8 @@ import type { IImage } from '@/app/interfaces/entities'; import { deleteEntity, editEntity } from '@/app/helpers'; import { useDataStore } from '@/app/stores/data'; import { useElementSize } from '@vueuse/core'; -import MoveMenu from '@/components/editEntityMenu/image/MoveMenu.vue'; -import StateMenu from '@/components/editEntityMenu/image/StateMenu.vue'; +import MoveImageMenu from '@/components/editEntityMenu/image/MoveImageMenu.vue'; +import StateImageMenu from '@/components/editEntityMenu/image/StateImageMenu.vue'; interface Props { entityData: IImage; @@ -72,7 +72,7 @@ const homeEntities = computed(() => dataStore.homeEntities); diff --git a/src/output.css b/src/output.css index cc2f81a73be841ff8d65249f2cbdd444510c1760..b54d04658fe476f2c828c7d53cbf6d58c0b2e54c 100644 --- a/src/output.css +++ b/src/output.css @@ -644,6 +644,10 @@ video { top: 0.5rem; } +.z-50 { + z-index: 50; +} + .-m-2 { margin: -0.5rem; } @@ -653,6 +657,11 @@ video { margin-bottom: -0.5rem; } +.mx-auto { + margin-left: auto; + margin-right: auto; +} + .-mb-2 { margin-bottom: -0.5rem; } @@ -689,6 +698,10 @@ video { margin-right: 0.5rem; } +.mr-4 { + margin-right: 1rem; +} + .mt-2 { margin-top: 0.5rem; } @@ -727,6 +740,11 @@ video { height: 3rem; } +.size-6 { + width: 1.5rem; + height: 1.5rem; +} + .h-\[1px\] { height: 1px; } @@ -767,12 +785,23 @@ video { min-width: 100px; } -.max-w-\[400px\] { - max-width: 400px; +.-translate-x-1\/2 { + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-y-1\/2 { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-y-full { + --tw-translate-y: -100%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } -.max-w-\[800px\] { - max-width: 800px; +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .cursor-pointer { @@ -841,14 +870,27 @@ video { border-radius: 0.375rem; } +.rounded-t-lg { + border-top-left-radius: 0.5rem; + border-top-right-radius: 0.5rem; +} + .border { border-width: 1px; } +.border-0 { + border-width: 0px; +} + .border-2 { border-width: 2px; } +.border-t-2 { + border-top-width: 2px; +} + .border-solid { border-style: solid; } @@ -858,11 +900,21 @@ video { border-color: rgb(0 0 0 / var(--tw-border-opacity)); } +.border-t-black { + --tw-border-opacity: 1; + border-top-color: rgb(0 0 0 / var(--tw-border-opacity)); +} + .bg-black { --tw-bg-opacity: 1; background-color: rgb(0 0 0 / var(--tw-bg-opacity)); } +.bg-blue-400 { + --tw-bg-opacity: 1; + background-color: rgb(96 165 250 / var(--tw-bg-opacity)); +} + .bg-blue-500 { --tw-bg-opacity: 1; background-color: rgb(59 130 246 / var(--tw-bg-opacity)); @@ -888,8 +940,9 @@ video { background-color: rgb(255 255 255 / var(--tw-bg-opacity)); } -.bg-opacity-70 { - --tw-bg-opacity: 0.7; +.bg-red-200 { + --tw-bg-opacity: 1; + background-color: rgb(254 202 202 / var(--tw-bg-opacity)); } .bg-opacity-80 { @@ -918,6 +971,11 @@ video { padding-right: 4rem; } +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; @@ -967,6 +1025,11 @@ video { line-height: 2.5rem; } +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + .text-xl { font-size: 1.25rem; line-height: 1.75rem; diff --git a/src/pages/HomePage.vue b/src/pages/HomePage.vue index b1fdd51091086c9204c59eb013c2980038af451c..85ca5bb740295fc83e147b4f031e89374f525d62 100644 --- a/src/pages/HomePage.vue +++ b/src/pages/HomePage.vue @@ -2,12 +2,15 @@ import { useElementSize } from '@vueuse/core'; import EntityItem from '@/modules/EntityItem.vue'; import CreateEntityMenu from '@/components/CreateEntityMenu.vue'; -import { setDefaultHomeBackground, uploadFile } from '@/app/helpers'; +// import { setDefaultHomeBackground, uploadFile } from '@/app/helpers'; +import { setDefaultHomeBackground } from '@/app/helpers'; import { useInterfaceStore } from '@/app/stores/interface'; import type { IEntity } from '@/app/interfaces/environment'; import { useDataStore } from '@/app/stores/data'; import { useAuthorizationStore } from '@/app/stores/authorization'; import { useWebsocketStore } from '@/app/stores/websocket'; +import BaseModal from '@/modules/BaseModal.vue'; +import type { IImageMainInfo } from '@/app/interfaces'; const backgroundImage = ref(); const { height: backgroundImageHeight } = useElementSize(backgroundImage); @@ -34,12 +37,49 @@ const addEntity = (newEntity: IEntity) => { console.log('data.body?.image_data: ', data.body?.image_data); websocketStore.sendData(data); }; + +const imageInfo = ref({ + url: backgroundUrl.value, + width: 0, + height: 0 +}); +const isModalUploadFile = ref(false); +function openUploadFileModal() { + console.log('openModal'); + isModalUploadFile.value = true; +} +function uploadFile($event: Event) { + const target = $event.target as HTMLInputElement; + console.log('target.files', target.files); + if (target && target.files && target.files[0]) { + let image = new Image(); + const file = target.files[0]; + console.log('file: ', file); + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.addEventListener('load', () => { + image.src = reader.result; + image.onload = function () { + console.log('image width and height: ', image.width, image.height); + imageInfo.value.url = String(reader.result); + imageInfo.value.width = image.width; + imageInfo.value.height = image.height; + console.log('imageInfo.value', imageInfo.value); + openUploadFileModal(); + const interfaceStore = useInterfaceStore(); + // interfaceStore.changeHomeBackgroundUrl(url); + // localStorage.setItem('homeBackgroundUrl', url); + }; + }); + } +}