Merge pull request 'bx-1379-redesign' (#15) from bx-1379-redesign into dev
Reviewed-on: #15
|
@ -1,5 +1,7 @@
|
|||
.venv/
|
||||
files/*
|
||||
postgres_data/*
|
||||
export_images/*
|
||||
.vscode/
|
||||
__pycache__/
|
||||
poetry.lock
|
||||
|
|
|
@ -79,11 +79,12 @@ INSTALLED_APPS = [
|
|||
"django.contrib.staticfiles",
|
||||
"corsheaders",
|
||||
"django_filters",
|
||||
'django_extensions',
|
||||
"django_extensions",
|
||||
"rest_framework",
|
||||
"crispy_forms",
|
||||
"crispy_bootstrap4",
|
||||
"colorfield",
|
||||
"import_export",
|
||||
"frontImages",
|
||||
"object",
|
||||
]
|
||||
|
@ -125,14 +126,12 @@ WSGI_APPLICATION = "back.wsgi.application"
|
|||
|
||||
DATABASES = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.postgresql_psycopg2", # change engine to this
|
||||
"NAME": "interactive_table", # db name you created above
|
||||
"HOST": os.getenv("DB_HOST"), # usually localhost
|
||||
"USER": os.getenv("DB_USER"), # db user you created above or postgres default
|
||||
"PASSWORD": os.getenv(
|
||||
"DB_PASSWORD"
|
||||
), # db password you created above or postgres
|
||||
"PORT": os.getenv("DB_PORT"), # usually 5432
|
||||
"ENGINE": "django.db.backends.postgresql_psycopg2",
|
||||
"NAME": os.getenv("POSTGRES_NAME"),
|
||||
"HOST": os.getenv("POSTGRES_HOST"),
|
||||
"USER": os.getenv("POSTGRES_USER"),
|
||||
"PASSWORD": os.getenv("POSTGRES_PASSWORD"),
|
||||
"PORT": os.getenv("POSTGRES_PORT"),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -178,12 +177,14 @@ STATIC_URL = "static/"
|
|||
|
||||
|
||||
REST_FRAMEWORK = {
|
||||
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
|
||||
"DEFAULT_FILTER_BACKENDS": ["django_filters.rest_framework.DjangoFilterBackend"]
|
||||
}
|
||||
|
||||
CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap4"
|
||||
CRISPY_TEMPLATE_PACK = "bootstrap4"
|
||||
|
||||
IMPORT_EXPORT_USE_TRANSACTIONS = True
|
||||
|
||||
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
|
||||
LOGGING = {
|
||||
"version": 1,
|
||||
|
|
|
@ -1,9 +1,13 @@
|
|||
from django.contrib import admin
|
||||
from import_export.admin import ImportExportModelAdmin
|
||||
from .models import Image, Item
|
||||
|
||||
class ItemAdmin(admin.ModelAdmin):
|
||||
class ItemAdmin(ImportExportModelAdmin, admin.ModelAdmin):
|
||||
filter_horizontal = ("images",)
|
||||
|
||||
class ImportExportBtnAdmin(ImportExportModelAdmin, admin.ModelAdmin):
|
||||
pass
|
||||
|
||||
admin.site.register(Image)
|
||||
|
||||
admin.site.register(Image, ImportExportModelAdmin)
|
||||
admin.site.register(Item, ItemAdmin)
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
from django.contrib import admin
|
||||
from import_export.admin import ImportExportModelAdmin
|
||||
from .models import ClickableArea, Element3D, Environment, Scene3D
|
||||
|
||||
|
||||
class Scene3DAdmin(admin.ModelAdmin):
|
||||
class Scene3DAdmin(ImportExportModelAdmin, admin.ModelAdmin):
|
||||
filter_horizontal = ("elements",)
|
||||
|
||||
class ImportExportBtnAdmin(ImportExportModelAdmin, admin.ModelAdmin):
|
||||
pass
|
||||
|
||||
admin.site.register(Environment)
|
||||
admin.site.register(Environment, ImportExportBtnAdmin)
|
||||
admin.site.register(Scene3D, Scene3DAdmin)
|
||||
admin.site.register(Element3D)
|
||||
admin.site.register(ClickableArea)
|
||||
admin.site.register(Element3D, ImportExportBtnAdmin)
|
||||
admin.site.register(ClickableArea, ImportExportBtnAdmin)
|
||||
|
|
|
@ -16,13 +16,8 @@ def group_based_upload_to(instance, filename):
|
|||
|
||||
|
||||
class Environment(models.Model):
|
||||
env_displacementmap = models.FileField(
|
||||
upload_to=group_based_upload_to, blank=True, null=True
|
||||
)
|
||||
env_normalmap = models.FileField(
|
||||
upload_to=group_based_upload_to, blank=True, null=True
|
||||
)
|
||||
clear_color = ColorField(blank=True, null=True)
|
||||
clear_color_to = ColorField(blank=True, null=True)
|
||||
hdr_gainmap = models.FileField(
|
||||
upload_to=group_based_upload_to, blank=True, null=True
|
||||
)
|
||||
|
@ -47,6 +42,7 @@ class Element3D(models.Model):
|
|||
|
||||
class Scene3D(models.Model):
|
||||
name = models.CharField(max_length=120)
|
||||
description = models.TextField(blank=True, null=True)
|
||||
elements = models.ManyToManyField(Element3D)
|
||||
env = models.ForeignKey(Environment, models.RESTRICT, blank=True, null=True)
|
||||
|
||||
|
@ -73,33 +69,33 @@ def maximum_size_validator(image):
|
|||
|
||||
|
||||
class ClickableArea(models.Model):
|
||||
name = models.CharField("название", max_length=255)
|
||||
description = models.TextField("описание")
|
||||
object_name = models.CharField("название объекта", max_length=255)
|
||||
target_name = models.CharField(
|
||||
max_length=200,
|
||||
blank=True,
|
||||
null=True,
|
||||
name = models.CharField(
|
||||
"Название",
|
||||
max_length=255,
|
||||
help_text="Название кликабельной области",
|
||||
)
|
||||
description = models.TextField(
|
||||
"Описание",
|
||||
help_text="Описание кликабельной области",
|
||||
)
|
||||
|
||||
target = models.ForeignKey(
|
||||
Scene3D,
|
||||
on_delete=models.PROTECT,
|
||||
related_name="clickable_areas",
|
||||
blank=True,
|
||||
null=True,
|
||||
help_text="На какую сцену ведет клик",
|
||||
)
|
||||
source = models.ForeignKey(
|
||||
Element3D,
|
||||
on_delete=models.PROTECT,
|
||||
help_text="В каком элементе искать object_name",
|
||||
)
|
||||
image = models.ImageField(
|
||||
"Картинка",
|
||||
upload_to=group_based_upload_to,
|
||||
validators=[
|
||||
maximum_size_validator,
|
||||
],
|
||||
blank=True,
|
||||
null=True,
|
||||
object_name = models.CharField(
|
||||
"Название объекта",
|
||||
max_length=255,
|
||||
help_text="Имя mesh или group в элементе 3D",
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
|
|
|
@ -6,8 +6,6 @@ class EnvironmentSerializer(serializers.ModelSerializer):
|
|||
hdr_gainmap = serializers.FileField(use_url=False)
|
||||
hdr_json = serializers.FileField(use_url=False)
|
||||
hdr_webp = serializers.FileField(use_url=False)
|
||||
env_displacementmap = serializers.FileField(use_url=False)
|
||||
env_normalmap = serializers.FileField(use_url=False)
|
||||
|
||||
class Meta:
|
||||
model = Environment
|
||||
|
@ -33,8 +31,6 @@ class Scene3DSerializer(serializers.ModelSerializer):
|
|||
|
||||
|
||||
class ClickableAreaSerializer(serializers.ModelSerializer):
|
||||
image = serializers.ImageField(use_url=False)
|
||||
|
||||
class Meta:
|
||||
model = ClickableArea
|
||||
fields = "__all__"
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
asgiref==3.8.1 ; python_version >= "3.10" and python_version < "4.0"
|
||||
colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0"
|
||||
crispy-bootstrap4==2024.1 ; python_version >= "3.10" and python_version < "4.0"
|
||||
diff-match-patch==20230430 ; python_version >= "3.10" and python_version < "4.0"
|
||||
django-colorfield==0.11.0 ; python_version >= "3.10" and python_version < "4.0"
|
||||
django-cors-headers==4.3.1 ; python_version >= "3.10" and python_version < "4.0"
|
||||
django-crispy-forms==2.2 ; python_version >= "3.10" and python_version < "4.0"
|
||||
django-extensions==3.2.3 ; python_version >= "3.10" and python_version < "4.0"
|
||||
django-filter==24.2 ; python_version >= "3.10" and python_version < "4.0"
|
||||
django-import-export==4.1.1 ; python_version >= "3.10" and python_version < "4.0"
|
||||
django==5.0.6 ; python_version >= "3.10" and python_version < "4.0"
|
||||
djangorestframework==3.15.1 ; python_version >= "3.10" and python_version < "4.0"
|
||||
mslex==1.2.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32"
|
||||
|
@ -14,6 +16,7 @@ psutil==5.9.8 ; python_version >= "3.10" and python_version < "4.0"
|
|||
psycopg2==2.9.9 ; python_version >= "3.10" and python_version < "4.0"
|
||||
python-dotenv==1.0.1 ; python_version >= "3.10" and python_version < "4.0"
|
||||
sqlparse==0.5.0 ; python_version >= "3.10" and python_version < "4.0"
|
||||
tablib==3.5.0 ; python_version >= "3.10" and python_version < "4.0"
|
||||
taskipy==1.12.2 ; python_version >= "3.10" and python_version < "4.0"
|
||||
tomli==2.0.1 ; python_version >= "3.10" and python_version < "4.0"
|
||||
typing-extensions==4.11.0 ; python_version >= "3.10" and python_version < "3.11"
|
||||
|
|
|
@ -1,10 +1,32 @@
|
|||
services:
|
||||
db:
|
||||
image: postgres:16
|
||||
restart: always
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
PGDATA: /var/lib/postgresql/data/pgdata
|
||||
POSTGRES_DB: inttable
|
||||
ports:
|
||||
- 5433:5432
|
||||
volumes:
|
||||
- ./postgres_data:/var/lib/postgresql/data
|
||||
networks:
|
||||
- dev
|
||||
healthcheck:
|
||||
test: pg_isready -d $$POSTGRES_DB -U $$POSTGRES_USER
|
||||
start_period: 5s
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
|
||||
back:
|
||||
build:
|
||||
context: ./back
|
||||
dockerfile: Dockerfile
|
||||
container_name: inttable-back
|
||||
restart: always
|
||||
env_file:
|
||||
- ./.env
|
||||
expose:
|
||||
- "8000"
|
||||
healthcheck:
|
||||
|
@ -12,19 +34,16 @@ services:
|
|||
interval: 5s
|
||||
timeout: 3s
|
||||
retries: 10
|
||||
privileged: true
|
||||
volumes:
|
||||
- ./.env:/app/.env
|
||||
- ./files:/app/files
|
||||
networks:
|
||||
# - network
|
||||
- dev
|
||||
|
||||
front:
|
||||
build:
|
||||
context: ./front
|
||||
dockerfile: Dockerfile
|
||||
container_name: inttable-front
|
||||
restart: always
|
||||
expose:
|
||||
- "4173"
|
||||
|
@ -32,15 +51,13 @@ services:
|
|||
back:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
# - network
|
||||
- dev
|
||||
|
||||
nginx:
|
||||
image: nginx:1.25
|
||||
container_name: inttable-nginx
|
||||
restart: always
|
||||
ports:
|
||||
- "8098:80"
|
||||
- "${WEB_PORT:-80}:80"
|
||||
depends_on:
|
||||
back:
|
||||
condition: service_healthy
|
||||
|
@ -51,7 +68,6 @@ services:
|
|||
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
|
||||
- ./nginx/conf.d:/etc/nginx/conf.d
|
||||
networks:
|
||||
# - network
|
||||
- dev
|
||||
|
||||
networks:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
VITE_SERVER_URL='https://demo.kustarshina.ru'
|
||||
VITE_IMAGE_URL='https://demo.kustarshina.ru'
|
||||
VITE_SERVER_URL='https://demo.kustarshina.ru'
|
||||
VITE_SERVER_URL='http://localhost:8000'
|
||||
# VITE_SERVER_URL='http://localhost:8000'
|
|
@ -10,24 +10,41 @@ declare module 'vue' {
|
|||
Composer: typeof import('./src/components/Promo/composer.vue')['default']
|
||||
Env: typeof import('./src/components/Promo/env.vue')['default']
|
||||
Floorplan: typeof import('./src/components/Floorplan/index.vue')['default']
|
||||
Gallery: typeof import('./src/components/Promo/gallery.vue')['default']
|
||||
Gallery: typeof import('./src/components/Gallery/index.vue')['default']
|
||||
Game: typeof import('./src/components/Game.vue')['default']
|
||||
Home: typeof import('./src/components/Home.vue')['default']
|
||||
IIconMdiHomeOutline: typeof import('~icons/ic/on-mdi-home-outline')['default']
|
||||
IIconParkSolidLeftC: typeof import('~icons/icon-park-solid/left-c')['default']
|
||||
'IMdi:arrowLeft': typeof import('~icons/mdi/arrow-left')['default']
|
||||
'IMdi:arrowRight': typeof import('~icons/mdi/arrow-right')['default']
|
||||
'IMdi:vectorArrangeBelow': typeof import('~icons/mdi/vector-arrange-below')['default']
|
||||
'IMdi:video3d': typeof import('~icons/mdi/video3d')['default']
|
||||
IMdiArrowRight: typeof import('~icons/mdi/arrow-right')['default']
|
||||
IMdiChevronLeft: typeof import('~icons/mdi/chevron-left')['default']
|
||||
IMdiClose: typeof import('~icons/mdi/close')['default']
|
||||
IMdiFile: typeof import('~icons/mdi/file')['default']
|
||||
IMdiHexagonOutline: typeof import('~icons/mdi/hexagon-outline')['default']
|
||||
IMdiHome: typeof import('~icons/mdi/home')['default']
|
||||
IMdiHomeOutline: typeof import('~icons/mdi/home-outline')['default']
|
||||
IMdiMinusCircle: typeof import('~icons/mdi/minus-circle')['default']
|
||||
IMdiMonitorScreenshot: typeof import('~icons/mdi/monitor-screenshot')['default']
|
||||
IMdiPagePreviousOutline: typeof import('~icons/mdi/page-previous-outline')['default']
|
||||
IMdiPlusCircle: typeof import('~icons/mdi/plus-circle')['default']
|
||||
IMdiShop: typeof import('~icons/mdi/shop')['default']
|
||||
IMdiVideo3d: typeof import('~icons/mdi/video3d')['default']
|
||||
Item: typeof import('./src/components/Promo/item.vue')['default']
|
||||
Item: typeof import('./src/components/Gallery/item.vue')['default']
|
||||
IUilAngleLeft: typeof import('~icons/uil/angle-left')['default']
|
||||
IUilAngleLeftB: typeof import('~icons/uil/angle-left-b')['default']
|
||||
IUilAngleRightB: typeof import('~icons/uil/angle-right-b')['default']
|
||||
IUilCompressArrows: typeof import('~icons/uil/compress-arrows')['default']
|
||||
IUilTimes: typeof import('~icons/uil/times')['default']
|
||||
Load: typeof import('./src/components/load.vue')['default']
|
||||
Load_models: typeof import('./src/components/Promo/load_models.vue')['default']
|
||||
Main: typeof import('./src/components/Promo/main.vue')['default']
|
||||
Main: typeof import('./src/components/Main/index.vue')['default']
|
||||
Main_load_models: typeof import('./src/components/Main/main_load_models.vue')['default']
|
||||
ModelItem: typeof import('./src/components/Promo/modelItem.vue')['default']
|
||||
Models: typeof import('./src/components/Promo/models.vue')['default']
|
||||
Nav: typeof import('./src/components/nav.vue')['default']
|
||||
Post_pocessing: typeof import('./src/components/Promo/post_pocessing.vue')['default']
|
||||
Post_processing: typeof import('./src/components/Promo/post_processing.vue')['default']
|
||||
Projects: typeof import('./src/components/Projects.vue')['default']
|
||||
|
@ -35,6 +52,6 @@ declare module 'vue' {
|
|||
RandomIcon: typeof import('./src/components/RandomIcon.vue')['default']
|
||||
RouterLink: typeof import('vue-router')['RouterLink']
|
||||
RouterView: typeof import('vue-router')['RouterView']
|
||||
Sidebar: typeof import('./src/components/Promo/sidebar.vue')['default']
|
||||
Sidebar: typeof import('./src/components/sidebar.vue')['default']
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
|
||||
<title>Проекты Кустарщины</title>
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
@ -9,21 +9,25 @@
|
|||
"version": "0.0.0",
|
||||
"dependencies": {
|
||||
"@fireworks-js/vue": "^2.10.7",
|
||||
"@iconify-json/icon-park": "^1.1.14",
|
||||
"@iconify-json/icon-park-solid": "^1.1.15",
|
||||
"@iconify-json/uil": "^1.2.0",
|
||||
"@iconify/vue": "^4.1.2",
|
||||
"@monogrid/gainmap-js": "^3.0.5",
|
||||
"@tresjs/cientos": "^3.9.0",
|
||||
"@tresjs/core": "^4.0.2",
|
||||
"@tresjs/core": "^4.2.9",
|
||||
"@tresjs/leches": "^0.14.0",
|
||||
"@tresjs/post-processing": "^0.7.1",
|
||||
"@vueuse/components": "^10.9.0",
|
||||
"@vueuse/core": "^10.9.0",
|
||||
"d3": "^7.9.0",
|
||||
"maath": "^0.10.8",
|
||||
"pathfinding": "^0.4.18",
|
||||
"pinia": "^2.1.7",
|
||||
"reset-css": "^5.0.2",
|
||||
"three": "^0.164.1",
|
||||
"vite-svg-loader": "^5.1.0",
|
||||
"vue": "^3.4.21",
|
||||
"vue-3d-model": "^2.0.0-alpha.4",
|
||||
"vue-router": "^4.3.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
@ -435,6 +439,24 @@
|
|||
"vue": ">=3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify-json/icon-park": {
|
||||
"version": "1.1.14",
|
||||
"resolved": "https://registry.npmjs.org/@iconify-json/icon-park/-/icon-park-1.1.14.tgz",
|
||||
"integrity": "sha512-D/Tyww0fPhEwLqeQuzKMxE4HKjWsCG8TPRZsUIgjGh1qBOI3Ad9G5y0mQi4mLBtHrdCPdfbCz2oZJHxPoLyScA==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@iconify/types": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify-json/icon-park-solid": {
|
||||
"version": "1.1.15",
|
||||
"resolved": "https://registry.npmjs.org/@iconify-json/icon-park-solid/-/icon-park-solid-1.1.15.tgz",
|
||||
"integrity": "sha512-fFuDj5H8+x/V2hzknhpBifFBIOVP/sm2ElGQ0M1W4d0EQ5f7Pss1v7tfmDSQR2F6eISKDjuA2yyT7fF/C366Hw==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@iconify/types": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify-json/mdi": {
|
||||
"version": "1.1.66",
|
||||
"resolved": "https://registry.npmjs.org/@iconify-json/mdi/-/mdi-1.1.66.tgz",
|
||||
|
@ -444,11 +466,19 @@
|
|||
"@iconify/types": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify-json/uil": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@iconify-json/uil/-/uil-1.2.0.tgz",
|
||||
"integrity": "sha512-DFhJYbp/H2BGQ2oBS0DmqhvgkdUXpBTgCErhqwLEeRhkt8+MuTKlivpQf/gPgD5/6wHH37gPX4BhlqU4eH372w==",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@iconify/types": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify/types": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
|
||||
"integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="
|
||||
},
|
||||
"node_modules/@iconify/utils": {
|
||||
"version": "2.1.23",
|
||||
|
@ -478,6 +508,21 @@
|
|||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/@iconify/vue": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.1.2.tgz",
|
||||
"integrity": "sha512-CQnYqLiQD5LOAaXhBrmj1mdL2/NCJvwcC4jtW2Z8ukhThiFkLDkutarTOV2trfc9EXqUqRs0KqXOL9pZ/IyysA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@iconify/types": "^2.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/cyberalien"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vue": ">=3"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/sourcemap-codec": {
|
||||
"version": "1.4.15",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
|
||||
|
@ -793,13 +838,14 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@tresjs/core": {
|
||||
"version": "4.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@tresjs/core/-/core-4.0.2.tgz",
|
||||
"integrity": "sha512-+Shy5ch4m9gQSHRlArZAn4nv2apaFJJv21bAvpOKRXTCtGu0BakKGUpWcTzzmDsTs9t6yndbjCWzyifggjFpQQ==",
|
||||
"version": "4.2.9",
|
||||
"resolved": "https://registry.npmjs.org/@tresjs/core/-/core-4.2.9.tgz",
|
||||
"integrity": "sha512-e5RIRSlIOtrIHBZr4t/5bQ0v+egzDkojENaLOPELJ2TxwJAs33QJUfPTkPPVXc0gSDHzH47qFHqUCGIQ/LYG3w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@alvarosabu/utils": "^3.2.0",
|
||||
"@vue/devtools-api": "^6.6.2",
|
||||
"@vueuse/core": "^10.10.0"
|
||||
"@vue/devtools-api": "^6.6.3",
|
||||
"@vueuse/core": "^10.11.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"three": ">=0.133",
|
||||
|
@ -807,24 +853,26 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@tresjs/core/node_modules/@vueuse/core": {
|
||||
"version": "10.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.10.0.tgz",
|
||||
"integrity": "sha512-vexJ/YXYs2S42B783rI95lMt3GzEwkxzC8Hb0Ndpd8rD+p+Lk/Za4bd797Ym7yq4jXqdSyj3JLChunF/vyYjUw==",
|
||||
"version": "10.11.1",
|
||||
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz",
|
||||
"integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/web-bluetooth": "^0.0.20",
|
||||
"@vueuse/metadata": "10.10.0",
|
||||
"@vueuse/shared": "10.10.0",
|
||||
"vue-demi": ">=0.14.7"
|
||||
"@vueuse/metadata": "10.11.1",
|
||||
"@vueuse/shared": "10.11.1",
|
||||
"vue-demi": ">=0.14.8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/@tresjs/core/node_modules/@vueuse/core/node_modules/vue-demi": {
|
||||
"version": "0.14.8",
|
||||
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz",
|
||||
"integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==",
|
||||
"version": "0.14.10",
|
||||
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
|
||||
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||
|
@ -846,29 +894,32 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@tresjs/core/node_modules/@vueuse/metadata": {
|
||||
"version": "10.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.10.0.tgz",
|
||||
"integrity": "sha512-UNAo2sTCAW5ge6OErPEHb5z7NEAg3XcO9Cj7OK45aZXfLLH1QkexDcZD77HBi5zvEiLOm1An+p/4b5K3Worpug==",
|
||||
"version": "10.11.1",
|
||||
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz",
|
||||
"integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/@tresjs/core/node_modules/@vueuse/shared": {
|
||||
"version": "10.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.10.0.tgz",
|
||||
"integrity": "sha512-2aW33Ac0Uk0U+9yo3Ypg9s5KcR42cuehRWl7vnUHadQyFvCktseyxxEPBi1Eiq4D2yBGACOnqLZpx1eMc7g5Og==",
|
||||
"version": "10.11.1",
|
||||
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz",
|
||||
"integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"vue-demi": ">=0.14.7"
|
||||
"vue-demi": ">=0.14.8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/@tresjs/core/node_modules/@vueuse/shared/node_modules/vue-demi": {
|
||||
"version": "0.14.8",
|
||||
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz",
|
||||
"integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==",
|
||||
"version": "0.14.10",
|
||||
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
|
||||
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||
|
@ -1242,7 +1293,6 @@
|
|||
"version": "0.164.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/three/-/three-0.164.1.tgz",
|
||||
"integrity": "sha512-dR/trWDhyaNqJV38rl1TonlCA9DpnX7OPYDWD81bmBGn/+uEc3+zNalFxQcV4FlPTeDBhCY3SFWKvK6EJwL88g==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@tweenjs/tween.js": "~23.1.1",
|
||||
"@types/stats.js": "*",
|
||||
|
@ -1283,31 +1333,32 @@
|
|||
}
|
||||
},
|
||||
"node_modules/@volar/language-core": {
|
||||
"version": "2.2.0-alpha.10",
|
||||
"resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.0-alpha.10.tgz",
|
||||
"integrity": "sha512-njVJLtpu0zMvDaEk7K5q4BRpOgbyEUljU++un9TfJoJNhxG0z/hWwpwgTRImO42EKvwIxF3XUzeMk+qatAFy7Q==",
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.1.tgz",
|
||||
"integrity": "sha512-9AKhC7Qn2mQYxj7Dz3bVxeOk7gGJladhWixUYKef/o0o7Bm4an+A3XvmcTHVqZ8stE6lBVH++g050tBtJ4TZPQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@volar/source-map": "2.2.0-alpha.10"
|
||||
"@volar/source-map": "2.4.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@volar/source-map": {
|
||||
"version": "2.2.0-alpha.10",
|
||||
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.0-alpha.10.tgz",
|
||||
"integrity": "sha512-nrdWApVkP5cksAnDEyy1JD9rKdwOJsEq1B+seWO4vNXmZNcxQQCx4DULLBvKt7AzRUAQiAuw5aQkb9RBaSqdVA==",
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.1.tgz",
|
||||
"integrity": "sha512-Xq6ep3OZg9xUqN90jEgB9ztX5SsTz1yiV8wiQbcYNjWkek+Ie3dc8l7AVt3EhDm9mSIR58oWczHkzM2H6HIsmQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"muggle-string": "^0.4.0"
|
||||
}
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@volar/typescript": {
|
||||
"version": "2.2.0-alpha.10",
|
||||
"resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.2.0-alpha.10.tgz",
|
||||
"integrity": "sha512-GCa0vTVVdA9ULUsu2Rx7jwsIuyZQPvPVT9o3NrANTbYv+523Ao1gv3glC5vzNSDPM6bUl37r94HbCj7KINQr+g==",
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.1.tgz",
|
||||
"integrity": "sha512-UoRzC0PXcwajFQTu8XxKSYNsWNBtVja6Y9gC8eLv7kYm+UEKJCcZ8g7dialsOYA0HKs3Vpg57MeCsawFLC6m9Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@volar/language-core": "2.2.0-alpha.10",
|
||||
"path-browserify": "^1.0.1"
|
||||
"@volar/language-core": "2.4.1",
|
||||
"path-browserify": "^1.0.1",
|
||||
"vscode-uri": "^3.0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-core": {
|
||||
|
@ -1356,24 +1407,38 @@
|
|||
"@vue/shared": "3.4.25"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-vue2": {
|
||||
"version": "2.7.16",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz",
|
||||
"integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"de-indent": "^1.0.2",
|
||||
"he": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/devtools-api": {
|
||||
"version": "6.6.2",
|
||||
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.2.tgz",
|
||||
"integrity": "sha512-134clD8u7cBBXdmBbXI282gHGF7T/eAbD/G7mAK2llQF62IbI4ny28IVamZVMoJSvfImC2Xxnj732hXkJvUj6g=="
|
||||
"version": "6.6.3",
|
||||
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz",
|
||||
"integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@vue/language-core": {
|
||||
"version": "2.0.14",
|
||||
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.14.tgz",
|
||||
"integrity": "sha512-3q8mHSNcGTR7sfp2X6jZdcb4yt8AjBXAfKk0qkZIh7GAJxOnoZ10h5HToZglw4ToFvAnq+xu/Z2FFbglh9Icag==",
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.2.tgz",
|
||||
"integrity": "sha512-tt2J7C+l0J/T5PaLhJ0jvCCi0JNwu3e8azWTYxW3jmAW5B/dac0g5UxmI7l59CQgCGFotqUqI3tXjfZgoWNtog==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@volar/language-core": "2.2.0-alpha.10",
|
||||
"@volar/language-core": "~2.4.1",
|
||||
"@vue/compiler-dom": "^3.4.0",
|
||||
"@vue/compiler-vue2": "^2.7.16",
|
||||
"@vue/shared": "^3.4.0",
|
||||
"computeds": "^0.0.1",
|
||||
"minimatch": "^9.0.3",
|
||||
"path-browserify": "^1.0.1",
|
||||
"vue-template-compiler": "^2.7.14"
|
||||
"muggle-string": "^0.4.1",
|
||||
"path-browserify": "^1.0.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "*"
|
||||
|
@ -1665,7 +1730,8 @@
|
|||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz",
|
||||
"integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/confbox": {
|
||||
"version": "0.1.7",
|
||||
|
@ -2666,6 +2732,16 @@
|
|||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/maath": {
|
||||
"version": "0.10.8",
|
||||
"resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz",
|
||||
"integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"@types/three": ">=0.134.0",
|
||||
"three": ">=0.134.0"
|
||||
}
|
||||
},
|
||||
"node_modules/magic-string": {
|
||||
"version": "0.30.10",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
|
||||
|
@ -2700,12 +2776,13 @@
|
|||
"integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw=="
|
||||
},
|
||||
"node_modules/micromatch": {
|
||||
"version": "4.0.5",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
|
||||
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
|
||||
"version": "4.0.8",
|
||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
|
||||
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"braces": "^3.0.2",
|
||||
"braces": "^3.0.3",
|
||||
"picomatch": "^2.3.1"
|
||||
},
|
||||
"engines": {
|
||||
|
@ -2758,7 +2835,8 @@
|
|||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz",
|
||||
"integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
"version": "3.3.7",
|
||||
|
@ -2866,7 +2944,8 @@
|
|||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
|
||||
"integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/path-exists": {
|
||||
"version": "4.0.0",
|
||||
|
@ -3648,6 +3727,13 @@
|
|||
"vue": ">=3.2.13"
|
||||
}
|
||||
},
|
||||
"node_modules/vscode-uri": {
|
||||
"version": "3.0.8",
|
||||
"resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz",
|
||||
"integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/vue": {
|
||||
"version": "3.4.25",
|
||||
"resolved": "https://registry.npmjs.org/vue/-/vue-3.4.25.tgz",
|
||||
|
@ -3668,31 +3754,6 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"node_modules/vue-3d-model": {
|
||||
"version": "2.0.0-alpha.4",
|
||||
"resolved": "https://registry.npmjs.org/vue-3d-model/-/vue-3d-model-2.0.0-alpha.4.tgz",
|
||||
"integrity": "sha512-/dGP7YTAK5e7o8i9592PS9S0mbUStRl26OeeC2Qz4XePrG9BU/Q1GkETqPSMJPWgNa8TkqrxXP9ItYgcmxuSqw==",
|
||||
"dependencies": {
|
||||
"@types/three": "^0.141.0",
|
||||
"three": "^0.141.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vue": ">=3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/vue-3d-model/node_modules/@types/three": {
|
||||
"version": "0.141.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/three/-/three-0.141.0.tgz",
|
||||
"integrity": "sha512-OJdKDgTPVBUgc+s74DYoy4aLznbFFC38Xm4ElmU1YwGNgR7GGFVvFCX7lpVgOsT6S1zSJtGdajTsOYE8/xY9nA==",
|
||||
"dependencies": {
|
||||
"@types/webxr": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/vue-3d-model/node_modules/three": {
|
||||
"version": "0.141.0",
|
||||
"resolved": "https://registry.npmjs.org/three/-/three-0.141.0.tgz",
|
||||
"integrity": "sha512-JaSDAPWuk4RTzG5BYRQm8YZbERUxTfTDVouWgHMisS2to4E5fotMS9F2zPFNOIJyEFTTQDDKPpsgZVThKU3pXA=="
|
||||
},
|
||||
"node_modules/vue-router": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.2.tgz",
|
||||
|
@ -3712,26 +3773,29 @@
|
|||
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz",
|
||||
"integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==",
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"de-indent": "^1.0.2",
|
||||
"he": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/vue-tsc": {
|
||||
"version": "2.0.14",
|
||||
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.14.tgz",
|
||||
"integrity": "sha512-DgAO3U1cnCHOUO7yB35LENbkapeRsBZ7Ugq5hGz/QOHny0+1VQN8eSwSBjYbjLVPfvfw6EY7sNPjbuHHUhckcg==",
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.1.2.tgz",
|
||||
"integrity": "sha512-PH1BDxWT3eaPhl73elyZj6DV0nR3K4IFoUM1sGzMXXQneovVUwHQytdSyAHiED5MtEINGSHpL/Hs9ch+c/tDTw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@volar/typescript": "2.2.0-alpha.10",
|
||||
"@vue/language-core": "2.0.14",
|
||||
"@volar/typescript": "~2.4.1",
|
||||
"@vue/language-core": "2.1.2",
|
||||
"semver": "^7.5.4"
|
||||
},
|
||||
"bin": {
|
||||
"vue-tsc": "bin/vue-tsc.js"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "*"
|
||||
"typescript": ">=5.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/webpack-sources": {
|
||||
|
|
|
@ -11,21 +11,25 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@fireworks-js/vue": "^2.10.7",
|
||||
"@iconify-json/icon-park": "^1.1.14",
|
||||
"@iconify-json/icon-park-solid": "^1.1.15",
|
||||
"@iconify-json/uil": "^1.2.0",
|
||||
"@iconify/vue": "^4.1.2",
|
||||
"@monogrid/gainmap-js": "^3.0.5",
|
||||
"@tresjs/cientos": "^3.9.0",
|
||||
"@tresjs/core": "^4.0.2",
|
||||
"@tresjs/core": "^4.2.9",
|
||||
"@tresjs/leches": "^0.14.0",
|
||||
"@tresjs/post-processing": "^0.7.1",
|
||||
"@vueuse/components": "^10.9.0",
|
||||
"@vueuse/core": "^10.9.0",
|
||||
"d3": "^7.9.0",
|
||||
"maath": "^0.10.8",
|
||||
"pathfinding": "^0.4.18",
|
||||
"pinia": "^2.1.7",
|
||||
"reset-css": "^5.0.2",
|
||||
"three": "^0.164.1",
|
||||
"vite-svg-loader": "^5.1.0",
|
||||
"vue": "^3.4.21",
|
||||
"vue-3d-model": "^2.0.0-alpha.4",
|
||||
"vue-router": "^4.3.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 5.8 KiB |
|
@ -1,5 +1,19 @@
|
|||
<script setup lang="ts">
|
||||
import { watch } from 'vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
const route = useRoute()
|
||||
watch(() => route.params, () => {
|
||||
console.log(route.params)
|
||||
}, { deep: true })
|
||||
</script>
|
||||
<template>
|
||||
<Suspense>
|
||||
<RouterView />
|
||||
<Load />
|
||||
</Suspense>
|
||||
<Suspense>
|
||||
<RouterView :key="route.fullPath" />
|
||||
</Suspense>
|
||||
<Suspense>
|
||||
<Nav />
|
||||
</Suspense>
|
||||
</template>
|
|
@ -0,0 +1,4 @@
|
|||
<svg width="37" height="23" viewBox="0 0 37 23" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M7.85872 22.2998C6.77872 22.2998 5.65872 22.1598 4.49872 21.8798C3.33872 21.5998 2.32872 21.1798 1.46872 20.6198C1.06872 20.3598 0.798719 20.0598 0.658719 19.7198C0.518719 19.3798 0.478719 19.0598 0.538719 18.7598C0.618719 18.4398 0.768719 18.1698 0.988719 17.9498C1.22872 17.7298 1.51872 17.5998 1.85872 17.5598C2.21872 17.5198 2.60872 17.6098 3.02872 17.8298C3.84872 18.2698 4.63872 18.5898 5.39872 18.7898C6.15872 18.9698 6.93872 19.0598 7.73872 19.0598C8.61872 19.0598 9.35872 18.9398 9.95872 18.6998C10.5587 18.4598 11.0087 18.0998 11.3087 17.6198C11.6287 17.1398 11.7887 16.5598 11.7887 15.8798C11.7887 14.8798 11.4487 14.1398 10.7687 13.6598C10.1087 13.1598 9.13872 12.9098 7.85872 12.9098H5.93872C5.37872 12.9098 4.94872 12.7698 4.64872 12.4898C4.36872 12.2098 4.22872 11.8198 4.22872 11.3198C4.22872 10.8198 4.36872 10.4298 4.64872 10.1498C4.94872 9.86981 5.37872 9.7298 5.93872 9.7298H7.49872C8.25872 9.7298 8.90872 9.6098 9.44872 9.3698C9.98872 9.1098 10.4087 8.74981 10.7087 8.28981C11.0087 7.82981 11.1587 7.2698 11.1587 6.60981C11.1587 5.68981 10.8487 4.98981 10.2287 4.50981C9.62872 4.0298 8.74872 3.7898 7.58872 3.7898C6.84872 3.7898 6.14872 3.8798 5.48872 4.0598C4.84872 4.2198 4.13872 4.5298 3.35872 4.9898C2.99872 5.2098 2.64872 5.2998 2.30872 5.2598C1.98872 5.21981 1.71872 5.08981 1.49872 4.8698C1.27872 4.6498 1.12872 4.38981 1.04872 4.08981C0.968719 3.7698 0.988719 3.44981 1.10872 3.12981C1.22872 2.78981 1.47872 2.4998 1.85872 2.2598C2.71872 1.6998 3.66872 1.2798 4.70872 0.999804C5.74872 0.699805 6.81872 0.549805 7.91872 0.549805C9.37872 0.549805 10.6287 0.779805 11.6687 1.2398C12.7087 1.67981 13.4987 2.31981 14.0387 3.15981C14.5987 3.97981 14.8787 4.97981 14.8787 6.15981C14.8787 6.99981 14.7187 7.7698 14.3987 8.4698C14.0787 9.1498 13.6287 9.72981 13.0487 10.2098C12.4687 10.6898 11.7687 11.0298 10.9487 11.2298V10.8698C12.3887 11.1098 13.5087 11.7098 14.3087 12.6698C15.1087 13.6098 15.5087 14.7898 15.5087 16.2098C15.5087 17.4498 15.1987 18.5298 14.5787 19.4498C13.9587 20.3698 13.0787 21.0798 11.9387 21.5798C10.7987 22.0598 9.43872 22.2998 7.85872 22.2998Z" fill="#438CB6"/>
|
||||
<path d="M19.217 21.9998C18.557 21.9998 18.047 21.8298 17.687 21.4898C17.347 21.1298 17.177 20.6198 17.177 19.9598V2.8898C17.177 2.2298 17.347 1.7298 17.687 1.3898C18.047 1.0298 18.557 0.849804 19.217 0.849804H25.037C28.577 0.849804 31.307 1.7598 33.227 3.5798C35.167 5.39981 36.137 8.00981 36.137 11.4098C36.137 13.1098 35.887 14.6198 35.387 15.9398C34.907 17.2398 34.187 18.3398 33.227 19.2398C32.287 20.1398 31.127 20.8298 29.747 21.3098C28.387 21.7698 26.817 21.9998 25.037 21.9998H19.217ZM21.017 18.8198H24.797C26.037 18.8198 27.107 18.6698 28.007 18.3698C28.927 18.0498 29.687 17.5898 30.287 16.9898C30.907 16.3698 31.367 15.5998 31.667 14.6798C31.967 13.7398 32.117 12.6498 32.117 11.4098C32.117 8.92981 31.507 7.0798 30.287 5.8598C29.067 4.6398 27.237 4.0298 24.797 4.0298H21.017V18.8198Z" fill="#438CB6"/>
|
||||
</svg>
|
After Width: | Height: | Size: 3.0 KiB |
|
@ -0,0 +1,4 @@
|
|||
<svg width="24" height="15" viewBox="0 0 24 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M4.898 14.5C4.178 14.5 3.43133 14.4067 2.658 14.22C1.88467 14.0333 1.21133 13.7533 0.638 13.38C0.371333 13.2067 0.191333 13.0067 0.098 12.78C0.00466666 12.5533 -0.022 12.34 0.018 12.14C0.0713334 11.9267 0.171333 11.7467 0.318 11.6C0.478 11.4533 0.671333 11.3667 0.898 11.34C1.138 11.3133 1.398 11.3733 1.678 11.52C2.22467 11.8133 2.75133 12.0267 3.258 12.16C3.76467 12.28 4.28467 12.34 4.818 12.34C5.40467 12.34 5.898 12.26 6.298 12.1C6.698 11.94 6.998 11.7 7.198 11.38C7.41133 11.06 7.518 10.6733 7.518 10.22C7.518 9.55333 7.29133 9.06 6.838 8.74C6.398 8.40667 5.75133 8.24 4.898 8.24H3.618C3.24467 8.24 2.958 8.14667 2.758 7.96C2.57133 7.77333 2.478 7.51333 2.478 7.18C2.478 6.84667 2.57133 6.58667 2.758 6.4C2.958 6.21333 3.24467 6.12 3.618 6.12H4.658C5.16467 6.12 5.598 6.04 5.958 5.88C6.318 5.70667 6.598 5.46667 6.798 5.16C6.998 4.85333 7.098 4.48 7.098 4.04C7.098 3.42667 6.89133 2.96 6.478 2.64C6.078 2.32 5.49133 2.16 4.718 2.16C4.22467 2.16 3.758 2.22 3.318 2.34C2.89133 2.44667 2.418 2.65333 1.898 2.96C1.658 3.10667 1.42467 3.16667 1.198 3.14C0.984667 3.11333 0.804667 3.02667 0.658 2.88C0.511333 2.73333 0.411333 2.56 0.358 2.36C0.304667 2.14667 0.318 1.93333 0.398 1.72C0.478 1.49333 0.644667 1.3 0.898 1.14C1.47133 0.766666 2.10467 0.486666 2.798 0.3C3.49133 0.0999999 4.20467 0 4.938 0C5.91133 0 6.74467 0.153333 7.438 0.46C8.13133 0.753334 8.658 1.18 9.018 1.74C9.39133 2.28667 9.578 2.95333 9.578 3.74C9.578 4.3 9.47133 4.81333 9.258 5.28C9.04467 5.73333 8.74467 6.12 8.358 6.44C7.97133 6.76 7.50467 6.98667 6.958 7.12V6.88C7.918 7.04 8.66467 7.44 9.198 8.08C9.73133 8.70667 9.998 9.49333 9.998 10.44C9.998 11.2667 9.79133 11.9867 9.378 12.6C8.96467 13.2133 8.378 13.6867 7.618 14.02C6.858 14.34 5.95133 14.5 4.898 14.5Z" fill="white"/>
|
||||
<path d="M12.4702 14.3C12.0302 14.3 11.6902 14.1867 11.4502 13.96C11.2235 13.72 11.1102 13.38 11.1102 12.94V1.56C11.1102 1.12 11.2235 0.786667 11.4502 0.56C11.6902 0.32 12.0302 0.2 12.4702 0.2H16.3502C18.7102 0.2 20.5302 0.806667 21.8102 2.02C23.1035 3.23333 23.7502 4.97333 23.7502 7.24C23.7502 8.37333 23.5835 9.38 23.2502 10.26C22.9302 11.1267 22.4502 11.86 21.8102 12.46C21.1835 13.06 20.4102 13.52 19.4902 13.84C18.5835 14.1467 17.5369 14.3 16.3502 14.3H12.4702ZM13.6702 12.18H16.1902C17.0169 12.18 17.7302 12.08 18.3302 11.88C18.9435 11.6667 19.4502 11.36 19.8502 10.96C20.2635 10.5467 20.5702 10.0333 20.7702 9.42C20.9702 8.79333 21.0702 8.06667 21.0702 7.24C21.0702 5.58667 20.6635 4.35333 19.8502 3.54C19.0369 2.72667 17.8169 2.32 16.1902 2.32H13.6702V12.18Z" fill="white"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.6 KiB |
|
@ -0,0 +1,7 @@
|
|||
<svg width="100%" height="100%" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.9984 1.5C15.9984 0.671573 16.67 3.62114e-08 17.4984 0C18.3268 -3.62114e-08 18.9984 0.671573 18.9984 1.5L18.9984 6.87868L19.6197 6.25736C20.2055 5.67157 21.1552 5.67157 21.741 6.25736C22.3268 6.84315 22.3268 7.79289 21.741 8.37868L18.559 11.5607C17.9733 12.1464 17.0235 12.1464 16.4377 11.5607L13.2557 8.37868C12.67 7.79289 12.67 6.84315 13.2557 6.25736C13.8415 5.67157 14.7913 5.67157 15.3771 6.25736L15.9984 6.87868V1.5Z" fill="#438CB6"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.9984 33.5C15.9984 34.3284 16.67 35 17.4984 35C18.3268 35 18.9984 34.3284 18.9984 33.5L18.9984 28.1213L19.6197 28.7426C20.2055 29.3284 21.1552 29.3284 21.741 28.7426C22.3268 28.1569 22.3268 27.2071 21.741 26.6213L18.559 23.4393C17.9733 22.8536 17.0235 22.8536 16.4377 23.4393L13.2557 26.6213C12.67 27.2071 12.67 28.1569 13.2557 28.7426C13.8415 29.3284 14.7913 29.3284 15.3771 28.7426L15.9984 28.1213V33.5Z" fill="#438CB6"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.5 15.9999C34.3284 15.9999 35 16.6714 35 17.4999C35 18.3283 34.3284 18.9999 33.5 18.9999H28.1213L28.7426 19.6212C29.3284 20.207 29.3284 21.1567 28.7426 21.7425C28.1569 22.3283 27.2071 22.3283 26.6213 21.7425L23.4393 18.5605C22.8536 17.9747 22.8536 17.025 23.4393 16.4392L26.6213 13.2572C27.2071 12.6714 28.1569 12.6714 28.7426 13.2572C29.3284 13.843 29.3284 14.7927 28.7426 15.3785L28.1213 15.9999H33.5Z" fill="#438CB6"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 15.9999C0.671573 15.9999 7.24231e-08 16.6714 0 17.4999C-7.24231e-08 18.3283 0.671573 18.9999 1.5 18.9999L6.87868 18.9999L6.25736 19.6212C5.67157 20.207 5.67157 21.1567 6.25736 21.7425C6.84314 22.3283 7.79289 22.3283 8.37868 21.7425L11.5607 18.5605C12.1464 17.9747 12.1464 17.025 11.5607 16.4392L8.37868 13.2572C7.79289 12.6714 6.84315 12.6714 6.25736 13.2572C5.67157 13.843 5.67157 14.7927 6.25736 15.3785L6.87868 15.9999H1.5Z" fill="#438CB6"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.5 17.5C15.5 16.3954 16.3954 15.5 17.5 15.5C18.6046 15.5 19.5 16.3954 19.5 17.5C19.5 18.6046 18.6046 19.5 17.5 19.5C16.3954 19.5 15.5 18.6046 15.5 17.5Z" fill="#438CB6"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,4 @@
|
|||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.1136 1.8783H6.74375C6.30995 1.8783 5.94485 2.17242 5.83697 2.57212H3.93683C4.06114 1.13096 5.27037 0 6.74375 0H13.1136C14.6697 0 15.9311 1.26142 15.9311 2.81746V9.18736C15.9311 10.66 14.8013 11.8687 13.3612 11.9941V10.0935C13.7598 9.98491 14.0528 9.62036 14.0528 9.18736V2.81746C14.0528 2.29878 13.6323 1.8783 13.1136 1.8783Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.5 6.42965C0.5 4.77279 1.84315 3.42965 3.5 3.42965H9.50482C11.1617 3.42965 12.5048 4.77279 12.5048 6.42965V12.4345C12.5048 14.0913 11.1617 15.4345 9.50482 15.4345H3.5C1.84314 15.4345 0.5 14.0913 0.5 12.4345V6.42965ZM3.5 5.42965H9.50482C10.0571 5.42965 10.5048 5.87736 10.5048 6.42965V12.4345C10.5048 12.9867 10.0571 13.4345 9.50482 13.4345H3.5C2.94772 13.4345 2.5 12.9867 2.5 12.4345V6.42965C2.5 5.87736 2.94771 5.42965 3.5 5.42965Z" fill="white"/>
|
||||
</svg>
|
After Width: | Height: | Size: 958 B |
|
@ -0,0 +1,3 @@
|
|||
<svg width="16" height="15" viewBox="0 0 16 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15.6571 7.3769L8.38743 0.164061C8.17017 -0.0520829 7.80695 -0.052083 7.58969 0.164061L0.320031 7.3769C-0.369307 8.06134 0.127731 9.29226 1.11777 9.29226H1.88374V14.439C1.88374 14.7492 2.13612 14.9998 2.44851 14.9998H6.85902V11.0744H8.83572V14.9998H13.5286C13.841 14.9998 14.0934 14.7492 14.0934 14.439V9.29226H14.8593C15.8251 9.29226 16.3637 8.07853 15.6571 7.3769Z" fill="white"/>
|
||||
</svg>
|
After Width: | Height: | Size: 495 B |
|
@ -0,0 +1,3 @@
|
|||
<svg height="100%" viewBox="0 0 15 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.9923 0.585786C13.2113 -0.195262 11.945 -0.195262 11.1639 0.585786L-0.000302315 11.75L11.1639 22.9142C11.945 23.6953 13.2113 23.6953 13.9923 22.9142C14.7734 22.1332 14.7734 20.8668 13.9923 20.0858L5.65655 11.75L13.9923 3.41421C14.7734 2.63317 14.7734 1.36683 13.9923 0.585786Z" fill="#438CB6"/>
|
||||
</svg>
|
After Width: | Height: | Size: 441 B |
|
@ -0,0 +1,3 @@
|
|||
<svg height="100%" viewBox="0 0 10 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.18175 0.43934C8.59597 -0.146447 7.64622 -0.146447 7.06043 0.43934L-0.000226974 7.5L7.06043 14.5607C7.64622 15.1464 8.59597 15.1464 9.18175 14.5607C9.76754 13.9749 9.76754 13.0251 9.18175 12.4393L4.24241 7.5L9.18175 2.56066C9.76754 1.97487 9.76754 1.02513 9.18175 0.43934Z" fill="#438CB6"/>
|
||||
</svg>
|
After Width: | Height: | Size: 436 B |
|
@ -0,0 +1,3 @@
|
|||
<svg width="10" height="2" viewBox="0 0 10 2" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M-8.74228e-08 1C-3.91405e-08 0.447715 0.447715 3.91405e-08 1 8.74228e-08L9 7.86805e-07C9.55229 8.35087e-07 10 0.447716 10 1C10 1.55229 9.55229 2 9 2L1 2C0.447715 2 -1.35705e-07 1.55228 -8.74228e-08 1Z" fill="white"/>
|
||||
</svg>
|
After Width: | Height: | Size: 367 B |
|
@ -0,0 +1,3 @@
|
|||
<svg width="100%" height="100%" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2.56066 0.43934C1.97487 -0.146447 1.02513 -0.146447 0.43934 0.43934C-0.146447 1.02513 -0.146447 1.97487 0.43934 2.56066L4.37868 6.5L0.43934 10.4393C-0.146446 11.0251 -0.146446 11.9749 0.43934 12.5607C1.02513 13.1464 1.97487 13.1464 2.56066 12.5607L6.5 8.62132L10.4393 12.5607C11.0251 13.1464 11.9749 13.1464 12.5607 12.5607C13.1464 11.9749 13.1464 11.0251 12.5607 10.4393L8.62132 6.5L12.5607 2.56066C13.1464 1.97487 13.1464 1.02513 12.5607 0.43934C11.9749 -0.146447 11.0251 -0.146447 10.4393 0.43934L6.5 4.37868L2.56066 0.43934Z" fill="#438CB6"/>
|
||||
</svg>
|
After Width: | Height: | Size: 664 B |
|
@ -0,0 +1,3 @@
|
|||
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M6 1C6 0.447715 5.55228 0 5 0C4.44772 0 4 0.447715 4 1L4 4L1 4C0.447715 4 0 4.44772 0 5C0 5.55228 0.447715 6 1 6L4 6L4 9C4 9.55229 4.44771 10 5 10C5.55228 10 6 9.55229 6 9V6L9 6C9.55229 6 10 5.55229 10 5C10 4.44772 9.55229 4 9 4L6 4V1Z" fill="white"/>
|
||||
</svg>
|
After Width: | Height: | Size: 364 B |
|
@ -0,0 +1,3 @@
|
|||
<svg width="15" height="24" viewBox="0 0 15 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.585786 0.585786C1.36683 -0.195262 2.63317 -0.195262 3.41421 0.585786L14.5784 11.75L3.41421 22.9142C2.63317 23.6953 1.36683 23.6953 0.585786 22.9142C-0.195262 22.1332 -0.195262 20.8668 0.585786 20.0858L8.92157 11.75L0.585786 3.41421C-0.195262 2.63317 -0.195262 1.36683 0.585786 0.585786Z" fill="#438CB6"/>
|
||||
</svg>
|
After Width: | Height: | Size: 460 B |
|
@ -0,0 +1,3 @@
|
|||
<svg height="100%" viewBox="0 0 10 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.43934 0.43934C1.02513 -0.146447 1.97487 -0.146447 2.56066 0.43934L9.62132 7.5L2.56066 14.5607C1.97487 15.1464 1.02513 15.1464 0.43934 14.5607C-0.146447 13.9749 -0.146447 13.0251 0.43934 12.4393L5.37868 7.5L0.43934 2.56066C-0.146447 1.97487 -0.146447 1.02513 0.43934 0.43934Z" fill="#438CB6"/>
|
||||
</svg>
|
After Width: | Height: | Size: 439 B |
|
@ -26,3 +26,5 @@
|
|||
@include font-face("Montserrat", '../fonts/Montserrat-ExtraBoldItalic.ttf', 800, italic);
|
||||
@include font-face("Montserrat", '../fonts/Montserrat-Black.ttf', 900);
|
||||
@include font-face("Montserrat", '../fonts/Montserrat-BlackItalic.ttf', 900, italic);
|
||||
|
||||
@include font-face("Project Space", '../fonts/Project Space.ttf', 400);
|
|
@ -1,6 +1,21 @@
|
|||
@import 'grid.scss';
|
||||
@import 'fonts.scss';
|
||||
|
||||
:root {
|
||||
--primary-color: #ACD0E5;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Montserrat';
|
||||
user-select: none;
|
||||
|
||||
&:not(.notouch) {
|
||||
// canvas {
|
||||
cursor: none;
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
a[href] {
|
||||
color: #048280;
|
||||
|
||||
|
@ -9,4 +24,48 @@ a[href] {
|
|||
}
|
||||
}
|
||||
|
||||
.main {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
height: calc(100vh - 4.25rem);
|
||||
gap: 1.25rem;
|
||||
|
||||
&-title,
|
||||
&-desc {
|
||||
max-width: 40vw;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
color: var(--main-text-color)
|
||||
}
|
||||
|
||||
&-title {
|
||||
text-align: center;
|
||||
font-family: 'Project Space';
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 3rem
|
||||
}
|
||||
|
||||
&-desc {
|
||||
font-size: 1.125rem;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
p {
|
||||
&:not(:last-child) {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
&-canvas {
|
||||
flex-grow: 1;
|
||||
height: 100vh;
|
||||
}
|
||||
}
|
||||
|
||||
@import 'sidebar.scss';
|
||||
@import 'nav.scss';
|
|
@ -0,0 +1,80 @@
|
|||
$bg: #ACD0E5;
|
||||
$activeBg: #438CB6;
|
||||
$white: #fff;
|
||||
|
||||
.nav {
|
||||
background-color: $white;
|
||||
padding: 1rem;
|
||||
// height: 2rem;
|
||||
position: fixed;
|
||||
right: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
> * {
|
||||
&:not(:last-child) {
|
||||
border-right: 2px solid #B3B3B3
|
||||
}
|
||||
}
|
||||
|
||||
&-icon {
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-size: 1.75rem;
|
||||
width: 2.25rem;
|
||||
height: 2.25rem;
|
||||
border-radius: 50%;
|
||||
overflow: hidden;
|
||||
|
||||
background-color: var(--primary-color);
|
||||
color: $white;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
|
||||
&.disabled {
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
a,
|
||||
a[href].router-link-active {
|
||||
color: $white;
|
||||
line-height: 0;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
&.active {
|
||||
background-image: linear-gradient(fade-out(#000, 0.5), fade-out(#000, 0.5));
|
||||
}
|
||||
}
|
||||
|
||||
&-group {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
padding: 0 1.5rem;
|
||||
}
|
||||
|
||||
&-content {
|
||||
flex-grow: 1;
|
||||
text-align: right;
|
||||
font-size: 1.125rem;
|
||||
padding: 0 1.5rem;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
|
||||
.nav-icon {
|
||||
margin: 0 0.25rem;
|
||||
|
||||
font-size: 1.25em;
|
||||
width: 1.25em;
|
||||
height: 1.25em;
|
||||
}
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 247 B |
After Width: | Height: | Size: 387 B |
After Width: | Height: | Size: 417 B |
After Width: | Height: | Size: 446 B |
After Width: | Height: | Size: 218 B |
After Width: | Height: | Size: 231 B |
|
@ -0,0 +1,36 @@
|
|||
<svg width="1920" height="1567" viewBox="0 0 1920 1567" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15.727 8.51899H31.9905V84.4155C31.9905 87.6423 31.926 91.1919 31.7969 95.0642C31.7969 98.8074 31.7324 102.551 31.6033 106.294C31.4742 110.037 31.2806 113.393 31.0225 116.362C30.8934 119.201 30.7643 121.396 30.6352 122.945H31.4097L107.5 8.51899H126.861V146.759H110.598V71.637C110.598 68.1519 110.662 64.4087 110.791 60.4074C110.92 56.277 111.049 52.3402 111.178 48.597C111.437 44.7247 111.63 41.3042 111.759 38.3355C111.888 35.3667 112.017 33.1724 112.147 31.7526H111.372L35.0884 146.759H15.727V8.51899Z" fill="black"/>
|
||||
<path d="M174.989 42.9822V86.158H231.331V42.9822H248.369V146.759H231.331V100.485H174.989V146.759H157.951V42.9822H174.989Z" fill="black"/>
|
||||
<path d="M348.993 57.3096H315.111V146.759H298.267V57.3096H264.771V42.9822H348.993V57.3096Z" fill="black"/>
|
||||
<path d="M403.751 41.0461C412.657 41.0461 420.273 42.9822 426.597 46.8545C433.051 50.7267 437.956 56.2124 441.312 63.3116C444.797 70.2817 446.54 78.478 446.54 87.9005V98.162H375.483C375.742 109.908 378.71 118.879 384.39 125.074C390.198 131.141 398.265 134.174 408.591 134.174C415.174 134.174 420.983 133.593 426.017 132.432C431.18 131.141 436.472 129.334 441.893 127.01V141.919C436.601 144.242 431.373 145.92 426.21 146.953C421.047 148.114 414.916 148.695 407.817 148.695C398.007 148.695 389.295 146.694 381.679 142.693C374.193 138.692 368.32 132.754 364.06 124.881C359.93 116.878 357.865 107.133 357.865 95.6451C357.865 84.2864 359.736 74.5412 363.479 66.4094C367.352 58.2776 372.708 52.0175 379.549 47.6289C386.519 43.2403 394.587 41.0461 403.751 41.0461ZM403.557 54.9862C395.426 54.9862 388.972 57.6323 384.196 62.9244C379.549 68.0874 376.774 75.3156 375.871 84.6091H428.727C428.727 78.6716 427.824 73.5086 426.017 69.12C424.21 64.7314 421.434 61.3109 417.691 58.8585C414.077 56.277 409.366 54.9862 403.557 54.9862Z" fill="black"/>
|
||||
<path d="M518.458 41.0461C531.236 41.0461 541.498 45.4992 549.242 54.4054C557.116 63.3116 561.053 76.7355 561.053 94.677C561.053 106.423 559.246 116.362 555.632 124.493C552.147 132.496 547.177 138.563 540.724 142.693C534.399 146.694 526.912 148.695 518.264 148.695C512.972 148.695 508.261 147.985 504.131 146.565C500 145.146 496.451 143.339 493.482 141.144C490.642 138.821 488.19 136.304 486.125 133.593H484.963C485.221 135.788 485.479 138.563 485.737 141.919C485.995 145.275 486.125 148.179 486.125 150.631V193.226H469.087V42.9822H483.027L485.35 57.116H486.125C488.19 54.1472 490.642 51.4366 493.482 48.9842C496.451 46.5318 499.936 44.5956 503.937 43.1758C508.067 41.756 512.908 41.0461 518.458 41.0461ZM515.36 55.3734C508.39 55.3734 502.775 56.7287 498.516 59.4393C494.256 62.0208 491.158 65.9576 489.222 71.2497C487.286 76.5419 486.254 83.2538 486.125 91.3856V94.677C486.125 103.196 487.028 110.424 488.835 116.362C490.642 122.299 493.675 126.817 497.935 129.915C502.324 133.012 508.261 134.561 515.747 134.561C522.072 134.561 527.235 132.819 531.236 129.334C535.367 125.849 538.4 121.137 540.336 115.2C542.401 109.133 543.434 102.228 543.434 94.4834C543.434 82.6084 541.111 73.1213 536.464 66.0222C531.946 58.923 524.912 55.3734 515.36 55.3734Z" fill="black"/>
|
||||
<path d="M623.635 41.2397C636.285 41.2397 645.643 44.0148 651.709 49.565C657.776 55.1153 660.809 63.957 660.809 76.0901V146.759H648.418L645.127 132.044H644.352C641.383 135.788 638.286 138.95 635.059 141.531C631.961 143.984 628.347 145.791 624.216 146.953C620.215 148.114 615.31 148.695 609.502 148.695C603.306 148.695 597.691 147.598 592.657 145.404C587.752 143.209 583.88 139.853 581.04 135.336C578.201 130.689 576.781 124.881 576.781 117.911C576.781 107.585 580.847 99.6464 588.979 94.0961C597.11 88.4168 609.631 85.319 626.54 84.8027L644.158 84.2218V78.0262C644.158 69.3782 642.287 63.3761 638.544 60.0202C634.8 56.6642 629.508 54.9862 622.667 54.9862C617.246 54.9862 612.083 55.8252 607.178 57.5032C602.273 59.0521 597.691 60.8592 593.432 62.9244L588.204 50.1459C592.722 47.6935 598.078 45.6282 604.274 43.9503C610.47 42.1432 616.924 41.2397 623.635 41.2397ZM628.669 96.6131C615.762 97.1294 606.791 99.1946 601.757 102.809C596.852 106.423 594.4 111.521 594.4 118.104C594.4 123.913 596.142 128.172 599.627 130.883C603.241 133.593 607.824 134.949 613.374 134.949C622.151 134.949 629.444 132.561 635.252 127.785C641.061 122.88 643.965 115.394 643.965 105.326V96.0323L628.669 96.6131Z" fill="black"/>
|
||||
<path d="M750.365 42.9822H768.951L724.614 92.9344L772.63 146.759H752.881L706.027 94.0961V146.759H688.989V42.9822H706.027V93.3217L750.365 42.9822Z" fill="black"/>
|
||||
<path d="M859.233 57.3096H825.35V146.759H808.506V57.3096H775.011V42.9822H859.233V57.3096Z" fill="black"/>
|
||||
<path d="M891.873 106.294C891.873 107.455 891.809 109.133 891.68 111.328C891.68 113.393 891.615 115.652 891.486 118.104C891.357 120.428 891.228 122.686 891.099 124.881C890.97 126.946 890.841 128.624 890.712 129.915L946.279 42.9822H967.189V146.759H951.313V85.5771C951.313 83.5119 951.313 80.8013 951.313 77.4454C951.442 74.0894 951.571 70.798 951.7 67.5711C951.829 64.2151 951.958 61.6982 952.087 60.0202L896.907 146.759H875.803V42.9822H891.873V106.294Z" fill="black"/>
|
||||
<path d="M1079.79 69.12C1079.79 75.5738 1077.85 80.6077 1073.98 84.2218C1070.11 87.836 1065.14 90.2884 1059.07 91.5792V92.3536C1065.53 93.2571 1071.14 95.5805 1075.92 99.3237C1080.69 102.938 1083.08 108.617 1083.08 116.362C1083.08 120.75 1082.24 124.816 1080.56 128.559C1079.02 132.303 1076.56 135.529 1073.21 138.24C1069.85 140.951 1065.53 143.08 1060.24 144.629C1054.94 146.049 1048.55 146.759 1041.07 146.759H996.343V42.9822H1040.87C1048.23 42.9822 1054.81 43.8212 1060.62 45.4992C1066.56 47.0481 1071.21 49.7587 1074.56 53.6309C1078.05 57.3741 1079.79 62.5371 1079.79 69.12ZM1065.46 116.362C1065.46 110.424 1063.2 106.165 1058.69 103.583C1054.17 101.002 1047.52 99.7109 1038.74 99.7109H1013.38V133.012H1039.13C1047.65 133.012 1054.17 131.786 1058.69 129.334C1063.2 126.752 1065.46 122.428 1065.46 116.362ZM1062.56 71.2497C1062.56 66.3449 1060.75 62.7953 1057.14 60.601C1053.65 58.2776 1047.91 57.116 1039.91 57.116H1013.38V85.5771H1036.81C1045.2 85.5771 1051.59 84.4155 1055.98 82.0921C1060.36 79.7687 1062.56 76.1546 1062.56 71.2497Z" fill="black"/>
|
||||
<path d="M1121.06 42.9822V86.158H1177.4V42.9822H1194.44V146.759H1177.4V100.485H1121.06V146.759H1104.03V42.9822H1121.06Z" fill="black"/>
|
||||
<path d="M1223.43 146.759V42.9822H1240.47V85.5771H1267.38C1276.42 85.5771 1283.84 86.6743 1289.65 88.8686C1295.45 91.0629 1299.78 94.3543 1302.62 98.7429C1305.46 103.002 1306.88 108.424 1306.88 115.006C1306.88 121.46 1305.46 127.075 1302.62 131.851C1299.91 136.627 1295.58 140.305 1289.65 142.887C1283.84 145.468 1276.16 146.759 1266.61 146.759H1223.43ZM1265.06 133.012C1272.41 133.012 1278.42 131.786 1283.06 129.334C1287.71 126.752 1290.03 122.299 1290.03 115.974C1290.03 109.65 1287.9 105.39 1283.64 103.196C1279.38 100.873 1273.25 99.7109 1265.25 99.7109H1240.47V133.012H1265.06ZM1324.11 146.759V42.9822H1341.15V146.759H1324.11Z" fill="black"/>
|
||||
<path d="M1454.28 0C1453.76 6.45378 1452.15 11.875 1449.44 16.2635C1446.86 20.6521 1442.99 23.9435 1437.82 26.1378C1432.66 28.3321 1425.95 29.4292 1417.69 29.4292C1409.3 29.4292 1402.52 28.3321 1397.36 26.1378C1392.32 23.9435 1388.64 20.7166 1386.32 16.4571C1384 12.0686 1382.58 6.58286 1382.06 0H1397.94C1398.58 6.97008 1400.39 11.6813 1403.36 14.1338C1406.46 16.4571 1411.36 17.6188 1418.07 17.6188C1424.01 17.6188 1428.66 16.3926 1432.01 13.9402C1435.5 11.3587 1437.56 6.71193 1438.21 0H1454.28ZM1386.32 106.294C1386.32 107.455 1386.26 109.133 1386.13 111.328C1386.13 113.393 1386.06 115.652 1385.93 118.104C1385.8 120.428 1385.68 122.686 1385.55 124.881C1385.42 126.946 1385.29 128.624 1385.16 129.915L1440.73 42.9822H1461.64V146.759H1445.76V85.5771C1445.76 83.5119 1445.76 80.8013 1445.76 77.4454C1445.89 74.0894 1446.02 70.798 1446.15 67.5711C1446.28 64.2151 1446.41 61.6982 1446.53 60.0202L1391.36 146.759H1370.25V42.9822H1386.32V106.294Z" fill="black"/>
|
||||
<path d="M1577.33 148.695C1568.16 148.695 1559.97 146.824 1552.74 143.08C1545.64 139.337 1540.02 133.529 1535.89 125.655C1531.89 117.782 1529.89 107.714 1529.89 95.4514C1529.89 82.6729 1532.02 72.2824 1536.28 64.2797C1540.54 56.277 1546.28 50.404 1553.51 46.6608C1560.87 42.9176 1569.2 41.0461 1578.49 41.0461C1583.78 41.0461 1588.88 41.6269 1593.78 42.7886C1598.69 43.8212 1602.69 45.1119 1605.79 46.6608L1600.56 60.7946C1597.46 59.6329 1593.85 58.5358 1589.72 57.5032C1585.59 56.4706 1581.72 55.9543 1578.1 55.9543C1571.13 55.9543 1565.39 57.4387 1560.87 60.4074C1556.35 63.3761 1553 67.7647 1550.8 73.5731C1548.61 79.3815 1547.51 86.6097 1547.51 95.2578C1547.51 103.519 1548.61 110.553 1550.8 116.362C1553 122.17 1556.29 126.559 1560.68 129.527C1565.06 132.496 1570.55 133.981 1577.13 133.981C1582.81 133.981 1587.78 133.4 1592.04 132.238C1596.43 131.076 1600.43 129.656 1604.05 127.979V143.08C1600.56 144.887 1596.69 146.243 1592.43 147.146C1588.3 148.179 1583.26 148.695 1577.33 148.695Z" fill="black"/>
|
||||
<path d="M1696.49 57.3096H1662.61V146.759H1645.76V57.3096H1612.27V42.9822H1696.49V57.3096Z" fill="black"/>
|
||||
<path d="M1801.39 94.677C1801.39 103.325 1800.23 111.005 1797.91 117.717C1795.71 124.3 1792.49 129.915 1788.23 134.561C1784.1 139.208 1779 142.758 1772.93 145.21C1766.99 147.533 1760.35 148.695 1752.99 148.695C1746.15 148.695 1739.82 147.533 1734.02 145.21C1728.21 142.758 1723.17 139.208 1718.91 134.561C1714.65 129.915 1711.3 124.3 1708.85 117.717C1706.52 111.005 1705.36 103.325 1705.36 94.677C1705.36 83.1892 1707.3 73.5086 1711.17 65.635C1715.04 57.6323 1720.59 51.5657 1727.82 47.4353C1735.05 43.1758 1743.63 41.0461 1753.57 41.0461C1762.99 41.0461 1771.25 43.1758 1778.35 47.4353C1785.58 51.5657 1791.2 57.6323 1795.2 65.635C1799.33 73.5086 1801.39 83.1892 1801.39 94.677ZM1722.98 94.677C1722.98 102.809 1724.01 109.908 1726.08 115.974C1728.27 121.912 1731.63 126.494 1736.15 129.721C1740.66 132.948 1746.41 134.561 1753.38 134.561C1760.35 134.561 1766.09 132.948 1770.61 129.721C1775.13 126.494 1778.42 121.912 1780.48 115.974C1782.68 109.908 1783.77 102.809 1783.77 94.677C1783.77 86.4161 1782.68 79.3815 1780.48 73.5731C1778.29 67.7647 1774.93 63.3116 1770.42 60.2138C1766.03 56.9869 1760.28 55.3734 1753.18 55.3734C1742.6 55.3734 1734.92 58.8585 1730.14 65.8286C1725.37 72.7987 1722.98 82.4148 1722.98 94.677Z" fill="black"/>
|
||||
<path d="M1903.52 146.759H1886.29V57.116H1855.7C1854.41 73.5086 1852.79 87.5133 1850.86 99.1301C1848.92 110.618 1846.47 119.976 1843.5 127.204C1840.53 134.432 1836.98 139.724 1832.85 143.08C1828.72 146.436 1823.88 148.114 1818.33 148.114C1816.65 148.114 1814.97 147.985 1813.29 147.727C1811.75 147.598 1810.46 147.275 1809.42 146.759V133.981C1810.2 134.239 1811.04 134.432 1811.94 134.561C1812.84 134.69 1813.75 134.755 1814.65 134.755C1817.49 134.755 1820.07 133.593 1822.39 131.27C1824.72 128.947 1826.78 125.397 1828.59 120.621C1830.53 115.845 1832.27 109.843 1833.82 102.615C1835.37 95.2578 1836.72 86.6097 1837.88 76.6709C1839.05 66.7321 1840.08 55.5025 1840.98 42.9822H1903.52V146.759Z" fill="black"/>
|
||||
<path d="M233.046 305.467H98.671C70.764 305.467 56.8106 316.716 56.8106 339.212C56.8106 357.96 68.243 367.333 91.108 367.333H163.045C192.359 367.333 213.406 372.841 226.187 383.855C239.085 394.869 245.534 413.733 245.534 440.448C245.534 467.398 238.206 487.024 223.549 499.327C208.892 511.63 186.085 517.781 155.13 517.781H10.3772V471.733H146.511C161.403 471.733 172.015 469.682 178.346 465.581C185.265 461.129 188.724 453.454 188.724 442.557C188.724 431.426 185.558 423.576 179.226 419.006C173.48 414.788 163.807 412.679 150.205 412.679H86.0073C56.3415 412.679 34.5905 406.762 20.7543 394.927C6.91811 383.093 0 364.287 0 338.509C0 310.74 7.38713 290.528 22.1614 277.873C36.7011 265.57 59.5661 259.419 90.7562 259.419H233.046V305.467Z" fill="#FF5600"/>
|
||||
<path d="M332.428 259.419V414.085C332.428 437.519 336.532 454.04 344.74 463.648C353.417 473.842 368.719 478.939 390.646 478.939C412.69 478.939 427.992 473.842 436.551 463.648C444.642 454.157 448.687 437.636 448.687 414.085V259.419H503.036V415.491C503.036 449.939 497.994 473.139 487.91 485.09C467.976 508.759 435.555 520.593 390.646 520.593C345.737 520.593 313.198 508.759 293.03 485.09C283.18 473.373 278.256 450.173 278.256 415.491V259.419H332.428Z" fill="#FF5600"/>
|
||||
<path d="M666.087 305.467H603.121V381.746H669.429C701.792 381.746 717.973 369.033 717.973 343.606C717.973 329.429 713.81 319.469 705.485 313.728C697.629 308.221 684.496 305.467 666.087 305.467ZM548.772 259.419H666.791C703.961 259.419 729.288 263.696 742.773 272.249C766.576 287.481 778.477 311.267 778.477 343.606C778.477 374.305 768.51 396.743 748.577 410.921C738.61 417.951 726.65 422.638 712.696 424.982C702.964 426.622 688.424 427.442 669.077 427.442H603.121V517.781H548.772V259.419Z" fill="#FF5600"/>
|
||||
<path d="M915.498 304.413C876.803 304.413 856.401 324.449 854.29 364.521H1004.85V409.515H853.938C854.056 432.481 858.922 448.767 868.537 458.375C878.152 467.983 893.805 472.787 915.498 472.787H1004.85V517.781H912.859C895.154 517.781 881.083 516.551 870.647 514.09C856.694 510.692 843.913 504.365 832.305 495.109C805.805 474.018 792.555 440.038 792.555 393.17C792.555 347.473 802.463 313.786 822.279 292.11C842.095 270.316 872.817 259.419 914.443 259.419H1004.85V304.413H915.498Z" fill="#FF5600"/>
|
||||
<path d="M1045.13 259.419H1178.98C1209.93 259.419 1232.74 265.629 1247.4 278.049C1262.06 290.469 1269.38 310.154 1269.38 337.103C1269.38 378.113 1251.97 402.368 1217.15 409.867L1281.7 517.781H1220.49L1163.5 416.194H1099.48V517.781H1045.13V259.419ZM1166.14 305.467H1099.48V370.497H1166.14C1183.14 370.497 1195.22 368.329 1202.37 363.994C1210.35 359.19 1214.33 350.461 1214.33 337.806C1214.33 325.152 1210.35 316.423 1202.37 311.619C1195.45 307.518 1183.38 305.467 1166.14 305.467Z" fill="#FF5600"/>
|
||||
<path d="M1365.25 517.781H1308.44V259.419H1365.25V517.781Z" fill="#FF5600"/>
|
||||
<path d="M1524.43 298.613C1478 298.613 1454.78 327.847 1454.78 386.315C1454.78 418.069 1460.29 441.386 1471.31 456.266C1482.45 471.147 1500.16 478.587 1524.43 478.587C1570.98 478.587 1594.26 448.592 1594.26 388.6C1594.26 328.608 1570.98 298.613 1524.43 298.613ZM1395.33 385.964C1395.33 298.203 1438.36 254.322 1524.43 254.322C1568.28 254.322 1600.7 265.278 1621.69 287.189C1642.8 309.099 1653.35 342.903 1653.35 388.6C1653.35 434.297 1642.8 468.159 1621.69 490.187C1600.7 512.216 1568.28 523.23 1524.43 523.23C1479.99 523.23 1447.33 512.157 1426.46 490.012C1405.71 467.749 1395.33 433.066 1395.33 385.964Z" fill="#FF5600"/>
|
||||
<path d="M1683.44 259.419H1817.28C1848.24 259.419 1871.05 265.629 1885.7 278.049C1900.36 290.469 1907.69 310.154 1907.69 337.103C1907.69 378.113 1890.28 402.368 1855.45 409.867L1920 517.781H1858.79L1801.81 416.194H1737.78V517.781H1683.44V259.419ZM1804.44 305.467H1737.78V370.497H1804.44C1821.45 370.497 1833.52 368.329 1840.68 363.994C1848.65 359.19 1852.64 350.461 1852.64 337.806C1852.64 325.152 1848.65 316.423 1840.68 311.619C1833.76 307.518 1821.68 305.467 1804.44 305.467Z" fill="#FF5600"/>
|
||||
<path d="M0 685.164C0 643.255 33.8636 609.28 75.6364 609.28C117.409 609.28 151.273 643.255 151.273 685.164V1152.15C151.273 1194.06 117.409 1228.03 75.6364 1228.03C33.8636 1228.03 0 1194.06 0 1152.15V685.164Z" fill="#D9D9D9"/>
|
||||
<path d="M1768.73 685.164C1768.73 643.255 1802.59 609.28 1844.36 609.28C1886.14 609.28 1920 643.255 1920 685.164V1152.15C1920 1194.06 1886.14 1228.03 1844.36 1228.03C1802.59 1228.03 1768.73 1194.06 1768.73 1152.15V685.164Z" fill="#D9D9D9"/>
|
||||
<path d="M884.364 685.164C884.364 643.255 918.227 609.28 960 609.28C1001.77 609.28 1035.64 643.255 1035.64 685.164V1373.96C1035.64 1415.87 1001.77 1449.85 960 1449.85C918.227 1449.85 884.364 1415.87 884.364 1373.96V685.164Z" fill="#D9D9D9"/>
|
||||
<path d="M221.091 685.164C221.091 643.255 254.954 609.28 296.727 609.28C338.5 609.28 372.364 643.255 372.364 685.164V1257.22C372.364 1299.13 338.5 1333.1 296.727 1333.1C254.954 1333.1 221.091 1299.13 221.091 1257.22V685.164Z" fill="#D9D9D9"/>
|
||||
<path d="M1547.64 685.164C1547.64 643.255 1581.5 609.28 1623.27 609.28C1665.05 609.28 1698.91 643.255 1698.91 685.164V1257.22C1698.91 1299.13 1665.05 1333.1 1623.27 1333.1C1581.5 1333.1 1547.64 1299.13 1547.64 1257.22V685.164Z" fill="#D9D9D9"/>
|
||||
<path d="M442.182 685.164C442.182 643.255 476.045 609.28 517.818 609.28C559.591 609.28 593.455 643.255 593.455 685.164V1373.96C593.455 1415.87 559.591 1449.85 517.818 1449.85C476.045 1449.85 442.182 1415.87 442.182 1373.96V685.164Z" fill="#D9D9D9"/>
|
||||
<path d="M1326.55 685.164C1326.55 643.255 1360.41 609.28 1402.18 609.28C1443.95 609.28 1477.82 643.255 1477.82 685.164V1373.96C1477.82 1415.87 1443.95 1449.85 1402.18 1449.85C1360.41 1449.85 1326.55 1415.87 1326.55 1373.96V685.164Z" fill="#D9D9D9"/>
|
||||
<path d="M663.273 685.164C663.273 643.255 697.136 609.28 738.909 609.28C780.682 609.28 814.545 643.255 814.545 685.164V1490.71C814.545 1532.62 780.682 1566.59 738.909 1566.59C697.136 1566.59 663.273 1532.62 663.273 1490.71V685.164Z" fill="#D9D9D9"/>
|
||||
<path d="M1105.45 685.164C1105.45 643.255 1139.32 609.28 1181.09 609.28C1222.86 609.28 1256.73 643.255 1256.73 685.164V1490.71C1256.73 1532.62 1222.86 1566.59 1181.09 1566.59C1139.32 1566.59 1105.45 1532.62 1105.45 1490.71V685.164Z" fill="#D9D9D9"/>
|
||||
</svg>
|
After Width: | Height: | Size: 17 KiB |
|
@ -1,167 +1,19 @@
|
|||
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="1656.000000pt" height="1773.000000pt" viewBox="0 0 1656.000000 1773.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
|
||||
<g transform="translate(0.000000,1773.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M8965 17604 c-11 -3 -56 -12 -100 -20 -181 -35 -356 -107 -525 -219
|
||||
-169 -112 -223 -170 -707 -760 -72 -88 -267 -324 -433 -525 -336 -406 -779
|
||||
-943 -970 -1175 -69 -84 -186 -225 -260 -315 -74 -89 -148 -179 -165 -200 -16
|
||||
-21 -78 -96 -137 -166 -134 -163 -377 -457 -568 -689 -81 -99 -260 -315 -397
|
||||
-481 -136 -165 -300 -363 -363 -440 -134 -163 -287 -349 -495 -600 -83 -99
|
||||
-188 -227 -235 -284 -47 -57 -145 -176 -218 -264 -73 -89 -159 -192 -191 -231
|
||||
-126 -153 -451 -547 -552 -670 -59 -71 -165 -200 -236 -285 -70 -86 -189 -229
|
||||
-263 -320 -74 -90 -204 -247 -288 -349 -85 -102 -202 -244 -261 -316 -186
|
||||
-226 -491 -595 -611 -740 -63 -77 -156 -189 -205 -249 -222 -269 -260 -315
|
||||
-314 -381 -177 -217 -276 -427 -325 -694 -24 -127 -22 -395 5 -524 62 -304
|
||||
186 -536 403 -753 192 -192 425 -326 666 -382 25 -6 70 -17 100 -24 87 -21
|
||||
444 -17 545 5 192 43 386 125 536 228 169 116 212 163 739 804 69 84 186 225
|
||||
260 315 74 90 191 231 260 315 170 207 446 542 631 765 84 102 203 245 263
|
||||
319 61 74 169 204 240 290 71 86 206 251 301 366 95 116 235 284 310 375 233
|
||||
282 549 664 844 1024 107 130 200 236 206 236 8 0 14 -47 18 -157 4 -87 11
|
||||
-241 17 -343 5 -102 17 -309 25 -460 15 -267 25 -444 45 -830 5 -102 14 -268
|
||||
20 -370 5 -102 14 -273 20 -380 5 -107 17 -316 25 -465 16 -281 28 -515 46
|
||||
-920 25 -562 26 -579 44 -630 40 -113 118 -202 221 -249 139 -65 169 -83 209
|
||||
-128 76 -85 115 -192 130 -363 4 -46 1 -96 -9 -147 -28 -145 -73 -212 -185
|
||||
-277 -195 -115 -281 -214 -362 -421 -16 -43 -17 -179 -1 -285 7 -44 23 -165
|
||||
37 -270 14 -104 30 -221 35 -260 5 -38 14 -108 20 -155 6 -47 15 -116 20 -155
|
||||
10 -72 52 -387 70 -530 30 -231 73 -378 176 -603 13 -29 24 -54 24 -56 0 -2
|
||||
21 -48 46 -102 25 -55 52 -112 59 -129 7 -16 34 -73 58 -125 24 -52 53 -115
|
||||
65 -140 134 -294 573 -1170 586 -1169 6 0 37 53 68 117 169 345 365 756 441
|
||||
922 14 30 44 96 67 145 173 372 328 739 356 844 22 85 41 186 54 291 6 52 15
|
||||
129 20 170 6 41 21 170 35 285 24 198 33 276 55 455 5 41 14 116 20 165 6 50
|
||||
22 178 35 285 22 178 23 201 11 261 -40 186 -167 350 -353 454 -99 56 -139 93
|
||||
-172 159 -51 104 -64 239 -36 396 18 106 64 200 125 260 46 45 55 51 185 111
|
||||
89 41 161 113 204 202 36 75 43 127 61 422 6 99 15 252 21 340 42 687 47 778
|
||||
84 1510 9 176 20 329 24 339 7 19 82 40 346 97 88 19 128 28 210 48 104 25
|
||||
480 111 525 121 19 4 107 24 195 45 159 37 184 43 280 64 28 6 97 22 155 36
|
||||
58 14 125 30 150 35 25 5 124 28 220 50 281 66 482 112 520 120 19 4 107 24
|
||||
195 45 164 38 194 45 280 64 28 6 118 26 200 46 83 19 229 53 325 75 96 22
|
||||
243 56 325 75 83 20 173 40 200 46 96 21 121 27 235 54 63 15 135 32 160 37
|
||||
25 6 61 13 80 18 56 12 437 100 525 121 44 11 98 23 120 28 22 5 112 25 200
|
||||
46 88 21 180 42 205 47 92 20 119 26 275 63 88 21 176 41 195 45 123 28 285
|
||||
85 368 132 17 10 49 27 69 39 249 141 491 442 587 729 54 165 66 246 66 465 0
|
||||
159 -4 217 -19 285 -80 358 -282 653 -586 855 -118 78 -185 111 -330 164 -224
|
||||
81 -526 92 -797 27 -78 -19 -222 -52 -308 -72 -36 -8 -83 -19 -105 -24 -22 -5
|
||||
-83 -19 -135 -31 -52 -12 -160 -37 -240 -55 -174 -41 -200 -48 -310 -73 -47
|
||||
-10 -137 -31 -200 -45 -63 -15 -133 -31 -155 -36 -22 -5 -78 -18 -125 -29
|
||||
-174 -41 -267 -63 -330 -77 -91 -21 -149 -34 -195 -45 -181 -42 -454 -105
|
||||
-565 -130 -74 -17 -182 -42 -240 -56 -368 -85 -715 -166 -750 -173 -68 -15
|
||||
-221 -50 -480 -111 -47 -11 -103 -24 -125 -29 -22 -5 -80 -19 -130 -30 -87
|
||||
-20 -177 -41 -260 -60 -22 -5 -78 -18 -125 -29 -317 -74 -449 -105 -480 -111
|
||||
-19 -4 -107 -24 -195 -45 -88 -21 -176 -41 -195 -45 -19 -4 -165 -38 -325 -75
|
||||
-159 -37 -306 -71 -325 -75 -49 -11 -204 -46 -345 -79 -66 -16 -183 -43 -260
|
||||
-61 -77 -18 -187 -43 -245 -56 -128 -30 -166 -39 -250 -58 -63 -14 -156 -36
|
||||
-330 -77 -47 -11 -103 -24 -125 -29 -22 -5 -64 -15 -92 -21 -29 -7 -55 -10
|
||||
-59 -7 -3 4 6 19 19 35 24 27 139 166 327 394 47 57 130 158 185 224 55 67
|
||||
181 220 280 340 99 120 245 298 325 394 80 97 196 237 257 311 61 74 180 219
|
||||
265 321 84 102 214 260 288 350 74 90 191 231 260 314 69 83 195 236 280 340
|
||||
85 104 193 235 240 291 47 55 132 159 190 229 98 120 175 213 470 570 200 242
|
||||
252 308 296 375 353 548 301 1254 -130 1750 -199 228 -482 394 -796 465 -73
|
||||
17 -435 31 -485 19z m470 -506 c187 -68 325 -156 440 -280 77 -83 128 -165
|
||||
186 -298 49 -115 69 -219 69 -365 -1 -137 -18 -239 -59 -336 -62 -149 -118
|
||||
-232 -321 -474 -32 -39 -285 -345 -478 -579 -226 -275 -299 -363 -442 -535
|
||||
-85 -102 -164 -198 -175 -212 -11 -15 -47 -59 -80 -99 -33 -39 -76 -91 -95
|
||||
-115 -19 -23 -118 -142 -220 -265 -102 -122 -198 -240 -215 -261 -16 -21 -100
|
||||
-122 -185 -225 -85 -103 -190 -230 -233 -283 -43 -53 -105 -127 -138 -166 -73
|
||||
-87 -283 -342 -454 -550 -71 -87 -166 -201 -210 -254 -44 -53 -92 -110 -105
|
||||
-127 -14 -18 -97 -118 -184 -224 -208 -251 -286 -357 -286 -386 0 -18 -18 -37
|
||||
-72 -78 -40 -29 -94 -80 -119 -112 -26 -32 -97 -120 -158 -194 -62 -74 -157
|
||||
-189 -211 -255 -54 -66 -159 -192 -232 -281 -73 -88 -169 -205 -213 -259 -44
|
||||
-54 -98 -119 -120 -145 -22 -26 -65 -77 -95 -114 -30 -38 -104 -127 -164 -200
|
||||
-60 -72 -133 -160 -162 -196 -30 -36 -93 -113 -141 -171 -208 -251 -364 -440
|
||||
-440 -534 -46 -55 -107 -129 -137 -165 -30 -36 -99 -119 -153 -185 -55 -66
|
||||
-144 -174 -198 -240 -55 -65 -111 -134 -125 -151 -14 -17 -52 -64 -85 -104
|
||||
-33 -39 -76 -91 -95 -115 -19 -23 -116 -140 -215 -260 -99 -120 -196 -237
|
||||
-215 -261 -19 -23 -62 -75 -95 -114 -33 -40 -73 -90 -90 -110 -185 -231 -401
|
||||
-483 -477 -556 -102 -96 -218 -165 -368 -217 -145 -51 -433 -53 -575 -5 -81
|
||||
27 -260 122 -315 166 -63 51 -143 133 -189 195 -50 67 -123 211 -155 309 -24
|
||||
71 -26 89 -26 266 0 217 8 257 87 419 54 112 98 173 273 384 234 281 324 391
|
||||
355 430 33 42 239 291 405 490 58 70 130 157 160 194 30 37 114 138 185 224
|
||||
72 87 189 229 260 316 72 87 168 204 215 260 47 56 110 133 141 171 32 38 106
|
||||
128 165 200 60 73 134 162 164 199 30 38 73 89 95 115 22 26 87 104 145 175
|
||||
58 71 154 187 213 259 59 72 153 185 207 251 54 66 148 179 207 251 59 72 155
|
||||
188 213 259 58 71 123 149 145 175 22 26 103 123 179 216 208 252 278 337 479
|
||||
580 100 121 241 292 312 379 72 86 189 228 260 315 72 86 189 228 260 315 72
|
||||
87 168 204 215 260 47 56 144 173 215 260 191 233 289 351 353 429 31 38 73
|
||||
88 92 111 19 23 60 73 91 111 32 38 107 130 168 204 62 74 157 189 211 255 54
|
||||
66 159 192 232 281 73 88 169 205 213 259 44 54 100 122 125 151 25 28 68 80
|
||||
95 114 47 59 274 334 450 545 44 53 93 113 108 133 57 75 208 231 269 277 65
|
||||
49 160 100 251 136 113 45 143 49 347 46 181 -3 200 -5 265 -29z m5801 -4819
|
||||
c63 -12 143 -42 239 -91 181 -92 313 -230 403 -418 71 -147 72 -153 72 -379 0
|
||||
-194 -1 -207 -26 -275 -14 -39 -49 -116 -77 -170 -44 -84 -68 -116 -152 -200
|
||||
-108 -109 -169 -149 -327 -212 -83 -33 -213 -70 -333 -96 -76 -15 -110 -23
|
||||
-235 -53 -133 -31 -473 -109 -675 -154 -77 -18 -178 -41 -225 -52 -47 -11
|
||||
-103 -24 -125 -29 -22 -5 -80 -19 -130 -30 -98 -23 -162 -38 -300 -69 -49 -12
|
||||
-178 -41 -285 -66 -107 -25 -256 -59 -330 -76 -74 -17 -182 -42 -240 -55 -58
|
||||
-14 -123 -29 -145 -34 -80 -18 -173 -40 -285 -66 -63 -15 -131 -30 -150 -34
|
||||
-100 -22 -420 -95 -525 -120 -66 -15 -183 -43 -260 -60 -121 -28 -235 -54
|
||||
-390 -90 -22 -5 -80 -19 -130 -30 -49 -11 -157 -36 -240 -55 -82 -20 -170 -40
|
||||
-195 -46 -40 -8 -102 -23 -370 -85 -85 -20 -146 -33 -195 -44 -43 -10 -119
|
||||
-27 -260 -60 -49 -11 -110 -25 -135 -31 -25 -6 -61 -14 -80 -19 -19 -5 -55
|
||||
-14 -80 -20 -113 -28 -254 -177 -279 -295 -7 -33 -17 -73 -23 -90 -10 -32 -19
|
||||
-166 -43 -625 -23 -461 -35 -663 -45 -825 -5 -82 -14 -229 -20 -325 -6 -96
|
||||
-15 -240 -20 -320 -5 -80 -12 -195 -16 -256 l-6 -111 -52 -23 c-56 -25 -170
|
||||
-104 -230 -159 -48 -45 -151 -182 -182 -242 -12 -25 -35 -93 -49 -150 -14 -57
|
||||
-30 -120 -35 -139 -34 -138 -37 -295 -7 -410 8 -30 22 -91 32 -135 27 -119 89
|
||||
-234 184 -339 34 -37 153 -125 216 -160 62 -35 100 -70 118 -110 13 -27 12
|
||||
-52 -8 -211 -13 -99 -28 -223 -34 -275 -7 -52 -16 -129 -21 -170 -5 -41 -14
|
||||
-115 -20 -165 -6 -49 -15 -124 -20 -165 -6 -41 -21 -167 -35 -280 -13 -113
|
||||
-30 -248 -36 -300 -6 -52 -18 -115 -26 -139 -14 -44 -86 -224 -122 -305 -10
|
||||
-22 -35 -79 -56 -126 -21 -47 -46 -104 -56 -127 -11 -23 -19 -44 -19 -46 0 -3
|
||||
-24 -56 -54 -118 -30 -63 -79 -168 -110 -234 -30 -66 -61 -121 -68 -123 -7 -1
|
||||
-26 25 -42 60 -16 35 -58 124 -94 198 -168 352 -351 768 -371 845 -6 22 -22
|
||||
130 -36 240 -14 110 -30 229 -35 265 -5 36 -14 103 -20 150 -6 47 -15 117 -20
|
||||
155 -5 39 -14 108 -20 155 -6 47 -15 114 -20 150 -5 36 -16 119 -25 185 -8 66
|
||||
-19 149 -25 185 -24 166 -23 172 8 216 17 23 51 53 78 69 134 78 217 149 286
|
||||
242 85 115 100 147 138 306 46 198 52 245 39 350 -14 126 -83 399 -114 456
|
||||
-62 112 -153 219 -240 283 -90 65 -148 100 -196 117 -25 9 -29 15 -29 50 0 22
|
||||
-4 118 -10 213 -5 95 -14 288 -20 428 -6 140 -15 329 -20 420 -11 185 -26 465
|
||||
-40 735 -11 205 -24 456 -60 1120 -5 105 -16 312 -25 460 -27 494 -38 699 -39
|
||||
769 l-1 70 155 37 c85 21 178 43 205 49 79 17 122 27 255 59 69 16 159 37 200
|
||||
46 41 9 111 25 155 35 44 10 109 26 145 34 96 22 239 56 285 66 22 5 81 19
|
||||
130 30 50 11 158 36 240 55 83 20 170 40 195 46 40 8 102 23 370 85 36 8 85
|
||||
19 110 25 25 6 61 14 80 19 19 4 107 25 195 45 88 20 198 45 245 56 47 11 103
|
||||
24 125 29 22 5 110 26 195 46 85 20 193 45 240 55 130 30 237 55 385 89 50 11
|
||||
110 25 135 31 67 15 109 25 275 64 83 19 191 44 240 56 248 56 459 105 560
|
||||
129 44 10 123 28 175 40 52 12 142 33 200 46 58 14 124 29 148 34 23 6 61 14
|
||||
85 20 44 10 292 67 437 101 47 11 103 24 125 29 48 11 139 32 260 60 50 11
|
||||
108 25 130 30 22 5 78 18 125 29 206 48 395 92 525 121 77 18 203 47 280 65
|
||||
160 37 229 52 300 64 73 13 302 13 371 0z"/>
|
||||
<path d="M11238 2796 c-42 -15 -48 -20 -430 -339 -329 -275 -333 -279 -333
|
||||
-402 0 -76 2 -83 35 -130 49 -68 113 -100 200 -100 43 1 77 7 100 19 31 17
|
||||
346 275 603 494 117 100 141 139 141 232 0 47 -6 77 -22 106 -55 107 -184 159
|
||||
-294 120z"/>
|
||||
<path d="M4330 2746 c-112 -57 -160 -196 -106 -312 24 -51 50 -76 221 -214 38
|
||||
-30 85 -69 104 -86 140 -120 383 -310 416 -325 165 -76 364 85 326 263 -7 28
|
||||
-21 67 -32 85 -26 41 -667 568 -724 594 -58 27 -148 25 -205 -5z"/>
|
||||
<path d="M9833 1752 c-17 -9 -188 -147 -379 -307 -191 -159 -390 -326 -444
|
||||
-370 -399 -329 -405 -336 -405 -455 0 -80 20 -125 80 -178 80 -70 211 -76 295
|
||||
-14 19 15 172 141 340 281 168 140 400 333 515 430 116 96 229 193 253 215 81
|
||||
76 106 157 77 249 -35 112 -113 167 -232 167 -44 -1 -79 -7 -100 -18z"/>
|
||||
<path d="M12755 1754 c-52 -13 -674 -270 -702 -290 -94 -70 -107 -206 -27
|
||||
-294 35 -39 103 -70 153 -70 21 0 277 98 456 174 17 7 71 30 120 51 146 61
|
||||
149 62 176 92 88 93 75 237 -26 304 -40 27 -111 42 -150 33z"/>
|
||||
<path d="M5585 1729 c-154 -77 -183 -272 -57 -391 20 -19 233 -195 472 -390
|
||||
239 -195 470 -383 513 -419 43 -35 105 -83 138 -107 59 -41 62 -42 143 -42 74
|
||||
0 87 3 129 29 115 74 146 222 68 333 -29 42 -1145 959 -1203 989 -51 26 -149
|
||||
25 -203 -2z"/>
|
||||
<path d="M2936 1696 c-106 -39 -160 -135 -134 -240 22 -87 55 -110 303 -210
|
||||
121 -48 229 -91 240 -96 186 -76 228 -90 272 -90 68 0 130 34 168 90 56 85 33
|
||||
212 -48 267 -18 12 -147 67 -287 123 -140 56 -264 105 -275 110 -11 4 -43 17
|
||||
-71 29 -71 29 -122 34 -168 17z"/>
|
||||
<path d="M11370 1271 c-22 -7 -524 -211 -605 -246 -16 -7 -82 -34 -145 -60
|
||||
-63 -26 -133 -55 -155 -65 -22 -9 -89 -36 -148 -60 -128 -52 -169 -86 -193
|
||||
-164 -15 -46 -15 -61 -5 -99 25 -87 112 -157 194 -157 35 0 140 37 277 97 75
|
||||
33 106 46 455 188 572 233 540 215 571 322 14 48 14 58 0 107 -31 105 -144
|
||||
168 -246 137z"/>
|
||||
<path d="M4304 1233 c-32 -6 -105 -72 -120 -110 -34 -79 -7 -187 58 -237 18
|
||||
-13 137 -65 263 -115 127 -50 241 -96 255 -102 34 -16 28 -13 369 -148 380
|
||||
-151 411 -155 504 -52 81 89 53 245 -53 301 -19 10 -138 60 -265 110 -126 50
|
||||
-239 95 -250 100 -11 5 -162 65 -335 134 -319 127 -346 135 -426 119z"/>
|
||||
</g>
|
||||
<svg width="100%" height="100%" viewBox="0 0 1920 1313" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M233.046 51.1452H98.671C70.764 51.1452 56.8106 62.3936 56.8106 84.8904C56.8106 103.638 68.243 113.011 91.108 113.011H163.045C192.359 113.011 213.406 118.519 226.187 129.533C239.085 140.547 245.534 159.411 245.534 186.126C245.534 213.076 238.206 232.702 223.549 245.005C208.892 257.308 186.085 263.459 155.13 263.459H10.3772V217.411H146.511C161.403 217.411 172.015 215.36 178.346 211.259C185.265 206.807 188.724 199.132 188.724 188.235C188.724 177.104 185.558 169.254 179.226 164.684C173.48 160.466 163.807 158.357 150.205 158.357H86.0073C56.3415 158.357 34.5905 152.44 20.7543 140.605C6.91811 128.771 0 109.965 0 84.1874C0 56.4179 7.38713 36.2059 22.1614 23.5514C36.7011 11.2484 59.5661 5.09694 90.7562 5.09694H233.046V51.1452Z" fill="#FF5600"/>
|
||||
<path d="M332.428 5.09694V159.763C332.428 183.197 336.532 199.718 344.74 209.326C353.417 219.52 368.719 224.617 390.646 224.617C412.69 224.617 427.992 219.52 436.551 209.326C444.642 199.835 448.687 183.314 448.687 159.763V5.09694H503.036V161.169C503.036 195.617 497.994 218.817 487.91 230.768C467.976 254.437 435.555 266.271 390.646 266.271C345.737 266.271 313.198 254.437 293.03 230.768C283.18 219.051 278.256 195.851 278.256 161.169V5.09694H332.428Z" fill="#FF5600"/>
|
||||
<path d="M666.087 51.1452H603.121V127.424H669.429C701.792 127.424 717.973 114.71 717.973 89.2843C717.973 75.1066 713.81 65.1471 705.485 59.4057C697.629 53.8987 684.496 51.1452 666.087 51.1452ZM548.772 5.09694H666.791C703.961 5.09694 729.288 9.37368 742.773 17.9272C766.576 33.1594 778.477 56.9451 778.477 89.2843C778.477 119.983 768.51 142.421 748.577 156.599C738.61 163.629 726.65 168.316 712.696 170.66C702.964 172.3 688.424 173.12 669.077 173.12H603.121V263.459H548.772V5.09694Z" fill="#FF5600"/>
|
||||
<path d="M915.498 50.0906C876.803 50.0906 856.401 70.1269 854.29 110.199H1004.85V155.193H853.938C854.056 178.159 858.922 194.445 868.537 204.053C878.152 213.661 893.805 218.465 915.498 218.465H1004.85V263.459H912.859C895.154 263.459 881.083 262.229 870.647 259.768C856.694 256.37 843.913 250.043 832.305 240.787C805.805 219.696 792.555 185.716 792.555 138.848C792.555 93.151 802.463 59.4643 822.279 37.7877C842.095 15.9939 872.817 5.09694 914.443 5.09694H1004.85V50.0906H915.498Z" fill="#FF5600"/>
|
||||
<path d="M1045.13 5.09694H1178.98C1209.93 5.09694 1232.74 11.307 1247.4 23.7271C1262.06 36.1473 1269.38 55.832 1269.38 82.7814C1269.38 123.791 1251.97 148.046 1217.15 155.545L1281.7 263.459H1220.49L1163.5 161.872H1099.48V263.459H1045.13V5.09694ZM1166.14 51.1452H1099.48V116.175H1166.14C1183.14 116.175 1195.22 114.007 1202.37 109.672C1210.35 104.868 1214.33 96.1388 1214.33 83.4844C1214.33 70.8299 1210.35 62.1007 1202.37 57.2966C1195.45 53.1957 1183.38 51.1452 1166.14 51.1452Z" fill="#FF5600"/>
|
||||
<path d="M1365.25 263.459H1308.44V5.09694H1365.25V263.459Z" fill="#FF5600"/>
|
||||
<path d="M1524.43 44.2907C1478 44.2907 1454.78 73.5248 1454.78 131.993C1454.78 163.747 1460.29 187.064 1471.31 201.944C1482.45 216.825 1500.16 224.265 1524.43 224.265C1570.98 224.265 1594.26 194.27 1594.26 134.278C1594.26 74.2865 1570.98 44.2907 1524.43 44.2907ZM1395.33 131.642C1395.33 43.8806 1438.36 0 1524.43 0C1568.28 0 1600.7 10.9555 1621.69 32.8665C1642.8 54.7775 1653.35 88.5813 1653.35 134.278C1653.35 179.975 1642.8 213.837 1621.69 235.865C1600.7 257.893 1568.28 268.908 1524.43 268.908C1479.99 268.908 1447.33 257.835 1426.46 235.69C1405.71 213.427 1395.33 178.744 1395.33 131.642Z" fill="#FF5600"/>
|
||||
<path d="M1683.44 5.09694H1817.28C1848.24 5.09694 1871.05 11.307 1885.7 23.7271C1900.36 36.1473 1907.69 55.832 1907.69 82.7814C1907.69 123.791 1890.28 148.046 1855.45 155.545L1920 263.459H1858.79L1801.81 161.872H1737.78V263.459H1683.44V5.09694ZM1804.44 51.1452H1737.78V116.175H1804.44C1821.45 116.175 1833.52 114.007 1840.68 109.672C1848.65 104.868 1852.64 96.1388 1852.64 83.4844C1852.64 70.8299 1848.65 62.1007 1840.68 57.2966C1833.76 53.1957 1821.68 51.1452 1804.44 51.1452Z" fill="#FF5600"/>
|
||||
<path d="M0 430.842C0 388.933 33.8636 354.958 75.6364 354.958C117.409 354.958 151.273 388.933 151.273 430.842V897.823C151.273 939.733 117.409 973.708 75.6364 973.708C33.8636 973.708 0 939.733 0 897.823V430.842Z" fill="#D9D9D9"/>
|
||||
<path d="M1768.73 430.842C1768.73 388.933 1802.59 354.958 1844.36 354.958C1886.14 354.958 1920 388.933 1920 430.842V897.823C1920 939.733 1886.14 973.708 1844.36 973.708C1802.59 973.708 1768.73 939.733 1768.73 897.823V430.842Z" fill="#D9D9D9"/>
|
||||
<path d="M884.364 430.842C884.364 388.933 918.227 354.958 960 354.958C1001.77 354.958 1035.64 388.933 1035.64 430.842V1119.64C1035.64 1161.55 1001.77 1195.52 960 1195.52C918.227 1195.52 884.364 1161.55 884.364 1119.64V430.842Z" fill="#D9D9D9"/>
|
||||
<path d="M221.091 430.842C221.091 388.933 254.954 354.958 296.727 354.958C338.5 354.958 372.364 388.933 372.364 430.842V1002.89C372.364 1044.8 338.5 1078.78 296.727 1078.78C254.954 1078.78 221.091 1044.8 221.091 1002.89V430.842Z" fill="#D9D9D9"/>
|
||||
<path d="M1547.64 430.842C1547.64 388.933 1581.5 354.958 1623.27 354.958C1665.05 354.958 1698.91 388.933 1698.91 430.842V1002.89C1698.91 1044.8 1665.05 1078.78 1623.27 1078.78C1581.5 1078.78 1547.64 1044.8 1547.64 1002.89V430.842Z" fill="#D9D9D9"/>
|
||||
<path d="M442.182 430.842C442.182 388.933 476.045 354.958 517.818 354.958C559.591 354.958 593.455 388.933 593.455 430.842V1119.64C593.455 1161.55 559.591 1195.52 517.818 1195.52C476.045 1195.52 442.182 1161.55 442.182 1119.64V430.842Z" fill="#D9D9D9"/>
|
||||
<path d="M1326.55 430.842C1326.55 388.933 1360.41 354.958 1402.18 354.958C1443.95 354.958 1477.82 388.933 1477.82 430.842V1119.64C1477.82 1161.55 1443.95 1195.52 1402.18 1195.52C1360.41 1195.52 1326.55 1161.55 1326.55 1119.64V430.842Z" fill="#D9D9D9"/>
|
||||
<path d="M663.273 430.842C663.273 388.933 697.136 354.958 738.909 354.958C780.682 354.958 814.545 388.933 814.545 430.842V1236.38C814.545 1278.29 780.682 1312.27 738.909 1312.27C697.136 1312.27 663.273 1278.29 663.273 1236.38V430.842Z" fill="#D9D9D9"/>
|
||||
<path d="M1105.45 430.842C1105.45 388.933 1139.32 354.958 1181.09 354.958C1222.86 354.958 1256.73 388.933 1256.73 430.842V1236.38C1256.73 1278.29 1222.86 1312.27 1181.09 1312.27C1139.32 1312.27 1105.45 1278.29 1105.45 1236.38V430.842Z" fill="#D9D9D9"/>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 6.1 KiB |
|
@ -1,34 +1,26 @@
|
|||
$bg: #2D3031;
|
||||
$textColor: #fff;
|
||||
$bg: fade-out(#fff, 0.05);
|
||||
$textColor: #484848;
|
||||
$textColor2: #9A9697;
|
||||
$primary: #E75B12;
|
||||
$boxShadow: 0px 0px 8px rgba(0, 0, 0, .25);
|
||||
|
||||
.homelink {
|
||||
position: absolute;
|
||||
right: 2rem;
|
||||
top: 4rem;
|
||||
top: 2rem;
|
||||
|
||||
transition: right 300ms linear;
|
||||
|
||||
&.main {
|
||||
right: auto;
|
||||
left: 2rem;
|
||||
}
|
||||
|
||||
a {
|
||||
background-color: $bg;
|
||||
color: $textColor;
|
||||
color: $bg;
|
||||
line-height: 1;
|
||||
font-size: 3rem;
|
||||
height: 7rem;
|
||||
font-size: 2.5rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border-radius: 1rem;
|
||||
opacity: 0.97;
|
||||
}
|
||||
|
||||
svg {
|
||||
transition: all 400ms linear;
|
||||
}
|
||||
filter: drop-shadow($boxShadow);
|
||||
}
|
||||
|
||||
&.open {
|
||||
|
@ -40,10 +32,83 @@ $primary: #E75B12;
|
|||
}
|
||||
}
|
||||
|
||||
.itemnav {
|
||||
position: absolute;
|
||||
bottom: 5rem;
|
||||
left: 50%;
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr 1fr;
|
||||
grid-template-rows: 1fr 1fr;
|
||||
// flex-wrap: wrap;
|
||||
column-gap: 1rem;
|
||||
max-width: 8rem;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
>* {
|
||||
grid-row-start: 2;
|
||||
grid-row-end: 2;
|
||||
line-height: 1;
|
||||
font-size: 2.5rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
border-radius: 50%;
|
||||
background-color: $bg;
|
||||
color: var(--primary-color);
|
||||
|
||||
width: 2.5rem;
|
||||
height: 2.5rem;
|
||||
filter: drop-shadow($boxShadow);
|
||||
|
||||
&.invisible {
|
||||
visibility: hidden;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
>a {
|
||||
line-height: 1;
|
||||
font-size: 0;
|
||||
color: inherit;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
svg {
|
||||
width: 50%;
|
||||
height: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
&_one {
|
||||
grid-column-start: 2;
|
||||
grid-column-end: 4;
|
||||
grid-row-start: 1;
|
||||
grid-row-end: 1;
|
||||
margin: 1rem 0.75rem;
|
||||
}
|
||||
&_big {
|
||||
width: 4rem;
|
||||
height: 4rem;
|
||||
|
||||
}
|
||||
|
||||
&-deep {
|
||||
svg {
|
||||
width: 70%;
|
||||
height: 70%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
width: 30vw;
|
||||
top: 4rem;
|
||||
top: 2rem;
|
||||
right: -50%;
|
||||
bottom: 0;
|
||||
transition: all 300ms linear;
|
||||
|
@ -51,6 +116,8 @@ $primary: #E75B12;
|
|||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1.5rem;
|
||||
color: #484848;
|
||||
pointer-events: none;
|
||||
|
||||
&.open {
|
||||
right: 0;
|
||||
|
@ -62,60 +129,129 @@ $primary: #E75B12;
|
|||
}
|
||||
|
||||
&-content {
|
||||
max-height: 50vh;
|
||||
overflow: auto;
|
||||
|
||||
pointer-events: all;
|
||||
background-color: $bg;
|
||||
border-top-left-radius: 2rem;
|
||||
border-bottom-left-radius: 2rem;
|
||||
|
||||
padding: 1.5rem;
|
||||
border-top-left-radius: 0.5rem;
|
||||
border-bottom-left-radius: 0.5rem;
|
||||
box-shadow: $boxShadow;
|
||||
|
||||
color: $textColor;
|
||||
font-family: 'Montserrat';
|
||||
}
|
||||
|
||||
&-list {}
|
||||
|
||||
&-list-item {
|
||||
font-size: 1.5rem;
|
||||
color: $textColor2;
|
||||
|
||||
display: flex;
|
||||
|
||||
input {
|
||||
margin-right: 2rem;
|
||||
|
||||
&.checked+label {
|
||||
color: $primary;
|
||||
}
|
||||
}
|
||||
flex-direction: column;
|
||||
max-height: calc(100vh - 8rem);
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 3rem;
|
||||
text-align: center;
|
||||
margin-bottom: 1rem;
|
||||
&-accordion {
|
||||
padding: 1.125rem 1rem;
|
||||
border-bottom: 2px solid var(--primary-color);
|
||||
min-height: 1.625rem;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
font-weight: 800;
|
||||
&:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-weight: 700;
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 1rem;
|
||||
&:not(:last-child) {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
a {
|
||||
background-color: darken($textColor2, 30%);
|
||||
opacity: 0.97;
|
||||
border-radius: 1rem;
|
||||
height: 3.75rem;
|
||||
color: $primary;
|
||||
|
||||
&-title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
gap: 0.75rem;
|
||||
color: var(--primary-color);
|
||||
cursor: pointer;
|
||||
|
||||
svg {
|
||||
flex-shrink: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&-content {
|
||||
height: calc(100% - 2rem);
|
||||
overflow: auto;
|
||||
margin-top: 1.125rem;
|
||||
padding-left: 2rem;
|
||||
scrollbar-gutter: stable;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.5rem;
|
||||
text-align: center;
|
||||
padding: 0.5rem 1rem;
|
||||
min-height: 3rem;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-decoration: none;
|
||||
font-size: 2rem;
|
||||
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
line-height: 1;
|
||||
|
||||
border-bottom: 2px solid var(--primary-color);
|
||||
}
|
||||
|
||||
&-list {
|
||||
&-item {
|
||||
font-size: 1.25rem;
|
||||
position: relative;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
margin-right: 0.25rem;
|
||||
margin-bottom: 0.25rem;
|
||||
|
||||
input[type=radio],
|
||||
input[type=checkbox] {
|
||||
order: 10;
|
||||
|
||||
&:checked + label {
|
||||
font-weight: bolder;
|
||||
}
|
||||
}
|
||||
|
||||
label {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
$r: 0.5rem;
|
||||
|
||||
&:before,
|
||||
&::after {
|
||||
content: '';
|
||||
display: block;
|
||||
background-color: var(--primary-color);
|
||||
position: absolute;
|
||||
left: -1.5rem;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
&:before {
|
||||
width: $r;
|
||||
height: $r;
|
||||
border-radius: 50%;
|
||||
top: calc(50% - 0.125rem)
|
||||
}
|
||||
|
||||
&:after {
|
||||
width: 0.125rem;
|
||||
top: 50%;
|
||||
bottom: -50%;
|
||||
transform: translate3d((0.125rem)*1.5, -100%, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,126 @@
|
|||
<script setup lang="ts">
|
||||
import { useRouter } from "vue-router";
|
||||
|
||||
import GalleryItem from './item.vue';
|
||||
import KLogo from "../../assets/promo/logo.svg";
|
||||
import { useItem } from "../../stores/item";
|
||||
|
||||
const router = useRouter()
|
||||
const pageStore = useItem()
|
||||
|
||||
const startColor = `hsl(${(Math.random() * 360).toFixed()}, 100%, 50%)`
|
||||
const endColor = `hsl(${(Math.random() * 360).toFixed()}, 100%, 50%)`
|
||||
</script>
|
||||
<template>
|
||||
<div class="main">
|
||||
<div class="pin" @click="router.push(`/${pageStore.page.slug}/${pageStore.page.scene_3d}`)">
|
||||
<KLogo />
|
||||
</div>
|
||||
<GalleryItem :files="pageStore.page.images" v-if="pageStore.page.images && pageStore.page.images.length" />
|
||||
</div>
|
||||
</template>
|
||||
<style scoped lang="scss">
|
||||
* {
|
||||
--logo-start-color: v-bind(startColor);
|
||||
--logo-end-color: v-bind(endColor);
|
||||
--anim-time: 4s;
|
||||
}
|
||||
|
||||
.main {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
|
||||
background-image: url(../../assets/promo/map.png);
|
||||
background-position: 50% 100%;
|
||||
background-size: auto 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.pin {
|
||||
cursor: pointer;
|
||||
|
||||
border-radius: 0.25rem;
|
||||
overflow: hidden;
|
||||
|
||||
position: absolute;
|
||||
bottom: 20vh;
|
||||
left: calc(50% - 1vw);
|
||||
|
||||
color: white;
|
||||
|
||||
width: 4rem;
|
||||
height: 4rem;
|
||||
padding: 0.25rem;
|
||||
|
||||
animation: bounce2 var(--anim-time) ease infinite;
|
||||
transition: all 300ms linear;
|
||||
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -2rem;
|
||||
right: -2rem;
|
||||
bottom: -2rem;
|
||||
left: -2rem;
|
||||
background-image: linear-gradient(var(--logo-start-color), var(--logo-end-color));
|
||||
animation: bounce2grad var(--anim-time) ease infinite;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
svg {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
color: #fff;
|
||||
fill: currentColor;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
// animation-play-state: paused;
|
||||
animation: none;
|
||||
transform: scale(1.5);
|
||||
|
||||
&::before {
|
||||
// animation-play-state: paused;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@keyframes bounce2grad {
|
||||
|
||||
0%,
|
||||
20%,
|
||||
50%,
|
||||
80%,
|
||||
100% {
|
||||
transform: rotate(90deg)
|
||||
}
|
||||
|
||||
40% {
|
||||
transform: rotate(60deg);
|
||||
}
|
||||
|
||||
60% {
|
||||
transform: rotate(20deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes bounce2 {
|
||||
|
||||
0%,
|
||||
20%,
|
||||
50%,
|
||||
80%,
|
||||
100% {
|
||||
transform: translateY(0) scale(1.5);
|
||||
}
|
||||
|
||||
40% {
|
||||
transform: translateY(-2rem);
|
||||
}
|
||||
|
||||
60% {
|
||||
transform: translateY(-1rem);
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -7,7 +7,8 @@ import { IMAGE_URL } from '../../constants'
|
|||
const props = defineProps(['files'])
|
||||
|
||||
onMounted(async () => {
|
||||
const files = props.files
|
||||
const files = props.files.slice(0)
|
||||
|
||||
// const width = 1920
|
||||
// const height = 1080
|
||||
const width = window.innerWidth
|
||||
|
@ -35,7 +36,7 @@ onMounted(async () => {
|
|||
.attr("x", 0)
|
||||
.attr("y", 0);
|
||||
});
|
||||
const range = files.length + 2
|
||||
const range = files.length - 2
|
||||
const circles = d3.range(range).map(() => ({
|
||||
x: Math.random() * width,
|
||||
y: Math.random() * height,
|
||||
|
@ -61,30 +62,26 @@ onMounted(async () => {
|
|||
.attr("d", voronoi.render());
|
||||
|
||||
const cell = svg.append("g")
|
||||
.attr("fill", "none")
|
||||
.attr("pointer-events", "all")
|
||||
.selectAll("path")
|
||||
.data(circles)
|
||||
.join("path")
|
||||
.attr("d", (d, i) => voronoi.renderCell(i))
|
||||
.attr('fill', (d, i) => i < (range - 2) ? `url(#img${i})` : 'none')
|
||||
.attr("d", (_, i) => voronoi.renderCell(i))
|
||||
.attr('fill', (_, i) => `url(#img${i})`)
|
||||
.call(d3.drag()
|
||||
.on("start", (event, d) => circle.filter(p => p === d).raise().attr("stroke", "black"))
|
||||
.on("start", (_, d) => circle.filter(p => p === d).raise().attr("stroke", "black"))
|
||||
.on("drag", (event, d: any) => (d.x = event.x, d.y = event.y))
|
||||
.on("end", (event, d) => circle.filter(p => p === d).attr("stroke", null))
|
||||
.on("end", (_, d) => circle.filter(p => p === d).attr("stroke", null))
|
||||
.on("start.update drag.update end.update", update) as any)
|
||||
|
||||
function update() {
|
||||
voronoi = d3.Delaunay.from(circles, d => d.x, d => d.y).voronoi([0, 0, width, height]);
|
||||
circle.attr("cx", d => d.x).attr("cy", d => d.y);
|
||||
cell.attr("d", (d, i) => voronoi.renderCell(i));
|
||||
cell.attr("d", (_, i) => voronoi.renderCell(i));
|
||||
mesh.attr("d", voronoi.render());
|
||||
}
|
||||
|
||||
if (document.querySelector('.pin')) {
|
||||
const rect = (document.querySelector('.pin') as HTMLElement).getBoundingClientRect()
|
||||
circles[circles.length - 1] = { x: rect.x + rect.width, y: rect.y + rect.height }
|
||||
circles[circles.length - 2] = { x: rect.x, y: rect.y }
|
||||
update()
|
||||
}
|
||||
})
|
||||
|
@ -92,3 +89,9 @@ onMounted(async () => {
|
|||
<template>
|
||||
<div id="gallery"></div>
|
||||
</template>
|
||||
<style scoped lang="scss">
|
||||
#gallery {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,55 @@
|
|||
<script setup lang="ts">
|
||||
import { onMounted, reactive, ref, watch } from 'vue';
|
||||
import { SRGBColorSpace } from 'three';
|
||||
import { TresCanvas, } from '@tresjs/core';
|
||||
import { OrbitControls } from '@tresjs/cientos';
|
||||
import MainLoadModels from './main_load_models.vue';
|
||||
import { useItem } from '../../stores/item';
|
||||
import { useRawData } from '../../stores/raw_data';
|
||||
import { useRoute } from 'vue-router';
|
||||
|
||||
const raw_dataStore = useRawData()
|
||||
const pageStore = useItem()
|
||||
const route = useRoute()
|
||||
|
||||
const camera = ref()
|
||||
const controls = ref()
|
||||
|
||||
const controlsState = reactive({
|
||||
enableDamping: true,
|
||||
minPolarAngle: 66 * (Math.PI / 180),
|
||||
maxPolarAngle: 66 * (Math.PI / 180),
|
||||
// minAzimuthAngle: (Math.PI / 2) / 2,
|
||||
enablePan: false,
|
||||
enableZoom: false,
|
||||
// autoRotate: true,
|
||||
})
|
||||
await pageStore.load(route.params)
|
||||
await raw_dataStore.load({ source: pageStore.page.scene_3d })
|
||||
onMounted(async () => {
|
||||
pageStore.load(route.params)
|
||||
await raw_dataStore.load({ source: pageStore.page.scene_3d })
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<div class="main">
|
||||
<h1 class="main-title">
|
||||
{{ raw_dataStore.data.name }}
|
||||
</h1>
|
||||
<div class="main-desc">
|
||||
<p v-for="p in (raw_dataStore.data.description || '').replace(/(\n|\r)+/g, '\n').split('\n')">
|
||||
{{ p }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="main-canvas">
|
||||
<TresCanvas window-size :output-encoding="SRGBColorSpace">
|
||||
<TresPerspectiveCamera ref="camera" />
|
||||
<OrbitControls v-bind="controlsState" make-default ref="controls" />
|
||||
<Suspense>
|
||||
<MainLoadModels v-if="raw_dataStore.data.id" />
|
||||
</Suspense>
|
||||
<TresAmbientLight />
|
||||
</TresCanvas>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
|
@ -0,0 +1,82 @@
|
|||
<script setup lang="ts">
|
||||
import { ref } from 'vue';
|
||||
import { useLoop, useTresContext } from '@tresjs/core';
|
||||
// @ts-ignore
|
||||
import { useGLTF } from '@tresjs/cientos';
|
||||
import { OrbitControlsProps } from '@tresjs/cientos/dist/core/controls/OrbitControls.vue.js';
|
||||
import { useRawData } from '../../stores/raw_data';
|
||||
import { IMAGE_URL } from '../../constants';
|
||||
|
||||
const { controls, camera } = useTresContext()
|
||||
const raw_dataStore = useRawData()
|
||||
const models = ref([] as model3DType[])
|
||||
const envVars = ref({} as any)
|
||||
|
||||
const loadModels = async () => {
|
||||
envVars.value = Object.assign(envVars.value, raw_dataStore.data.env)
|
||||
for (let index = 0; index < raw_dataStore.data.elements.length; index++) {
|
||||
const element = raw_dataStore.data.elements[index];
|
||||
const item = {} as model3DType
|
||||
|
||||
item.modelUrl = `${IMAGE_URL}/${element.model_file}`
|
||||
let { scene: loaded_scene } = await useGLTF(item.modelUrl)
|
||||
item.modelFile = loaded_scene
|
||||
item.id = element.id
|
||||
item.name = element.name
|
||||
|
||||
if (!element.is_enabled) {
|
||||
item.modelFile.visible = false
|
||||
}
|
||||
|
||||
if (item.modelFile.children[0]) {
|
||||
item.modelFile.children[0].position.set(
|
||||
item.modelFile.children[0].position.x + element.x_pos,
|
||||
item.modelFile.children[0].position.y + element.y_pos,
|
||||
item.modelFile.children[0].position.z + element.z_pos
|
||||
)
|
||||
item.modelFile.children[0].updateMatrixWorld(true)
|
||||
}
|
||||
models.value.push(item)
|
||||
}
|
||||
rotateSet()
|
||||
}
|
||||
const cameraSet = () => {
|
||||
if (controls.value) {
|
||||
(controls.value as OrbitControlsProps).minDistance = raw_dataStore.data.min_distance;
|
||||
(controls.value as OrbitControlsProps).maxDistance = raw_dataStore.data.max_distance;
|
||||
// (controls.value as OrbitControlsProps).autoRotate = true;
|
||||
// (controls.value as OrbitControlsProps).autoRotateSpeed = 0.5;
|
||||
(controls.value as any).update()
|
||||
}
|
||||
if (camera.value) {
|
||||
const d = raw_dataStore.data.max_distance * 0.75;
|
||||
camera.value.position.set(d * 0.25, d, d);
|
||||
camera.value.updateMatrixWorld()
|
||||
}
|
||||
}
|
||||
const rotateSet = () => {
|
||||
if (controls.value) {
|
||||
(controls.value as OrbitControlsProps).autoRotate = true;
|
||||
(controls.value as OrbitControlsProps).autoRotateSpeed = 0.5;
|
||||
}
|
||||
}
|
||||
cameraSet()
|
||||
loadModels()
|
||||
const { onAfterRender } = useLoop()
|
||||
onAfterRender(() => {
|
||||
if (controls.value) {
|
||||
if (!(controls.value as OrbitControlsProps).autoRotate) {
|
||||
rotateSet()
|
||||
}
|
||||
(controls.value as any).update()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<Env v-bind="envVars" />
|
||||
<template v-for="item in models">
|
||||
<TresGroup :name="item.name">
|
||||
<TresObject3D v-bind="item.modelFile.clone()" />
|
||||
</TresGroup>
|
||||
</template>
|
||||
</template>
|
|
@ -1,7 +1,7 @@
|
|||
<script setup lang="ts">
|
||||
import { onMounted, watch } from 'vue';
|
||||
import { onMounted, render, watch } from 'vue';
|
||||
|
||||
import { ACESFilmicToneMapping, Color, Fog, PMREMGenerator, SRGBColorSpace } from 'three';
|
||||
import { ACESFilmicToneMapping, CanvasTexture, Color, Fog, PMREMGenerator, SRGBColorSpace } from 'three';
|
||||
import { GainMapLoader } from '@monogrid/gainmap-js'
|
||||
import { useTresContext } from '@tresjs/core';
|
||||
|
||||
|
@ -10,7 +10,11 @@ import hdr_json from '../../assets/promo/hdr/hdr.json?url'
|
|||
import hdr_webp from '../../assets/promo/hdr/hdr.webp'
|
||||
import { IMAGE_URL, PROMOBG } from '../../constants';
|
||||
|
||||
const props = defineProps(['hdr_webp', 'hdr_gainmap', 'hdr_json', 'env_displacementmap', 'env_normalmap', 'clear_color', 'focus'])
|
||||
const props = defineProps([
|
||||
'hdr_webp', 'hdr_gainmap', 'hdr_json',
|
||||
'clear_color', 'clear_color_to',
|
||||
'focus'
|
||||
])
|
||||
const { renderer, scene } = useTresContext()
|
||||
|
||||
const k = { start: 0.5, end: 4.5 }
|
||||
|
@ -20,35 +24,68 @@ renderer.value.toneMapping = ACESFilmicToneMapping;
|
|||
renderer.value.toneMappingExposure = 1.25;
|
||||
renderer.value.setPixelRatio((window.devicePixelRatio || 1) * 2)
|
||||
|
||||
const pmremGenerator = new PMREMGenerator(renderer.value);
|
||||
pmremGenerator.compileEquirectangularShader();
|
||||
|
||||
const loadEnv = async () => {
|
||||
// console.log('update env')
|
||||
try {
|
||||
const loader = new GainMapLoader(renderer.value)
|
||||
const result = await loader.loadAsync([
|
||||
props.hdr_webp ? `${IMAGE_URL}/${props.hdr_webp}` : hdr_webp,
|
||||
props.hdr_gainmap ? `${IMAGE_URL}/${props.hdr_gainmap}` : hdr_gainmap,
|
||||
props.hdr_json ? `${IMAGE_URL}/${props.hdr_json}` : hdr_json,
|
||||
])
|
||||
const pmremGenerator = new PMREMGenerator(renderer.value);
|
||||
pmremGenerator.compileEquirectangularShader();
|
||||
|
||||
const exrCubeRenderTarget = pmremGenerator.fromEquirectangular(result.renderTarget.texture);
|
||||
const newEnvMap = exrCubeRenderTarget ? exrCubeRenderTarget.texture : null;
|
||||
|
||||
// scene.value.background = exrCubeRenderTarget.texture
|
||||
scene.value.environment = newEnvMap
|
||||
scene.value.environmentIntensity = 1
|
||||
scene.value.environmentIntensity = 1.5
|
||||
|
||||
result.renderTarget.texture.dispose();
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
|
||||
const c = new Color()
|
||||
c.set(props.clear_color || PROMOBG)
|
||||
renderer.value.setClearColor(c)
|
||||
scene.value.fog = new Fog(c, props.focus * k.start, props.focus * k.end)
|
||||
|
||||
const hsl_value = { h: 0, s: 0, l: 0 }
|
||||
new Color(props.clear_color).getHSL(hsl_value);
|
||||
|
||||
document.documentElement.style.setProperty('--primary-color', props.clear_color || PROMOBG)
|
||||
document.documentElement.style.setProperty('--main-text-color', hsl_value.l < 0.5 ? '#fff' : '#000')
|
||||
|
||||
if (props.clear_color_to) {
|
||||
const c_to = new Color()
|
||||
c_to.set(props.clear_color_to)
|
||||
|
||||
const canvas = document.createElement('canvas');
|
||||
const ctx = canvas.getContext('2d');
|
||||
const s = 100
|
||||
canvas.width = s;
|
||||
canvas.height = s;
|
||||
if (ctx instanceof CanvasRenderingContext2D) {
|
||||
const grad = ctx.createLinearGradient(0, 0, 0, s);
|
||||
grad.addColorStop(0, props.clear_color);
|
||||
grad.addColorStop(1, props.clear_color_to);
|
||||
ctx.fillStyle = grad;
|
||||
ctx.fillRect(0, 0, s, s);
|
||||
}
|
||||
const texture = new CanvasTexture(canvas);
|
||||
texture.colorSpace = SRGBColorSpace
|
||||
texture.needsUpdate = true
|
||||
scene.value.background = texture
|
||||
texture.dispose()
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
// loadEnv()
|
||||
})
|
||||
watch(() => props, loadEnv, { deep: true })
|
||||
loadEnv()
|
||||
|
||||
watch(() => props, () => {
|
||||
loadEnv()
|
||||
}, { deep: true })
|
||||
</script>
|
||||
<template></template>
|
|
@ -1,131 +1,150 @@
|
|||
<script setup lang="ts">
|
||||
import { useRouter, useRoute } from "vue-router";
|
||||
import { reactive, ref, watch } from 'vue';
|
||||
import type { Ref } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
|
||||
import KLogo from "../../assets/promo/logo.svg";
|
||||
import { SERVER_URL } from "../../constants";
|
||||
import { Vector3 } from 'three';
|
||||
import { TresCanvas } from '@tresjs/core';
|
||||
import { OrbitControls, Stats } from '@tresjs/cientos'
|
||||
import '@tresjs/leches/styles'
|
||||
|
||||
import Gallery from "./gallery.vue";
|
||||
import LoadModels from './load_models.vue'
|
||||
import Sidebar from '../sidebar.vue'
|
||||
import { PROMOBG } from '../../constants';
|
||||
import { usePromoSidebar } from '../../stores/promo_sidebar';
|
||||
import { useLoading } from '../../stores/loading';
|
||||
import { useRawData } from '../../stores/raw_data';
|
||||
import { usePromoScene } from '../../stores/promo_scene';
|
||||
|
||||
const router = useRouter()
|
||||
import icon_enter from '../../assets/btn/enter.svg';
|
||||
import icon_right from '../../assets/btn/right_sm.svg';
|
||||
import icon_left from '../../assets/btn/left_sm.svg';
|
||||
import icon_plus from '../../assets/btn/plus_lg.svg';
|
||||
|
||||
const minPan = ref(new Vector3(-2, -2, -2))
|
||||
const maxPan = ref(new Vector3(2, 2, 2))
|
||||
const _v = new Vector3();
|
||||
const onChange = (e: any) => {
|
||||
if (e.target) {
|
||||
_v.copy(e.target);
|
||||
e.target.clamp(minPan.value, maxPan.value);
|
||||
_v.sub(e.target);
|
||||
camera.value.position.sub(_v);
|
||||
}
|
||||
}
|
||||
const loadedPan = (max: any, min: any) => {
|
||||
maxPan.value = max
|
||||
minPan.value = min
|
||||
}
|
||||
const sidebar = usePromoSidebar()
|
||||
const loading_store = useLoading()
|
||||
|
||||
const camera = ref()
|
||||
const cameraPosition = ref([1, 1, 1]) as unknown as Ref<Vector3>
|
||||
|
||||
const controlsState = reactive({
|
||||
enableDamping: true,
|
||||
maxPolarAngle: (60) * (Math.PI / 180),
|
||||
minAzimuthAngle: (75) * (Math.PI / 180),
|
||||
})
|
||||
|
||||
const raw_dataStore = useRawData()
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const sidebarScene = usePromoScene()
|
||||
|
||||
const startColor = `hsl(${(Math.random() * 360).toFixed()}, 100%, 50%)`
|
||||
const endColor = `hsl(${(Math.random() * 360).toFixed()}, 100%, 50%)`
|
||||
watch(() => route.params.target, sidebar.close)
|
||||
const sidebarFunc = () => {
|
||||
if (sidebar.is_open) {
|
||||
sidebar.close()
|
||||
} else {
|
||||
sidebar.open()
|
||||
}
|
||||
}
|
||||
|
||||
const res = await fetch(`${SERVER_URL}/api/item/${route.params.item ? (route.params.item + '/') : '?is_front=true'}`)
|
||||
const pageArray = await res.json()
|
||||
const page = Array.isArray(pageArray) ? pageArray[0] : pageArray
|
||||
const prevClickableId = () => {
|
||||
const item = sidebarScene.clickable.findIndex(el => el.id == sidebar.id_clickable)
|
||||
if (item == 0) {
|
||||
return sidebarScene.clickable[sidebarScene.clickable.length - 1].id
|
||||
} else {
|
||||
return sidebarScene.clickable[item - 1].id
|
||||
}
|
||||
}
|
||||
const nextClickableId = () => {
|
||||
const item = sidebarScene.clickable.findIndex(el => el.id == sidebar.id_clickable)
|
||||
if (item == (sidebarScene.clickable.length - 1)) {
|
||||
return sidebarScene.clickable[0].id
|
||||
} else {
|
||||
return sidebarScene.clickable[item + 1].id
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<div class="main">
|
||||
<div class="pin" @click="router.push(`/${page.slug}/${page.scene_3d}`)">
|
||||
<KLogo />
|
||||
<div>
|
||||
<div v-if="raw_dataStore.data.loading"
|
||||
style="position: absolute;z-index: 10;font-size: 6rem;text-align: center;top: 50%;left: 50%;transform: translate3d(-50%, -50%, 0);">
|
||||
{{ loading_store.getStatus() }}
|
||||
</div>
|
||||
<Gallery :files="page.images" />
|
||||
<div :class="[{ 'loading': raw_dataStore.data.loading }, 'canvas-wrapper']">
|
||||
<TresCanvas window-size :alpha="false" power-preference="high-performance" :clear-color="PROMOBG"
|
||||
:shadows="false">
|
||||
<TresPerspectiveCamera :position="cameraPosition" ref="camera" />
|
||||
<OrbitControls v-bind="controlsState" @change="onChange" make-default />
|
||||
<!-- <Stats /> -->
|
||||
<Suspense>
|
||||
<LoadModels :source="route.params.target" :loaded_pan="loadedPan" :push="router.push" />
|
||||
</Suspense>
|
||||
</TresCanvas>
|
||||
<div class="itemnav" v-if="sidebar.is_btn_open">
|
||||
<div class="itemnav-close itemnav_one" v-if="sidebar.target">
|
||||
<a href="#" @click.prevent="sidebar.closeBtn()">
|
||||
<icon_plus />
|
||||
</a>
|
||||
</div>
|
||||
<div class="itemnav-back">
|
||||
<a href="#" @click.prevent="sidebar.open(prevClickableId())">
|
||||
<icon_left />
|
||||
</a>
|
||||
</div>
|
||||
<div class="itemnav-deep itemnav_big" v-if="sidebar.target">
|
||||
<RouterLink :to="`/${route.params.item}/${sidebar.target}`">
|
||||
<icon_enter />
|
||||
</RouterLink>
|
||||
</div>
|
||||
<div class="itemnav-close itemnav_big" v-else>
|
||||
<a href="#" @click.prevent="sidebar.closeBtn()">
|
||||
<icon_plus />
|
||||
</a>
|
||||
</div>
|
||||
<div class="itemnav-forward">
|
||||
<a href="#" @click.prevent="sidebar.open(nextClickableId())">
|
||||
<icon_right />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="homelink" :class="[{ open: sidebar.is_open }]">
|
||||
<a href="#" @click.prevent="sidebarFunc">
|
||||
<i-icon-park-solid-left-c />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<Sidebar />
|
||||
</div>
|
||||
</template>
|
||||
<style scoped lang="scss">
|
||||
* {
|
||||
--logo-start-color: v-bind(startColor);
|
||||
--logo-end-color: v-bind(endColor);
|
||||
--anim-time: 4s;
|
||||
}
|
||||
|
||||
.main {
|
||||
width: 100vw;
|
||||
.canvas-wrapper {
|
||||
overflow: hidden;
|
||||
height: 100vh;
|
||||
|
||||
background-image: url(../../assets/promo/map.png);
|
||||
background-position: 50% 100%;
|
||||
background-size: auto 100%;
|
||||
overflow: hidden;
|
||||
width: 100vw;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
left: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.pin {
|
||||
cursor: pointer;
|
||||
|
||||
border-radius: 0.25rem;
|
||||
overflow: hidden;
|
||||
|
||||
position: absolute;
|
||||
bottom: 20vh;
|
||||
left: calc(50% - 1vw);
|
||||
|
||||
color: white;
|
||||
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
padding: 0.25rem;
|
||||
|
||||
animation: bounce2 var(--anim-time) ease infinite;
|
||||
.loading {
|
||||
filter: blur(10px);
|
||||
transition: all 300ms linear;
|
||||
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -1rem;
|
||||
right: -1rem;
|
||||
bottom: -1rem;
|
||||
left: -1rem;
|
||||
background-image: linear-gradient(var(--logo-start-color), var(--logo-end-color));
|
||||
animation: bounce2grad var(--anim-time) ease infinite;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
svg {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
color: #fff;
|
||||
fill: currentColor;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
// animation-play-state: paused;
|
||||
animation: none;
|
||||
transform: scale(1.5);
|
||||
|
||||
&::before {
|
||||
// animation-play-state: paused;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@keyframes bounce2grad {
|
||||
|
||||
0%,
|
||||
20%,
|
||||
50%,
|
||||
80%,
|
||||
100% {
|
||||
transform: rotate(90deg)
|
||||
}
|
||||
|
||||
40% {
|
||||
transform: rotate(60deg);
|
||||
}
|
||||
|
||||
60% {
|
||||
transform: rotate(20deg);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes bounce2 {
|
||||
|
||||
0%,
|
||||
20%,
|
||||
50%,
|
||||
80%,
|
||||
100% {
|
||||
transform: translateY(0) scale(1.5);
|
||||
}
|
||||
|
||||
40% {
|
||||
transform: translateY(-2rem);
|
||||
}
|
||||
|
||||
60% {
|
||||
transform: translateY(-1rem);
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,110 +1,134 @@
|
|||
<script setup lang="ts">
|
||||
import { onMounted, onUnmounted, reactive, Ref, ref, watch } from 'vue';
|
||||
import { onMounted, onUnmounted, reactive, ref, watch } from 'vue';
|
||||
import {
|
||||
Box3, Color, DoubleSide, Group, Mesh, PlaneGeometry,
|
||||
MeshStandardMaterial, MeshStandardMaterialParameters,
|
||||
Box3, Color, Group, Mesh,
|
||||
MeshStandardMaterial,
|
||||
Vector2, Vector3,
|
||||
CircleGeometry, MeshBasicMaterial,
|
||||
Quaternion,
|
||||
Quaternion, SRGBColorSpace
|
||||
} from 'three';
|
||||
|
||||
import { useTresContext, useSeek, useTexture, useLoop } from '@tresjs/core';
|
||||
import { useGLTF } from '@tresjs/cientos'
|
||||
import { useTresContext, useSeek, useLoop } from '@tresjs/core';
|
||||
// @ts-ignore
|
||||
import { useGLTF, useGLTFExporter } from '@tresjs/cientos'
|
||||
|
||||
import Env from './env.vue'
|
||||
|
||||
import { IMAGE_URL, PROMOBG, SERVER_URL, } from '../../constants'
|
||||
import { IMAGE_URL, PROMOBG, SERVER_URL, title, } from '../../constants'
|
||||
import { usePromoSidebar } from '../../stores/promo_sidebar';
|
||||
import { usePromoScene } from '../../stores/promo_scene';
|
||||
import { useClickable } from '../../stores/clickable';
|
||||
import { useLoading } from '../../stores/loading';
|
||||
import { mobileAndTabletCheck } from '../../helpers';
|
||||
import { useTimer } from '../../stores/timer';
|
||||
import { useRawData } from '../../stores/raw_data';
|
||||
import { useTimerHome } from '../../stores/timer_home';
|
||||
import { useItem } from '../../stores/item';
|
||||
|
||||
const props = defineProps(['source', 'loaded', 'loaded_pan'])
|
||||
const CON_MOVETO_COUNT = 150;
|
||||
const CAM_MOVETO_COUNT = 100;
|
||||
const props = defineProps(['source', 'loaded_pan', 'push'])
|
||||
|
||||
const models = ref<model3DType[]>([])
|
||||
const clickable_items = ref<any[]>([])
|
||||
const clickable_refs = ref<any[]>([])
|
||||
const envVars = reactive({}) as EnvVars
|
||||
const def_distance = reactive({ max: 10, min: 1 })
|
||||
const process_loading = ref(null)
|
||||
const targetDistance = reactive({ max: 10, min: 0 })
|
||||
let sidebar_clickable = [] as PromoScene[]
|
||||
let sidebar_visible = [] as PromoScene[]
|
||||
|
||||
const controls_targetto = ref() as Ref<Vector3 | undefined>;
|
||||
const controls_targetto_count = ref(CON_MOVETO_COUNT)
|
||||
const camera_moveto = ref() as Ref<Vector3 | undefined>;
|
||||
const camera_moveto_count = ref(CON_MOVETO_COUNT)
|
||||
const camera_rotatetoto = ref() as Ref<Quaternion | undefined>;
|
||||
const camera_rotatetoto_count = ref(CAM_MOVETO_COUNT)
|
||||
const COUNT = 30
|
||||
type smooth = {
|
||||
value: Vector3 | Quaternion | undefined,
|
||||
count: number
|
||||
}
|
||||
const smooth_target = reactive({}) as smooth
|
||||
const smooth_move = reactive({}) as smooth
|
||||
const temp_smooth_target = reactive({}) as smooth
|
||||
const temp_smooth_move = reactive({}) as smooth
|
||||
|
||||
const sidebar = usePromoSidebar();
|
||||
const sidebar_scene = usePromoScene();
|
||||
const clickable = useClickable()
|
||||
const loading_store = useLoading()
|
||||
const raw_dataStore = useRawData();
|
||||
const itemStore = useItem();
|
||||
|
||||
const { controls, camera, scene, raycaster, renderer } = useTresContext()
|
||||
const { seekByName, seekAllByName } = useSeek()
|
||||
|
||||
const groundTexture = await useTexture({
|
||||
displacementMap: '/ground_displacement.jpg',
|
||||
})
|
||||
const pointerTexture = await useTexture({
|
||||
map: '/pointer_texture.png'
|
||||
})
|
||||
const { scene: point_mesh_obj } = await useGLTF((await import('../../assets/pointer/point-v1-v1.glb')).default)
|
||||
|
||||
const loadModels = async () => {
|
||||
const res = await fetch(`${SERVER_URL}/api/obj/scene/${props.source}`)
|
||||
const raw_data = await res.json() as scene3D
|
||||
loading_store.status = 'other'
|
||||
|
||||
def_distance.max = raw_data.max_distance
|
||||
def_distance.min = raw_data.min_distance
|
||||
|
||||
envVars.focus = raw_data.max_distance * 0.5
|
||||
if (raw_data.env) {
|
||||
Object.assign(envVars, raw_data.env)
|
||||
} else {
|
||||
delete envVars.env_displacementmap
|
||||
delete envVars.env_normalmap
|
||||
delete envVars.hdr_gainmap
|
||||
delete envVars.hdr_json
|
||||
delete envVars.hdr_webp
|
||||
envVars.clear_color = PROMOBG
|
||||
const set_moveto = (obj: smooth, value: Vector3 | Quaternion | undefined) => {
|
||||
obj.value = value
|
||||
obj.count = COUNT
|
||||
}
|
||||
|
||||
loading_store.status = 'env'
|
||||
const data = raw_data.elements
|
||||
const setEnv = async () => {
|
||||
envVars.focus = raw_dataStore.data.max_distance * 0.5
|
||||
if (raw_dataStore.data.env) {
|
||||
Object.assign(envVars, raw_dataStore.data.env)
|
||||
} else {
|
||||
envVars.clear_color = PROMOBG
|
||||
}
|
||||
}
|
||||
|
||||
const setControls = () => {
|
||||
if (!controls.value) return;
|
||||
|
||||
controls.value.enabled = false;
|
||||
targetDistance.max = raw_dataStore.data.max_distance;
|
||||
targetDistance.min = mobileAndTabletCheck() ? raw_dataStore.data.min_distance * 0.5 : raw_dataStore.data.min_distance;
|
||||
(controls.value as any).maxDistance = targetDistance.max;
|
||||
(controls.value as any).minDistance = targetDistance.min;
|
||||
|
||||
(controls.value as any).minDistance = mobileAndTabletCheck() ? raw_data.min_distance * 0.5 : raw_data.min_distance;
|
||||
(controls.value as any).maxDistance = raw_data.max_distance;
|
||||
|
||||
camera.value?.position.set(
|
||||
(controls.value as any).maxDistance * 0.5,
|
||||
(controls.value as any).maxDistance * 0.5,
|
||||
(controls.value as any).maxDistance * 0.5
|
||||
);
|
||||
const d = targetDistance.max * 0.5
|
||||
camera.value?.position.set(d, d, d);
|
||||
camera.value?.updateMatrixWorld();
|
||||
(controls.value as any).target = new Vector3(0, 0, 0);
|
||||
(controls.value as any).autoRotate = false;
|
||||
|
||||
(controls.value as any)._needsUpdate = true;
|
||||
(controls.value as any).update()
|
||||
}
|
||||
|
||||
const sidebar_items = [] as PromoScene[]
|
||||
const clearValues = () => {
|
||||
clickable_items.value = []
|
||||
clickable_refs.value = []
|
||||
sidebar_clickable = []
|
||||
sidebar_visible = []
|
||||
}
|
||||
|
||||
const loadModels = async () => {
|
||||
if (!props.source) return
|
||||
if (!raw_dataStore.data) return
|
||||
|
||||
console.log(`load models ${props.source} ${process_loading.value}`)
|
||||
clearValues()
|
||||
|
||||
loading_store.status = 'loading'
|
||||
process_loading.value = props.source
|
||||
|
||||
await raw_dataStore.load(props)
|
||||
raw_dataStore.data.loading = true
|
||||
document.title = `${raw_dataStore.data.name} - ${title}`
|
||||
|
||||
loading_store.status = 'env'
|
||||
await setEnv()
|
||||
|
||||
loading_store.status = 'other'
|
||||
setControls()
|
||||
|
||||
sidebar_scene.setName({ name: raw_dataStore.data.name, description: raw_dataStore.data.name })
|
||||
|
||||
loading_store.status = 'model'
|
||||
for (let index = 0; index < data.length; index++) {
|
||||
for (let index = 0; index < raw_dataStore.data.elements.length; index++) {
|
||||
if (process_loading.value !== props.source) return
|
||||
loading_store.count = index
|
||||
const element = data[index];
|
||||
const element = raw_dataStore.data.elements[index];
|
||||
const item = {} as model3DType
|
||||
|
||||
item.modelUrl = `${IMAGE_URL}/${element.model_file}`
|
||||
let { scene: loaded_scene } = await useGLTF(item.modelUrl)
|
||||
item.modelFile = loaded_scene
|
||||
item.id = element.id
|
||||
item.name = element.name
|
||||
|
||||
if (!element.is_enabled) {
|
||||
|
@ -120,52 +144,25 @@ const loadModels = async () => {
|
|||
item.modelFile.children[0].updateMatrixWorld(true)
|
||||
}
|
||||
|
||||
item.modelFile.updateMatrixWorld(true)
|
||||
item.modelFile.traverse((el: Mesh) => {
|
||||
if (el.material && el.material instanceof MeshStandardMaterial && el.material.map) {
|
||||
el.material.map.colorSpace = SRGBColorSpace
|
||||
}
|
||||
})
|
||||
models.value.push(item)
|
||||
|
||||
const res = await fetch(`${SERVER_URL}/api/obj/clickable/?source=${element.id}`)
|
||||
const clickable_areas = await res.json()
|
||||
clickable.list.push(...clickable_areas)
|
||||
}
|
||||
|
||||
let c = new Color()
|
||||
if (envVars.clear_color) {
|
||||
c.set(envVars.clear_color)
|
||||
} else {
|
||||
renderer.value.getClearColor(c)
|
||||
if (!element.can_not_disable) {
|
||||
sidebar_visible.push(element)
|
||||
}
|
||||
const tex = {} as any
|
||||
if (envVars.env_displacementmap) { tex.displacementMap = `${IMAGE_URL}/${envVars.env_displacementmap}` }
|
||||
if (envVars.env_normalmap) { tex.normalMap = `${IMAGE_URL}/${envVars.env_normalmap}` }
|
||||
let addTexture: any
|
||||
if (Object.keys(tex).length > 0) {
|
||||
addTexture = await useTexture(tex)
|
||||
}
|
||||
sidebar_scene.setVisible(sidebar_visible)
|
||||
|
||||
if (!models.value.find(el => el.name == 'ground')) {
|
||||
loading_store.status = 'ground'
|
||||
const mesh = {
|
||||
color: c.offsetHSL(0, 0.5, -0.33),
|
||||
displacementScale: envVars.focus * 0.33,
|
||||
roughness: 100,
|
||||
side: DoubleSide
|
||||
} as MeshStandardMaterialParameters
|
||||
if (envVars.env_displacementmap) {
|
||||
mesh.displacementMap = addTexture.displacementMap
|
||||
} else {
|
||||
mesh.displacementMap = groundTexture.displacementMap
|
||||
}
|
||||
if (envVars.env_normalmap) {
|
||||
mesh.normalMap = addTexture.normalMap
|
||||
}
|
||||
const ground = new Mesh(
|
||||
new PlaneGeometry(envVars.focus * 7, envVars.focus * 7, 1024, 1024),
|
||||
new MeshStandardMaterial(mesh)
|
||||
)
|
||||
ground.position.y = -0.33 * envVars.focus
|
||||
ground.rotateX(-Math.PI / 2)
|
||||
ground.name = "ground"
|
||||
models.value.push({ name: 'ground', modelFile: ground })
|
||||
}
|
||||
|
||||
for (let index = 0; index < clickable.list.length; index++) {
|
||||
|
@ -175,35 +172,38 @@ const loadModels = async () => {
|
|||
if (!find_element) continue
|
||||
if (find_element && !(find_element as Group).isGroup) {
|
||||
const world_position = new Vector3();
|
||||
((find_element as Mesh).geometry.boundingBox as any).getCenter(world_position);
|
||||
const size = new Vector3();
|
||||
const boundingBox = ((find_element as Mesh).geometry.boundingBox as any)
|
||||
boundingBox.getCenter(world_position);
|
||||
boundingBox.getSize(size);
|
||||
(find_element as Mesh).localToWorld(world_position);
|
||||
|
||||
const p = raw_data.min_distance * 0.05
|
||||
const point = point_mesh_obj.clone()
|
||||
const point_color = new Color(envVars.clear_color).offsetHSL(0.45, 0.2, 0)
|
||||
point.traverse((el: Group | Mesh) => {
|
||||
if (el instanceof Mesh && el.material && el.material instanceof MeshStandardMaterial) {
|
||||
el.position.set(0, 0, 0)
|
||||
el.material.color = point_color
|
||||
}
|
||||
})
|
||||
point.position.set(world_position.x, size.y + raw_dataStore.data.min_distance * 0.05, world_position.z)
|
||||
|
||||
const point_mesh = new Mesh(
|
||||
new CircleGeometry(p, 32),
|
||||
new MeshBasicMaterial({ map: pointerTexture.map })
|
||||
)
|
||||
point_mesh.rotateX(-0.5 * Math.PI)
|
||||
const point = new Group()
|
||||
point.add(point_mesh)
|
||||
point.position.set(world_position.x, p * 3, world_position.z * 2)
|
||||
point.name = `${element.id}_clickable`
|
||||
point.updateMatrixWorld()
|
||||
point.name = `${element.id}_clickable`
|
||||
|
||||
if (clickable_items.value.find(el => el.name == point.name)) continue
|
||||
clickable_items.value.push(point)
|
||||
clickable_refs.value.push(ref(`${element.id}_clickable`))
|
||||
|
||||
sidebar_items.push({
|
||||
sidebar_clickable.push({
|
||||
is_enabled: true,
|
||||
id: element.id,
|
||||
name: element.name
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
sidebar_scene.name = raw_data.name;
|
||||
sidebar_scene.setData(sidebar_items)
|
||||
sidebar_scene.setClickable(sidebar_clickable)
|
||||
|
||||
loading_store.status = 'boxes'
|
||||
const box = new Box3();
|
||||
|
@ -213,14 +213,14 @@ const loadModels = async () => {
|
|||
}
|
||||
});
|
||||
const box_size = new Vector3();
|
||||
box.getSize(box_size)
|
||||
console.log(box_size)
|
||||
box.getSize(box_size);
|
||||
|
||||
props.loaded_pan(
|
||||
new Vector3(box_size.x * 0.5, box_size.y * 0.5, box_size.z * 0.5),
|
||||
new Vector3(box_size.x * -0.25, box_size.y * -0.25, box_size.z * -0.25),
|
||||
)
|
||||
controls.value.enabled = true;
|
||||
props.loaded(false)
|
||||
);
|
||||
(controls.value as any).enabled = true;
|
||||
raw_dataStore.data.loading = false;
|
||||
|
||||
timer.startTimer()
|
||||
if (controls.value && (controls.value as any).autoRotate) {
|
||||
|
@ -229,92 +229,128 @@ const loadModels = async () => {
|
|||
}
|
||||
|
||||
const gotoCenterAndDistance = () => {
|
||||
(controls.value as any).minDistance = mobileAndTabletCheck() ? def_distance.min * 0.5 : def_distance.min;
|
||||
(controls.value as any).maxDistance = def_distance.max;
|
||||
controls_targetto.value = new Vector3(0, 0, 0);
|
||||
camera_moveto.value = new Vector3(
|
||||
def_distance.max * 0.5,
|
||||
def_distance.max * 0.5,
|
||||
def_distance.max * 0.5
|
||||
);
|
||||
targetDistance.min = mobileAndTabletCheck() ? raw_dataStore.data.min_distance * 0.5 : raw_dataStore.data.min_distance;
|
||||
targetDistance.max = raw_dataStore.data.max_distance;
|
||||
const d = raw_dataStore.data.max_distance * 0.5
|
||||
set_moveto(smooth_target, new Vector3(0, 0, 0))
|
||||
set_moveto(smooth_move, new Vector3(d, d, d))
|
||||
}
|
||||
|
||||
loadModels()
|
||||
watch(() => props.source, () => {
|
||||
if (props.source) {
|
||||
raw_dataStore.$reset()
|
||||
const loaded = seekByName(scene.value, 'loaded')
|
||||
if (loaded) {
|
||||
loaded.children = []
|
||||
}
|
||||
console.log('props change')
|
||||
sidebar.close()
|
||||
loadModels()
|
||||
})
|
||||
|
||||
watch(() => sidebar, () => {
|
||||
if (sidebar.is_open == false) {
|
||||
gotoCenterAndDistance()
|
||||
} else {
|
||||
renderer.value.dispose()
|
||||
}
|
||||
if (sidebar.is_open && sidebar.id_clickable) {
|
||||
}, { deep: true })
|
||||
|
||||
watch(() => sidebar.is_btn_open, () => {
|
||||
if (sidebar.is_btn_open == false) {
|
||||
gotoCenterAndDistance();
|
||||
}
|
||||
})
|
||||
watch(() => sidebar.is_btn_open && sidebar.id_clickable, () => {
|
||||
if (sidebar.is_btn_open && sidebar.id_clickable) {
|
||||
const clickable = useClickable()
|
||||
const target = clickable.list.find(el => el.id == sidebar.id_clickable)
|
||||
if (!target) return
|
||||
const el = seekByName(scene.value, `${sidebar.id_clickable}_clickable`);
|
||||
if (el) {
|
||||
(controls.value as any).maxDistance = 10;
|
||||
(controls.value as any).minDistance = 1;
|
||||
const target_vector = new Vector3();
|
||||
targetDistance.max = 10
|
||||
targetDistance.min = 3
|
||||
|
||||
const target_vector = new Vector3();
|
||||
el.getWorldPosition(target_vector);
|
||||
controls_targetto.value = target_vector;
|
||||
camera_rotatetoto.value = new Quaternion(0, 1, 0.25, -0.25)
|
||||
target_vector.setComponent(1, targetDistance.min)
|
||||
|
||||
set_moveto(smooth_target, target_vector)
|
||||
set_moveto(smooth_move, new Vector3(
|
||||
(target_vector.x / Math.abs(target_vector.x)) * targetDistance.min,
|
||||
0,
|
||||
(target_vector.z / Math.abs(target_vector.z)) * targetDistance.min
|
||||
))
|
||||
}
|
||||
}
|
||||
}, { deep: true })
|
||||
|
||||
const { onAfterRender } = useLoop()
|
||||
onAfterRender(() => {
|
||||
const { onBeforeRender } = useLoop()
|
||||
onBeforeRender(() => {
|
||||
const cameraDistance = (camera.value?.position as Vector3).distanceTo((controls.value as any).target)
|
||||
if (cameraDistance <= raw_dataStore.data.min_distance && sidebar.is_btn_open == false) {
|
||||
// sidebar.is_btn_open = true
|
||||
}
|
||||
clickable_refs.value.map(el => {
|
||||
el.value[0].visible = cameraDistance < raw_dataStore.data.min_distance ? false : true;
|
||||
if (el.value[0] && el.value[0].children) {
|
||||
el.value[0].children[0].lookAt(camera.value?.position)
|
||||
el.value[0].children[0].lookAt(camera.value?.position);
|
||||
el.value[0].children[0].rotateX(90 * (Math.PI / 180));
|
||||
el.value[0].children[0].rotateZ(15 * (Math.PI / 180));
|
||||
|
||||
const dis_to_cam = camera.value?.position.distanceTo(el.value[0].position);
|
||||
if (dis_to_cam) {
|
||||
const scaling = (0.5 * dis_to_cam) / 100
|
||||
el.value[0].children[0].scale.set(scaling, scaling, scaling);
|
||||
el.value[0].updateMatrixWorld()
|
||||
}
|
||||
}
|
||||
})
|
||||
if (controls.value) {
|
||||
if (timer.seconds_left == 0) {
|
||||
(controls.value as any).update();
|
||||
}
|
||||
}
|
||||
if (controls_targetto.value) {
|
||||
timer.stopTimer();
|
||||
(controls.value as any).target.lerp(controls_targetto.value, 0.01);
|
||||
controls_targetto_count.value -= 1
|
||||
if (controls_targetto_count.value == 0) {
|
||||
controls_targetto_count.value = CON_MOVETO_COUNT
|
||||
controls_targetto.value = undefined
|
||||
}
|
||||
const koef = (1 / COUNT) * 3
|
||||
// const koef = 0.05
|
||||
if (smooth_target.value || smooth_move.value) {
|
||||
timer.resetTimer()
|
||||
home_timer.resetTimer()
|
||||
|
||||
if (smooth_target.value) {
|
||||
(controls.value as any).target.lerp(smooth_target.value as Vector3, koef);
|
||||
(controls.value as any).update()
|
||||
}
|
||||
if (camera_moveto.value) {
|
||||
timer.stopTimer();
|
||||
camera.value?.position.lerp(camera_moveto.value, 0.01);
|
||||
camera_moveto_count.value -= 1
|
||||
if (camera_moveto_count.value == 0) {
|
||||
camera_moveto_count.value = CON_MOVETO_COUNT
|
||||
camera_moveto.value = undefined
|
||||
smooth_target.count -= 1
|
||||
if (smooth_target.count == 1) {
|
||||
set_moveto(smooth_target, undefined)
|
||||
if (temp_smooth_target.value) {
|
||||
set_moveto(smooth_target, temp_smooth_target.value)
|
||||
set_moveto(temp_smooth_target, undefined)
|
||||
}
|
||||
}
|
||||
if (camera_rotatetoto.value) {
|
||||
timer.stopTimer();
|
||||
camera.value?.quaternion.slerp(camera_rotatetoto.value, 0.01);
|
||||
camera_rotatetoto_count.value -= 1;
|
||||
if (camera_rotatetoto_count.value == 0) {
|
||||
camera_rotatetoto_count.value = CAM_MOVETO_COUNT
|
||||
camera_rotatetoto.value = undefined
|
||||
}
|
||||
else
|
||||
if (smooth_move.value) {
|
||||
camera.value?.position.lerp(smooth_move.value as Vector3, koef);
|
||||
camera.value?.updateMatrixWorld();
|
||||
(controls.value as any).update()
|
||||
|
||||
smooth_move.count -= 1
|
||||
if (smooth_move.count == 1) {
|
||||
set_moveto(smooth_move, undefined)
|
||||
if (temp_smooth_move.value) {
|
||||
set_moveto(smooth_move, temp_smooth_move.value)
|
||||
set_moveto(temp_smooth_move, undefined)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
watch(() => targetDistance.min, () => {
|
||||
(controls.value as any).minDistance = targetDistance.min;
|
||||
})
|
||||
|
||||
const timer = useTimer()
|
||||
timer.timer_func = () => {
|
||||
if (timer.seconds_left == 0 && !(controls.value as any).autoRotate && (controls.value as any).enabled) {
|
||||
if (sidebar.is_open) {
|
||||
sidebar.close();
|
||||
} else {
|
||||
gotoCenterAndDistance();
|
||||
}
|
||||
home_timer.startTimer();
|
||||
|
||||
(controls.value as any).autoRotate = true;
|
||||
(controls.value as any).autoRotateSpeed = 0.5;
|
||||
}
|
||||
|
@ -322,13 +358,22 @@ timer.timer_func = () => {
|
|||
|
||||
const stopTimer = () => {
|
||||
timer.resetTimer()
|
||||
home_timer.resetTimer()
|
||||
if ((controls.value as any).autoRotate) {
|
||||
(controls.value as any).autoRotate = false
|
||||
}
|
||||
}
|
||||
const home_timer = useTimerHome()
|
||||
home_timer.timer_func = () => {
|
||||
if (itemStore.page.scene_3d !== raw_dataStore.data.id) {
|
||||
props.push(`/${itemStore.page.slug}/${itemStore.page.scene_3d}`)
|
||||
}
|
||||
}
|
||||
|
||||
const pointer = reactive({ x: 0, y: 0 })
|
||||
const clickEvent = (event: MouseEvent) => {
|
||||
if (event.target && !(event.target as HTMLElement).closest('canvas')) return
|
||||
|
||||
const x = (event.clientX / window.innerWidth) * 2 - 1
|
||||
const y = - (event.clientY / window.innerHeight) * 2 + 1
|
||||
if (x == pointer.x && y == pointer.y) return
|
||||
|
@ -340,13 +385,21 @@ const clickEvent = (event: MouseEvent) => {
|
|||
|
||||
const clickable_objects = seekAllByName(scene.value, '_clickable');
|
||||
const intersects = raycaster.value.intersectObjects(clickable_objects);
|
||||
const names = intersects.map(el => (el.object.parent ? el.object.parent.name : el.object.name) ?? false).filter(Boolean)
|
||||
const names = intersects
|
||||
.filter(el => (el.object.parent ? el.object.parent.visible : el.object.visible))
|
||||
.map(el => (el.object.parent ? el.object.parent.name : el.object.name) ?? false)
|
||||
.filter(Boolean)
|
||||
if (names.length) {
|
||||
sidebar.open(parseInt(names[0].replace('_clickable', '')))
|
||||
sidebar.toggleAccordion('clickable')
|
||||
}
|
||||
}
|
||||
const timerEvent = ['click', 'contextmenu', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'touchmove']
|
||||
const timerEvent = ['click', 'contextmenu', 'mousedown', 'mouseup', 'touchstart', 'touchend', 'touchmove', 'scroll']
|
||||
onMounted(() => {
|
||||
console.log('mount')
|
||||
clearValues()
|
||||
loadModels()
|
||||
|
||||
document.addEventListener('click', clickEvent)
|
||||
|
||||
timerEvent.map((event: string) => {
|
||||
|
@ -358,18 +411,22 @@ onMounted(() => {
|
|||
}
|
||||
})
|
||||
onUnmounted(() => {
|
||||
console.log('unmount load models')
|
||||
clearValues()
|
||||
document.removeEventListener('click', clickEvent)
|
||||
timerEvent.map((event: string) => {
|
||||
document.removeEventListener(event, stopTimer)
|
||||
})
|
||||
renderer.value.dispose()
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<TresGroup name="loaded">
|
||||
<TresGroup name="loaded" :key="props.source" ref="loaded">
|
||||
<Env v-bind="envVars" />
|
||||
<!-- <PostProcessing /> -->
|
||||
<template v-for="item in models">
|
||||
<TresGroup :name="item.name">
|
||||
<TresGroup :name="item.name"
|
||||
:visible="sidebar_scene.visible.find(el => el.id == item.id)?.is_enabled ?? true">
|
||||
<TresObject3D v-bind="item.modelFile.clone()" />
|
||||
</TresGroup>
|
||||
</template>
|
||||
|
|
|
@ -1,115 +0,0 @@
|
|||
<script setup lang="ts">
|
||||
import { reactive, ref, watch } from 'vue';
|
||||
import type { Ref } from 'vue'
|
||||
import { useRoute } from 'vue-router';
|
||||
|
||||
import { Vector3 } from 'three';
|
||||
import { TresCanvas, useLoader } from '@tresjs/core';
|
||||
import { OrbitControls, Stats } from '@tresjs/cientos'
|
||||
import '@tresjs/leches/styles'
|
||||
|
||||
import LoadModels from './load_models.vue'
|
||||
import Sidebar from './sidebar.vue'
|
||||
import { usePromoSidebar } from '../../stores/promo_sidebar';
|
||||
import { PROMOBG } from '../../constants';
|
||||
import { useLoading } from '../../stores/loading';
|
||||
|
||||
const minPan = ref(new Vector3(-2, -2, -2))
|
||||
const maxPan = ref(new Vector3(2, 2, 2))
|
||||
const _v = new Vector3();
|
||||
const onChange = (e: any) => {
|
||||
if (e.target) {
|
||||
_v.copy(e.target);
|
||||
e.target.clamp(minPan.value, maxPan.value);
|
||||
_v.sub(e.target);
|
||||
camera.value.position.sub(_v);
|
||||
}
|
||||
}
|
||||
const loadedPan = (max: any, min: any) => {
|
||||
maxPan.value = max
|
||||
minPan.value = min
|
||||
}
|
||||
const sidebar = usePromoSidebar()
|
||||
const loading_store = useLoading()
|
||||
|
||||
const camera = ref()
|
||||
const cameraPosition = ref([1, 1, 1]) as unknown as Ref<Vector3>
|
||||
|
||||
const controlsState = reactive({
|
||||
enableDamping: true,
|
||||
maxPolarAngle: (Math.PI / 2) - 0.07,
|
||||
minAzimuthAngle: (Math.PI / 2) - 0.20,
|
||||
})
|
||||
const models_loading = ref(true)
|
||||
const set_model_load_status = (status: boolean) => {
|
||||
models_loading.value = status
|
||||
}
|
||||
|
||||
const route = useRoute()
|
||||
const source = ref(route.params.target ? (route.params.target.toString() + '/') : '1/')
|
||||
watch(() => route.params.target, () => {
|
||||
let t = '1/'
|
||||
if (route.params.target) t = route.params.target.toString() + '/'
|
||||
if (source.value !== t) {
|
||||
source.value = t
|
||||
models_loading.value = true
|
||||
sidebar.close()
|
||||
}
|
||||
}, { deep: true })
|
||||
|
||||
|
||||
const sidebarFunc = () => {
|
||||
if (sidebar.is_open) {
|
||||
sidebar.close()
|
||||
} else {
|
||||
sidebar.open()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<div>
|
||||
<div v-if="models_loading"
|
||||
style="position: absolute;z-index: 10;font-size: 6rem;text-align: center;top: 50%;left: 50%;transform: translate3d(-50%, -50%, 0);">
|
||||
{{loading_store.getStatus()}}
|
||||
</div>
|
||||
<div :class="[{ 'loading': models_loading }, 'canvas-wrapper']">
|
||||
<TresCanvas window-size :alpha="false" power-preference="high-performance" :clear-color="PROMOBG"
|
||||
:shadows="false">
|
||||
<Stats />
|
||||
<TresPerspectiveCamera :position="cameraPosition" ref="camera" />
|
||||
<OrbitControls v-bind="controlsState" @change="onChange" make-default />
|
||||
<Suspense>
|
||||
<LoadModels :source="source" :loaded="set_model_load_status" :loaded_pan="loadedPan" />
|
||||
</Suspense>
|
||||
</TresCanvas>
|
||||
<div class="homelink" :class="[{ open: sidebar.is_open }]">
|
||||
<a href="#" @click.prevent="sidebarFunc">
|
||||
<i-mdi-chevron-left />
|
||||
</a>
|
||||
</div>
|
||||
<div class="homelink main" v-if="route.params.item">
|
||||
<RouterLink :to="`/${route.params.item.toString()}`" @click.prevent="sidebarFunc">
|
||||
<i-mdi-home />
|
||||
</RouterLink>
|
||||
</div>
|
||||
</div>
|
||||
<Sidebar />
|
||||
</div>
|
||||
</template>
|
||||
<style scoped lang="scss">
|
||||
.canvas-wrapper {
|
||||
overflow: hidden;
|
||||
height: 100vh;
|
||||
width: 100vw;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
left: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
.loading {
|
||||
filter: blur(10px);
|
||||
transition: all 300ms linear;
|
||||
}
|
||||
</style>
|
|
@ -1,55 +0,0 @@
|
|||
<script setup lang="ts">
|
||||
import { ref, watch } from 'vue';
|
||||
import { RouterLink, useRoute } from 'vue-router';
|
||||
import { usePromoSidebar } from '../../stores/promo_sidebar';
|
||||
import { usePromoScene } from '../../stores/promo_scene';
|
||||
|
||||
const sidebar = usePromoSidebar()
|
||||
const sidebar_scene = usePromoScene()
|
||||
const sidebar_obj = ref()
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
const opened_desc = ref()
|
||||
|
||||
const openedChange = () => {
|
||||
sidebar.open(opened_desc.value)
|
||||
}
|
||||
|
||||
watch(() => sidebar, () => {
|
||||
if (sidebar.is_open == false) {
|
||||
opened_desc.value = null
|
||||
} else {
|
||||
opened_desc.value = sidebar.id_clickable
|
||||
}
|
||||
}, { deep: true })
|
||||
</script>
|
||||
<template>
|
||||
<div class="sidebar" :class="[{ 'open': sidebar.is_open }]" ref="sidebar_obj">
|
||||
<template v-if="!sidebar.is_open"></template>
|
||||
<template v-else>
|
||||
<div class="sidebar-content">
|
||||
<h2>{{ sidebar_scene.name }}</h2>
|
||||
<div class="sidebar-list">
|
||||
<div class="sidebar-list-item" v-for="item in sidebar_scene.list">
|
||||
<input type="radio" v-model=opened_desc :value="item.id" :id="item.id.toString()"
|
||||
:checked="opened_desc == item.id" @change="openedChange"
|
||||
:class="[{ checked: opened_desc == item.id }]" />
|
||||
<label :for="item.id.toString()">{{ item.name }}</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-content" v-if="sidebar.title">
|
||||
<h2>{{ sidebar.title }}</h2>
|
||||
<div class="sidebar-inner" v-if="sidebar.description">
|
||||
<template v-for="p in sidebar.description.replace(/(\n|\r)+/g, '\n').split('\n')">
|
||||
<p>{{ p }}</p>
|
||||
</template>
|
||||
</div>
|
||||
<RouterLink class="btn" :to="`/${route.params.item}/${sidebar.target}`" v-if="sidebar.target">
|
||||
<i-mdi-arrow-right />
|
||||
</RouterLink>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
|
@ -0,0 +1,23 @@
|
|||
<script setup lang="ts">
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import { useItem } from '../stores/item';
|
||||
import { watch } from 'vue';
|
||||
|
||||
const page = useItem()
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
|
||||
router.afterEach((to) => {
|
||||
if (to.name == 'home_no') {
|
||||
page.load(route.params)
|
||||
}
|
||||
return true
|
||||
})
|
||||
|
||||
watch(() => route.params.item, () => {
|
||||
page.load(route.params)
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
|
||||
</template>
|
|
@ -0,0 +1,81 @@
|
|||
<script setup lang="ts">
|
||||
import icon_3d from '../assets/btn/3D_sm.svg';
|
||||
import icon_home from '../assets/btn/home.svg';
|
||||
import icon_gallery from '../assets/btn/gallery.svg';
|
||||
import { useRoute } from 'vue-router';
|
||||
import { useItem } from '../stores/item';
|
||||
import { onMounted, ref } from 'vue';
|
||||
import { SERVER_URL } from '../constants';
|
||||
import { useTimer } from '../stores/timer';
|
||||
import { useTimerHome } from '../stores/timer_home';
|
||||
|
||||
const route = useRoute()
|
||||
const pageStore = useItem()
|
||||
const timer = useTimer()
|
||||
const home_timer = useTimerHome()
|
||||
|
||||
const items = ref([] as { name: string, slug: string }[])
|
||||
|
||||
onMounted(async () => {
|
||||
const res = await fetch(`${SERVER_URL}/api/item/`)
|
||||
const data = await res.json()
|
||||
|
||||
data.forEach((element: any) => {
|
||||
items.value.push({
|
||||
name: element.name,
|
||||
slug: element.slug,
|
||||
})
|
||||
});
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<div class="nav">
|
||||
<div class="nav-group">
|
||||
<span class="nav-icon" :class="[{ 'active': ['main', 'home_no'].includes(route.name as string) }]">
|
||||
<RouterLink :to="`/${pageStore.page.slug}`">
|
||||
<icon_home />
|
||||
</RouterLink>
|
||||
</span>
|
||||
<span class="nav-icon" :class="[{ 'active': route.name == 'scene' }]" style="font-size: 1.875rem;">
|
||||
<RouterLink :to="`/${pageStore.page.slug}/${pageStore.page.scene_3d}`">
|
||||
<icon_3d />
|
||||
</RouterLink>
|
||||
</span>
|
||||
<span class="nav-icon" :class="[{ 'active': route.name == 'gallery' }]" style="font-size: 1.375rem;">
|
||||
<RouterLink :to="`/${pageStore.page.slug}/gallery`">
|
||||
<icon_gallery />
|
||||
</RouterLink>
|
||||
</span>
|
||||
</div>
|
||||
<div class="nav-content">
|
||||
<span style="opacity: 0.5; margin-right: 1rem" v-if=false>
|
||||
{{ timer.seconds_left }}
|
||||
</span>
|
||||
<span style="opacity: 0.5; margin-right: 1rem" v-if="false">
|
||||
{{ home_timer.seconds_left }}
|
||||
</span>
|
||||
<template v-if="['main', 'home_no'].includes(route.name as string)">
|
||||
Нажмите на <span class="nav-icon">
|
||||
<icon_3d />
|
||||
</span>, чтобы узнать подробнее про объекты
|
||||
</template>
|
||||
<template v-if="['scene'].includes(route.name as string)">
|
||||
Нажмите на <span class="nav-icon">
|
||||
<i-icon-park-solid-left-c />
|
||||
</span> вверху экрана, чтобы узнать подробнее про объекты
|
||||
</template>
|
||||
<template v-if="['gallery'].includes(route.name as string)">
|
||||
Картинки можно перетаскивать
|
||||
</template>
|
||||
</div>
|
||||
<div class="nav-group">
|
||||
<template v-for="item in items">
|
||||
<span class="nav-icon" :class="[{ active: item.slug == pageStore.page.slug }]">
|
||||
<RouterLink :to="`/${item.slug}`" :title="item.name">
|
||||
{{ item.name[0].toUpperCase() }}
|
||||
</RouterLink>
|
||||
</span>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
|
@ -0,0 +1,77 @@
|
|||
<script setup lang="ts">
|
||||
import { ref, watch } from 'vue';
|
||||
import { RouterLink, useRoute } from 'vue-router';
|
||||
import { usePromoSidebar } from '../stores/promo_sidebar';
|
||||
import { usePromoScene } from '../stores/promo_scene';
|
||||
|
||||
const sidebar = usePromoSidebar()
|
||||
const sidebar_scene = usePromoScene()
|
||||
const route = useRoute()
|
||||
|
||||
const clickable_obj = ref()
|
||||
|
||||
watch(clickable_obj, () => {
|
||||
sidebar.open(clickable_obj.value);
|
||||
})
|
||||
watch(() => sidebar.id_clickable, () => {
|
||||
if (sidebar.is_open) {
|
||||
clickable_obj.value = sidebar.id_clickable
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<div class="sidebar" :class="[{ 'open': sidebar.is_open }]">
|
||||
<template v-if="!sidebar.is_open"></template>
|
||||
<template v-else>
|
||||
<div class="sidebar-content">
|
||||
<h2>{{ sidebar_scene.name }}</h2>
|
||||
<div class="sidebar-accordion" :class="[{ 'open': sidebar.isAccOpen('clickable') }]" v-if="sidebar_scene.clickable.length > 0">
|
||||
<div class="sidebar-accordion-title" @click="sidebar.toggleAccordion('clickable')">
|
||||
<i-mdi-minus-circle v-if="sidebar.isAccOpen('clickable')" />
|
||||
<i-mdi-plus-circle v-else />
|
||||
<h3>Виртуальный тур</h3>
|
||||
</div>
|
||||
|
||||
<div class="sidebar-accordion-content" v-if="sidebar.isAccOpen('clickable')">
|
||||
<div class="sidebar-list-item" v-for="(item, index) in sidebar_scene.clickable">
|
||||
<input type="radio" name="clickable" v-model="clickable_obj" :value="item.id"
|
||||
:id="item.id.toString()" />
|
||||
<label :for="item.id.toString()">{{ index + 1 }} {{ item.name }}</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebar-accordion" :class="[{ 'open': sidebar.isAccOpen('obj') }]" v-if="sidebar_scene.visible.length > 0" >
|
||||
<div class="sidebar-accordion-title" @click="sidebar.toggleAccordion('obj')">
|
||||
<i-mdi-minus-circle v-if="sidebar.isAccOpen('obj')" />
|
||||
<i-mdi-plus-circle v-else />
|
||||
<h3>Объекты</h3>
|
||||
</div>
|
||||
|
||||
<div class="sidebar-accordion-content" v-if="sidebar.isAccOpen('obj')">
|
||||
<div class="sidebar-list-item" v-for="item in sidebar_scene.visible">
|
||||
<input type="checkbox" v-model=item.is_enabled :value="item.id" :id="item.id.toString()" />
|
||||
<label :for="item.id.toString()">{{ item.name }}</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sidebar-accordion" :class="[{ 'open': sidebar.isAccOpen('desc') }]">
|
||||
<div class="sidebar-accordion-title" @click="sidebar.toggleAccordion('desc')">
|
||||
<i-mdi-minus-circle v-if="sidebar.isAccOpen('desc')" />
|
||||
<i-mdi-plus-circle v-else />
|
||||
<h3>Описание</h3>
|
||||
</div>
|
||||
<div class="sidebar-accordion-content" v-if="sidebar.isAccOpen('desc')">
|
||||
<template
|
||||
v-for="p in (sidebar.description || sidebar_scene.description || '').replace(/(\n|\r)+/g, '\n').split('\n')">
|
||||
<p>{{ p }}</p>
|
||||
</template>
|
||||
<RouterLink :to="`/${route.params.item}/${sidebar.target}`" v-if="sidebar.target">
|
||||
Перейти
|
||||
</RouterLink>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
|
@ -2,3 +2,4 @@ export const SERVER_URL = import.meta.env.VITE_SERVER_URL ?? window.location.ori
|
|||
export const IMAGE_URL = import.meta.env.VITE_IMAGE_URL ?? window.location.origin
|
||||
|
||||
export const PROMOBG = '#ccc'
|
||||
export const title = 'Проекты Кустарщины'
|
|
@ -15,14 +15,14 @@ interface scene3D {
|
|||
min_distance: number
|
||||
max_distance: number
|
||||
elements: element3DType[]
|
||||
description?: string
|
||||
env: {
|
||||
hdr_gainmap?: string
|
||||
hdr_json?: string
|
||||
hdr_webp?: string
|
||||
env_displacementmap?: string
|
||||
env_normalmap?: string
|
||||
clear_color?: string
|
||||
}
|
||||
loading?: boolean
|
||||
}
|
||||
interface element3DType {
|
||||
id: number
|
||||
|
@ -39,6 +39,7 @@ interface element3DType {
|
|||
z_pos: number
|
||||
}
|
||||
interface model3DType {
|
||||
id?: number
|
||||
modelUrl?: string,
|
||||
modelFile?: any,
|
||||
name: string
|
||||
|
@ -51,22 +52,23 @@ interface clickableAreaType {
|
|||
image?: string;
|
||||
source: number;
|
||||
target: number;
|
||||
target_name?: string
|
||||
}
|
||||
interface PromoSidebarData {
|
||||
title?: string
|
||||
description?: string
|
||||
target?: string
|
||||
target_name?: string
|
||||
}
|
||||
interface PromoSidebar extends PromoSidebarData {
|
||||
id_clickable?: number
|
||||
loading: boolean
|
||||
is_open: boolean
|
||||
is_btn_open: boolean
|
||||
accordions: string[]
|
||||
}
|
||||
interface PromoScene {
|
||||
id: number
|
||||
name: string
|
||||
is_enabled?: boolean
|
||||
}
|
||||
interface EnvVars {
|
||||
focus: number,
|
||||
|
@ -74,6 +76,19 @@ interface EnvVars {
|
|||
hdr_json?: string,
|
||||
hdr_webp?: string,
|
||||
clear_color?: string,
|
||||
env_displacementmap?: string,
|
||||
env_normalmap?: string
|
||||
}
|
||||
|
||||
interface PageItem {
|
||||
id: number;
|
||||
images: Image[];
|
||||
name: string;
|
||||
slug: string;
|
||||
is_front: boolean;
|
||||
scene_3d: number;
|
||||
}
|
||||
interface Image {
|
||||
id: number;
|
||||
file: string;
|
||||
alt: string;
|
||||
title: string;
|
||||
}
|
|
@ -5,13 +5,21 @@ import { createWebHistory, createRouter } from 'vue-router'
|
|||
import './assets/main.scss'
|
||||
|
||||
import App from './App.vue'
|
||||
import Main from './components/Main/index.vue'
|
||||
import Gallery from './components/Gallery/index.vue'
|
||||
import Promo from './components/Promo/index.vue'
|
||||
import PromoMain from './components/Promo/main.vue'
|
||||
import { title } from './constants'
|
||||
|
||||
const routes = [
|
||||
{ path: '/', component: Promo },
|
||||
{ path: '/:item', component: Promo },
|
||||
{ path: '/:item/:target', component: PromoMain },
|
||||
{
|
||||
path: '/',
|
||||
component: Main,
|
||||
name: 'home_no',
|
||||
meta: { title: title }
|
||||
},
|
||||
{ path: '/:item', component: Main, name: 'main', meta: { title: title } },
|
||||
{ path: '/:item/gallery', component: Gallery, name: 'gallery', meta: { title: `Галерея - ${title}` } },
|
||||
{ path: '/:item/:target', component: Promo, name: 'scene', meta: { title: `Модель ${title}` } },
|
||||
]
|
||||
|
||||
const router = createRouter({
|
||||
|
@ -19,6 +27,17 @@ const router = createRouter({
|
|||
routes,
|
||||
})
|
||||
|
||||
router.beforeEach((to, from, next) => {
|
||||
document.title = to.meta && to.meta.title ? to.meta.title.toString() : title;
|
||||
|
||||
console.log('Navigating from', from.fullPath, 'to', to.fullPath);
|
||||
next();
|
||||
});
|
||||
|
||||
if (navigator.maxTouchPoints == 0) {
|
||||
document.body.classList += 'notouch'
|
||||
}
|
||||
|
||||
|
||||
const pinia = createPinia()
|
||||
const app = createApp(App)
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
import { defineStore } from 'pinia'
|
||||
import { SERVER_URL } from '../constants'
|
||||
export const useItem = defineStore('item', {
|
||||
state: () => {
|
||||
return {
|
||||
page: {} as PageItem
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
async load(params: any) {
|
||||
const res = await fetch(`${SERVER_URL}/api/item/${params.item ? (params.item + '/') : '?is_front=true'}`)
|
||||
const pageArray = await res.json()
|
||||
const page = Array.isArray(pageArray) ? pageArray[0] : pageArray
|
||||
this.page = page
|
||||
return page
|
||||
}
|
||||
}
|
||||
})
|
|
@ -11,6 +11,7 @@ const lines = {
|
|||
clickable: "Расставляем кликабельные элементы",
|
||||
boxes: "Считаем коробки",
|
||||
other: "Делаем еще что-то важное",
|
||||
loading: "Получаем данные",
|
||||
}
|
||||
export const useLoading = defineStore('loading', {
|
||||
state: () => {
|
||||
|
@ -21,10 +22,11 @@ export const useLoading = defineStore('loading', {
|
|||
},
|
||||
actions: {
|
||||
getStatus() {
|
||||
if (this.status == 'model') {
|
||||
return lines[this.status] + ' ' + this.count
|
||||
const key = this.status as keyof typeof lines;
|
||||
if (key == 'model') {
|
||||
return `${lines[key]}${this.count ? (' ' + (this.count + 1)) : ''}`
|
||||
}
|
||||
return lines[this.status]
|
||||
return lines[key]
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
@ -1,19 +1,28 @@
|
|||
import { defineStore } from 'pinia'
|
||||
|
||||
type state = {
|
||||
name: string,
|
||||
list: PromoScene[]
|
||||
name?: string,
|
||||
description?: string,
|
||||
clickable: PromoScene[],
|
||||
visible: PromoScene[],
|
||||
}
|
||||
export const usePromoScene = defineStore('promo_scene', {
|
||||
state: () => {
|
||||
return {
|
||||
name: '',
|
||||
list: []
|
||||
clickable: [],
|
||||
visible: [],
|
||||
} as state
|
||||
},
|
||||
actions: {
|
||||
setData(data: PromoScene[]) {
|
||||
this.list = data
|
||||
setName(data: any) {
|
||||
this.name = data.name
|
||||
this.description = data.description
|
||||
},
|
||||
setClickable(data: PromoScene[]) {
|
||||
this.clickable = data
|
||||
},
|
||||
setVisible(data: PromoScene[]) {
|
||||
this.visible = data
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
@ -8,9 +8,10 @@ export const usePromoSidebar = defineStore('promo_sidebar', {
|
|||
title: undefined,
|
||||
description: undefined,
|
||||
target: undefined,
|
||||
target_name: undefined,
|
||||
loading: true,
|
||||
is_open: false
|
||||
is_open: false,
|
||||
is_btn_open: false,
|
||||
accordions: [],
|
||||
} as PromoSidebar
|
||||
},
|
||||
actions: {
|
||||
|
@ -27,23 +28,50 @@ export const usePromoSidebar = defineStore('promo_sidebar', {
|
|||
} as PromoSidebarData
|
||||
if (target?.target) {
|
||||
sidebar_data.target = target.target.toString()
|
||||
sidebar_data.target_name = target.target_name
|
||||
}
|
||||
this.setData(sidebar_data)
|
||||
}
|
||||
|
||||
if (!this.is_btn_open) {
|
||||
this.is_btn_open = true
|
||||
this.is_open = true
|
||||
}
|
||||
this.loading = true
|
||||
|
||||
},
|
||||
setData(data: PromoSidebarData) {
|
||||
this.$state = Object.assign(this.$state, data)
|
||||
this.$state = Object.assign(this.$state, { target: undefined }, data)
|
||||
},
|
||||
close() {
|
||||
if (this.is_open) {
|
||||
this.$reset()
|
||||
this.is_open = false
|
||||
// this.id_clickable = undefined;
|
||||
// this.target = undefined;
|
||||
// this.loading = true;
|
||||
this.is_open = false;
|
||||
this.accordions = []
|
||||
}
|
||||
},
|
||||
closeBtn() {
|
||||
this.$reset;
|
||||
this.is_open = false;
|
||||
this.is_btn_open = false;
|
||||
},
|
||||
toggleAccordion(name: string, newState = null) {
|
||||
if (name == 'obj' && this.accordions.includes('clickable')) this.toggleAccordion('clickable')
|
||||
if (name == 'clickable' && this.accordions.includes('obj')) this.toggleAccordion('obj')
|
||||
|
||||
if (this.accordions.includes(name)) {
|
||||
if (newState == false || newState == null) {
|
||||
this.accordions.splice(this.accordions.indexOf(name), 1)
|
||||
}
|
||||
} else {
|
||||
if (newState == true || newState == null) {
|
||||
this.accordions.push(name)
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
isAccOpen(name: string) {
|
||||
return this.accordions.includes(name)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
import { defineStore } from 'pinia'
|
||||
import { SERVER_URL } from '../constants'
|
||||
|
||||
export const useRawData = defineStore('raw_data', {
|
||||
state: () => {
|
||||
return {
|
||||
data: {} as scene3D
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
async load(params: any) {
|
||||
const res = await fetch(`${SERVER_URL}/api/obj/scene/${params.source}/`)
|
||||
const raw_data = await res.json() as scene3D
|
||||
this.data = raw_data
|
||||
return raw_data
|
||||
}
|
||||
}
|
||||
})
|
|
@ -1,4 +1,5 @@
|
|||
import { defineStore } from 'pinia'
|
||||
|
||||
const BASE_TIMER = 10
|
||||
interface state {
|
||||
timer_el: any,
|
||||
|
@ -18,12 +19,13 @@ export const useTimer = defineStore('timer', {
|
|||
actions: {
|
||||
startTimer() {
|
||||
this.is_enabled = true
|
||||
clearInterval(this.timer_el)
|
||||
this.resetTimer()
|
||||
this.countdownTimer()
|
||||
this.timer_el = this.countdownTimer()
|
||||
},
|
||||
stopTimer() {
|
||||
this.is_enabled = false
|
||||
clearInterval(this.timer_el)
|
||||
|
||||
if (this.timer_func) {
|
||||
this.timer_func()
|
||||
this.startTimer()
|
||||
|
@ -36,7 +38,7 @@ export const useTimer = defineStore('timer', {
|
|||
this.seconds_left = time
|
||||
},
|
||||
countdownTimer() {
|
||||
this.timer_el = setInterval(() => {
|
||||
const id = setInterval(() => {
|
||||
if (this.is_enabled && this.seconds_left > 0) {
|
||||
this.seconds_left -= 1
|
||||
// this.countdownTimer()
|
||||
|
@ -45,6 +47,7 @@ export const useTimer = defineStore('timer', {
|
|||
this.stopTimer()
|
||||
}
|
||||
}, 1000)
|
||||
return id
|
||||
},
|
||||
}
|
||||
})
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
import { defineStore } from 'pinia'
|
||||
const BASE_TIMER = 30
|
||||
interface state {
|
||||
timer_el: any,
|
||||
timer_func: any,
|
||||
is_enabled: boolean,
|
||||
seconds_left: number
|
||||
}
|
||||
export const useTimerHome = defineStore('timer_home', {
|
||||
state: () => {
|
||||
return {
|
||||
timer_el: undefined,
|
||||
timer_func: undefined,
|
||||
is_enabled: false,
|
||||
seconds_left: BASE_TIMER
|
||||
} as state
|
||||
},
|
||||
actions: {
|
||||
startTimer() {
|
||||
this.is_enabled = true
|
||||
clearInterval(this.timer_el)
|
||||
this.resetTimer()
|
||||
this.timer_el = this.countdownTimer()
|
||||
},
|
||||
stopTimer() {
|
||||
this.is_enabled = false
|
||||
if (this.timer_func) {
|
||||
this.timer_func()
|
||||
this.startTimer()
|
||||
}
|
||||
},
|
||||
pauseTimer() {
|
||||
this.is_enabled = !this.is_enabled
|
||||
},
|
||||
resetTimer() {
|
||||
this.seconds_left = BASE_TIMER
|
||||
},
|
||||
setTimer(time: number) {
|
||||
this.seconds_left = time
|
||||
},
|
||||
countdownTimer() {
|
||||
const id = setInterval(() => {
|
||||
if (this.is_enabled && this.seconds_left > 0) {
|
||||
this.seconds_left -= 1
|
||||
// this.countdownTimer()
|
||||
}
|
||||
if (this.is_enabled && this.seconds_left == 0) {
|
||||
this.stopTimer()
|
||||
}
|
||||
}, 1000)
|
||||
return id
|
||||
},
|
||||
}
|
||||
})
|
|
@ -0,0 +1,528 @@
|
|||
{
|
||||
"name": "interactive-table",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"@tresjs/post-processing": "^0.7.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@alvarosabu/utils": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@alvarosabu/utils/-/utils-3.2.0.tgz",
|
||||
"integrity": "sha512-aoGWRfaQjOo9TUwrBA6W0zwTHktgrXy69GIFNILT4gHsqscw6+X8P6uoSlZVQFr887SPm8x3aDin5EBVq8y4pw=="
|
||||
},
|
||||
"node_modules/@babel/helper-string-parser": {
|
||||
"version": "7.24.8",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
|
||||
"integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/helper-validator-identifier": {
|
||||
"version": "7.24.7",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
|
||||
"integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/parser": {
|
||||
"version": "7.25.6",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz",
|
||||
"integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/types": "^7.25.6"
|
||||
},
|
||||
"bin": {
|
||||
"parser": "bin/babel-parser.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/types": {
|
||||
"version": "7.25.6",
|
||||
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz",
|
||||
"integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/helper-string-parser": "^7.24.8",
|
||||
"@babel/helper-validator-identifier": "^7.24.7",
|
||||
"to-fast-properties": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@jridgewell/sourcemap-codec": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
|
||||
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/@tresjs/core": {
|
||||
"version": "3.9.0",
|
||||
"resolved": "https://registry.npmjs.org/@tresjs/core/-/core-3.9.0.tgz",
|
||||
"integrity": "sha512-6el70oXSduTvSA3XCI8/rQV2GzcgCLceZKA443CTU/MBPmRDULJ12q/UYl18Ij4CJ68rTqgVi0Da+WNMrs784A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@alvarosabu/utils": "^3.1.1",
|
||||
"@vue/devtools-api": "^6.6.1",
|
||||
"@vueuse/core": "^10.7.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"three": ">=0.133",
|
||||
"vue": ">=3.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@tresjs/post-processing": {
|
||||
"version": "0.7.1",
|
||||
"resolved": "https://registry.npmjs.org/@tresjs/post-processing/-/post-processing-0.7.1.tgz",
|
||||
"integrity": "sha512-MLrjxR4rJ55MOYFKMEZ8aqh5no2/sOG1fdYk2B49Ntx2p2etyuVpI6e9BBAvrc4M/wktRHkQ2JNDbgMaCiJoMg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@tresjs/core": "^3.5.1",
|
||||
"@unocss/core": "^0.58.0",
|
||||
"@vueuse/core": "^10.6.1",
|
||||
"postprocessing": "^6.33.4",
|
||||
"three-stdlib": "^2.28.7"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"three": ">=0.133",
|
||||
"vue": ">=3.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/draco3d": {
|
||||
"version": "1.4.10",
|
||||
"resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz",
|
||||
"integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/offscreencanvas": {
|
||||
"version": "2019.7.3",
|
||||
"resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz",
|
||||
"integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/web-bluetooth": {
|
||||
"version": "0.0.20",
|
||||
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
|
||||
"integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/webxr": {
|
||||
"version": "0.5.20",
|
||||
"resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.20.tgz",
|
||||
"integrity": "sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@unocss/core": {
|
||||
"version": "0.58.9",
|
||||
"resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.58.9.tgz",
|
||||
"integrity": "sha512-wYpPIPPsOIbIoMIDuH8ihehJk5pAZmyFKXIYO/Kro98GEOFhz6lJoLsy6/PZuitlgp2/TSlubUuWGjHWvp5osw==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-core": {
|
||||
"version": "3.4.38",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.38.tgz",
|
||||
"integrity": "sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.24.7",
|
||||
"@vue/shared": "3.4.38",
|
||||
"entities": "^4.5.0",
|
||||
"estree-walker": "^2.0.2",
|
||||
"source-map-js": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-dom": {
|
||||
"version": "3.4.38",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.38.tgz",
|
||||
"integrity": "sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-core": "3.4.38",
|
||||
"@vue/shared": "3.4.38"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-sfc": {
|
||||
"version": "3.4.38",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.38.tgz",
|
||||
"integrity": "sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.24.7",
|
||||
"@vue/compiler-core": "3.4.38",
|
||||
"@vue/compiler-dom": "3.4.38",
|
||||
"@vue/compiler-ssr": "3.4.38",
|
||||
"@vue/shared": "3.4.38",
|
||||
"estree-walker": "^2.0.2",
|
||||
"magic-string": "^0.30.10",
|
||||
"postcss": "^8.4.40",
|
||||
"source-map-js": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-ssr": {
|
||||
"version": "3.4.38",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.38.tgz",
|
||||
"integrity": "sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-dom": "3.4.38",
|
||||
"@vue/shared": "3.4.38"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/devtools-api": {
|
||||
"version": "6.6.3",
|
||||
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz",
|
||||
"integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@vue/reactivity": {
|
||||
"version": "3.4.38",
|
||||
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.38.tgz",
|
||||
"integrity": "sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/shared": "3.4.38"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/runtime-core": {
|
||||
"version": "3.4.38",
|
||||
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.38.tgz",
|
||||
"integrity": "sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/reactivity": "3.4.38",
|
||||
"@vue/shared": "3.4.38"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/runtime-dom": {
|
||||
"version": "3.4.38",
|
||||
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.38.tgz",
|
||||
"integrity": "sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/reactivity": "3.4.38",
|
||||
"@vue/runtime-core": "3.4.38",
|
||||
"@vue/shared": "3.4.38",
|
||||
"csstype": "^3.1.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/server-renderer": {
|
||||
"version": "3.4.38",
|
||||
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.38.tgz",
|
||||
"integrity": "sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-ssr": "3.4.38",
|
||||
"@vue/shared": "3.4.38"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vue": "3.4.38"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/shared": {
|
||||
"version": "3.4.38",
|
||||
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.38.tgz",
|
||||
"integrity": "sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==",
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/@vueuse/core": {
|
||||
"version": "10.11.1",
|
||||
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz",
|
||||
"integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/web-bluetooth": "^0.0.20",
|
||||
"@vueuse/metadata": "10.11.1",
|
||||
"@vueuse/shared": "10.11.1",
|
||||
"vue-demi": ">=0.14.8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/@vueuse/core/node_modules/vue-demi": {
|
||||
"version": "0.14.10",
|
||||
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
|
||||
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@vue/composition-api": "^1.0.0-rc.1",
|
||||
"vue": "^3.0.0-0 || ^2.6.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@vue/composition-api": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@vueuse/metadata": {
|
||||
"version": "10.11.1",
|
||||
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz",
|
||||
"integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==",
|
||||
"license": "MIT",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/@vueuse/shared": {
|
||||
"version": "10.11.1",
|
||||
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz",
|
||||
"integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"vue-demi": ">=0.14.8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/@vueuse/shared/node_modules/vue-demi": {
|
||||
"version": "0.14.10",
|
||||
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
|
||||
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@vue/composition-api": "^1.0.0-rc.1",
|
||||
"vue": "^3.0.0-0 || ^2.6.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@vue/composition-api": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/csstype": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
|
||||
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/draco3d": {
|
||||
"version": "1.5.7",
|
||||
"resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz",
|
||||
"integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==",
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/entities": {
|
||||
"version": "4.5.0",
|
||||
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
|
||||
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
|
||||
"license": "BSD-2-Clause",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=0.12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/fb55/entities?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/estree-walker": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
|
||||
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/fflate": {
|
||||
"version": "0.6.10",
|
||||
"resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz",
|
||||
"integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/magic-string": {
|
||||
"version": "0.30.11",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
|
||||
"integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@jridgewell/sourcemap-codec": "^1.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
"version": "3.3.7",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
|
||||
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"nanoid": "bin/nanoid.cjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/picocolors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
|
||||
"integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
|
||||
"license": "ISC",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.4.44",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.44.tgz",
|
||||
"integrity": "sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/postcss/"
|
||||
},
|
||||
{
|
||||
"type": "tidelift",
|
||||
"url": "https://tidelift.com/funding/github/npm/postcss"
|
||||
},
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ai"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.7",
|
||||
"picocolors": "^1.0.1",
|
||||
"source-map-js": "^1.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12 || >=14"
|
||||
}
|
||||
},
|
||||
"node_modules/postprocessing": {
|
||||
"version": "6.36.0",
|
||||
"resolved": "https://registry.npmjs.org/postprocessing/-/postprocessing-6.36.0.tgz",
|
||||
"integrity": "sha512-7V2t8Yi+Edh0FybErMdBV3CCJ/tTeNeLh6z+i0VczwZ6HGV3XyRfC8v4Ps9a6tjawcTvatLptQzX8QnDlU8BXw==",
|
||||
"license": "Zlib",
|
||||
"peerDependencies": {
|
||||
"three": ">= 0.157.0 < 0.168.0"
|
||||
}
|
||||
},
|
||||
"node_modules/potpack": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz",
|
||||
"integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/source-map-js": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
|
||||
"integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
|
||||
"license": "BSD-3-Clause",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/three": {
|
||||
"version": "0.167.1",
|
||||
"resolved": "https://registry.npmjs.org/three/-/three-0.167.1.tgz",
|
||||
"integrity": "sha512-gYTLJA/UQip6J/tJvl91YYqlZF47+D/kxiWrbTon35ZHlXEN0VOo+Qke2walF1/x92v55H6enomymg4Dak52kw==",
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/three-stdlib": {
|
||||
"version": "2.32.2",
|
||||
"resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.32.2.tgz",
|
||||
"integrity": "sha512-ZN25Na/Xg7APhGKwJ1zhGdhZDsDGGnnm1k5Z+9LLlnfsFye4jigvbN3eA/Ta8hQmBNmEHXoozpmpKK1x8dCePQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/draco3d": "^1.4.0",
|
||||
"@types/offscreencanvas": "^2019.6.4",
|
||||
"@types/webxr": "^0.5.2",
|
||||
"draco3d": "^1.4.1",
|
||||
"fflate": "^0.6.9",
|
||||
"potpack": "^1.0.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"three": ">=0.128.0"
|
||||
}
|
||||
},
|
||||
"node_modules/to-fast-properties": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
|
||||
"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/vue": {
|
||||
"version": "3.4.38",
|
||||
"resolved": "https://registry.npmjs.org/vue/-/vue-3.4.38.tgz",
|
||||
"integrity": "sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-dom": "3.4.38",
|
||||
"@vue/compiler-sfc": "3.4.38",
|
||||
"@vue/runtime-dom": "3.4.38",
|
||||
"@vue/server-renderer": "3.4.38",
|
||||
"@vue/shared": "3.4.38"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"typescript": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"dependencies": {
|
||||
"@tresjs/post-processing": "^0.7.1"
|
||||
}
|
||||
}
|
|
@ -43,6 +43,20 @@ files = [
|
|||
django = ">=4.2"
|
||||
django-crispy-forms = ">=2.0"
|
||||
|
||||
[[package]]
|
||||
name = "diff-match-patch"
|
||||
version = "20230430"
|
||||
description = "Diff Match and Patch"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "diff-match-patch-20230430.tar.gz", hash = "sha256:953019cdb9c9d2c9e47b5b12bcff3cf4746fc4598eb406076fa1fc27e6a1f15c"},
|
||||
{file = "diff_match_patch-20230430-py3-none-any.whl", hash = "sha256:dce43505fb7b1b317de7195579388df0746d90db07015ed47a85e5e44930ef93"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
dev = ["attribution (==1.6.2)", "black (==23.3.0)", "flit (==3.8.0)", "mypy (==1.2.0)", "ufmt (==2.1.0)", "usort (==1.0.6)"]
|
||||
|
||||
[[package]]
|
||||
name = "django"
|
||||
version = "5.0.6"
|
||||
|
@ -134,6 +148,31 @@ files = [
|
|||
[package.dependencies]
|
||||
Django = ">=4.2"
|
||||
|
||||
[[package]]
|
||||
name = "django-import-export"
|
||||
version = "4.1.1"
|
||||
description = "Django application and library for importing and exporting data with included admin integration."
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "django_import_export-4.1.1-py3-none-any.whl", hash = "sha256:730ae2443a02b1ba27d8dba078a27ae9123adfcabb78161b4f130843607b3df9"},
|
||||
{file = "django_import_export-4.1.1.tar.gz", hash = "sha256:16ecc5a9f0df46bde6eb278a3e65ebda0ee1db55656f36440e9fb83f40ab85a3"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
diff-match-patch = "*"
|
||||
Django = ">=3.2"
|
||||
tablib = "3.5.0"
|
||||
|
||||
[package.extras]
|
||||
all = ["tablib[all] (==3.5.0)"]
|
||||
cli = ["tablib[cli]"]
|
||||
ods = ["tablib[ods]"]
|
||||
pandas = ["tablib[pandas]"]
|
||||
xls = ["tablib[xls] (==3.5.0)"]
|
||||
xlsx = ["tablib[xlsx] (==3.5.0)"]
|
||||
yaml = ["tablib[yaml] (==3.5.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "djangorestframework"
|
||||
version = "3.15.1"
|
||||
|
@ -324,6 +363,27 @@ files = [
|
|||
dev = ["build", "hatch"]
|
||||
doc = ["sphinx"]
|
||||
|
||||
[[package]]
|
||||
name = "tablib"
|
||||
version = "3.5.0"
|
||||
description = "Format agnostic tabular data library (XLS, JSON, YAML, CSV, etc.)"
|
||||
optional = false
|
||||
python-versions = ">=3.8"
|
||||
files = [
|
||||
{file = "tablib-3.5.0-py3-none-any.whl", hash = "sha256:9821caa9eca6062ff7299fa645e737aecff982e6b2b42046928a6413c8dabfd9"},
|
||||
{file = "tablib-3.5.0.tar.gz", hash = "sha256:f6661dfc45e1d4f51fa8a6239f9c8349380859a5bfaa73280645f046d6c96e33"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
all = ["markuppy", "odfpy", "openpyxl (>=2.6.0)", "pandas", "pyyaml", "tabulate", "xlrd", "xlwt"]
|
||||
cli = ["tabulate"]
|
||||
html = ["markuppy"]
|
||||
ods = ["odfpy"]
|
||||
pandas = ["pandas"]
|
||||
xls = ["xlrd", "xlwt"]
|
||||
xlsx = ["openpyxl (>=2.6.0)"]
|
||||
yaml = ["pyyaml"]
|
||||
|
||||
[[package]]
|
||||
name = "taskipy"
|
||||
version = "1.12.2"
|
||||
|
@ -377,4 +437,4 @@ files = [
|
|||
[metadata]
|
||||
lock-version = "2.0"
|
||||
python-versions = "^3.10"
|
||||
content-hash = "e2a879fbbc841d8bceb6c622ba4fefd3930ffe8944faa0c9a3c9e976bbd7dd34"
|
||||
content-hash = "721ce91ef3ad82e5b07e5c1c94740541e5edc6250a4c6c51fcfa5ff2ab2cc290"
|
||||
|
|
|
@ -20,6 +20,7 @@ django-crispy-forms = "^2.2"
|
|||
crispy-bootstrap4 = "^2024.1"
|
||||
django-extensions = "^3.2.3"
|
||||
django-colorfield = "^0.11.0"
|
||||
django-import-export = "^4.1.1"
|
||||
|
||||
|
||||
[build-system]
|
||||
|
|