Initial commit

This commit is contained in:
2025-07-15 23:39:10 +02:00
parent 1d3986a901
commit fb14214612
181 changed files with 31070 additions and 50 deletions

View File

@ -0,0 +1,130 @@
{#<div class="sp_panel__header"></div>#}
<div class="sp_panel__switch">
<img class="sp_panel__open" src="{{ asset(assets.img.ui~'arrow_open.png') }}" alt="-">
<img class="sp_panel__close" src="{{ asset(assets.img.ui~'arrow_close.png') }}" alt="-">
</div>
<div class="sp_panel__content-switch-container">
<div class="sp_panel__content-switch sp_panel__switch-active" data-target="worldmap-filters">
<img src="{{ asset(assets.img.ui~'content-pins.png') }}" alt="-">
</div>
<div class="sp_panel__content-switch" data-target="worlmap-settings">
<img src="{{ asset(assets.img.ui~'content-settings.png') }}" alt="-">
</div>
</div>
<div id="primogem-counter-container">
<div class="sp_primogem__main-container">
<div>
<div>At least</div>
<div id="primogem-counter">0</div>
<div class="sp_icon__container sp_header__page-icon">
<img src="{{ asset(assets.img.ui ~'primogem.png') }}" alt="Primogem">
</div>
</div>
<div><h2>primogems</h2>&nbsp;left to collect</div>
</div>
</div>
<div class="sp_panel__content sp_slider">
{% set leftIndex = worldmarksData|length %}
<div id="worldmap-filters" class="sp_slider__slide sp_slider__slide-open">
<section class="sp_panel__section sp_filter__section" style="color:#c31414;font-weight:bold;background-color:rgba(0,0,0,0.1);">
<span>This website is used as portfolio and is no longer maintained. While the data it provide is still accurate, it will not be updated anymore.</span>
<span style="padding-top: 8px">Credits to HoYoVerse for the icons and images.</span>
</section>
{% for _worldmarkCategory in worldmarksData %}
<section class="sp_panel__section sp_filter__section">
<div class="sp_panel__section-title">
<h2 data-section-title="{{ _worldmarkCategory._data.name }}">{{ _worldmarkCategory._data.name }}<span>▼</span></h2>
<button class="sp_section-filter__switch" type="button" value="show_all">Show all</button>
<button class="sp_section-filter__switch" type="button" value="hide_all">Hide all</button>
</div>
<div class="sp_form-row__radio {{ is_granted('ROLE_CONTRIBUTOR') ? 'sp_radio__layout-grid-c' : 'sp_radio__layout-grid-b' }} sp_radio__style-icon">
<div class="sp_worldmap-filter__section sp_radio__container">
{% set rightIndex = _worldmarkCategory._worldmarks|length %}
{% for _worldmark in _worldmarkCategory._worldmarks %}
<label class="sp_radio__input-wrapper" title="{{ _worldmark.name }}">
<span class="sp_radio__input-icon">
<span class="sp_node__item">
<span class="sp_node__background">
<img {% if _worldmark.icon %}data-src="{{ asset(assets.worldmark.upload_path ~ _worldmark.icon) }}"{% endif%} src="{{ asset(assets.img._blank_xs) }}" alt="{{ _worldmark.name }}">
</span>
</span>
</span>
{#<span class="sp_radio__input-mark"></span>#}
<span class="sp_radio__input-label">{{ _worldmark.name }}</span>
<span class="nodes_count"></span>
<input class="sp_worldmap__filter" data-index="{{ (leftIndex * 100) + rightIndex }}" data-can-be-hidden="{{ _worldmark.canBeHidden }}" type="checkbox" value="{{ _worldmark.slug }}">
</label>
{% if is_granted('ROLE_CONTRIBUTOR') %}
<button class="sp_button sp_worldmark__init-new-node" data-uri="{{ path('bo_node_new', {'gridId': '%gridId%', 'worldmarkId': _worldmark.id}) }}">
<span>+</span>
</button>
{% endif %}
{% set rightIndex = rightIndex - 1 %}
{% endfor %}
</div>
</div>
</section>
{% set leftIndex = leftIndex - 1 %}
{% endfor %}
</div>
<div id="worlmap-settings" class="sp_slider__slide">
<section class="sp_panel__section">
<div class="sp_panel__section-title">
<label>Worldmap settings</label>
</div>
<div class="sp_form-row__radio sp_radio__layout-grid-a sp_radio__style-text">
<label class="sp_radio__main-label">Profile</label>
<div id="profiles__profiles-container" class="sp_radio__container">
<label class="sp_radio__input-wrapper" title="America">
<span class="sp_radio__input-mark"></span>
<span class="sp_radio__input-label">Profile A</span>
<input name="_profile" type="radio" value="profile-a">
</label>
<label class="sp_radio__input-wrapper" title="America">
<span class="sp_radio__input-mark"></span>
<span class="sp_radio__input-label">Profile B</span>
<input name="_profile" type="radio" value="profile-b">
</label>
<label class="sp_radio__input-wrapper" title="America">
<span class="sp_radio__input-mark"></span>
<span class="sp_radio__input-label">Profile C</span>
<input name="_profile" type="radio" value="profile-c">
</label>
<label class="sp_radio__input-wrapper" title="America">
<span class="sp_radio__input-mark"></span>
<span class="sp_radio__input-label">Profile D</span>
<input name="_profile" type="radio" value="profile-d">
</label>
<label class="sp_radio__input-wrapper" title="America">
<span class="sp_radio__input-mark"></span>
<span class="sp_radio__input-label">Profile E</span>
<input name="_profile" type="radio" value="profile-e">
</label>
</div>
</div>
<div class="sp_form-row__radio sp_radio__layout-grid-a sp_radio__style-text">
<label class="sp_radio__main-label">Profile's server</label>
<div id="profiles__servers-container" class="sp_radio__container">
<label class="sp_radio__input-wrapper" title="America">
<span class="sp_radio__input-mark"></span>
<span class="sp_radio__input-label">America</span>
<input name="_profile__server" type="radio" value="na">
</label>
<label class="sp_radio__input-wrapper" title="Europe">
<span class="sp_radio__input-mark"></span>
<span class="sp_radio__input-label">Europe</span>
<input name="_profile__server" type="radio" value="eu">
</label>
<label class="sp_radio__input-wrapper" title="Asia">
<span class="sp_radio__input-mark"></span>
<span class="sp_radio__input-label">Asia</span>
<input name="_profile__server" type="radio" value="cn">
</label>
</div>
</div>
</section>
</div>
</div>

View File

@ -0,0 +1,31 @@
{% set screenshots = [] %}
{% set screenshots = screenshots|merge(node.screenshotA ? [asset(assets.screenshot.thumbnail_path ~ node.screenshotA)]: []) %}
{% set screenshots = screenshots|merge(node.screenshotB ? [asset(assets.screenshot.thumbnail_path ~ node.screenshotB)]: []) %}
{% set screenshots = screenshots|merge(node.screenshotC ? [asset(assets.screenshot.thumbnail_path ~ node.screenshotC)]: []) %}
{% set screenshots = screenshots|merge(node.screenshotD ? [asset(assets.screenshot.thumbnail_path ~ node.screenshotD)]: []) %}
{% set screenshots = screenshots|merge(node.screenshotE ? [asset(assets.screenshot.thumbnail_path ~ node.screenshotE)]: []) %}
<label id="{{ 'node-' ~ node.id }}" class="sp_node__item {% if is_granted('ROLE_ADMIN') and node.isDeleted %}sp_node__deleted{% endif %}"
data-coordinate="{{ node.coordinate|json_encode }}"
data-filter="{{ node.worldmark.slug }}"
data-can-be-hidden="{{ node.worldmark.canBeHidden }}"
{% if is_granted('ROLE_CONTRIBUTOR') %}data-edit-url="{{ path('bo_node_edit', {'gridId': node.grid.id, 'worldmarkId': node.worldmark.id, 'id': node.id}) }}"{% endif %}
{% if is_granted('ROLE_CONTRIBUTOR') %}data-delete-url="{{ path('bo_node_delete', {'gridId': node.grid.id, 'worldmarkId': node.worldmark.id, 'id': node.id}) }}"{% endif %}
data-description="{{ node.description }}"
{% if node.screenshotA %}data-screenshots="{{ screenshots|json_encode }}"{% endif %}
data-quantity="{{ node.quantity }}"
data-primogem="{{ node.primogem }}"
hidden>
<span class="sp_node__background">
{% if directRender is defined %}
<img src="{{ asset(node.worldmark.icon ? assets.worldmark.upload_path ~ node.worldmark.icon : assets.img._blank_xs) }}" alt="{{ node.worldmark.name }}">
{% else %}
<img {% if node.worldmark.icon %}data-src="{{ asset(assets.worldmark.upload_path ~ node.worldmark.icon) }}"{% endif %} src="{{ asset(assets.img._blank_xs) }}" alt="{{ node.worldmark.name }}">
{% endif %}
</span>
{% if node.quantity > 1 %}
<span class="sp_node__quantity">
<span>{{ node.quantity }}</span>
</span>
{% endif %}
</label>

View File

@ -0,0 +1,115 @@
{% extends 'base.html.twig' %}
{% set metaRegionName = region.name %}
{% for _region in region.subRegions|filter(_region => _region.isAlias and _region.parentRegion.id == region.id) %}
{% set metaRegionName = metaRegionName ~ ' and ' ~ _region.name %}
{% endfor %}
{% set metaTitle = title is defined ? title : 'Genshin Impact interactive map - Genshin World' %}
{#{% set metaDesc = 'Genshin Impact interactive map of ' ~ metaRegionName ~ '. Find every interest points, events, chests, monsters and materials of Teyvat. Up to date with latest patch.' %}#}
{% set metaDesc = 'Genshin Impact interactive map of ' ~ metaRegionName ~ '. Find every interest points, events, chests, monsters and materials of Teyvat.' %}
{% block meta %}
<meta name="title" content="{{ metaTitle }}">
<meta name="description" content="{{ metaDesc }}">
{% if not region.isActive %}
<meta name="robots" content="noindex, nofollow">
<meta name="googlebot" content="noindex, nofollow">
{% endif %}
<meta property="og:type" content="website">
<meta property="og:url" content="{{ url('fo_region_show', { 'slug': regionSlug }) }}">
<meta property="og:title" content="{{ metaTitle }}">
<meta property="og:description" content="{{ metaDesc }}">
<meta property="og:image" content="https://genshin-world.com/og.jpg">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="{{ url('fo_region_show', { 'slug': regionSlug }) }}">
<meta property="twitter:title" content="{{ metaTitle }}">
<meta property="twitter:description" content="{{ metaDesc }}">
<meta property="twitter:image" content="https://genshin-world.com/og.jpg">
<link rel="canonical" href="{{ url('fo_region_show', { 'slug': region.slug }) }}">
{% endblock %}
{% block leftPanel %}
{% include 'woldmap/_leftPannel.html.twig' %}
{% endblock %}
{% block body %}
<h1 id="map-title">{{ metaTitle }}</h1>
<div id="worldmap-container" class="sp_grid__container" data-region-id="{{ region.slug }}" data-region-name="{{ region.name }}" data-region-width="{{ region.gridWidth }}" data-region-height="{{ region.gridHeight }}" {% if anchor %}data-anchor="{{ anchor }}"{% endif %}>
{% for row in 1..region.gridHeight %}
{% for col in 1..region.gridWidth %}
<div id="grid-{{ grid[row][col]['id'] }}" class="sp_grid__cell">
{% set idHash = 'map_g' ~ grid[row][col]['id'] ~ '_v' ~ version %}
<img id="{{ idHash }}" class="sp_grid__map" {% if grid[row][col]['map_data']['map'].id is not null %}data-src="{{ asset(assets.map.upload_path ~ grid[row][col]['map_data']['map'].file) }}"{% endif %} src="{{ asset(assets.map[region.mapBackground]) }}" alt="{{ region.name }}" draggable="false">
<div class="sp_grid__node-container">
{% if nodes['grid_' ~ grid[row][col]['id']] is defined %}
{% for _node in nodes['grid_' ~ grid[row][col]['id']] %}
{% include 'woldmap/_node.html.twig' with {'node': _node} %}
{% endfor %}
{% endif %}
</div>
</div>
{% endfor %}
{% endfor %}
</div>
<div id="grid-zoom-container">
<span>+</span>
<input id="grid-zoom-controller" type="range" min="0" step="2">
<span>-</span>
</div>
<template id="template_tooltip">
<div class="sp_tooltip__wrapper" hidden>
{% if is_granted('ROLE_CONTRIBUTOR') %}
<div class="sp_tooltip__action-left-wrapper">
<form action="" class="sp_tooltip__action sp_node__edit-form sp_form__xhr" method="post">
<button class="sp_button" type="submit">
<span>Edit node</span>
</button>
</form>
<form action="" class="sp_tooltip__action sp_node_delete-form sp_form__xhr" method="post">
<button class="sp_button sp_icon__container" data-type="cancel" type="submit">
<img src="{{ asset(assets.img.delete) }}" alt="delete node">
</button>
</form>
{% if is_granted('ROLE_ADMIN') %}
<button class="sp_button sp_icon__container sp_node__calc-anchor">
<img src="{{ asset(assets.img.ui ~ 'location.png') }}" alt="delete node">
</button>
{% endif %}
</div>
{% endif %}
<div class="sp_tooltip__action-right-wrapper">
<button class="sp_button sp_tooltip__action sp_node__set-display" data-node-id="" data-is-hidden="0">
<span>Hide Pin</span>
<span>Show Pin</span>
</button>
</div>
<div class="sp_tooltip">
<h4 class="sp_tooltip__header">
<span></span>
{% if is_granted('ROLE_CONTRIBUTOR') %}<span></span>{% endif %}
</h4>
<div class="sp_tooltip__body"></div>
<div class="sp_tooltip__footer" hidden>
<div>Screenshots :</div>
<div class="sp_tooltip__screenshot-container"></div>
</div>
</div>
<div class="sp_tooltip__cursor"></div>
</div>
</template>
{#<template id="template_radio-input">#}
{# <label class="sp_radio__input-wrapper">#}
{# <span class="sp_radio__input-icon"></span>#}
{# <span class="sp_radio__input-mark"></span>#}
{# <span class="sp_radio__input-label"></span>#}
{# <input name type value>#}
{# </label>#}
{#</template>#}
{% endblock %}

View File

@ -0,0 +1,109 @@
{% extends 'base.html.twig' %}
{% set metaRegionName = region.name %}
{% for _region in region.subRegions|filter(_region => _region.isAlias and _region.parentRegion.id == region.id) %}
{% set metaRegionName = metaRegionName ~ ' and ' ~ _region.name %}
{% endfor %}
{% set metaTitle = title is defined ? title ~ ' - Genshin World' : 'Genshin World' %}
{#{% set metaDesc = 'Genshin Impact interactive map of ' ~ metaRegionName ~ '. Find every interest points, events, chests, monsters and materials of Teyvat. Up to date with latest patch.' %}#}
{% set metaDesc = 'Genshin Impact interactive map of ' ~ metaRegionName ~ '. Find every interest points, events, chests, monsters and materials of Teyvat.' %}
{% block meta %}
<meta name="title" content="{{ metaTitle }}">
<meta name="description" content="{{ metaDesc }}">
<meta property="og:type" content="website">
<meta property="og:url" content="{{ url('fo_region_show', { 'slug': regionSlug }) }}">
<meta property="og:title" content="{{ metaTitle }}">
<meta property="og:description" content="{{ metaDesc }}">
<meta property="og:image" content="https://genshin-world.com/og.jpg">
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="{{ url('fo_region_show', { 'slug': regionSlug }) }}">
<meta property="twitter:title" content="{{ metaTitle }}">
<meta property="twitter:description" content="{{ metaDesc }}">
<meta property="twitter:image" content="https://genshin-world.com/og.jpg">
<link rel="canonical" href="{{ url('fo_region_show', { 'slug': region.slug }) }}">
{% endblock %}
{% block leftPanel %}
{% include 'woldmap/_leftPannel.html.twig' %}
{% endblock %}
{% block body %}
<h1 id="map-title">{{ metaTitle }}</h1>
<div id="worldmap-container" data-region-id="{{ region.slug }}" data-region-name="{{ region.name }}" {% if anchor %}data-anchor="{{ anchor }}"{% endif %}>
<div class="sp_grid__container">
{% for row in 1..region.gridHeight %}
<div class="sp_grid__row">
{% for col in 1..region.gridWidth %}
<div id="grid-{{ grid[row][col]['id'] }}" class="sp_grid__column">
{% set idHash = 'map_g' ~ grid[row][col]['id'] ~ '_v' ~ version %}
<img id="{{ idHash }}" class="sp_grid__map" {% if grid[row][col]['map_data']['map'].id is not null %}data-src="{{ asset(assets.map.upload_path ~ grid[row][col]['map_data']['map'].file) }}"{% endif %} src="{{ asset(assets.map[region.mapBackground]) }}" alt="{{ region.name }}" draggable="false">
<div class="sp_grid__node-container">
{% if nodes['grid_' ~ grid[row][col]['id']] is defined %}
{% for _node in nodes['grid_' ~ grid[row][col]['id']] %}
{% include 'woldmap/_node.html.twig' with {'node': _node} %}
{% endfor %}
{% endif %}
</div>
</div>
{% endfor %}
</div>
{% endfor %}
</div>
</div>
<template id="template_tooltip">
<div class="sp_tooltip__wrapper" hidden>
{% if is_granted('ROLE_CONTRIBUTOR') %}
<div class="sp_tooltip__action-left-wrapper">
<form action="" class="sp_tooltip__action sp_node__edit-form sp_form__xhr" method="post">
<button class="sp_button" type="submit">
<span>Edit node</span>
</button>
</form>
<form action="" class="sp_tooltip__action sp_node_delete-form sp_form__xhr" method="post">
<button class="sp_button sp_icon__container" data-type="cancel" type="submit">
<img src="{{ asset(assets.img.delete) }}" alt="delete node">
</button>
</form>
{% if is_granted('ROLE_ADMIN') %}
<button class="sp_button sp_icon__container sp_node__calc-anchor">
<img src="{{ asset(assets.img.ui ~ 'location.png') }}" alt="delete node">
</button>
{% endif %}
</div>
{% endif %}
<div class="sp_tooltip__action-right-wrapper">
<button class="sp_button sp_tooltip__action sp_node__set-display" data-node-id="" data-is-hidden="0">
<span>Hide Pin</span>
<span>Show Pin</span>
</button>
</div>
<div class="sp_tooltip">
<h4 class="sp_tooltip__header">
<span></span>
{% if is_granted('ROLE_CONTRIBUTOR') %}<span></span>{% endif %}
</h4>
<div class="sp_tooltip__body"></div>
<div class="sp_tooltip__footer" hidden>
<div>Screenshots :</div>
<div class="sp_tooltip__screenshot-container"></div>
</div>
</div>
<div class="sp_tooltip__cursor"></div>
</div>
</template>
{#<template id="template_radio-input">#}
{# <label class="sp_radio__input-wrapper">#}
{# <span class="sp_radio__input-icon"></span>#}
{# <span class="sp_radio__input-mark"></span>#}
{# <span class="sp_radio__input-label"></span>#}
{# <input name type value>#}
{# </label>#}
{#</template>#}
{% endblock %}