Merge pull request 'feat/brand-logo' (#50) from feat/brand-logo into dev
All checks were successful
Build and Deploy / test-backend (push) Successful in 35s
PR Checks / security-sast (pull_request) Successful in 30s
PR Checks / test-backend (pull_request) Successful in 27s
PR Checks / prettier-autofix (pull_request) Successful in 10s
Build and Deploy / test-frontend (push) Successful in 1m7s
PR Checks / test-frontend (pull_request) Successful in 1m5s
Build and Deploy / build-and-push (push) Successful in 1m21s
Build and Deploy / deploy (push) Successful in 19s
Reviewed-on: #50
@@ -18,6 +18,7 @@ import java.math.BigDecimal;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import static org.springframework.http.HttpStatus.BAD_REQUEST;
|
||||
@@ -124,6 +125,9 @@ public class QuoteController {
|
||||
if (file.isEmpty()) {
|
||||
return ResponseEntity.badRequest().build();
|
||||
}
|
||||
if (!isSupportedInputFile(file)) {
|
||||
throw new ResponseStatusException(BAD_REQUEST, "Unsupported file type. Allowed: stl, 3mf");
|
||||
}
|
||||
|
||||
// Scan for virus
|
||||
clamAVService.scan(file.getInputStream());
|
||||
@@ -153,4 +157,14 @@ public class QuoteController {
|
||||
Files.deleteIfExists(tempInput);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isSupportedInputFile(MultipartFile file) {
|
||||
String originalFilename = file.getOriginalFilename();
|
||||
if (originalFilename == null || originalFilename.isBlank()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
String normalized = originalFilename.toLowerCase(Locale.ROOT);
|
||||
return normalized.endsWith(".stl") || normalized.endsWith(".3mf");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.printcalculator.dto;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
public record ShopProductDetailDto(
|
||||
@@ -25,6 +26,8 @@ public record ShopProductDetailDto(
|
||||
List<ShopProductVariantOptionDto> variants,
|
||||
PublicMediaUsageDto primaryImage,
|
||||
List<PublicMediaUsageDto> images,
|
||||
ShopProductModelDto model3d
|
||||
ShopProductModelDto model3d,
|
||||
String publicPath,
|
||||
Map<String, String> localizedPaths
|
||||
) {
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.printcalculator.dto;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
public record ShopProductSummaryDto(
|
||||
@@ -15,6 +16,8 @@ public record ShopProductSummaryDto(
|
||||
BigDecimal priceToChf,
|
||||
ShopProductVariantOptionDto defaultVariant,
|
||||
PublicMediaUsageDto primaryImage,
|
||||
ShopProductModelDto model3d
|
||||
ShopProductModelDto model3d,
|
||||
String publicPath,
|
||||
Map<String, String> localizedPaths
|
||||
) {
|
||||
}
|
||||
|
||||
@@ -223,10 +223,15 @@ public class OrderEmailListener {
|
||||
order.getCreatedAt().format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withLocale(locale))
|
||||
);
|
||||
templateData.put("totalCost", currencyFormatter.format(order.getTotalChf()));
|
||||
templateData.put("logoUrl", buildLogoUrl());
|
||||
templateData.put("currentYear", Year.now().getValue());
|
||||
return templateData;
|
||||
}
|
||||
|
||||
private String buildLogoUrl() {
|
||||
return frontendBaseUrl.replaceAll("/+$", "") + "/assets/images/brand-logo-yellow.svg";
|
||||
}
|
||||
|
||||
private String applyOrderConfirmationTexts(Map<String, Object> templateData, String language, String orderNumber) {
|
||||
return switch (language) {
|
||||
case "en" -> {
|
||||
|
||||
@@ -72,10 +72,14 @@ public class QuoteSessionItemService {
|
||||
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Cannot modify a converted session");
|
||||
}
|
||||
|
||||
String ext = quoteStorageService.getSafeExtension(file.getOriginalFilename(), "");
|
||||
if (ext.isBlank()) {
|
||||
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Unsupported file type. Allowed: stl, 3mf");
|
||||
}
|
||||
|
||||
clamAVService.scan(file.getInputStream());
|
||||
|
||||
Path sessionStorageDir = quoteStorageService.sessionStorageDir(session.getId());
|
||||
String ext = quoteStorageService.getSafeExtension(file.getOriginalFilename(), "stl");
|
||||
String storedFilename = UUID.randomUUID() + "." + ext;
|
||||
Path persistentPath = quoteStorageService.resolveSessionPath(sessionStorageDir, storedFilename);
|
||||
|
||||
|
||||
@@ -54,7 +54,6 @@ public class QuoteStorageService {
|
||||
return switch (ext) {
|
||||
case "stl" -> "stl";
|
||||
case "3mf" -> "3mf";
|
||||
case "step", "stp" -> "step";
|
||||
default -> fallback;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -30,6 +30,9 @@ public class CustomQuoteRequestNotificationService {
|
||||
@Value("${app.mail.contact-request.customer.enabled:true}")
|
||||
private boolean contactRequestCustomerMailEnabled;
|
||||
|
||||
@Value("${app.frontend.base-url:http://localhost:4200}")
|
||||
private String frontendBaseUrl;
|
||||
|
||||
public CustomQuoteRequestNotificationService(EmailNotificationService emailNotificationService,
|
||||
ContactRequestLocalizationService localizationService) {
|
||||
this.emailNotificationService = emailNotificationService;
|
||||
@@ -63,6 +66,7 @@ public class CustomQuoteRequestNotificationService {
|
||||
templateData.put("phone", safeValue(request.getPhone()));
|
||||
templateData.put("message", safeValue(request.getMessage()));
|
||||
templateData.put("attachmentsCount", attachmentsCount);
|
||||
templateData.put("logoUrl", buildLogoUrl());
|
||||
templateData.put("currentYear", Year.now().getValue());
|
||||
|
||||
emailNotificationService.sendEmail(
|
||||
@@ -101,6 +105,7 @@ public class CustomQuoteRequestNotificationService {
|
||||
templateData.put("phone", safeValue(request.getPhone()));
|
||||
templateData.put("message", safeValue(request.getMessage()));
|
||||
templateData.put("attachmentsCount", attachmentsCount);
|
||||
templateData.put("logoUrl", buildLogoUrl());
|
||||
templateData.put("currentYear", Year.now().getValue());
|
||||
|
||||
String subject = localizationService.applyCustomerContactRequestTexts(templateData, language, request.getId());
|
||||
@@ -119,4 +124,11 @@ public class CustomQuoteRequestNotificationService {
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
private String buildLogoUrl() {
|
||||
String baseUrl = frontendBaseUrl == null || frontendBaseUrl.isBlank()
|
||||
? "http://localhost:4200"
|
||||
: frontendBaseUrl;
|
||||
return baseUrl.replaceAll("/+$", "") + "/assets/images/brand-logo-yellow.svg";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -399,6 +399,7 @@ public class PublicShopCatalogService {
|
||||
Map<String, String> variantColorHexByMaterialAndColor,
|
||||
String language) {
|
||||
List<PublicMediaUsageDto> images = productMediaBySlug.getOrDefault(productMediaUsageKey(entry.product()), List.of());
|
||||
Map<String, String> localizedPaths = ShopPublicPathSupport.buildLocalizedProductPaths(entry.product());
|
||||
return new ShopProductSummaryDto(
|
||||
entry.product().getId(),
|
||||
entry.product().getSlug(),
|
||||
@@ -415,7 +416,9 @@ public class PublicShopCatalogService {
|
||||
resolvePriceTo(entry.variants()),
|
||||
toVariantDto(entry.defaultVariant(), entry.defaultVariant(), variantColorHexByMaterialAndColor, language),
|
||||
selectPrimaryMedia(images),
|
||||
toProductModelDto(entry)
|
||||
toProductModelDto(entry),
|
||||
localizedPaths.getOrDefault(normalizeLanguage(language), localizedPaths.get("it")),
|
||||
localizedPaths
|
||||
);
|
||||
}
|
||||
|
||||
@@ -426,6 +429,7 @@ public class PublicShopCatalogService {
|
||||
List<PublicMediaUsageDto> images = productMediaBySlug.getOrDefault(productMediaUsageKey(entry.product()), List.of());
|
||||
String localizedSeoTitle = entry.product().getSeoTitleForLanguage(language);
|
||||
String localizedSeoDescription = entry.product().getSeoDescriptionForLanguage(language);
|
||||
Map<String, String> localizedPaths = ShopPublicPathSupport.buildLocalizedProductPaths(entry.product());
|
||||
return new ShopProductDetailDto(
|
||||
entry.product().getId(),
|
||||
entry.product().getSlug(),
|
||||
@@ -453,7 +457,9 @@ public class PublicShopCatalogService {
|
||||
.toList(),
|
||||
selectPrimaryMedia(images),
|
||||
images,
|
||||
toProductModelDto(entry)
|
||||
toProductModelDto(entry),
|
||||
localizedPaths.getOrDefault(normalizeLanguage(language), localizedPaths.get("it")),
|
||||
localizedPaths
|
||||
);
|
||||
}
|
||||
|
||||
@@ -514,6 +520,22 @@ public class PublicShopCatalogService {
|
||||
return raw;
|
||||
}
|
||||
|
||||
private String normalizeLanguage(String language) {
|
||||
String normalized = trimToNull(language);
|
||||
if (normalized == null) {
|
||||
return "it";
|
||||
}
|
||||
normalized = normalized.toLowerCase(Locale.ROOT);
|
||||
int separatorIndex = normalized.indexOf('-');
|
||||
if (separatorIndex > 0) {
|
||||
normalized = normalized.substring(0, separatorIndex);
|
||||
}
|
||||
return switch (normalized) {
|
||||
case "en", "de", "fr" -> normalized;
|
||||
default -> "it";
|
||||
};
|
||||
}
|
||||
|
||||
private ShopProductModelDto toProductModelDto(ProductEntry entry) {
|
||||
if (entry.modelAsset() == null) {
|
||||
return null;
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
package com.printcalculator.service.shop;
|
||||
|
||||
import com.printcalculator.entity.ShopProduct;
|
||||
|
||||
import java.text.Normalizer;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
|
||||
final class ShopPublicPathSupport {
|
||||
private static final String PRODUCT_ROUTE_PREFIX = "/shop/p/";
|
||||
|
||||
private ShopPublicPathSupport() {
|
||||
}
|
||||
|
||||
static String buildProductPathSegment(ShopProduct product, String language) {
|
||||
String localizedName = product.getNameForLanguage(language);
|
||||
String idPrefix = productIdPrefix(product.getId());
|
||||
String tail = firstNonBlank(slugify(localizedName), slugify(product.getSlug()), "product");
|
||||
return idPrefix.isBlank() ? tail : idPrefix + "-" + tail;
|
||||
}
|
||||
|
||||
static Map<String, String> buildLocalizedProductPaths(ShopProduct product) {
|
||||
Map<String, String> localizedPaths = new LinkedHashMap<>();
|
||||
for (String language : ShopProduct.SUPPORTED_LANGUAGES) {
|
||||
localizedPaths.put(language, "/" + language + PRODUCT_ROUTE_PREFIX + buildProductPathSegment(product, language));
|
||||
}
|
||||
return localizedPaths;
|
||||
}
|
||||
|
||||
static String productIdPrefix(UUID productId) {
|
||||
if (productId == null) {
|
||||
return "";
|
||||
}
|
||||
String raw = productId.toString().trim().toLowerCase(Locale.ROOT);
|
||||
int dashIndex = raw.indexOf('-');
|
||||
if (dashIndex > 0) {
|
||||
return raw.substring(0, dashIndex);
|
||||
}
|
||||
return raw.length() >= 8 ? raw.substring(0, 8) : raw;
|
||||
}
|
||||
|
||||
static String slugify(String rawValue) {
|
||||
String safeValue = rawValue == null ? "" : rawValue;
|
||||
String normalized = Normalizer.normalize(safeValue, Normalizer.Form.NFD)
|
||||
.replaceAll("\\p{M}+", "")
|
||||
.toLowerCase(Locale.ROOT)
|
||||
.replaceAll("[^a-z0-9]+", "-")
|
||||
.replaceAll("^-+|-+$", "")
|
||||
.replaceAll("-{2,}", "-");
|
||||
return normalized;
|
||||
}
|
||||
|
||||
private static String firstNonBlank(String... values) {
|
||||
if (values == null) {
|
||||
return null;
|
||||
}
|
||||
for (String value : values) {
|
||||
if (value != null && !value.isBlank()) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,6 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.text.Normalizer;
|
||||
import java.time.Clock;
|
||||
import java.time.Duration;
|
||||
import java.time.Instant;
|
||||
@@ -19,7 +18,6 @@ import java.time.OffsetDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
@@ -31,6 +29,12 @@ public class ShopSitemapService {
|
||||
private static final List<String> SUPPORTED_LANGUAGES = ShopProduct.SUPPORTED_LANGUAGES;
|
||||
private static final String DEFAULT_LANGUAGE = "it";
|
||||
private static final DateTimeFormatter LASTMOD_FORMATTER = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
|
||||
private static final Map<String, String> HREFLANG_BY_LANGUAGE = Map.of(
|
||||
"it", "it-CH",
|
||||
"en", "en-CH",
|
||||
"de", "de-CH",
|
||||
"fr", "fr-CH"
|
||||
);
|
||||
|
||||
private final ShopCategoryRepository shopCategoryRepository;
|
||||
private final ShopProductRepository shopProductRepository;
|
||||
@@ -130,7 +134,7 @@ public class ShopSitemapService {
|
||||
|
||||
Map<String, String> hrefByLanguage = new LinkedHashMap<>();
|
||||
for (String language : SUPPORTED_LANGUAGES) {
|
||||
String publicSegment = localizedProductPathSegment(product, language);
|
||||
String publicSegment = ShopPublicPathSupport.buildProductPathSegment(product, language);
|
||||
hrefByLanguage.put(language, frontendBaseUrl + "/" + language + "/shop/p/" + pathEncodeSegment(publicSegment));
|
||||
}
|
||||
|
||||
@@ -169,7 +173,7 @@ public class ShopSitemapService {
|
||||
continue;
|
||||
}
|
||||
xml.append(" <xhtml:link rel=\"alternate\" hreflang=\"")
|
||||
.append(language)
|
||||
.append(HREFLANG_BY_LANGUAGE.getOrDefault(language, language))
|
||||
.append("\" href=\"")
|
||||
.append(xmlEscape(href))
|
||||
.append("\" />\n");
|
||||
@@ -186,48 +190,6 @@ public class ShopSitemapService {
|
||||
xml.append(" </url>\n");
|
||||
}
|
||||
|
||||
private String localizedProductPathSegment(ShopProduct product, String language) {
|
||||
String localizedName = product.getNameForLanguage(language);
|
||||
String idPrefix = productIdPrefix(product.getId());
|
||||
String tail = firstNonBlank(slugify(localizedName), slugify(product.getSlug()), "product");
|
||||
return idPrefix.isBlank() ? tail : idPrefix + "-" + tail;
|
||||
}
|
||||
|
||||
private String productIdPrefix(UUID productId) {
|
||||
if (productId == null) {
|
||||
return "";
|
||||
}
|
||||
String raw = productId.toString().trim().toLowerCase(Locale.ROOT);
|
||||
int dashIndex = raw.indexOf('-');
|
||||
if (dashIndex > 0) {
|
||||
return raw.substring(0, dashIndex);
|
||||
}
|
||||
return raw.length() >= 8 ? raw.substring(0, 8) : raw;
|
||||
}
|
||||
|
||||
static String slugify(String rawValue) {
|
||||
String safeValue = rawValue == null ? "" : rawValue;
|
||||
String normalized = Normalizer.normalize(safeValue, Normalizer.Form.NFD)
|
||||
.replaceAll("\\p{M}+", "")
|
||||
.toLowerCase(Locale.ROOT)
|
||||
.replaceAll("[^a-z0-9]+", "-")
|
||||
.replaceAll("^-+|-+$", "")
|
||||
.replaceAll("-{2,}", "-");
|
||||
return normalized;
|
||||
}
|
||||
|
||||
private String firstNonBlank(String... values) {
|
||||
if (values == null) {
|
||||
return null;
|
||||
}
|
||||
for (String value : values) {
|
||||
if (value != null && !value.isBlank()) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String pathEncodeSegment(String rawSegment) {
|
||||
String safeSegment = rawSegment == null ? "" : rawSegment;
|
||||
return URLEncoder.encode(safeSegment, StandardCharsets.UTF_8).replace("+", "%20");
|
||||
|
||||
@@ -25,6 +25,21 @@
|
||||
color: #222222;
|
||||
}
|
||||
|
||||
.header {
|
||||
text-align: center;
|
||||
border-bottom: 1px solid #eeeeee;
|
||||
padding-bottom: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.brand-logo {
|
||||
display: block;
|
||||
width: 220px;
|
||||
max-width: 220px;
|
||||
height: auto;
|
||||
margin: 0 auto 16px;
|
||||
}
|
||||
|
||||
p {
|
||||
color: #444444;
|
||||
line-height: 1.5;
|
||||
@@ -63,7 +78,10 @@
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>Nuova richiesta di contatto</h1>
|
||||
<div class="header">
|
||||
<img class="brand-logo" th:src="${logoUrl}" src="https://example.com/assets/images/brand-logo-yellow.svg" alt="3D-Fab">
|
||||
<h1>Nuova richiesta di contatto</h1>
|
||||
</div>
|
||||
<p>E' stata ricevuta una nuova richiesta dal form contatti/su misura.</p>
|
||||
|
||||
<table>
|
||||
|
||||
@@ -25,6 +25,21 @@
|
||||
color: #222222;
|
||||
}
|
||||
|
||||
.header {
|
||||
text-align: center;
|
||||
border-bottom: 1px solid #eeeeee;
|
||||
padding-bottom: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.brand-logo {
|
||||
display: block;
|
||||
width: 220px;
|
||||
max-width: 220px;
|
||||
height: auto;
|
||||
margin: 0 auto 16px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin-top: 18px;
|
||||
color: #222222;
|
||||
@@ -69,7 +84,10 @@
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1 th:text="${headlineText}">We received your contact request</h1>
|
||||
<div class="header">
|
||||
<img class="brand-logo" th:src="${logoUrl}" src="https://example.com/assets/images/brand-logo-yellow.svg" alt="3D-Fab">
|
||||
<h1 th:text="${headlineText}">We received your contact request</h1>
|
||||
</div>
|
||||
<p th:text="${greetingText}">Hi customer,</p>
|
||||
<p th:text="${introText}">Thank you for contacting us. Our team will reply as soon as possible.</p>
|
||||
<p>
|
||||
|
||||
@@ -27,8 +27,17 @@
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.brand-logo {
|
||||
display: block;
|
||||
width: 220px;
|
||||
max-width: 220px;
|
||||
height: auto;
|
||||
margin: 0 auto 16px;
|
||||
}
|
||||
|
||||
.header h1 {
|
||||
color: #333333;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.content {
|
||||
@@ -67,6 +76,7 @@
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<img class="brand-logo" th:src="${logoUrl}" src="https://example.com/assets/images/brand-logo-yellow.svg" alt="3D-Fab">
|
||||
<h1 th:text="${headlineText}">Thank you for your order #00000000</h1>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -27,8 +27,17 @@
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.brand-logo {
|
||||
display: block;
|
||||
width: 220px;
|
||||
max-width: 220px;
|
||||
height: auto;
|
||||
margin: 0 auto 16px;
|
||||
}
|
||||
|
||||
.header h1 {
|
||||
color: #333333;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.content {
|
||||
@@ -70,6 +79,7 @@
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<img class="brand-logo" th:src="${logoUrl}" src="https://example.com/assets/images/brand-logo-yellow.svg" alt="3D-Fab">
|
||||
<h1 th:text="${headlineText}">Your order #00000000 has been shipped</h1>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -27,8 +27,17 @@
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.brand-logo {
|
||||
display: block;
|
||||
width: 220px;
|
||||
max-width: 220px;
|
||||
height: auto;
|
||||
margin: 0 auto 16px;
|
||||
}
|
||||
|
||||
.header h1 {
|
||||
color: #333333;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.content {
|
||||
@@ -70,6 +79,7 @@
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<img class="brand-logo" th:src="${logoUrl}" src="https://example.com/assets/images/brand-logo-yellow.svg" alt="3D-Fab">
|
||||
<h1 th:text="${headlineText}">Payment confirmed for order #00000000</h1>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -27,8 +27,17 @@
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.brand-logo {
|
||||
display: block;
|
||||
width: 220px;
|
||||
max-width: 220px;
|
||||
height: auto;
|
||||
margin: 0 auto 16px;
|
||||
}
|
||||
|
||||
.header h1 {
|
||||
color: #333333;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.content {
|
||||
@@ -70,6 +79,7 @@
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<img class="brand-logo" th:src="${logoUrl}" src="https://example.com/assets/images/brand-logo-yellow.svg" alt="3D-Fab">
|
||||
<h1 th:text="${headlineText}">Payment reported for order #00000000</h1>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -92,15 +92,15 @@ class ShopSitemapServiceTest {
|
||||
assertTrue(xml.contains("<loc>https://3d-fab.ch/en/shop/accessori</loc>"));
|
||||
assertTrue(xml.contains("<loc>https://3d-fab.ch/de/shop/accessori</loc>"));
|
||||
assertTrue(xml.contains("<loc>https://3d-fab.ch/fr/shop/accessori</loc>"));
|
||||
assertTrue(xml.contains("hreflang=\"en\" href=\"https://3d-fab.ch/en/shop/accessori\""));
|
||||
assertTrue(xml.contains("hreflang=\"en-CH\" href=\"https://3d-fab.ch/en/shop/accessori\""));
|
||||
assertFalse(xml.contains("https://3d-fab.ch/it/shop/bozza"));
|
||||
|
||||
assertTrue(xml.contains("<loc>https://3d-fab.ch/it/shop/p/123e4567-supporto-bici</loc>"));
|
||||
assertTrue(xml.contains("<loc>https://3d-fab.ch/en/shop/p/123e4567-bike-holder</loc>"));
|
||||
assertTrue(xml.contains("<loc>https://3d-fab.ch/de/shop/p/123e4567-fahrrad-halter</loc>"));
|
||||
assertTrue(xml.contains("<loc>https://3d-fab.ch/fr/shop/p/123e4567-support-velo</loc>"));
|
||||
assertTrue(xml.contains("hreflang=\"en\" href=\"https://3d-fab.ch/en/shop/p/123e4567-bike-holder\""));
|
||||
assertTrue(xml.contains("hreflang=\"de\" href=\"https://3d-fab.ch/de/shop/p/123e4567-fahrrad-halter\""));
|
||||
assertTrue(xml.contains("hreflang=\"en-CH\" href=\"https://3d-fab.ch/en/shop/p/123e4567-bike-holder\""));
|
||||
assertTrue(xml.contains("hreflang=\"de-CH\" href=\"https://3d-fab.ch/de/shop/p/123e4567-fahrrad-halter\""));
|
||||
assertTrue(xml.contains("hreflang=\"x-default\" href=\"https://3d-fab.ch/it/shop/p/123e4567-supporto-bici\""));
|
||||
assertTrue(xml.contains("<lastmod>2026-03-11T07:30:00Z</lastmod>"));
|
||||
assertFalse(xml.contains("33333333-draft"));
|
||||
|
||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 31 KiB |
23
frontend/public/site.webmanifest
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"name": "3D fab",
|
||||
"short_name": "3D fab",
|
||||
"description": "Stampa 3D su misura con preventivo online immediato.",
|
||||
"start_url": "/",
|
||||
"display": "standalone",
|
||||
"background_color": "#ffffff",
|
||||
"theme_color": "#ffffff",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/assets/images/Fav-icon-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
},
|
||||
{
|
||||
"src": "/assets/images/Fav-icon-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png",
|
||||
"purpose": "any"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -2,40 +2,40 @@
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/it</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/en</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/de</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/fr</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
@@ -43,40 +43,40 @@
|
||||
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/it/calculator/basic</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/calculator/basic" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/en/calculator/basic</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/calculator/basic" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/de/calculator/basic</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/calculator/basic" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/fr/calculator/basic</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/calculator/basic" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/calculator/basic" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.9</priority>
|
||||
@@ -84,40 +84,40 @@
|
||||
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/it/calculator/advanced</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/calculator/advanced" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/en/calculator/advanced</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/calculator/advanced" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/de/calculator/advanced</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/calculator/advanced" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/fr/calculator/advanced</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/calculator/advanced" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/calculator/advanced" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
@@ -125,40 +125,40 @@
|
||||
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/it/shop</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/shop" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/en/shop</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/shop" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/de/shop</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/shop" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/fr/shop</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/shop" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/shop" />
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
@@ -166,40 +166,40 @@
|
||||
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/it/about</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/about" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/about" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/about" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/about" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/about" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/about" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/about" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/about" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/about" />
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/en/about</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/about" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/about" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/about" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/about" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/about" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/about" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/about" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/about" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/about" />
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/de/about</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/about" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/about" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/about" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/about" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/about" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/about" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/about" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/about" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/about" />
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/fr/about</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/about" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/about" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/about" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/about" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/about" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/about" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/about" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/about" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/about" />
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
@@ -207,40 +207,40 @@
|
||||
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/it/contact</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/contact" />
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/en/contact</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/contact" />
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/de/contact</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/contact" />
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/fr/contact</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/contact" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/contact" />
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
@@ -248,40 +248,40 @@
|
||||
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/it/privacy</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/privacy" />
|
||||
<changefreq>yearly</changefreq>
|
||||
<priority>0.4</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/en/privacy</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/privacy" />
|
||||
<changefreq>yearly</changefreq>
|
||||
<priority>0.4</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/de/privacy</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/privacy" />
|
||||
<changefreq>yearly</changefreq>
|
||||
<priority>0.4</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/fr/privacy</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/privacy" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/privacy" />
|
||||
<changefreq>yearly</changefreq>
|
||||
<priority>0.4</priority>
|
||||
@@ -289,40 +289,40 @@
|
||||
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/it/terms</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/terms" />
|
||||
<changefreq>yearly</changefreq>
|
||||
<priority>0.4</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/en/terms</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/terms" />
|
||||
<changefreq>yearly</changefreq>
|
||||
<priority>0.4</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/de/terms</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/terms" />
|
||||
<changefreq>yearly</changefreq>
|
||||
<priority>0.4</priority>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://3d-fab.ch/fr/terms</loc>
|
||||
<xhtml:link rel="alternate" hreflang="it" href="https://3d-fab.ch/it/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://3d-fab.ch/en/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://3d-fab.ch/de/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="fr" href="https://3d-fab.ch/fr/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="it-CH" href="https://3d-fab.ch/it/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="en-CH" href="https://3d-fab.ch/en/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="de-CH" href="https://3d-fab.ch/de/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="fr-CH" href="https://3d-fab.ch/fr/terms" />
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://3d-fab.ch/it/terms" />
|
||||
<changefreq>yearly</changefreq>
|
||||
<priority>0.4</priority>
|
||||
|
||||
@@ -1 +1,14 @@
|
||||
<router-outlet></router-outlet>
|
||||
|
||||
@if (siteIntroState() !== "hidden") {
|
||||
<div
|
||||
class="site-intro"
|
||||
[class.site-intro--closing]="siteIntroState() === 'closing'"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<app-brand-animation-logo
|
||||
class="site-intro__logo"
|
||||
variant="site-intro"
|
||||
></app-brand-animation-logo>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
.site-intro {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: 2000;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
background: var(--color-bg);
|
||||
pointer-events: none;
|
||||
opacity: 1;
|
||||
transition: opacity 0.24s ease-out;
|
||||
}
|
||||
|
||||
.site-intro--closing {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.site-intro__logo {
|
||||
width: min(calc(100vw - 2rem), 23rem);
|
||||
--brand-animation-width: 23rem;
|
||||
--brand-animation-height: 7.1rem;
|
||||
--brand-animation-letter-width: 3.75rem;
|
||||
--brand-animation-scale: 0.88;
|
||||
--brand-animation-width-mobile: 16.8rem;
|
||||
--brand-animation-height-mobile: 5.3rem;
|
||||
--brand-animation-letter-width-mobile: 2.8rem;
|
||||
--brand-animation-scale-mobile: 0.68;
|
||||
--brand-animation-site-intro-duration: 1.05s;
|
||||
justify-self: center;
|
||||
align-self: center;
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
transition:
|
||||
opacity 0.24s ease-out,
|
||||
transform 0.24s ease-out;
|
||||
}
|
||||
|
||||
.site-intro--closing .site-intro__logo {
|
||||
opacity: 0;
|
||||
transform: scale(0.985);
|
||||
}
|
||||
|
||||
@@ -1,14 +1,50 @@
|
||||
import { Component, inject } from '@angular/core';
|
||||
import {
|
||||
afterNextRender,
|
||||
Component,
|
||||
DestroyRef,
|
||||
Inject,
|
||||
Optional,
|
||||
PLATFORM_ID,
|
||||
inject,
|
||||
signal,
|
||||
} from '@angular/core';
|
||||
import { isPlatformBrowser } from '@angular/common';
|
||||
import { RouterOutlet } from '@angular/router';
|
||||
import { SeoService } from './core/services/seo.service';
|
||||
import { BrandAnimationLogoComponent } from './shared/components/brand-animation-logo/brand-animation-logo.component';
|
||||
|
||||
@Component({
|
||||
selector: 'app-root',
|
||||
standalone: true,
|
||||
imports: [RouterOutlet],
|
||||
imports: [RouterOutlet, BrandAnimationLogoComponent],
|
||||
templateUrl: './app.component.html',
|
||||
styleUrl: './app.component.scss',
|
||||
})
|
||||
export class AppComponent {
|
||||
private readonly seoService = inject(SeoService);
|
||||
private readonly destroyRef = inject(DestroyRef);
|
||||
readonly siteIntroState = signal<'hidden' | 'active' | 'closing'>('hidden');
|
||||
|
||||
constructor(@Optional() @Inject(PLATFORM_ID) platformId?: Object) {
|
||||
if (!isPlatformBrowser(platformId ?? 'browser')) {
|
||||
return;
|
||||
}
|
||||
|
||||
afterNextRender(() => {
|
||||
this.siteIntroState.set('active');
|
||||
|
||||
const closeTimeoutId = window.setTimeout(() => {
|
||||
this.siteIntroState.set('closing');
|
||||
}, 1020);
|
||||
|
||||
const hideTimeoutId = window.setTimeout(() => {
|
||||
this.siteIntroState.set('hidden');
|
||||
}, 1280);
|
||||
|
||||
this.destroyRef.onDestroy(() => {
|
||||
window.clearTimeout(closeTimeoutId);
|
||||
window.clearTimeout(hideTimeoutId);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,21 +28,12 @@ import {
|
||||
import { serverOriginInterceptor } from './core/interceptors/server-origin.interceptor';
|
||||
import { catchError, firstValueFrom, of } from 'rxjs';
|
||||
import { StaticTranslateLoader } from './core/i18n/static-translate.loader';
|
||||
|
||||
type SupportedLang = 'it' | 'en' | 'de' | 'fr';
|
||||
const SUPPORTED_LANGS: readonly SupportedLang[] = ['it', 'en', 'de', 'fr'];
|
||||
|
||||
function resolveLangFromUrl(url: string): SupportedLang {
|
||||
const firstSegment = (url || '/')
|
||||
.split('?')[0]
|
||||
.split('#')[0]
|
||||
.split('/')
|
||||
.filter(Boolean)[0]
|
||||
?.toLowerCase();
|
||||
return SUPPORTED_LANGS.includes(firstSegment as SupportedLang)
|
||||
? (firstSegment as SupportedLang)
|
||||
: 'it';
|
||||
}
|
||||
import {
|
||||
getNavigatorLanguagePreferences,
|
||||
parseAcceptLanguage,
|
||||
resolveInitialLanguage,
|
||||
SUPPORTED_LANGS,
|
||||
} from './core/i18n/language-resolution';
|
||||
|
||||
export const appConfig: ApplicationConfig = {
|
||||
providers: [
|
||||
@@ -52,7 +43,7 @@ export const appConfig: ApplicationConfig = {
|
||||
withComponentInputBinding(),
|
||||
withViewTransitions(),
|
||||
withInMemoryScrolling({
|
||||
scrollPositionRestoration: 'top',
|
||||
scrollPositionRestoration: 'enabled',
|
||||
}),
|
||||
),
|
||||
provideHttpClient(
|
||||
@@ -72,13 +63,21 @@ export const appConfig: ApplicationConfig = {
|
||||
const router = inject(Router);
|
||||
const request = inject(REQUEST, { optional: true }) as {
|
||||
url?: string;
|
||||
headers?: Record<string, string | string[] | undefined>;
|
||||
} | null;
|
||||
|
||||
translate.addLangs([...SUPPORTED_LANGS]);
|
||||
translate.setFallbackLang('it');
|
||||
const requestedUrl =
|
||||
(typeof request?.url === 'string' && request.url) || router.url || '/';
|
||||
const lang = resolveLangFromUrl(requestedUrl);
|
||||
const lang = resolveInitialLanguage({
|
||||
url: requestedUrl,
|
||||
preferredLanguages: request
|
||||
? parseAcceptLanguage(readRequestHeader(request, 'accept-language'))
|
||||
: getNavigatorLanguagePreferences(
|
||||
typeof navigator === 'undefined' ? null : navigator,
|
||||
),
|
||||
});
|
||||
|
||||
return firstValueFrom(
|
||||
translate.use(lang).pipe(
|
||||
@@ -96,3 +95,21 @@ export const appConfig: ApplicationConfig = {
|
||||
provideClientHydration(withEventReplay()),
|
||||
],
|
||||
};
|
||||
|
||||
function readRequestHeader(
|
||||
request: {
|
||||
headers?: Record<string, string | string[] | undefined>;
|
||||
} | null,
|
||||
headerName: string,
|
||||
): string | null {
|
||||
if (!request?.headers) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const headerValue = request.headers[headerName.toLowerCase()];
|
||||
if (Array.isArray(headerValue)) {
|
||||
return headerValue[0] ?? null;
|
||||
}
|
||||
|
||||
return typeof headerValue === 'string' ? headerValue : null;
|
||||
}
|
||||
|
||||
@@ -134,6 +134,31 @@ const appChildRoutes: Routes = [
|
||||
];
|
||||
|
||||
export const routes: Routes = [
|
||||
{
|
||||
path: ':lang/calculator/animation-test',
|
||||
canMatch: [langPrefixCanMatch],
|
||||
loadComponent: () =>
|
||||
import('./features/calculator/calculator-animation-test.component').then(
|
||||
(m) => m.CalculatorAnimationTestComponent,
|
||||
),
|
||||
data: {
|
||||
seoTitleKey: 'SEO.ROUTES.CALCULATOR.TITLE',
|
||||
seoDescriptionKey: 'SEO.ROUTES.CALCULATOR.DESCRIPTION',
|
||||
seoRobots: 'noindex, nofollow',
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'calculator/animation-test',
|
||||
loadComponent: () =>
|
||||
import('./features/calculator/calculator-animation-test.component').then(
|
||||
(m) => m.CalculatorAnimationTestComponent,
|
||||
),
|
||||
data: {
|
||||
seoTitleKey: 'SEO.ROUTES.CALCULATOR.TITLE',
|
||||
seoDescriptionKey: 'SEO.ROUTES.CALCULATOR.DESCRIPTION',
|
||||
seoRobots: 'noindex, nofollow',
|
||||
},
|
||||
},
|
||||
{
|
||||
path: ':lang',
|
||||
canMatch: [langPrefixCanMatch],
|
||||
|
||||
135
frontend/src/app/core/i18n/language-resolution.ts
Normal file
@@ -0,0 +1,135 @@
|
||||
export type SupportedLang = 'it' | 'en' | 'de' | 'fr';
|
||||
|
||||
export const SUPPORTED_LANGS: readonly SupportedLang[] = [
|
||||
'it',
|
||||
'en',
|
||||
'de',
|
||||
'fr',
|
||||
];
|
||||
|
||||
type InitialLanguageOptions = {
|
||||
url?: string | null;
|
||||
preferredLanguages?: readonly string[] | null;
|
||||
fallbackLang?: SupportedLang;
|
||||
};
|
||||
|
||||
type NavigatorLike = {
|
||||
language?: string;
|
||||
languages?: readonly string[];
|
||||
};
|
||||
|
||||
export function resolveInitialLanguage({
|
||||
url,
|
||||
preferredLanguages,
|
||||
fallbackLang = 'it',
|
||||
}: InitialLanguageOptions): SupportedLang {
|
||||
const explicitLang = resolveExplicitLanguageFromUrl(url);
|
||||
if (explicitLang) {
|
||||
return explicitLang;
|
||||
}
|
||||
|
||||
for (const candidate of preferredLanguages ?? []) {
|
||||
const normalized = normalizeSupportedLanguage(candidate);
|
||||
if (normalized) {
|
||||
return normalized;
|
||||
}
|
||||
}
|
||||
|
||||
return fallbackLang;
|
||||
}
|
||||
|
||||
export function parseAcceptLanguage(
|
||||
header: string | null | undefined,
|
||||
): string[] {
|
||||
if (!header) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return header
|
||||
.split(',')
|
||||
.map((entry, index) => {
|
||||
const [rawTag, ...params] = entry.split(';').map((part) => part.trim());
|
||||
if (!rawTag) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const qualityParam = params.find((param) => param.startsWith('q='));
|
||||
const quality = qualityParam
|
||||
? Number.parseFloat(qualityParam.slice(2))
|
||||
: 1;
|
||||
return {
|
||||
tag: rawTag,
|
||||
quality: Number.isFinite(quality) ? quality : 0,
|
||||
index,
|
||||
};
|
||||
})
|
||||
.filter(
|
||||
(
|
||||
entry,
|
||||
): entry is {
|
||||
tag: string;
|
||||
quality: number;
|
||||
index: number;
|
||||
} => entry !== null && entry.quality > 0,
|
||||
)
|
||||
.sort(
|
||||
(left, right) => right.quality - left.quality || left.index - right.index,
|
||||
)
|
||||
.map((entry) => entry.tag);
|
||||
}
|
||||
|
||||
export function getNavigatorLanguagePreferences(
|
||||
navigatorLike: NavigatorLike | null | undefined,
|
||||
): string[] {
|
||||
if (!navigatorLike) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const orderedLanguages = [
|
||||
...(Array.isArray(navigatorLike.languages) ? navigatorLike.languages : []),
|
||||
];
|
||||
|
||||
if (
|
||||
typeof navigatorLike.language === 'string' &&
|
||||
navigatorLike.language &&
|
||||
!orderedLanguages.includes(navigatorLike.language)
|
||||
) {
|
||||
orderedLanguages.push(navigatorLike.language);
|
||||
}
|
||||
|
||||
return orderedLanguages;
|
||||
}
|
||||
|
||||
function resolveExplicitLanguageFromUrl(
|
||||
url: string | null | undefined,
|
||||
): SupportedLang | null {
|
||||
const normalizedUrl = String(url ?? '/');
|
||||
const [pathAndQuery] = normalizedUrl.split('#', 1);
|
||||
const [rawPath, rawQuery] = pathAndQuery.split('?', 2);
|
||||
const firstSegment = rawPath.split('/').filter(Boolean)[0];
|
||||
const pathLanguage = normalizeSupportedLanguage(firstSegment);
|
||||
if (pathLanguage) {
|
||||
return pathLanguage;
|
||||
}
|
||||
|
||||
const queryLanguage = new URLSearchParams(rawQuery ?? '').get('lang');
|
||||
return normalizeSupportedLanguage(queryLanguage);
|
||||
}
|
||||
|
||||
function normalizeSupportedLanguage(
|
||||
rawLanguage: string | null | undefined,
|
||||
): SupportedLang | null {
|
||||
if (typeof rawLanguage !== 'string') {
|
||||
return null;
|
||||
}
|
||||
|
||||
const normalized = rawLanguage.trim().toLowerCase();
|
||||
if (!normalized || normalized === '*') {
|
||||
return null;
|
||||
}
|
||||
|
||||
const [baseLanguage] = normalized.split('-', 1);
|
||||
return SUPPORTED_LANGS.includes(baseLanguage as SupportedLang)
|
||||
? (baseLanguage as SupportedLang)
|
||||
: null;
|
||||
}
|
||||
@@ -1,7 +1,11 @@
|
||||
<footer class="footer">
|
||||
<div class="container footer-inner">
|
||||
<div class="col">
|
||||
<span class="brand">3D fab</span>
|
||||
<img
|
||||
class="brand"
|
||||
src="/assets/images/brand-logo-white.svg"
|
||||
alt="3D Fab"
|
||||
/>
|
||||
<p class="copyright">© 2026 3D fab.</p>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -38,9 +38,10 @@
|
||||
}
|
||||
|
||||
.brand {
|
||||
font-weight: 700;
|
||||
color: white;
|
||||
display: block;
|
||||
width: auto;
|
||||
height: 1.85rem;
|
||||
max-width: min(9.25rem, 46vw);
|
||||
margin-bottom: var(--space-2);
|
||||
}
|
||||
.copyright {
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
<header class="navbar">
|
||||
<div class="container navbar-inner">
|
||||
<a [routerLink]="langService.localizedPath('/')" class="brand"
|
||||
>3D <span class="highlight">fab</span></a
|
||||
>
|
||||
<a [routerLink]="langService.localizedPath('/')" class="brand">
|
||||
<img
|
||||
class="brand-logo"
|
||||
ngSrc="/assets/images/Asset%202.svg"
|
||||
alt="3D Fab"
|
||||
width="380"
|
||||
height="86"
|
||||
priority
|
||||
/>
|
||||
</a>
|
||||
|
||||
<div
|
||||
class="mobile-toggle"
|
||||
|
||||
@@ -14,13 +14,16 @@
|
||||
justify-content: space-between;
|
||||
}
|
||||
.brand {
|
||||
font-size: 1.25rem;
|
||||
font-weight: 700;
|
||||
color: var(--color-text);
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
text-decoration: none;
|
||||
}
|
||||
.highlight {
|
||||
color: var(--color-brand);
|
||||
|
||||
.brand-logo {
|
||||
display: block;
|
||||
width: auto;
|
||||
height: 2.1rem;
|
||||
max-width: min(11rem, 40vw);
|
||||
}
|
||||
|
||||
.nav-links {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { CommonModule, NgOptimizedImage } from '@angular/common';
|
||||
import {
|
||||
afterNextRender,
|
||||
Component,
|
||||
@@ -30,7 +30,13 @@ import {
|
||||
@Component({
|
||||
selector: 'app-navbar',
|
||||
standalone: true,
|
||||
imports: [CommonModule, RouterLink, RouterLinkActive, TranslateModule],
|
||||
imports: [
|
||||
CommonModule,
|
||||
RouterLink,
|
||||
RouterLinkActive,
|
||||
TranslateModule,
|
||||
NgOptimizedImage,
|
||||
],
|
||||
templateUrl: './navbar.component.html',
|
||||
styleUrls: ['./navbar.component.scss'],
|
||||
})
|
||||
|
||||
@@ -1,7 +1,13 @@
|
||||
import { Subject } from 'rxjs';
|
||||
import { DefaultUrlSerializer, Router, UrlTree } from '@angular/router';
|
||||
import {
|
||||
DefaultUrlSerializer,
|
||||
NavigationEnd,
|
||||
Router,
|
||||
UrlTree,
|
||||
} from '@angular/router';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { LanguageService } from './language.service';
|
||||
import { RequestLike } from '../../../core/request-origin';
|
||||
|
||||
describe('LanguageService', () => {
|
||||
function createTranslateMock() {
|
||||
@@ -60,7 +66,14 @@ describe('LanguageService', () => {
|
||||
parseUrl: (url: string) => serializer.parse(url),
|
||||
createUrlTree,
|
||||
serializeUrl: (tree: UrlTree) => serializer.serialize(tree),
|
||||
navigateByUrl: jasmine.createSpy('navigateByUrl'),
|
||||
navigateByUrl: jasmine
|
||||
.createSpy('navigateByUrl')
|
||||
.and.callFake((tree: UrlTree) => {
|
||||
const nextUrl = serializer.serialize(tree);
|
||||
router.url = nextUrl;
|
||||
events$.next(new NavigationEnd(1, nextUrl, nextUrl));
|
||||
return Promise.resolve(true);
|
||||
}),
|
||||
};
|
||||
|
||||
return router as unknown as Router;
|
||||
@@ -70,9 +83,14 @@ describe('LanguageService', () => {
|
||||
const translate = createTranslateMock();
|
||||
const router = createRouterMock('/calculator?session=abc');
|
||||
const navigateSpy = router.navigateByUrl as unknown as jasmine.Spy;
|
||||
const request: RequestLike = {
|
||||
headers: {
|
||||
'accept-language': 'it-CH,it;q=0.9,en;q=0.8',
|
||||
},
|
||||
};
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const service = new LanguageService(translate, router);
|
||||
const service = new LanguageService(translate, router, request);
|
||||
|
||||
expect(translate.use).toHaveBeenCalledWith('it');
|
||||
expect((translate as any).setFallbackLang).toHaveBeenCalledWith('it');
|
||||
@@ -85,6 +103,48 @@ describe('LanguageService', () => {
|
||||
expect(navOptions.replaceUrl).toBeTrue();
|
||||
});
|
||||
|
||||
it('uses the preferred browser language on the root URL', () => {
|
||||
const translate = createTranslateMock();
|
||||
const router = createRouterMock('/');
|
||||
const navigateSpy = router.navigateByUrl as unknown as jasmine.Spy;
|
||||
const request: RequestLike = {
|
||||
headers: {
|
||||
'accept-language': 'de-CH,de;q=0.9,en;q=0.8,it;q=0.7',
|
||||
},
|
||||
};
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const service = new LanguageService(translate, router, request);
|
||||
|
||||
expect(translate.use).toHaveBeenCalledWith('de');
|
||||
expect(navigateSpy).toHaveBeenCalledTimes(1);
|
||||
|
||||
const firstCall = navigateSpy.calls.mostRecent();
|
||||
const tree = firstCall.args[0] as UrlTree;
|
||||
expect(router.serializeUrl(tree)).toBe('/de');
|
||||
});
|
||||
|
||||
it('uses the default language for non-root URLs without a language prefix', () => {
|
||||
const translate = createTranslateMock();
|
||||
const router = createRouterMock('/calculator?session=abc');
|
||||
const navigateSpy = router.navigateByUrl as unknown as jasmine.Spy;
|
||||
const request: RequestLike = {
|
||||
headers: {
|
||||
'accept-language': 'de-CH,de;q=0.9,en;q=0.8,it;q=0.7',
|
||||
},
|
||||
};
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const service = new LanguageService(translate, router, request);
|
||||
|
||||
expect(translate.use).toHaveBeenCalledWith('de');
|
||||
expect(navigateSpy).toHaveBeenCalledTimes(1);
|
||||
|
||||
const firstCall = navigateSpy.calls.mostRecent();
|
||||
const tree = firstCall.args[0] as UrlTree;
|
||||
expect(router.serializeUrl(tree)).toBe('/it/calculator?session=abc');
|
||||
});
|
||||
|
||||
it('switches language while preserving path and query params', () => {
|
||||
const translate = createTranslateMock();
|
||||
const router = createRouterMock('/it/calculator?session=abc&mode=advanced');
|
||||
@@ -115,4 +175,23 @@ describe('LanguageService', () => {
|
||||
'/de/contact?topic=seo#form',
|
||||
);
|
||||
});
|
||||
|
||||
it('switches product pages using the resolved localized route overrides', () => {
|
||||
const translate = createTranslateMock();
|
||||
const router = createRouterMock('/it/shop/p/12345678-supporto-cavo');
|
||||
const navigateSpy = router.navigateByUrl as unknown as jasmine.Spy;
|
||||
const service = new LanguageService(translate, router);
|
||||
|
||||
service.setLocalizedRouteOverrides({
|
||||
it: '/it/shop/p/12345678-supporto-cavo',
|
||||
de: '/de/shop/p/12345678-kabelhalter',
|
||||
});
|
||||
navigateSpy.calls.reset();
|
||||
|
||||
service.switchLang('de');
|
||||
|
||||
const call = navigateSpy.calls.mostRecent();
|
||||
const tree = call.args[0] as UrlTree;
|
||||
expect(router.serializeUrl(tree)).toBe('/de/shop/p/12345678-kabelhalter');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Injectable, signal } from '@angular/core';
|
||||
import { Inject, Injectable, Optional, REQUEST, signal } from '@angular/core';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import {
|
||||
NavigationEnd,
|
||||
@@ -6,22 +6,29 @@ import {
|
||||
Router,
|
||||
UrlTree,
|
||||
} from '@angular/router';
|
||||
import {
|
||||
getNavigatorLanguagePreferences,
|
||||
parseAcceptLanguage,
|
||||
resolveInitialLanguage,
|
||||
} from '../i18n/language-resolution';
|
||||
import { RequestLike } from '../../../core/request-origin';
|
||||
|
||||
type SupportedLang = 'it' | 'en' | 'de' | 'fr';
|
||||
type LocalizedRouteOverrides = Partial<Record<SupportedLang, string>>;
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class LanguageService {
|
||||
currentLang = signal<'it' | 'en' | 'de' | 'fr'>('it');
|
||||
private readonly supportedLangs: Array<'it' | 'en' | 'de' | 'fr'> = [
|
||||
'it',
|
||||
'en',
|
||||
'de',
|
||||
'fr',
|
||||
];
|
||||
currentLang = signal<SupportedLang>('it');
|
||||
private readonly defaultLang: SupportedLang = 'it';
|
||||
private readonly supportedLangs: SupportedLang[] = ['it', 'en', 'de', 'fr'];
|
||||
private localizedRouteOverrides: LocalizedRouteOverrides | null = null;
|
||||
|
||||
constructor(
|
||||
private translate: TranslateService,
|
||||
private router: Router,
|
||||
@Optional() @Inject(REQUEST) private request: RequestLike | null = null,
|
||||
) {
|
||||
this.translate.addLangs(this.supportedLangs);
|
||||
this.translate.setFallbackLang('it');
|
||||
@@ -34,13 +41,14 @@ export class LanguageService {
|
||||
});
|
||||
|
||||
const initialTree = this.router.parseUrl(this.router.url);
|
||||
const initialSegments = this.getPrimarySegments(initialTree);
|
||||
const queryLang = this.getQueryLang(initialTree);
|
||||
const initialLang = this.isSupportedLang(initialSegments[0])
|
||||
? initialSegments[0]
|
||||
: this.isSupportedLang(queryLang)
|
||||
? queryLang
|
||||
: 'it';
|
||||
const initialLang = resolveInitialLanguage({
|
||||
url: this.router.url,
|
||||
preferredLanguages: this.request
|
||||
? parseAcceptLanguage(this.readRequestHeader('accept-language'))
|
||||
: getNavigatorLanguagePreferences(
|
||||
typeof navigator === 'undefined' ? null : navigator,
|
||||
),
|
||||
});
|
||||
this.applyLanguage(initialLang);
|
||||
this.ensureLanguageInPath(initialTree);
|
||||
|
||||
@@ -53,13 +61,21 @@ export class LanguageService {
|
||||
});
|
||||
}
|
||||
|
||||
switchLang(lang: 'it' | 'en' | 'de' | 'fr') {
|
||||
switchLang(lang: SupportedLang) {
|
||||
if (!this.isSupportedLang(lang)) {
|
||||
return;
|
||||
}
|
||||
this.applyLanguage(lang);
|
||||
|
||||
const currentTree = this.router.parseUrl(this.router.url);
|
||||
const localizedRoute = this.resolveLocalizedRouteOverride(
|
||||
currentTree,
|
||||
lang,
|
||||
);
|
||||
if (localizedRoute) {
|
||||
this.navigateToLocalizedRoute(currentTree, localizedRoute);
|
||||
return;
|
||||
}
|
||||
|
||||
const segments = this.getPrimarySegments(currentTree);
|
||||
|
||||
let targetSegments: string[];
|
||||
@@ -77,7 +93,7 @@ export class LanguageService {
|
||||
this.navigateIfChanged(currentTree, targetSegments);
|
||||
}
|
||||
|
||||
selectedLang(): 'it' | 'en' | 'de' | 'fr' {
|
||||
selectedLang(): SupportedLang {
|
||||
const activeLang =
|
||||
typeof this.translate.currentLang === 'string'
|
||||
? this.translate.currentLang.toLowerCase()
|
||||
@@ -110,6 +126,16 @@ export class LanguageService {
|
||||
return `/${[lang, ...segments].join('/')}${suffix}`;
|
||||
}
|
||||
|
||||
setLocalizedRouteOverrides(
|
||||
paths: LocalizedRouteOverrides | null | undefined,
|
||||
): void {
|
||||
this.localizedRouteOverrides = this.normalizeLocalizedRouteOverrides(paths);
|
||||
}
|
||||
|
||||
clearLocalizedRouteOverrides(): void {
|
||||
this.localizedRouteOverrides = null;
|
||||
}
|
||||
|
||||
private ensureLanguageInPath(urlTree: UrlTree): void {
|
||||
const segments = this.getPrimarySegments(urlTree);
|
||||
|
||||
@@ -118,23 +144,26 @@ export class LanguageService {
|
||||
return;
|
||||
}
|
||||
|
||||
const queryLang = this.getQueryLang(urlTree);
|
||||
const activeLang = this.isSupportedLang(queryLang)
|
||||
? queryLang
|
||||
: this.currentLang();
|
||||
if (activeLang !== this.currentLang()) {
|
||||
this.applyLanguage(activeLang);
|
||||
}
|
||||
let targetSegments: string[];
|
||||
|
||||
if (segments.length === 0) {
|
||||
targetSegments = [activeLang];
|
||||
} else if (this.looksLikeLangToken(segments[0])) {
|
||||
targetSegments = [activeLang, ...segments.slice(1)];
|
||||
} else {
|
||||
targetSegments = [activeLang, ...segments];
|
||||
const queryLang = this.getQueryLang(urlTree);
|
||||
const rootLang = this.isSupportedLang(queryLang)
|
||||
? queryLang
|
||||
: this.currentLang();
|
||||
if (rootLang !== this.currentLang()) {
|
||||
this.applyLanguage(rootLang);
|
||||
}
|
||||
this.navigateIfChanged(urlTree, [rootLang]);
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.currentLang() !== this.defaultLang) {
|
||||
this.applyLanguage(this.defaultLang);
|
||||
}
|
||||
|
||||
const targetSegments = this.looksLikeLangToken(segments[0])
|
||||
? [this.defaultLang, ...segments.slice(1)]
|
||||
: [this.defaultLang, ...segments];
|
||||
|
||||
this.navigateIfChanged(urlTree, targetSegments);
|
||||
}
|
||||
|
||||
@@ -151,12 +180,23 @@ export class LanguageService {
|
||||
return typeof lang === 'string' ? lang.toLowerCase() : null;
|
||||
}
|
||||
|
||||
private readRequestHeader(headerName: string): string | null {
|
||||
const headerValue =
|
||||
this.request?.headers?.[headerName.toLowerCase()] ??
|
||||
this.request?.get?.(headerName.toLowerCase());
|
||||
if (Array.isArray(headerValue)) {
|
||||
return headerValue[0] ?? null;
|
||||
}
|
||||
|
||||
return typeof headerValue === 'string' ? headerValue : null;
|
||||
}
|
||||
|
||||
private isSupportedLang(
|
||||
lang: string | null | undefined,
|
||||
): lang is 'it' | 'en' | 'de' | 'fr' {
|
||||
): lang is SupportedLang {
|
||||
return (
|
||||
typeof lang === 'string' &&
|
||||
this.supportedLangs.includes(lang as 'it' | 'en' | 'de' | 'fr')
|
||||
this.supportedLangs.includes(lang as SupportedLang)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -166,7 +206,7 @@ export class LanguageService {
|
||||
);
|
||||
}
|
||||
|
||||
private applyLanguage(lang: 'it' | 'en' | 'de' | 'fr'): void {
|
||||
private applyLanguage(lang: SupportedLang): void {
|
||||
if (this.currentLang() === lang && this.translate.currentLang === lang) {
|
||||
return;
|
||||
}
|
||||
@@ -174,6 +214,88 @@ export class LanguageService {
|
||||
this.currentLang.set(lang);
|
||||
}
|
||||
|
||||
private resolveLocalizedRouteOverride(
|
||||
currentTree: UrlTree,
|
||||
lang: SupportedLang,
|
||||
): string | null {
|
||||
const overrides = this.localizedRouteOverrides;
|
||||
if (!overrides) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const currentPath = this.getCleanPath(
|
||||
this.router.serializeUrl(currentTree),
|
||||
);
|
||||
const paths = Object.values(overrides)
|
||||
.map((path) => this.normalizeLocalizedRoutePath(path))
|
||||
.filter((path): path is string => !!path);
|
||||
if (!paths.includes(currentPath)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return this.normalizeLocalizedRoutePath(overrides[lang]);
|
||||
}
|
||||
|
||||
private normalizeLocalizedRouteOverrides(
|
||||
paths: LocalizedRouteOverrides | null | undefined,
|
||||
): LocalizedRouteOverrides | null {
|
||||
if (!paths) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const normalized = this.supportedLangs.reduce<LocalizedRouteOverrides>(
|
||||
(accumulator, lang) => {
|
||||
const path = this.normalizeLocalizedRoutePath(paths[lang]);
|
||||
if (path) {
|
||||
accumulator[lang] = path;
|
||||
}
|
||||
return accumulator;
|
||||
},
|
||||
{},
|
||||
);
|
||||
|
||||
return Object.keys(normalized).length > 0 ? normalized : null;
|
||||
}
|
||||
|
||||
private normalizeLocalizedRoutePath(
|
||||
path: string | null | undefined,
|
||||
): string | null {
|
||||
const rawPath = String(path ?? '').trim();
|
||||
if (!rawPath) {
|
||||
return null;
|
||||
}
|
||||
const cleanPath = this.getCleanPath(rawPath);
|
||||
return cleanPath.startsWith('/') ? cleanPath : null;
|
||||
}
|
||||
|
||||
private navigateToLocalizedRoute(
|
||||
currentTree: UrlTree,
|
||||
localizedPath: string,
|
||||
): void {
|
||||
const { lang: _unusedLang, ...queryParams } = currentTree.queryParams;
|
||||
const targetTree = this.router.createUrlTree(
|
||||
['/', ...localizedPath.split('/').filter(Boolean)],
|
||||
{
|
||||
queryParams,
|
||||
fragment: currentTree.fragment ?? undefined,
|
||||
},
|
||||
);
|
||||
|
||||
if (
|
||||
this.router.serializeUrl(targetTree) ===
|
||||
this.router.serializeUrl(currentTree)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.router.navigateByUrl(targetTree, { replaceUrl: true });
|
||||
}
|
||||
|
||||
private getCleanPath(url: string): string {
|
||||
const path = (url || '/').split('?')[0].split('#')[0];
|
||||
return path || '/';
|
||||
}
|
||||
|
||||
private navigateIfChanged(
|
||||
currentTree: UrlTree,
|
||||
targetSegments: string[],
|
||||
|
||||
@@ -29,6 +29,7 @@ describe('SeoService', () => {
|
||||
data: Record<string, unknown>;
|
||||
translations: Record<string, string>;
|
||||
}): {
|
||||
service: SeoService;
|
||||
meta: jasmine.SpyObj<Meta>;
|
||||
title: jasmine.SpyObj<Title>;
|
||||
} {
|
||||
@@ -51,7 +52,7 @@ describe('SeoService', () => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const service = new SeoService(router, title, meta, translate, document);
|
||||
|
||||
return { meta, title };
|
||||
return { service, meta, title };
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -94,14 +95,14 @@ describe('SeoService', () => {
|
||||
}));
|
||||
|
||||
expect(alternates).toContain({
|
||||
hreflang: 'en',
|
||||
hreflang: 'en-CH',
|
||||
href: `${document.location.origin}/en/privacy`,
|
||||
});
|
||||
expect(alternates).toContain({
|
||||
hreflang: 'x-default',
|
||||
href: `${document.location.origin}/it/privacy`,
|
||||
});
|
||||
expect(document.documentElement.lang).toBe('it');
|
||||
expect(document.documentElement.lang).toBe('it-CH');
|
||||
|
||||
const ogUrlCall = meta.updateTag.calls
|
||||
.allArgs()
|
||||
@@ -109,6 +110,11 @@ describe('SeoService', () => {
|
||||
expect(ogUrlCall?.[0].content).toBe(
|
||||
`${document.location.origin}/it/privacy`,
|
||||
);
|
||||
|
||||
const ogLocaleCall = meta.updateTag.calls
|
||||
.allArgs()
|
||||
.find(([tag]) => tag.property === 'og:locale');
|
||||
expect(ogLocaleCall?.[0].content).toBe('it_CH');
|
||||
});
|
||||
|
||||
it('resolves translated route metadata for the active language', () => {
|
||||
@@ -130,6 +136,54 @@ describe('SeoService', () => {
|
||||
.allArgs()
|
||||
.find(([tag]) => tag.name === 'description');
|
||||
expect(descriptionCall?.[0].content).toBe('About description');
|
||||
expect(document.documentElement.lang).toBe('en');
|
||||
expect(document.documentElement.lang).toBe('en-CH');
|
||||
});
|
||||
|
||||
it('applies canonical and hreflang values resolved from localized paths', () => {
|
||||
const { service } = createService({
|
||||
url: '/it/shop/p/12345678-supporto-cavo-scrivania',
|
||||
data: {},
|
||||
translations: {},
|
||||
});
|
||||
|
||||
service.applyResolvedSeo({
|
||||
title: 'Supporto cavo scrivania | 3D fab',
|
||||
description: 'Accessorio tecnico',
|
||||
robots: 'index, follow',
|
||||
ogTitle: 'Supporto cavo scrivania | 3D fab',
|
||||
ogDescription: 'Accessorio tecnico',
|
||||
canonicalPath: '/it/shop/p/12345678-supporto-cavo-scrivania',
|
||||
alternates: {
|
||||
it: '/it/shop/p/12345678-supporto-cavo-scrivania',
|
||||
en: '/en/shop/p/12345678-desk-cable-clip',
|
||||
de: '/de/shop/p/12345678-schreibtisch-kabelhalter',
|
||||
},
|
||||
xDefault: '/it/shop/p/12345678-supporto-cavo-scrivania',
|
||||
});
|
||||
|
||||
const canonical = document.head.querySelector(
|
||||
'link[rel="canonical"]',
|
||||
) as HTMLLinkElement | null;
|
||||
expect(canonical?.getAttribute('href')).toBe(
|
||||
`${document.location.origin}/it/shop/p/12345678-supporto-cavo-scrivania`,
|
||||
);
|
||||
|
||||
const alternates = Array.from(
|
||||
document.head.querySelectorAll(
|
||||
'link[rel="alternate"][data-seo-managed="true"]',
|
||||
),
|
||||
).map((node) => ({
|
||||
hreflang: node.getAttribute('hreflang'),
|
||||
href: node.getAttribute('href'),
|
||||
}));
|
||||
|
||||
expect(alternates).toContain({
|
||||
hreflang: 'de-CH',
|
||||
href: `${document.location.origin}/de/shop/p/12345678-schreibtisch-kabelhalter`,
|
||||
});
|
||||
expect(alternates).toContain({
|
||||
hreflang: 'x-default',
|
||||
href: `${document.location.origin}/it/shop/p/12345678-supporto-cavo-scrivania`,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -17,7 +17,13 @@ export interface PageSeoOverride {
|
||||
ogDescriptionKey?: string | null;
|
||||
}
|
||||
|
||||
type SupportedLang = 'it' | 'en' | 'de' | 'fr';
|
||||
export interface ResolvedPageSeo extends PageSeoOverride {
|
||||
canonicalPath: string | null;
|
||||
alternates?: SeoMap | null;
|
||||
xDefault?: string | null;
|
||||
}
|
||||
|
||||
export type SupportedLang = 'it' | 'en' | 'de' | 'fr';
|
||||
type SeoMap = Partial<Record<SupportedLang, string>>;
|
||||
type SeoTextDataKey =
|
||||
| 'seoTitle'
|
||||
@@ -51,10 +57,16 @@ export class SeoService {
|
||||
this.supportedLangs,
|
||||
);
|
||||
private readonly ogLocaleByLang: Record<SupportedLang, string> = {
|
||||
it: 'it_IT',
|
||||
en: 'en_US',
|
||||
de: 'de_DE',
|
||||
fr: 'fr_FR',
|
||||
it: 'it_CH',
|
||||
en: 'en_CH',
|
||||
de: 'de_CH',
|
||||
fr: 'fr_CH',
|
||||
};
|
||||
private readonly seoLocaleByLang: Record<SupportedLang, string> = {
|
||||
it: 'it-CH',
|
||||
en: 'en-CH',
|
||||
de: 'de-CH',
|
||||
fr: 'fr-CH',
|
||||
};
|
||||
|
||||
constructor(
|
||||
@@ -79,23 +91,10 @@ export class SeoService {
|
||||
applyPageSeo(override: PageSeoOverride): void {
|
||||
const cleanPath = this.getCleanPath(this.router.url);
|
||||
const lang = this.resolveLangFromPath(cleanPath);
|
||||
const title =
|
||||
this.resolveOverrideSeoText(override.title, override.titleKey) ??
|
||||
this.defaultTitle(lang);
|
||||
const description =
|
||||
this.resolveOverrideSeoText(
|
||||
override.description,
|
||||
override.descriptionKey,
|
||||
) ?? this.defaultDescription(lang);
|
||||
const robots = this.asString(override.robots) ?? 'index, follow';
|
||||
const ogTitle =
|
||||
this.resolveOverrideSeoText(override.ogTitle, override.ogTitleKey) ??
|
||||
title;
|
||||
const ogDescription =
|
||||
this.resolveOverrideSeoText(
|
||||
override.ogDescription,
|
||||
override.ogDescriptionKey,
|
||||
) ?? description;
|
||||
const { title, description, robots, ogTitle, ogDescription } =
|
||||
this.resolvePageSeoOverride(override, lang);
|
||||
const canonicalPath = this.buildLocalizedPath(cleanPath, lang);
|
||||
const alternates = this.buildAlternatePaths(canonicalPath);
|
||||
|
||||
this.applySeoValues(
|
||||
title,
|
||||
@@ -104,6 +103,35 @@ export class SeoService {
|
||||
ogTitle,
|
||||
ogDescription,
|
||||
cleanPath,
|
||||
canonicalPath,
|
||||
alternates,
|
||||
alternates.it ?? canonicalPath,
|
||||
lang,
|
||||
);
|
||||
}
|
||||
|
||||
applyResolvedSeo(override: ResolvedPageSeo): void {
|
||||
const cleanPath = this.getCleanPath(this.router.url);
|
||||
const lang = this.resolveLangFromPath(cleanPath);
|
||||
const { title, description, robots, ogTitle, ogDescription } =
|
||||
this.resolvePageSeoOverride(override, lang);
|
||||
const canonicalPath = this.normalizeSeoPath(override.canonicalPath);
|
||||
const alternates = this.normalizeAlternatePaths(override.alternates);
|
||||
const xDefault =
|
||||
this.normalizeSeoPath(override.xDefault) ??
|
||||
alternates?.it ??
|
||||
canonicalPath;
|
||||
|
||||
this.applySeoValues(
|
||||
title,
|
||||
description,
|
||||
robots,
|
||||
ogTitle,
|
||||
ogDescription,
|
||||
cleanPath,
|
||||
canonicalPath,
|
||||
alternates,
|
||||
xDefault,
|
||||
lang,
|
||||
);
|
||||
}
|
||||
@@ -122,6 +150,8 @@ export class SeoService {
|
||||
const ogTitle = this.resolveSeoText(mergedData, 'ogTitle', lang) ?? title;
|
||||
const ogDescription =
|
||||
this.resolveSeoText(mergedData, 'ogDescription', lang) ?? description;
|
||||
const canonicalPath = this.buildLocalizedPath(cleanPath, lang);
|
||||
const alternates = this.buildAlternatePaths(canonicalPath);
|
||||
|
||||
this.applySeoValues(
|
||||
title,
|
||||
@@ -130,6 +160,9 @@ export class SeoService {
|
||||
ogTitle,
|
||||
ogDescription,
|
||||
cleanPath,
|
||||
canonicalPath,
|
||||
alternates,
|
||||
alternates.it ?? canonicalPath,
|
||||
lang,
|
||||
);
|
||||
}
|
||||
@@ -141,6 +174,9 @@ export class SeoService {
|
||||
ogTitle: string,
|
||||
ogDescription: string,
|
||||
cleanPath: string,
|
||||
canonicalPath: string | null,
|
||||
alternates: SeoMap | null,
|
||||
xDefaultPath: string | null,
|
||||
lang: SupportedLang,
|
||||
): void {
|
||||
this.titleService.setTitle(title);
|
||||
@@ -160,12 +196,13 @@ export class SeoService {
|
||||
content: ogDescription,
|
||||
});
|
||||
|
||||
const canonicalPath = this.buildLocalizedPath(cleanPath, lang);
|
||||
const canonical = `${this.document.location.origin}${canonicalPath}`;
|
||||
this.metaService.updateTag({ property: 'og:url', content: canonical });
|
||||
this.updateCanonicalTag(canonical);
|
||||
const ogUrl = this.toAbsoluteUrl(canonicalPath ?? cleanPath);
|
||||
this.metaService.updateTag({ property: 'og:url', content: ogUrl });
|
||||
this.updateCanonicalTag(
|
||||
canonicalPath ? this.toAbsoluteUrl(canonicalPath) : null,
|
||||
);
|
||||
this.updateOpenGraphLocales(lang);
|
||||
this.updateLangAndAlternates(canonicalPath, lang);
|
||||
this.updateLangAndAlternates(alternates, xDefaultPath, lang);
|
||||
}
|
||||
|
||||
private getMergedRouteData(
|
||||
@@ -191,6 +228,43 @@ export class SeoService {
|
||||
return this.asString(value) ?? this.resolveTranslation(key);
|
||||
}
|
||||
|
||||
private resolvePageSeoOverride(
|
||||
override: PageSeoOverride,
|
||||
lang: SupportedLang,
|
||||
): {
|
||||
title: string;
|
||||
description: string;
|
||||
robots: string;
|
||||
ogTitle: string;
|
||||
ogDescription: string;
|
||||
} {
|
||||
const title =
|
||||
this.resolveOverrideSeoText(override.title, override.titleKey) ??
|
||||
this.defaultTitle(lang);
|
||||
const description =
|
||||
this.resolveOverrideSeoText(
|
||||
override.description,
|
||||
override.descriptionKey,
|
||||
) ?? this.defaultDescription(lang);
|
||||
const robots = this.asString(override.robots) ?? 'index, follow';
|
||||
const ogTitle =
|
||||
this.resolveOverrideSeoText(override.ogTitle, override.ogTitleKey) ??
|
||||
title;
|
||||
const ogDescription =
|
||||
this.resolveOverrideSeoText(
|
||||
override.ogDescription,
|
||||
override.ogDescriptionKey,
|
||||
) ?? description;
|
||||
|
||||
return {
|
||||
title,
|
||||
description,
|
||||
robots,
|
||||
ogTitle,
|
||||
ogDescription,
|
||||
};
|
||||
}
|
||||
|
||||
private resolveSeoText(
|
||||
routeData: Record<string, unknown>,
|
||||
key: SeoTextDataKey,
|
||||
@@ -275,10 +349,59 @@ export class SeoService {
|
||||
return `/${[lang, ...segments].join('/')}`;
|
||||
}
|
||||
|
||||
private updateCanonicalTag(url: string): void {
|
||||
private buildAlternatePaths(canonicalPath: string): SeoMap {
|
||||
const suffixSegments = canonicalPath.split('/').filter(Boolean).slice(1);
|
||||
const suffix =
|
||||
suffixSegments.length > 0 ? `/${suffixSegments.join('/')}` : '';
|
||||
|
||||
return this.supportedLangs.reduce<SeoMap>((accumulator, alt) => {
|
||||
accumulator[alt] = `/${alt}${suffix}`;
|
||||
return accumulator;
|
||||
}, {});
|
||||
}
|
||||
|
||||
private normalizeAlternatePaths(
|
||||
paths: SeoMap | null | undefined,
|
||||
): SeoMap | null {
|
||||
if (!paths) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const normalized = this.supportedLangs.reduce<SeoMap>(
|
||||
(accumulator, lang) => {
|
||||
const path = this.normalizeSeoPath(paths[lang]);
|
||||
if (path) {
|
||||
accumulator[lang] = path;
|
||||
}
|
||||
return accumulator;
|
||||
},
|
||||
{},
|
||||
);
|
||||
|
||||
return Object.keys(normalized).length > 0 ? normalized : null;
|
||||
}
|
||||
|
||||
private normalizeSeoPath(path: string | null | undefined): string | null {
|
||||
const rawPath = String(path ?? '').trim();
|
||||
if (!rawPath) {
|
||||
return null;
|
||||
}
|
||||
const normalized = this.getCleanPath(rawPath);
|
||||
return normalized.startsWith('/') ? normalized : null;
|
||||
}
|
||||
|
||||
private toAbsoluteUrl(path: string): string {
|
||||
return `${this.document.location.origin}${path}`;
|
||||
}
|
||||
|
||||
private updateCanonicalTag(url: string | null): void {
|
||||
let link = this.document.head.querySelector(
|
||||
'link[rel="canonical"]',
|
||||
) as HTMLLinkElement | null;
|
||||
if (!url) {
|
||||
link?.remove();
|
||||
return;
|
||||
}
|
||||
if (!link) {
|
||||
link = this.document.createElement('link');
|
||||
link.setAttribute('rel', 'canonical');
|
||||
@@ -308,29 +431,33 @@ export class SeoService {
|
||||
}
|
||||
|
||||
private updateLangAndAlternates(
|
||||
localizedPath: string,
|
||||
alternates: SeoMap | null,
|
||||
xDefaultPath: string | null,
|
||||
lang: SupportedLang,
|
||||
): void {
|
||||
const suffixSegments = localizedPath.split('/').filter(Boolean).slice(1);
|
||||
const suffix =
|
||||
suffixSegments.length > 0 ? `/${suffixSegments.join('/')}` : '';
|
||||
|
||||
this.document.documentElement.lang = lang;
|
||||
this.document.documentElement.lang = this.seoLocaleByLang[lang];
|
||||
|
||||
this.document.head
|
||||
.querySelectorAll('link[rel="alternate"][data-seo-managed="true"]')
|
||||
.forEach((node) => node.remove());
|
||||
|
||||
if (!alternates) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (const alt of this.supportedLangs) {
|
||||
const path = alternates[alt];
|
||||
if (!path) {
|
||||
continue;
|
||||
}
|
||||
this.appendAlternateLink(
|
||||
alt,
|
||||
`${this.document.location.origin}/${alt}${suffix}`,
|
||||
this.seoLocaleByLang[alt],
|
||||
this.toAbsoluteUrl(path),
|
||||
);
|
||||
}
|
||||
this.appendAlternateLink(
|
||||
'x-default',
|
||||
`${this.document.location.origin}/it${suffix}`,
|
||||
);
|
||||
if (xDefaultPath) {
|
||||
this.appendAlternateLink('x-default', this.toAbsoluteUrl(xDefaultPath));
|
||||
}
|
||||
}
|
||||
|
||||
private appendAlternateLink(hreflang: string, href: string): void {
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
<section class="animation-test-page">
|
||||
<div class="animation-toolbar" role="group" aria-label="Animation variants">
|
||||
<button
|
||||
type="button"
|
||||
class="variant-toggle"
|
||||
[class.active]="variant() === 'site-intro'"
|
||||
(click)="setVariant('site-intro')"
|
||||
>
|
||||
Site intro
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="variant-toggle"
|
||||
[class.active]="variant() === 'calculator-loader'"
|
||||
(click)="setVariant('calculator-loader')"
|
||||
>
|
||||
Calculator loader
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="animation-stage" [attr.data-variant]="variant()">
|
||||
<app-brand-animation-logo
|
||||
[variant]="variant()"
|
||||
[decorative]="false"
|
||||
ariaLabel="3D fab animation test"
|
||||
></app-brand-animation-logo>
|
||||
</div>
|
||||
</section>
|
||||
@@ -0,0 +1,60 @@
|
||||
:host {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.animation-test-page {
|
||||
min-height: 100vh;
|
||||
display: grid;
|
||||
align-content: center;
|
||||
justify-items: center;
|
||||
gap: 1.5rem;
|
||||
padding: 2rem 1.5rem 3rem;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.animation-toolbar {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 0.35rem;
|
||||
border: 1px solid rgba(16, 24, 32, 0.12);
|
||||
border-radius: 999px;
|
||||
background: #f7f5ef;
|
||||
}
|
||||
|
||||
.variant-toggle {
|
||||
min-height: 2.4rem;
|
||||
padding: 0 1rem;
|
||||
border: 0;
|
||||
border-radius: 999px;
|
||||
background: transparent;
|
||||
color: var(--color-text-muted);
|
||||
font: inherit;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition:
|
||||
background-color 0.18s ease,
|
||||
color 0.18s ease,
|
||||
box-shadow 0.18s ease;
|
||||
}
|
||||
|
||||
.variant-toggle.active {
|
||||
background: #fff;
|
||||
color: var(--color-text);
|
||||
box-shadow: 0 6px 16px rgba(16, 24, 32, 0.08);
|
||||
}
|
||||
|
||||
.animation-stage {
|
||||
width: min(100%, 26rem);
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.animation-toolbar {
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.animation-stage {
|
||||
width: min(100%, 19rem);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { Component, signal } from '@angular/core';
|
||||
import {
|
||||
BrandAnimationLogoComponent,
|
||||
BrandAnimationVariant,
|
||||
} from '../../shared/components/brand-animation-logo/brand-animation-logo.component';
|
||||
|
||||
@Component({
|
||||
selector: 'app-calculator-animation-test',
|
||||
standalone: true,
|
||||
imports: [CommonModule, BrandAnimationLogoComponent],
|
||||
templateUrl: './calculator-animation-test.component.html',
|
||||
styleUrl: './calculator-animation-test.component.scss',
|
||||
})
|
||||
export class CalculatorAnimationTestComponent {
|
||||
readonly variant = signal<BrandAnimationVariant>('site-intro');
|
||||
|
||||
setVariant(variant: BrandAnimationVariant): void {
|
||||
this.variant.set(variant);
|
||||
}
|
||||
}
|
||||
@@ -57,7 +57,10 @@
|
||||
@if (loading()) {
|
||||
<app-card class="loading-state">
|
||||
<div class="loader-content">
|
||||
<div class="spinner"></div>
|
||||
<app-brand-animation-logo
|
||||
class="loader-logo"
|
||||
variant="calculator-loader"
|
||||
></app-brand-animation-logo>
|
||||
<h3 class="loading-title">
|
||||
{{ "CALC.ANALYZING_TITLE" | translate }}
|
||||
</h3>
|
||||
|
||||
@@ -93,7 +93,7 @@
|
||||
|
||||
.loader-content {
|
||||
text-align: center;
|
||||
max-width: 300px;
|
||||
max-width: 22rem;
|
||||
margin: 0 auto;
|
||||
|
||||
/* Center content vertically within the stretched card */
|
||||
@@ -101,12 +101,14 @@
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: var(--space-3);
|
||||
}
|
||||
|
||||
.loading-title {
|
||||
font-size: 1.1rem;
|
||||
font-weight: 600;
|
||||
margin: var(--space-4) 0 var(--space-2);
|
||||
margin: 0;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
@@ -114,23 +116,21 @@
|
||||
font-size: 0.9rem;
|
||||
color: var(--color-text-muted);
|
||||
line-height: 1.5;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.spinner {
|
||||
border: 3px solid var(--color-neutral-200);
|
||||
border-left-color: var(--color-brand);
|
||||
border-radius: 50%;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
animation: spin 1s linear infinite;
|
||||
.loader-logo {
|
||||
display: block;
|
||||
width: min(100%, 16rem);
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
--brand-animation-width: 16rem;
|
||||
--brand-animation-height: 4.8rem;
|
||||
--brand-animation-letter-width: 2.85rem;
|
||||
--brand-animation-scale: 0.84;
|
||||
--brand-animation-word-spacing: 0.97;
|
||||
--brand-animation-width-mobile: 14rem;
|
||||
--brand-animation-height-mobile: 4.1rem;
|
||||
--brand-animation-letter-width-mobile: 2.45rem;
|
||||
--brand-animation-scale-mobile: 0.84;
|
||||
--brand-animation-loader-loop-duration: 2.65s;
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import { catchError, map } from 'rxjs/operators';
|
||||
import { AppCardComponent } from '../../shared/components/app-card/app-card.component';
|
||||
import { AppAlertComponent } from '../../shared/components/app-alert/app-alert.component';
|
||||
import { AppButtonComponent } from '../../shared/components/app-button/app-button.component';
|
||||
import { BrandAnimationLogoComponent } from '../../shared/components/brand-animation-logo/brand-animation-logo.component';
|
||||
import { UploadFormComponent } from './components/upload-form/upload-form.component';
|
||||
import { QuoteResultComponent } from './components/quote-result/quote-result.component';
|
||||
import {
|
||||
@@ -48,6 +49,7 @@ type TrackedPrintSettings = {
|
||||
AppCardComponent,
|
||||
AppAlertComponent,
|
||||
AppButtonComponent,
|
||||
BrandAnimationLogoComponent,
|
||||
UploadFormComponent,
|
||||
QuoteResultComponent,
|
||||
SuccessStateComponent,
|
||||
|
||||
@@ -3,6 +3,18 @@ import { CalculatorPageComponent } from './calculator-page.component';
|
||||
|
||||
export const CALCULATOR_ROUTES: Routes = [
|
||||
{ path: '', redirectTo: 'basic', pathMatch: 'full' },
|
||||
{
|
||||
path: 'animation-test',
|
||||
loadComponent: () =>
|
||||
import('./calculator-animation-test.component').then(
|
||||
(m) => m.CalculatorAnimationTestComponent,
|
||||
),
|
||||
data: {
|
||||
seoTitleKey: 'SEO.ROUTES.CALCULATOR.TITLE',
|
||||
seoDescriptionKey: 'SEO.ROUTES.CALCULATOR.DESCRIPTION',
|
||||
seoRobots: 'noindex, nofollow',
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'basic',
|
||||
component: CalculatorPageComponent,
|
||||
|
||||
@@ -127,7 +127,8 @@ export class UploadFormComponent implements OnInit {
|
||||
private layerHeightsByNozzle: Record<string, SimpleOption[]> = {};
|
||||
private isPatchingSettings = false;
|
||||
|
||||
acceptedFormats = '.stl,.3mf,.step,.stp';
|
||||
acceptedFormats = '.stl,.3mf';
|
||||
private readonly allowedExtensions = ['stl', '3mf'] as const;
|
||||
|
||||
constructor() {
|
||||
this.form = this.fb.group({
|
||||
@@ -286,6 +287,13 @@ export class UploadFormComponent implements OnInit {
|
||||
return name.endsWith('.stl');
|
||||
}
|
||||
|
||||
isSupportedFile(file: File | null): boolean {
|
||||
if (!file) return false;
|
||||
|
||||
const name = file.name.toLowerCase().trim();
|
||||
return this.allowedExtensions.some((ext) => name.endsWith(`.${ext}`));
|
||||
}
|
||||
|
||||
canPreviewSelectedFile(): boolean {
|
||||
return this.isStlFile(this.getSelectedPreviewFile());
|
||||
}
|
||||
@@ -340,13 +348,19 @@ export class UploadFormComponent implements OnInit {
|
||||
onFilesDropped(newFiles: File[]) {
|
||||
const MAX_SIZE = 200 * 1024 * 1024;
|
||||
const validItems: FormItem[] = [];
|
||||
let hasError = false;
|
||||
let hasInvalidType = false;
|
||||
let hasOversize = false;
|
||||
|
||||
const defaults = this.getCurrentGlobalItemDefaults();
|
||||
|
||||
for (const file of newFiles) {
|
||||
if (!this.isSupportedFile(file)) {
|
||||
hasInvalidType = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (file.size > MAX_SIZE) {
|
||||
hasError = true;
|
||||
hasOversize = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -367,7 +381,11 @@ export class UploadFormComponent implements OnInit {
|
||||
});
|
||||
}
|
||||
|
||||
if (hasError) {
|
||||
if (hasInvalidType) {
|
||||
alert(this.translate.instant('CALC.ERR_INVALID_FILE_TYPE'));
|
||||
}
|
||||
|
||||
if (hasOversize) {
|
||||
alert(this.translate.instant('CALC.ERR_FILE_TOO_LARGE'));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
<article class="product-card">
|
||||
<a class="media" [routerLink]="productLink()" [state]="navigationState()">
|
||||
<a
|
||||
class="media"
|
||||
[routerLink]="productLink()"
|
||||
[state]="navigationState()"
|
||||
(click)="rememberCatalogScroll()"
|
||||
>
|
||||
@if (imageUrl(); as imageUrl) {
|
||||
<img
|
||||
[src]="imageUrl"
|
||||
@@ -32,9 +37,12 @@
|
||||
</div>
|
||||
|
||||
<h3 class="name">
|
||||
<a [routerLink]="productLink()" [state]="navigationState()">{{
|
||||
product().name
|
||||
}}</a>
|
||||
<a
|
||||
[routerLink]="productLink()"
|
||||
[state]="navigationState()"
|
||||
(click)="rememberCatalogScroll()"
|
||||
>{{ product().name }}</a
|
||||
>
|
||||
</h3>
|
||||
|
||||
<p class="excerpt">
|
||||
@@ -62,6 +70,7 @@
|
||||
<a
|
||||
[routerLink]="productLink()"
|
||||
[state]="navigationState()"
|
||||
(click)="rememberCatalogScroll()"
|
||||
class="view-btn"
|
||||
>{{ "SHOP.DETAILS" | translate }}</a
|
||||
>
|
||||
|
||||
@@ -74,4 +74,16 @@ export class ProductCardComponent {
|
||||
shopReturnUrl: this.router.url,
|
||||
};
|
||||
}
|
||||
|
||||
rememberCatalogScroll(): void {
|
||||
if (typeof window === 'undefined') {
|
||||
return;
|
||||
}
|
||||
|
||||
const nextState = {
|
||||
...(history.state ?? {}),
|
||||
shopRestoreScrollY: Math.max(0, Math.round(window.scrollY)),
|
||||
};
|
||||
history.replaceState(nextState, '');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { CommonModule, isPlatformBrowser } from '@angular/common';
|
||||
import { CommonModule, Location, isPlatformBrowser } from '@angular/common';
|
||||
import {
|
||||
RESPONSE_INIT,
|
||||
afterNextRender,
|
||||
Component,
|
||||
DestroyRef,
|
||||
@@ -59,12 +60,14 @@ export class ProductDetailComponent {
|
||||
/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
|
||||
private readonly destroyRef = inject(DestroyRef);
|
||||
private readonly injector = inject(Injector);
|
||||
private readonly location = inject(Location);
|
||||
private readonly router = inject(Router);
|
||||
private readonly translate = inject(TranslateService);
|
||||
private readonly seoService = inject(SeoService);
|
||||
private readonly languageService = inject(LanguageService);
|
||||
private readonly shopRouteService = inject(ShopRouteService);
|
||||
private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));
|
||||
private readonly responseInit = inject(RESPONSE_INIT, { optional: true });
|
||||
readonly shopService = inject(ShopService);
|
||||
|
||||
readonly categorySlug = input<string | undefined>();
|
||||
@@ -197,6 +200,9 @@ export class ProductDetailComponent {
|
||||
afterNextRender(() => {
|
||||
this.scheduleCartWarmup();
|
||||
});
|
||||
this.destroyRef.onDestroy(() => {
|
||||
this.languageService.clearLocalizedRouteOverrides();
|
||||
});
|
||||
|
||||
combineLatest([
|
||||
toObservable(this.productSlug, { injector: this.injector }),
|
||||
@@ -215,13 +221,17 @@ export class ProductDetailComponent {
|
||||
}),
|
||||
switchMap(([productSlug]) => {
|
||||
if (!productSlug) {
|
||||
this.languageService.clearLocalizedRouteOverrides();
|
||||
this.error.set('SHOP.NOT_FOUND');
|
||||
this.setResponseStatus(404);
|
||||
this.applyFallbackSeo();
|
||||
this.loading.set(false);
|
||||
return of(null);
|
||||
}
|
||||
|
||||
return this.shopService.getProductByPublicPath(productSlug).pipe(
|
||||
catchError((error) => {
|
||||
this.languageService.clearLocalizedRouteOverrides();
|
||||
this.product.set(null);
|
||||
this.selectedVariantId.set(null);
|
||||
this.setSelectedImageAssetId(null);
|
||||
@@ -229,6 +239,9 @@ export class ProductDetailComponent {
|
||||
this.error.set(
|
||||
error?.status === 404 ? 'SHOP.NOT_FOUND' : 'SHOP.LOAD_ERROR',
|
||||
);
|
||||
if (error?.status === 404) {
|
||||
this.setResponseStatus(404);
|
||||
}
|
||||
this.applyFallbackSeo();
|
||||
return of(null);
|
||||
}),
|
||||
@@ -257,6 +270,7 @@ export class ProductDetailComponent {
|
||||
null,
|
||||
);
|
||||
this.quantity.set(1);
|
||||
this.languageService.setLocalizedRouteOverrides(product.localizedPaths);
|
||||
this.syncPublicUrl(product);
|
||||
this.applySeo(product);
|
||||
this.modelFile.set(null);
|
||||
@@ -489,6 +503,11 @@ export class ProductDetailComponent {
|
||||
: null;
|
||||
|
||||
if (returnUrl && this.shopRouteService.isCatalogUrl(returnUrl)) {
|
||||
if (this.isBrowser && window.history.length > 1) {
|
||||
this.location.back();
|
||||
return;
|
||||
}
|
||||
|
||||
void this.router.navigateByUrl(returnUrl);
|
||||
return;
|
||||
}
|
||||
@@ -548,25 +567,34 @@ export class ProductDetailComponent {
|
||||
this.translate.instant('SHOP.CATALOG_META_DESCRIPTION');
|
||||
const robots =
|
||||
product.indexable === false ? 'noindex, nofollow' : 'index, follow';
|
||||
const lang = this.languageService.selectedLang();
|
||||
const canonicalPath =
|
||||
product.localizedPaths?.[lang] ?? product.localizedPaths?.it ?? null;
|
||||
|
||||
this.seoService.applyPageSeo({
|
||||
this.seoService.applyResolvedSeo({
|
||||
title,
|
||||
description,
|
||||
robots,
|
||||
ogTitle: product.ogTitle || title,
|
||||
ogDescription: product.ogDescription || description,
|
||||
canonicalPath,
|
||||
alternates: product.localizedPaths,
|
||||
xDefault: product.localizedPaths?.it ?? canonicalPath,
|
||||
});
|
||||
}
|
||||
|
||||
private applyFallbackSeo(): void {
|
||||
const title = `${this.translate.instant('SHOP.TITLE')} | 3D fab`;
|
||||
const description = this.translate.instant('SHOP.CATALOG_META_DESCRIPTION');
|
||||
this.seoService.applyPageSeo({
|
||||
this.seoService.applyResolvedSeo({
|
||||
title,
|
||||
description,
|
||||
robots: 'index, follow',
|
||||
robots: 'noindex, nofollow',
|
||||
ogTitle: title,
|
||||
ogDescription: description,
|
||||
canonicalPath: null,
|
||||
alternates: null,
|
||||
xDefault: null,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -741,21 +769,23 @@ export class ProductDetailComponent {
|
||||
return;
|
||||
}
|
||||
|
||||
const currentProductSlug = this.productSlug()?.trim().toLowerCase() ?? '';
|
||||
const targetProductSlug = this.shopRouteService.productPathSegment(product);
|
||||
if (currentProductSlug === targetProductSlug) {
|
||||
const currentTree = this.router.parseUrl(this.router.url);
|
||||
const lang = this.languageService.selectedLang();
|
||||
const targetPath =
|
||||
product.localizedPaths?.[lang] ??
|
||||
`/${lang}/shop/p/${this.shopRouteService.productPathSegment(product)}`;
|
||||
const normalizedTargetPath = targetPath.startsWith('/')
|
||||
? targetPath
|
||||
: `/${targetPath}`;
|
||||
const currentPath = this.router
|
||||
.serializeUrl(currentTree)
|
||||
.split(/[?#]/, 1)[0];
|
||||
if (currentPath === normalizedTargetPath) {
|
||||
return;
|
||||
}
|
||||
|
||||
const currentTree = this.router.parseUrl(this.router.url);
|
||||
const targetTree = this.router.createUrlTree(
|
||||
[
|
||||
'/',
|
||||
this.languageService.selectedLang(),
|
||||
'shop',
|
||||
'p',
|
||||
targetProductSlug,
|
||||
],
|
||||
['/', ...normalizedTargetPath.split('/').filter(Boolean)],
|
||||
{
|
||||
queryParams: currentTree.queryParams,
|
||||
fragment: currentTree.fragment ?? undefined,
|
||||
@@ -774,4 +804,10 @@ export class ProductDetailComponent {
|
||||
state: history.state,
|
||||
});
|
||||
}
|
||||
|
||||
private setResponseStatus(status: number): void {
|
||||
if (this.responseInit) {
|
||||
this.responseInit.status = status;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { LanguageService } from '../../../core/services/language.service';
|
||||
|
||||
type SupportedLang = 'it' | 'en' | 'de' | 'fr';
|
||||
|
||||
export interface ShopProductRouteRef {
|
||||
id: string | null | undefined;
|
||||
name: string | null | undefined;
|
||||
slug?: string | null | undefined;
|
||||
}
|
||||
|
||||
export interface ShopProductLookup {
|
||||
idPrefix: string | null;
|
||||
slugHint: string | null;
|
||||
publicPath?: string | null | undefined;
|
||||
localizedPaths?: Partial<Record<SupportedLang, string>> | null | undefined;
|
||||
}
|
||||
|
||||
@Injectable({
|
||||
@@ -26,11 +25,21 @@ export class ShopRouteService {
|
||||
}
|
||||
|
||||
productCommands(product: ShopProductRouteRef): string[] {
|
||||
const localizedPath = this.localizedProductPath(product);
|
||||
if (localizedPath) {
|
||||
return ['/', ...localizedPath.split('/').filter(Boolean)];
|
||||
}
|
||||
|
||||
const lang = this.languageService.currentLang();
|
||||
return ['/', lang, 'shop', 'p', this.productPathSegment(product)];
|
||||
}
|
||||
|
||||
productPathSegment(product: ShopProductRouteRef): string {
|
||||
const publicPath = String(product.publicPath ?? '').trim();
|
||||
if (publicPath) {
|
||||
return publicPath;
|
||||
}
|
||||
|
||||
const idPrefix = this.productIdPrefix(product.id);
|
||||
const tail =
|
||||
this.slugify(product.name) || this.slugify(product.slug) || 'product';
|
||||
@@ -38,41 +47,6 @@ export class ShopRouteService {
|
||||
return idPrefix ? `${idPrefix}-${tail}` : tail;
|
||||
}
|
||||
|
||||
resolveProductLookup(
|
||||
productPathSegment: string | null | undefined,
|
||||
): ShopProductLookup {
|
||||
const normalized = String(productPathSegment ?? '')
|
||||
.trim()
|
||||
.toLowerCase();
|
||||
if (!normalized) {
|
||||
return {
|
||||
idPrefix: null,
|
||||
slugHint: null,
|
||||
};
|
||||
}
|
||||
|
||||
const bareUuidMatch = normalized.match(/^([0-9a-f]{8})$/);
|
||||
if (bareUuidMatch) {
|
||||
return {
|
||||
idPrefix: bareUuidMatch[1],
|
||||
slugHint: null,
|
||||
};
|
||||
}
|
||||
|
||||
const publicSlugMatch = normalized.match(/^([0-9a-f]{8})-(.+)$/);
|
||||
if (publicSlugMatch) {
|
||||
return {
|
||||
idPrefix: publicSlugMatch[1],
|
||||
slugHint: this.slugify(publicSlugMatch[2]) || null,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
idPrefix: null,
|
||||
slugHint: normalized,
|
||||
};
|
||||
}
|
||||
|
||||
isCatalogUrl(url: string | null | undefined): boolean {
|
||||
if (!url) {
|
||||
return false;
|
||||
@@ -92,6 +66,12 @@ export class ShopRouteService {
|
||||
.replace(/-{2,}/g, '-');
|
||||
}
|
||||
|
||||
private localizedProductPath(product: ShopProductRouteRef): string | null {
|
||||
const lang = this.languageService.currentLang();
|
||||
const localizedPath = String(product.localizedPaths?.[lang] ?? '').trim();
|
||||
return localizedPath.startsWith('/') ? localizedPath : null;
|
||||
}
|
||||
|
||||
private productIdPrefix(productId: string | null | undefined): string {
|
||||
const normalized = String(productId ?? '')
|
||||
.trim()
|
||||
|
||||
@@ -112,6 +112,13 @@ describe('ShopService', () => {
|
||||
defaultVariant: null,
|
||||
primaryImage: null,
|
||||
model3d: null,
|
||||
publicPath: '12345678-supporto-cavo-scrivania',
|
||||
localizedPaths: {
|
||||
it: '/it/shop/p/12345678-supporto-cavo-scrivania',
|
||||
en: '/en/shop/p/12345678-desk-cable-clip',
|
||||
de: '/de/shop/p/12345678-schreibtisch-kabelhalter',
|
||||
fr: '/fr/shop/p/12345678-support-cable-bureau',
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
@@ -142,6 +149,13 @@ describe('ShopService', () => {
|
||||
primaryImage: null,
|
||||
images: [],
|
||||
model3d: null,
|
||||
publicPath: '12345678-supporto-cavo-scrivania',
|
||||
localizedPaths: {
|
||||
it: '/it/shop/p/12345678-supporto-cavo-scrivania',
|
||||
en: '/en/shop/p/12345678-desk-cable-clip',
|
||||
de: '/de/shop/p/12345678-schreibtisch-kabelhalter',
|
||||
fr: '/fr/shop/p/12345678-support-cable-bureau',
|
||||
},
|
||||
});
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -235,14 +249,15 @@ describe('ShopService', () => {
|
||||
expect(response?.name).toBe('Supporto cavo scrivania');
|
||||
});
|
||||
|
||||
it('resolves product detail from uuid prefix even when slug tail does not match', () => {
|
||||
let response: ShopProductDetail | undefined;
|
||||
it('rejects product paths whose slug tail does not match the canonical path', () => {
|
||||
let errorResponse: { status?: number } | undefined;
|
||||
|
||||
service
|
||||
.getProductByPublicPath('12345678-qualunque-nome')
|
||||
.subscribe((product) => {
|
||||
response = product;
|
||||
});
|
||||
service.getProductByPublicPath('12345678-qualunque-nome').subscribe({
|
||||
next: () => fail('Expected canonical path mismatch to return 404'),
|
||||
error: (error) => {
|
||||
errorResponse = error;
|
||||
},
|
||||
});
|
||||
|
||||
const catalogRequest = httpMock.expectOne((request) => {
|
||||
return (
|
||||
@@ -253,24 +268,20 @@ describe('ShopService', () => {
|
||||
});
|
||||
catalogRequest.flush(buildCatalog());
|
||||
|
||||
const detailRequest = httpMock.expectOne((request) => {
|
||||
return (
|
||||
request.method === 'GET' &&
|
||||
request.url ===
|
||||
'http://localhost:8000/api/shop/products/desk-cable-clip' &&
|
||||
request.params.get('lang') === 'it'
|
||||
);
|
||||
});
|
||||
detailRequest.flush(buildProduct());
|
||||
|
||||
expect(response?.id).toBe('12345678-abcd-4abc-9abc-1234567890ab');
|
||||
httpMock.expectNone(
|
||||
'http://localhost:8000/api/shop/products/desk-cable-clip',
|
||||
);
|
||||
expect(errorResponse?.status).toBe(404);
|
||||
});
|
||||
|
||||
it('resolves product detail from bare uuid prefix without slug tail', () => {
|
||||
let response: ShopProductDetail | undefined;
|
||||
it('rejects bare uuid product paths without the localized slug tail', () => {
|
||||
let errorResponse: { status?: number } | undefined;
|
||||
|
||||
service.getProductByPublicPath('12345678').subscribe((product) => {
|
||||
response = product;
|
||||
service.getProductByPublicPath('12345678').subscribe({
|
||||
next: () => fail('Expected bare uuid path to return 404'),
|
||||
error: (error) => {
|
||||
errorResponse = error;
|
||||
},
|
||||
});
|
||||
|
||||
const catalogRequest = httpMock.expectOne((request) => {
|
||||
@@ -282,16 +293,9 @@ describe('ShopService', () => {
|
||||
});
|
||||
catalogRequest.flush(buildCatalog());
|
||||
|
||||
const detailRequest = httpMock.expectOne((request) => {
|
||||
return (
|
||||
request.method === 'GET' &&
|
||||
request.url ===
|
||||
'http://localhost:8000/api/shop/products/desk-cable-clip' &&
|
||||
request.params.get('lang') === 'it'
|
||||
);
|
||||
});
|
||||
detailRequest.flush(buildProduct());
|
||||
|
||||
expect(response?.id).toBe('12345678-abcd-4abc-9abc-1234567890ab');
|
||||
httpMock.expectNone(
|
||||
'http://localhost:8000/api/shop/products/desk-cable-clip',
|
||||
);
|
||||
expect(errorResponse?.status).toBe(404);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -7,7 +7,9 @@ import {
|
||||
PublicMediaVariantDto,
|
||||
} from '../../../core/services/public-media.service';
|
||||
import { LanguageService } from '../../../core/services/language.service';
|
||||
import { ShopRouteService } from './shop-route.service';
|
||||
|
||||
type SupportedLang = 'it' | 'en' | 'de' | 'fr';
|
||||
type LocalizedPathMap = Partial<Record<SupportedLang, string>>;
|
||||
|
||||
export interface ShopCategoryRef {
|
||||
id: string;
|
||||
@@ -84,6 +86,8 @@ export interface ShopProductSummary {
|
||||
defaultVariant: ShopProductVariantOption | null;
|
||||
primaryImage: PublicMediaUsageDto | null;
|
||||
model3d: ShopProductModel | null;
|
||||
publicPath: string;
|
||||
localizedPaths: LocalizedPathMap;
|
||||
}
|
||||
|
||||
export interface ShopProductDetail {
|
||||
@@ -108,6 +112,8 @@ export interface ShopProductDetail {
|
||||
primaryImage: PublicMediaUsageDto | null;
|
||||
images: PublicMediaUsageDto[];
|
||||
model3d: ShopProductModel | null;
|
||||
publicPath: string;
|
||||
localizedPaths: LocalizedPathMap;
|
||||
}
|
||||
|
||||
export interface ShopProductCatalogResponse {
|
||||
@@ -185,7 +191,6 @@ export interface ShopCategoryNavNode {
|
||||
export class ShopService {
|
||||
private readonly http = inject(HttpClient);
|
||||
private readonly languageService = inject(LanguageService);
|
||||
private readonly shopRouteService = inject(ShopRouteService);
|
||||
private readonly apiUrl = `${environment.apiUrl}/api/shop`;
|
||||
|
||||
readonly cart = signal<ShopCartResponse | null>(null);
|
||||
@@ -278,16 +283,18 @@ export class ShopService {
|
||||
getProductByPublicPath(
|
||||
productPathSegment: string,
|
||||
): Observable<ShopProductDetail> {
|
||||
const lookup =
|
||||
this.shopRouteService.resolveProductLookup(productPathSegment);
|
||||
if (!lookup.idPrefix && lookup.slugHint) {
|
||||
return this.getProduct(lookup.slugHint);
|
||||
const normalizedPath = this.normalizePublicPath(productPathSegment);
|
||||
if (!normalizedPath) {
|
||||
return throwError(() => ({
|
||||
status: 404,
|
||||
}));
|
||||
}
|
||||
|
||||
return this.getProductCatalog().pipe(
|
||||
map((catalog) =>
|
||||
catalog.products.find((product) =>
|
||||
product.id.toLowerCase().startsWith(lookup.idPrefix ?? ''),
|
||||
catalog.products.find(
|
||||
(product) =>
|
||||
this.normalizePublicPath(product.publicPath) === normalizedPath,
|
||||
),
|
||||
),
|
||||
switchMap((product) => {
|
||||
@@ -301,6 +308,12 @@ export class ShopService {
|
||||
);
|
||||
}
|
||||
|
||||
private normalizePublicPath(value: string | null | undefined): string {
|
||||
return String(value ?? '')
|
||||
.trim()
|
||||
.toLowerCase();
|
||||
}
|
||||
|
||||
loadCart(): Observable<ShopCartResponse> {
|
||||
this.cartLoading.set(true);
|
||||
return this.http
|
||||
|
||||
@@ -332,6 +332,10 @@
|
||||
}
|
||||
|
||||
@media (max-width: 760px) {
|
||||
.cart-card {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.product-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import {
|
||||
RESPONSE_INIT,
|
||||
afterNextRender,
|
||||
Component,
|
||||
DestroyRef,
|
||||
@@ -60,6 +61,7 @@ export class ShopPageComponent {
|
||||
private readonly router = inject(Router);
|
||||
private readonly translate = inject(TranslateService);
|
||||
private readonly seoService = inject(SeoService);
|
||||
private readonly responseInit = inject(RESPONSE_INIT, { optional: true });
|
||||
readonly languageService = inject(LanguageService);
|
||||
private readonly shopRouteService = inject(ShopRouteService);
|
||||
readonly shopService = inject(ShopService);
|
||||
@@ -118,7 +120,10 @@ export class ShopPageComponent {
|
||||
this.error.set(
|
||||
error?.status === 404 ? 'SHOP.NOT_FOUND' : 'SHOP.LOAD_ERROR',
|
||||
);
|
||||
this.applyDefaultSeo();
|
||||
if (error?.status === 404) {
|
||||
this.setResponseStatus(404);
|
||||
}
|
||||
this.applyErrorSeo();
|
||||
return of(null);
|
||||
}),
|
||||
finalize(() => this.loading.set(false)),
|
||||
@@ -141,6 +146,7 @@ export class ShopPageComponent {
|
||||
this.selectedCategory.set(result.catalog.category ?? null);
|
||||
this.products.set(result.catalog.products);
|
||||
this.applySeo(result.catalog.category ?? null);
|
||||
this.restoreCatalogScrollIfNeeded();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -353,4 +359,46 @@ export class ShopPageComponent {
|
||||
ogDescription: description,
|
||||
});
|
||||
}
|
||||
|
||||
private applyErrorSeo(): void {
|
||||
const title = `${this.translate.instant('SHOP.TITLE')} | 3D fab`;
|
||||
const description = this.translate.instant('SHOP.CATALOG_META_DESCRIPTION');
|
||||
|
||||
this.seoService.applyResolvedSeo({
|
||||
title,
|
||||
description,
|
||||
robots: 'noindex, nofollow',
|
||||
ogTitle: title,
|
||||
ogDescription: description,
|
||||
canonicalPath: null,
|
||||
alternates: null,
|
||||
xDefault: null,
|
||||
});
|
||||
}
|
||||
|
||||
private setResponseStatus(status: number): void {
|
||||
if (this.responseInit) {
|
||||
this.responseInit.status = status;
|
||||
}
|
||||
}
|
||||
|
||||
private restoreCatalogScrollIfNeeded(): void {
|
||||
if (typeof window === 'undefined') {
|
||||
return;
|
||||
}
|
||||
|
||||
const scrollY = Number(history.state?.shopRestoreScrollY);
|
||||
if (!Number.isFinite(scrollY) || scrollY < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { shopRestoreScrollY: _ignored, ...nextState } = history.state ?? {};
|
||||
const restore = () => window.scrollTo({ left: 0, top: scrollY });
|
||||
|
||||
history.replaceState(nextState, '');
|
||||
window.requestAnimationFrame(() => {
|
||||
restore();
|
||||
window.setTimeout(restore, 60);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import { TranslateModule } from '@ngx-translate/core';
|
||||
export class AppDropzoneComponent {
|
||||
label = input<string>('DROPZONE.DEFAULT_LABEL');
|
||||
subtext = input<string>('DROPZONE.DEFAULT_SUBTEXT');
|
||||
accept = input<string>('.stl,.3mf,.step,.stp');
|
||||
accept = input<string>('.stl,.3mf');
|
||||
multiple = input<boolean>(true);
|
||||
|
||||
filesDropped = output<File[]>();
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
<div
|
||||
class="brand-animation"
|
||||
[attr.data-variant]="variant()"
|
||||
role="img"
|
||||
[attr.aria-hidden]="decorative() ? 'true' : null"
|
||||
[attr.aria-label]="decorative() ? null : ariaLabel()"
|
||||
>
|
||||
@for (letter of resolvedLetters(); track letter.key) {
|
||||
<img
|
||||
class="brand-animation__letter"
|
||||
[src]="letter.src"
|
||||
alt=""
|
||||
[attr.data-letter]="letter.key"
|
||||
[style.--word-x]="letter.wordX"
|
||||
/>
|
||||
}
|
||||
</div>
|
||||
@@ -0,0 +1,172 @@
|
||||
:host {
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.brand-animation {
|
||||
--three-anchor-x: -9.4rem;
|
||||
--bee-anchor-x: 10.2rem;
|
||||
--word-scale: var(--brand-animation-scale, 1);
|
||||
--word-spacing-factor: var(--brand-animation-word-spacing, 1);
|
||||
--loader-group-scale-x: 0.94;
|
||||
--loader-group-scale-y: 1.05;
|
||||
--loader-exit-shift: 1.6rem;
|
||||
position: relative;
|
||||
width: min(100%, var(--brand-animation-width, 26rem));
|
||||
height: var(--brand-animation-height, 8rem);
|
||||
margin-inline: auto;
|
||||
}
|
||||
|
||||
.brand-animation__letter {
|
||||
--word-x: 0rem;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: var(--brand-animation-letter-width, clamp(2.7rem, 6vw, 4rem));
|
||||
height: auto;
|
||||
transform: translate(-50%, -50%);
|
||||
transform-origin: center center;
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
.brand-animation[data-variant="site-intro"] .brand-animation__letter {
|
||||
animation: site-intro-preview var(--brand-animation-site-intro-duration, 1s)
|
||||
linear 1 forwards;
|
||||
}
|
||||
|
||||
.brand-animation[data-variant="calculator-loader"] .brand-animation__letter {
|
||||
animation: calculator-loader-loop
|
||||
var(--brand-animation-loader-loop-duration, 2.65s) infinite;
|
||||
}
|
||||
|
||||
@keyframes site-intro-preview {
|
||||
0% {
|
||||
transform: translate(-50%, -50%) translateX(0) scale(0.92);
|
||||
}
|
||||
|
||||
20% {
|
||||
transform: translate(-50%, -50%) translateX(0) scale(0.92);
|
||||
}
|
||||
|
||||
80% {
|
||||
transform: translate(-50%, -50%)
|
||||
translateX(
|
||||
calc(var(--word-x) * var(--word-scale) * var(--word-spacing-factor))
|
||||
)
|
||||
scale(1);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translate(-50%, -50%)
|
||||
translateX(
|
||||
calc(var(--word-x) * var(--word-scale) * var(--word-spacing-factor))
|
||||
)
|
||||
scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes calculator-loader-loop {
|
||||
0%,
|
||||
5% {
|
||||
opacity: 0;
|
||||
transform: translate(-50%, -50%)
|
||||
translateX(
|
||||
calc(
|
||||
var(--three-anchor-x) * var(--word-scale) * var(--word-spacing-factor)
|
||||
)
|
||||
)
|
||||
scaleX(var(--loader-group-scale-x)) scaleY(var(--loader-group-scale-y));
|
||||
}
|
||||
|
||||
12% {
|
||||
opacity: 1;
|
||||
transform: translate(-50%, -50%)
|
||||
translateX(
|
||||
calc(
|
||||
var(--three-anchor-x) * var(--word-scale) * var(--word-spacing-factor)
|
||||
)
|
||||
)
|
||||
scaleX(var(--loader-group-scale-x)) scaleY(var(--loader-group-scale-y));
|
||||
}
|
||||
|
||||
12% {
|
||||
animation-timing-function: cubic-bezier(0.22, 0.82, 0.28, 1);
|
||||
}
|
||||
|
||||
38%,
|
||||
56% {
|
||||
opacity: 1;
|
||||
transform: translate(-50%, -50%)
|
||||
translateX(
|
||||
calc(var(--word-x) * var(--word-scale) * var(--word-spacing-factor))
|
||||
)
|
||||
scale(1);
|
||||
}
|
||||
|
||||
56% {
|
||||
animation-timing-function: cubic-bezier(0.38, 0, 0.72, 1);
|
||||
}
|
||||
|
||||
82%,
|
||||
88% {
|
||||
opacity: 1;
|
||||
transform: translate(-50%, -50%)
|
||||
translateX(
|
||||
calc(
|
||||
var(--bee-anchor-x) * var(--word-scale) * var(--word-spacing-factor)
|
||||
)
|
||||
)
|
||||
scaleX(var(--loader-group-scale-x)) scaleY(var(--loader-group-scale-y));
|
||||
}
|
||||
|
||||
88% {
|
||||
animation-timing-function: cubic-bezier(0.4, 0, 1, 1);
|
||||
}
|
||||
|
||||
94% {
|
||||
opacity: 0;
|
||||
transform: translate(-50%, -50%)
|
||||
translateX(
|
||||
calc(
|
||||
(var(--bee-anchor-x) + var(--loader-exit-shift)) * var(--word-scale) *
|
||||
var(--word-spacing-factor)
|
||||
)
|
||||
)
|
||||
scaleX(0.98) scaleY(1.02);
|
||||
}
|
||||
|
||||
94.01%,
|
||||
100% {
|
||||
opacity: 0;
|
||||
transform: translate(-50%, -50%)
|
||||
translateX(
|
||||
calc(
|
||||
var(--three-anchor-x) * var(--word-scale) * var(--word-spacing-factor)
|
||||
)
|
||||
)
|
||||
scaleX(var(--loader-group-scale-x)) scaleY(var(--loader-group-scale-y));
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.brand-animation {
|
||||
width: min(100%, var(--brand-animation-width-mobile, 19rem));
|
||||
height: var(--brand-animation-height-mobile, 6rem);
|
||||
--word-scale: var(--brand-animation-scale-mobile, 0.74);
|
||||
}
|
||||
|
||||
.brand-animation__letter {
|
||||
width: var(--brand-animation-letter-width-mobile, 2.8rem);
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.brand-animation__letter {
|
||||
animation: none !important;
|
||||
transform: translate(-50%, -50%)
|
||||
translateX(
|
||||
calc(var(--word-x) * var(--word-scale) * var(--word-spacing-factor))
|
||||
)
|
||||
scale(1);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
import { Component, computed, input } from '@angular/core';
|
||||
|
||||
export type BrandAnimationVariant = 'site-intro' | 'calculator-loader';
|
||||
|
||||
interface AnimationLetter {
|
||||
key: string;
|
||||
darkSrc: string;
|
||||
yellowSrc: string;
|
||||
wordX: string;
|
||||
}
|
||||
|
||||
interface ResolvedAnimationLetter {
|
||||
key: string;
|
||||
src: string;
|
||||
wordX: string;
|
||||
}
|
||||
|
||||
const LETTERS: readonly AnimationLetter[] = [
|
||||
{
|
||||
key: '3',
|
||||
darkSrc: '/assets/images/animation/31200.svg',
|
||||
yellowSrc: '/assets/images/animation/3g1200.svg',
|
||||
wordX: '-9.4rem',
|
||||
},
|
||||
{
|
||||
key: 'd',
|
||||
darkSrc: '/assets/images/animation/d1200.svg',
|
||||
yellowSrc: '/assets/images/animation/Dg1200.svg',
|
||||
wordX: '-4.9rem',
|
||||
},
|
||||
{
|
||||
key: 'F',
|
||||
darkSrc: '/assets/images/animation/F1200.svg',
|
||||
yellowSrc: '/assets/images/animation/Fg1200.svg',
|
||||
wordX: '1rem',
|
||||
},
|
||||
{
|
||||
key: 'A',
|
||||
darkSrc: '/assets/images/animation/A1200.svg',
|
||||
yellowSrc: '/assets/images/animation/Ag1200.svg',
|
||||
wordX: '5.6rem',
|
||||
},
|
||||
{
|
||||
key: 'B',
|
||||
darkSrc: '/assets/images/animation/B1200.svg',
|
||||
yellowSrc: '/assets/images/animation/Bg1200.svg',
|
||||
wordX: '10.2rem',
|
||||
},
|
||||
] as const;
|
||||
|
||||
@Component({
|
||||
selector: 'app-brand-animation-logo',
|
||||
standalone: true,
|
||||
templateUrl: './brand-animation-logo.component.html',
|
||||
styleUrl: './brand-animation-logo.component.scss',
|
||||
})
|
||||
export class BrandAnimationLogoComponent {
|
||||
readonly variant = input<BrandAnimationVariant>('site-intro');
|
||||
readonly decorative = input(true);
|
||||
readonly ariaLabel = input('3D fab animated logo');
|
||||
|
||||
readonly resolvedLetters = computed<ResolvedAnimationLetter[]>(() =>
|
||||
LETTERS.map((letter) => ({
|
||||
key: letter.key,
|
||||
src: this.variant() === 'site-intro' ? letter.yellowSrc : letter.darkSrc,
|
||||
wordX: letter.wordX,
|
||||
})),
|
||||
);
|
||||
}
|
||||
@@ -107,14 +107,14 @@
|
||||
},
|
||||
"CALC": {
|
||||
"TITLE": "3D-Angebot berechnen",
|
||||
"SUBTITLE": "Laden Sie Ihre 3D-Datei (STL, 3MF, STEP) hoch, stellen Sie Qualität und Farbe ein und berechnen Sie sofort Preis und Lieferzeit.",
|
||||
"SUBTITLE": "Laden Sie Ihre 3D-Datei (STL, 3MF) hoch, stellen Sie Qualität und Farbe ein und berechnen Sie sofort Preis und Lieferzeit.",
|
||||
"CTA_START": "Jetzt starten",
|
||||
"BUSINESS": "Unternehmen",
|
||||
"PRIVATE": "Privat",
|
||||
"MODE_EASY": "Basis",
|
||||
"MODE_ADVANCED": "Erweitert",
|
||||
"UPLOAD_LABEL": "Ziehen Sie Ihre 3D-Datei hierher",
|
||||
"UPLOAD_SUB": "Wir unterstützen STL, 3MF, STEP bis 50MB",
|
||||
"UPLOAD_SUB": "Wir unterstützen STL, 3MF bis 50MB",
|
||||
"MATERIAL": "Material",
|
||||
"QUALITY": "Qualität",
|
||||
"QUANTITY": "Menge",
|
||||
@@ -141,11 +141,12 @@
|
||||
"BENEFITS_2": "Ausgewählte Materialien und Qualitätskontrolle",
|
||||
"BENEFITS_3": "CAD-Beratung, falls die Datei Änderungen benötigt",
|
||||
"ERR_FILE_REQUIRED": "Die Datei ist erforderlich.",
|
||||
"STEP_WARNING": "Die 3D-Ansicht ist mit STEP- und 3MF-Dateien nicht kompatibel",
|
||||
"STEP_WARNING": "Die 3D-Vorschau ist nur für STL-Dateien verfügbar.",
|
||||
"REMOVE_FILE": "Datei entfernen",
|
||||
"FALLBACK_MATERIAL": "PLA (Fallback)",
|
||||
"FALLBACK_QUALITY_STANDARD": "Standard",
|
||||
"ERR_FILE_TOO_LARGE": "Einige Dateien überschreiten das 200MB-Limit und wurden nicht hinzugefügt.",
|
||||
"ERR_INVALID_FILE_TYPE": "Sie können nur Dateien vom Typ .stl oder .3mf hochladen.",
|
||||
"PRINT_SPEED": "Druckgeschwindigkeit",
|
||||
"COLOR": "Farbe",
|
||||
"ANALYZING_TITLE": "Analyse läuft...",
|
||||
@@ -624,7 +625,7 @@
|
||||
"BTN_CONTACT": "Mit uns sprechen",
|
||||
"SEC_CALC_TITLE": "Korrekte Preisberechnung in wenigen Sekunden",
|
||||
"SEC_CALC_SUBTITLE": "Keine Registrierung erforderlich. Die Schätzung basiert auf echtem Slicing.",
|
||||
"SEC_CALC_LIST_1": "Unterstützte Formate: STL, 3MF, STEP",
|
||||
"SEC_CALC_LIST_1": "Unterstützte Formate: STL, 3MF",
|
||||
"CARD_CALC_EYEBROW": "Automatische Berechnung",
|
||||
"CARD_CALC_TITLE": "Preis und Lieferzeit mit einem Klick",
|
||||
"CARD_CALC_TAG": "Ohne Registrierung",
|
||||
@@ -674,7 +675,7 @@
|
||||
},
|
||||
"DROPZONE": {
|
||||
"DEFAULT_LABEL": "Dateien hierher ziehen oder klicken zum Hochladen",
|
||||
"DEFAULT_SUBTEXT": "Unterstützt .STL, .3MF, .STEP"
|
||||
"DEFAULT_SUBTEXT": "Unterstützt .STL, .3MF"
|
||||
},
|
||||
"COLOR": {
|
||||
"AVAILABLE_COLORS": "Verfügbare Farben",
|
||||
|
||||
@@ -107,14 +107,14 @@
|
||||
},
|
||||
"CALC": {
|
||||
"TITLE": "3D Print Calculator",
|
||||
"SUBTITLE": "Upload your 3D file (STL, 3MF, STEP...) and get an instant estimate of costs and print time.",
|
||||
"SUBTITLE": "Upload your 3D file (STL, 3MF) and get an instant estimate of costs and print time.",
|
||||
"CTA_START": "Start Now",
|
||||
"BUSINESS": "Business",
|
||||
"PRIVATE": "Private",
|
||||
"MODE_EASY": "Quick",
|
||||
"MODE_ADVANCED": "Advanced",
|
||||
"UPLOAD_LABEL": "Drag your 3D file here",
|
||||
"UPLOAD_SUB": "Supports STL, 3MF, STEP up to 50MB",
|
||||
"UPLOAD_SUB": "Supports STL, 3MF up to 50MB",
|
||||
"MATERIAL": "Material",
|
||||
"QUALITY": "Quality",
|
||||
"QUANTITY": "Quantity",
|
||||
@@ -141,11 +141,12 @@
|
||||
"BENEFITS_2": "Selected materials and quality control",
|
||||
"BENEFITS_3": "CAD consultation if file needs modifications",
|
||||
"ERR_FILE_REQUIRED": "File is required.",
|
||||
"STEP_WARNING": "3D preview is not available for STEP files, but the calculator works perfectly. You can proceed with the quotation.",
|
||||
"STEP_WARNING": "3D preview is available only for STL files.",
|
||||
"REMOVE_FILE": "Remove file",
|
||||
"FALLBACK_MATERIAL": "PLA (fallback)",
|
||||
"FALLBACK_QUALITY_STANDARD": "Standard",
|
||||
"ERR_FILE_TOO_LARGE": "Some files exceed the 200MB limit and were not added.",
|
||||
"ERR_INVALID_FILE_TYPE": "You can upload only .stl or .3mf files.",
|
||||
"PRINT_SPEED": "Print speed",
|
||||
"COLOR": "Color",
|
||||
"ANALYZING_TITLE": "Analysis in progress...",
|
||||
@@ -624,7 +625,7 @@
|
||||
"BTN_CONTACT": "Talk to us",
|
||||
"SEC_CALC_TITLE": "Accurate pricing in a few seconds",
|
||||
"SEC_CALC_SUBTITLE": "No registration required. The estimate is calculated through real slicing.",
|
||||
"SEC_CALC_LIST_1": "Supported formats: STL, 3MF, STEP",
|
||||
"SEC_CALC_LIST_1": "Supported formats: STL, 3MF",
|
||||
"CARD_CALC_EYEBROW": "Automatic calculation",
|
||||
"CARD_CALC_TITLE": "Price and lead time in one click",
|
||||
"CARD_CALC_TAG": "No registration",
|
||||
@@ -674,7 +675,7 @@
|
||||
},
|
||||
"DROPZONE": {
|
||||
"DEFAULT_LABEL": "Drop files here or click to upload",
|
||||
"DEFAULT_SUBTEXT": "Supports .stl, .3mf, .step"
|
||||
"DEFAULT_SUBTEXT": "Supports .stl, .3mf"
|
||||
},
|
||||
"COLOR": {
|
||||
"AVAILABLE_COLORS": "Available colors",
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
"BTN_CONTACT": "Parlez avec nous",
|
||||
"SEC_CALC_TITLE": "Prix correct en quelques secondes",
|
||||
"SEC_CALC_SUBTITLE": "Aucune inscription requise. L'estimation est effectuée via un vrai slicing.",
|
||||
"SEC_CALC_LIST_1": "Formats pris en charge : STL, 3MF, STEP",
|
||||
"SEC_CALC_LIST_1": "Formats pris en charge : STL, 3MF",
|
||||
"CARD_CALC_EYEBROW": "Calcul automatique",
|
||||
"CARD_CALC_TITLE": "Prix et délais en un clic",
|
||||
"CARD_CALC_TAG": "Sans inscription",
|
||||
@@ -139,14 +139,14 @@
|
||||
},
|
||||
"CALC": {
|
||||
"TITLE": "Calculer un devis 3D",
|
||||
"SUBTITLE": "Chargez votre fichier 3D (STL, 3MF, STEP), réglez la qualité et la couleur puis calculez immédiatement prix et délais.",
|
||||
"SUBTITLE": "Chargez votre fichier 3D (STL, 3MF), réglez la qualité et la couleur puis calculez immédiatement prix et délais.",
|
||||
"CTA_START": "Commencer maintenant",
|
||||
"BUSINESS": "Entreprises",
|
||||
"PRIVATE": "Particuliers",
|
||||
"MODE_EASY": "Base",
|
||||
"MODE_ADVANCED": "Avancée",
|
||||
"UPLOAD_LABEL": "Glissez votre fichier 3D ici",
|
||||
"UPLOAD_SUB": "Nous prenons en charge STL, 3MF, STEP jusqu'à 50MB",
|
||||
"UPLOAD_SUB": "Nous prenons en charge STL, 3MF jusqu'à 50MB",
|
||||
"MATERIAL": "Matériau",
|
||||
"QUALITY": "Qualité",
|
||||
"PRINT_SPEED": "Vitesse d'impression",
|
||||
@@ -185,11 +185,12 @@
|
||||
"NOTES_PLACEHOLDER": "Instructions spécifiques...",
|
||||
"SETUP_NOTE": "* Inclut {{cost}} comme coût de setup",
|
||||
"SHIPPING_NOTE": "* Frais d'expédition exclus, calculés à l'étape suivante",
|
||||
"STEP_WARNING": "La visualisation 3D n'est pas compatible avec les fichiers STEP et 3MF",
|
||||
"STEP_WARNING": "La prévisualisation 3D est disponible uniquement pour les fichiers STL.",
|
||||
"REMOVE_FILE": "Supprimer le fichier",
|
||||
"FALLBACK_MATERIAL": "PLA (fallback)",
|
||||
"FALLBACK_QUALITY_STANDARD": "Standard",
|
||||
"ERR_FILE_TOO_LARGE": "Certains fichiers dépassent la limite de 200MB et n'ont pas été ajoutés.",
|
||||
"ERR_INVALID_FILE_TYPE": "Vous pouvez téléverser uniquement des fichiers .stl ou .3mf.",
|
||||
"ERROR_ZERO_PRICE": "Un problème est survenu pendant le calcul. Essayez un autre format ou contactez-nous directement via Demander une consultation.",
|
||||
"ZERO_RESULT_TITLE": "Résultat invalide",
|
||||
"ZERO_RESULT_HELP": "Le calcul a renvoyé des valeurs nulles invalides. Essayez un autre format de fichier ou contactez-nous directement via Demander une consultation."
|
||||
@@ -680,7 +681,7 @@
|
||||
},
|
||||
"DROPZONE": {
|
||||
"DEFAULT_LABEL": "Glissez les fichiers ici ou cliquez pour téléverser",
|
||||
"DEFAULT_SUBTEXT": "Prend en charge .STL, .3MF, .STEP"
|
||||
"DEFAULT_SUBTEXT": "Prend en charge .STL, .3MF"
|
||||
},
|
||||
"COLOR": {
|
||||
"AVAILABLE_COLORS": "Couleurs disponibles",
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
"BTN_CONTACT": "Parla con noi",
|
||||
"SEC_CALC_TITLE": "Prezzo corretto in pochi secondi",
|
||||
"SEC_CALC_SUBTITLE": "Nessuna registrazione necessaria. La stima è effettuata tramite vero slicing.",
|
||||
"SEC_CALC_LIST_1": "Formati supportati: STL, 3MF, STEP",
|
||||
"SEC_CALC_LIST_1": "Formati supportati: STL, 3MF",
|
||||
"CARD_CALC_EYEBROW": "Calcolo automatico",
|
||||
"CARD_CALC_TITLE": "Prezzo e tempi in un click",
|
||||
"CARD_CALC_TAG": "Senza registrazione",
|
||||
@@ -139,14 +139,14 @@
|
||||
},
|
||||
"CALC": {
|
||||
"TITLE": "Calcola Preventivo 3D",
|
||||
"SUBTITLE": "Carica il tuo file 3D (STL, 3MF, STEP), imposta la qualità, il colore e calcola immediatamente prezzo e tempi.",
|
||||
"SUBTITLE": "Carica il tuo file 3D (STL, 3MF), imposta la qualità, il colore e calcola immediatamente prezzo e tempi.",
|
||||
"CTA_START": "Inizia Ora",
|
||||
"BUSINESS": "Aziende",
|
||||
"PRIVATE": "Privati",
|
||||
"MODE_EASY": "Base",
|
||||
"MODE_ADVANCED": "Avanzata",
|
||||
"UPLOAD_LABEL": "Trascina il tuo file 3D qui",
|
||||
"UPLOAD_SUB": "Supportiamo STL, 3MF, STEP fino a 50MB",
|
||||
"UPLOAD_SUB": "Supportiamo STL, 3MF fino a 50MB",
|
||||
"MATERIAL": "Materiale",
|
||||
"QUALITY": "Qualità",
|
||||
"PRINT_SPEED": "Velocità di Stampa",
|
||||
@@ -185,11 +185,12 @@
|
||||
"NOTES_PLACEHOLDER": "Istruzioni specifiche...",
|
||||
"SETUP_NOTE": "* Include {{cost}} come costo di setup",
|
||||
"SHIPPING_NOTE": "* Costi di spedizione esclusi, calcolati al passaggio successivo",
|
||||
"STEP_WARNING": "La visualizzazione 3D non è compatibile con i file step e 3mf",
|
||||
"STEP_WARNING": "La visualizzazione 3D è disponibile solo per i file STL",
|
||||
"REMOVE_FILE": "Rimuovi file",
|
||||
"FALLBACK_MATERIAL": "PLA (fallback)",
|
||||
"FALLBACK_QUALITY_STANDARD": "Standard",
|
||||
"ERR_FILE_TOO_LARGE": "Alcuni file superano il limite di 200MB e non sono stati aggiunti.",
|
||||
"ERR_INVALID_FILE_TYPE": "Puoi caricare solo file .stl o .3mf.",
|
||||
"ERROR_ZERO_PRICE": "Qualcosa è andato storto nel calcolo. Prova un altro formato o contattaci direttamente con Richiedi Consulenza.",
|
||||
"ZERO_RESULT_TITLE": "Risultato non valido",
|
||||
"ZERO_RESULT_HELP": "Il calcolo ha restituito valori non validi (0). Prova con un altro formato file oppure contattaci direttamente con Richiedi Consulenza."
|
||||
@@ -680,7 +681,7 @@
|
||||
},
|
||||
"DROPZONE": {
|
||||
"DEFAULT_LABEL": "Trascina i file qui o clicca per caricare",
|
||||
"DEFAULT_SUBTEXT": "Supporta .STL, .3MF, .STEP"
|
||||
"DEFAULT_SUBTEXT": "Supporta .STL, .3MF"
|
||||
},
|
||||
"COLOR": {
|
||||
"AVAILABLE_COLORS": "Colori disponibili",
|
||||
|
||||
1080
frontend/src/assets/images/Asset 2.svg
Normal file
|
After Width: | Height: | Size: 74 KiB |
1080
frontend/src/assets/images/Asset 223.svg
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
frontend/src/assets/images/Fav-icon-192x192.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
frontend/src/assets/images/Fav-icon-512x512.png
Normal file
|
After Width: | Height: | Size: 325 KiB |
BIN
frontend/src/assets/images/Fav-icon-browser-192x192.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
1080
frontend/src/assets/images/SVG/Asset 1.svg
Normal file
|
After Width: | Height: | Size: 76 KiB |
207
frontend/src/assets/images/animation/31200.svg
Normal file
@@ -0,0 +1,207 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Livello_2" data-name="Livello 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 126.16 163.48">
|
||||
<g id="Livello_1-2" data-name="Livello 1">
|
||||
<g>
|
||||
<rect x=".25" y="157.08" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="146.6" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="136.13" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="125.66" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="115.19" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="104.72" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="94.25" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="83.77" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="73.3" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="62.83" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="52.36" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="41.89" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="31.42" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="20.94" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="10.47" width="125.66" height="1.05"/>
|
||||
<rect x=".25" width="125.66" height="1.05"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="110.82" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="110.82" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="110.82" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="110.82" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="110.82" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="110.82" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="110.82" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="110.82" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="110.82" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="110.82" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="110.82" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="110.82" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="105.79" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="105.79" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="105.79" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="105.79" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="105.79" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="105.79" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="105.79" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="105.79" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="105.79" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="105.79" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="105.79" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="105.79" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="105.79" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="105.79" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="100.77" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="100.77" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="100.77" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="100.77" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="100.77" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="100.77" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="100.77" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="100.77" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="100.77" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="100.77" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="100.77" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="100.77" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="100.77" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="100.77" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="95.75" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="95.75" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="95.75" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="95.75" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="95.75" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="95.75" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="95.75" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="95.75" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="95.75" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="95.75" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="95.75" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="95.75" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="95.75" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="95.75" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="90.72" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="90.72" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="90.72" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="90.72" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="90.72" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="90.72" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="90.72" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="90.72" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="90.72" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="90.72" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="90.72" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="90.72" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="90.72" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="90.72" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="85.7" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="85.7" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="85.7" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="85.7" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="85.7" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="85.7" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="85.7" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="85.7" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="85.7" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="85.7" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="85.7" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="85.7" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="85.7" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="85.7" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="80.67" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="80.67" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="80.67" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="80.67" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="80.67" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="80.67" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="80.67" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="80.67" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="75.65" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="75.65" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="75.65" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="75.65" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="75.65" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="75.65" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="75.65" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="75.65" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="70.63" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="70.63" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="70.63" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="70.63" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="70.63" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="70.63" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="70.63" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="70.63" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="65.6" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="65.6" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="65.6" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="65.6" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="65.6" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="65.6" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="65.6" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="65.6" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="60.58" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="60.58" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="60.58" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="60.58" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="60.58" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="60.58" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="60.58" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="60.58" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="55.55" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="55.55" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="55.55" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="55.55" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="55.55" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="55.55" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="55.55" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="55.55" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="50.53" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="50.53" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="50.53" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="50.53" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="50.53" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="50.53" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="50.53" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="50.53" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="45.51" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="45.51" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="45.51" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="45.51" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="45.51" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="45.51" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="40.44" y="142.31" width="5.06" height="5.21"/>
|
||||
<rect x="40.44" y="131.82" width="5.06" height="5.25"/>
|
||||
<rect x="40.44" y="121.37" width="5.06" height="5.25"/>
|
||||
<rect x="40.44" y="27.2" width="5.06" height="5.25"/>
|
||||
<rect x="40.44" y="16.75" width="5.06" height="5.21"/>
|
||||
<rect x="40.44" y="6.29" width="5.06" height="5.21"/>
|
||||
<rect x="35.42" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="35.42" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="35.42" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="35.42" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="35.42" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="35.42" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="30.4" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="30.4" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="30.4" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="30.4" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="30.4" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="30.4" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="25.37" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="25.37" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="25.37" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="25.37" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="25.37" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="25.37" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="20.35" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="20.35" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="20.35" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="20.35" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="20.35" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="20.35" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="15.32" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="15.32" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="15.32" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="15.32" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="15.32" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="15.32" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="10.3" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="10.3" y="16.75" width="5.02" height="5.21"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 12 KiB |
209
frontend/src/assets/images/animation/3g1200.svg
Normal file
@@ -0,0 +1,209 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Livello_2" data-name="Livello 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 126.16 163.48">
|
||||
<defs>
|
||||
</defs>
|
||||
<g id="Livello_1-2" data-name="Livello 1">
|
||||
<g>
|
||||
<rect class="cls-2" x=".25" y="157.08" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="146.6" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="136.13" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="125.66" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="115.19" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="104.72" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="94.25" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="83.77" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="73.3" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="62.83" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="52.36" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="41.89" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="31.42" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="20.94" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="10.47" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" width="125.66" height="1.05"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect class="cls-1" x="110.83" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.83" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.83" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.83" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="110.83" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="110.83" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.83" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.83" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="110.83" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="110.83" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.83" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.83" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.81" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="105.81" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.81" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.81" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.81" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="105.81" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="105.81" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.81" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.81" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="105.81" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="105.81" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.81" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.81" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.81" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="100.78" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="100.78" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.78" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.78" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.78" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="100.78" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="100.78" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.78" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.78" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="100.78" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="100.78" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.78" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.78" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.78" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="95.76" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="95.76" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.76" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.76" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.76" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="95.76" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="95.76" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.76" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.76" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="95.76" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="95.76" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.76" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.76" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.76" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.73" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.73" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.73" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.73" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.73" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.73" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.73" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.73" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.73" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.73" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.73" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.73" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.73" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.73" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="85.71" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="85.71" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="85.71" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="85.71" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="85.71" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="85.71" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="85.71" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="85.71" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="85.71" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="85.71" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="85.71" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="85.71" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="85.71" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="85.71" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="80.69" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="80.69" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.69" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.69" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.69" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.69" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.69" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.69" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="75.66" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="75.66" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.66" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.66" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.66" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.66" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.66" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.66" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="70.64" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="70.64" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.64" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.64" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.64" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.64" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.64" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.64" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="65.58" y="142.31" width="5.06" height="5.21"/>
|
||||
<rect class="cls-1" x="65.58" y="131.82" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="65.58" y="121.37" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="65.58" y="79.51" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="65.58" y="69.06" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="65.58" y="27.2" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="65.58" y="16.75" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="65.58" y="6.29" width="5.06" height="5.21"/>
|
||||
<rect class="cls-1" x="60.55" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="60.55" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.55" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.55" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.55" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.55" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.55" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.55" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="55.53" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="55.53" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.53" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.53" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.53" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.53" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.53" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.53" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="50.5" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="50.5" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.5" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.5" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.5" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.5" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.5" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.5" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="45.48" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="45.48" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="45.48" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="45.48" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="45.48" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="45.48" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="40.46" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="40.46" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="40.46" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="40.46" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="40.46" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="40.46" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.43" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.43" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.43" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.43" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.43" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.43" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.41" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.41" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.41" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.41" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.41" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.41" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.38" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.38" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.38" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.38" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.38" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.38" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.36" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.36" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.36" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.36" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.36" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.36" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.34" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.34" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.34" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.34" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.34" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.34" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="10.31" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.31" y="16.75" width="5.02" height="5.25"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 15 KiB |
225
frontend/src/assets/images/animation/A1200.svg
Normal file
@@ -0,0 +1,225 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Livello_2" data-name="Livello 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 126.16 163.48">
|
||||
<g id="Livello_1-2" data-name="Livello 1">
|
||||
<g>
|
||||
<rect x=".25" y="157.08" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="146.6" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="136.13" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="125.66" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="115.19" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="104.72" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="94.25" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="83.77" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="73.3" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="62.83" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="52.36" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="41.89" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="31.42" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="20.94" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="10.47" width="125.66" height="1.05"/>
|
||||
<rect x=".25" width="125.66" height="1.05"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="115.73" y="142.22" width="3.4" height="5.28"/>
|
||||
<rect x="112.33" y="142.22" width="3.4" height="5.28"/>
|
||||
<rect x="112.33" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="108.93" y="142.22" width="3.4" height="5.28"/>
|
||||
<rect x="108.93" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="108.93" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="105.53" y="142.22" width="3.4" height="5.28"/>
|
||||
<rect x="105.53" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="105.53" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="105.53" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="102.14" y="142.22" width="3.4" height="5.28"/>
|
||||
<rect x="102.14" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="102.14" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="102.14" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="102.14" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="98.74" y="142.22" width="3.4" height="5.28"/>
|
||||
<rect x="98.74" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="98.74" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="98.74" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="98.74" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="98.74" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="95.34" y="142.22" width="3.4" height="5.28"/>
|
||||
<rect x="95.34" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="95.34" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="95.34" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="95.34" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="95.34" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="95.34" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="91.94" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="91.94" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="91.94" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="91.94" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="91.94" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="91.94" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="91.94" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="88.54" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="88.54" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="88.54" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="88.54" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="88.54" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="88.54" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="88.54" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="85.14" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="85.14" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="85.14" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="85.14" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="85.14" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="85.14" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="85.14" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="81.74" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="81.74" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="81.74" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="81.74" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="81.74" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="81.74" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="81.74" y="37.26" width="3.4" height="5.25"/>
|
||||
<rect x="78.38" y="100.25" width="3.36" height="5.25"/>
|
||||
<rect x="78.38" y="89.76" width="3.36" height="5.25"/>
|
||||
<rect x="78.38" y="79.27" width="3.36" height="5.25"/>
|
||||
<rect x="78.38" y="68.74" width="3.36" height="5.28"/>
|
||||
<rect x="78.38" y="58.25" width="3.36" height="5.25"/>
|
||||
<rect x="78.38" y="47.75" width="3.36" height="5.25"/>
|
||||
<rect x="78.38" y="37.26" width="3.36" height="5.25"/>
|
||||
<rect x="78.38" y="26.77" width="3.36" height="5.25"/>
|
||||
<rect x="74.98" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="74.98" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="74.98" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="74.98" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="74.98" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="74.98" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="74.98" y="37.26" width="3.4" height="5.25"/>
|
||||
<rect x="74.98" y="26.77" width="3.4" height="5.25"/>
|
||||
<rect x="74.98" y="16.28" width="3.4" height="5.25"/>
|
||||
<rect x="71.58" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="71.58" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="71.58" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="71.58" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="71.58" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="71.58" y="37.26" width="3.4" height="5.25"/>
|
||||
<rect x="71.58" y="26.77" width="3.4" height="5.25"/>
|
||||
<rect x="71.58" y="16.28" width="3.4" height="5.25"/>
|
||||
<rect x="71.58" y="5.79" width="3.4" height="5.25"/>
|
||||
<rect x="68.19" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="68.19" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="68.19" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="68.19" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="68.19" y="37.26" width="3.4" height="5.25"/>
|
||||
<rect x="68.19" y="26.77" width="3.4" height="5.25"/>
|
||||
<rect x="68.19" y="16.28" width="3.4" height="5.25"/>
|
||||
<rect x="68.19" y="5.79" width="3.4" height="5.25"/>
|
||||
<rect x="64.79" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="64.79" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="64.79" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="64.79" y="37.26" width="3.4" height="5.25"/>
|
||||
<rect x="64.79" y="26.77" width="3.4" height="5.25"/>
|
||||
<rect x="64.79" y="16.28" width="3.4" height="5.25"/>
|
||||
<rect x="64.79" y="5.79" width="3.4" height="5.25"/>
|
||||
<rect x="61.39" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="61.39" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="61.39" y="37.26" width="3.4" height="5.25"/>
|
||||
<rect x="61.39" y="26.77" width="3.4" height="5.25"/>
|
||||
<rect x="61.39" y="16.28" width="3.4" height="5.25"/>
|
||||
<rect x="61.39" y="5.79" width="3.4" height="5.25"/>
|
||||
<rect x="57.99" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="57.99" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="57.99" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="57.99" y="37.26" width="3.4" height="5.25"/>
|
||||
<rect x="57.99" y="26.77" width="3.4" height="5.25"/>
|
||||
<rect x="57.99" y="16.28" width="3.4" height="5.25"/>
|
||||
<rect x="57.99" y="5.79" width="3.4" height="5.25"/>
|
||||
<rect x="54.59" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="54.59" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="54.59" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="54.59" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="54.59" y="37.26" width="3.4" height="5.25"/>
|
||||
<rect x="54.59" y="26.77" width="3.4" height="5.25"/>
|
||||
<rect x="54.59" y="16.28" width="3.4" height="5.25"/>
|
||||
<rect x="54.59" y="5.79" width="3.4" height="5.25"/>
|
||||
<rect x="51.19" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="51.19" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="51.19" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="51.19" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="51.19" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="51.19" y="37.26" width="3.4" height="5.25"/>
|
||||
<rect x="51.19" y="26.77" width="3.4" height="5.25"/>
|
||||
<rect x="51.19" y="16.28" width="3.4" height="5.25"/>
|
||||
<rect x="51.19" y="5.79" width="3.4" height="5.25"/>
|
||||
<rect x="47.79" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="47.79" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="47.79" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="47.79" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="47.79" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="47.79" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="47.79" y="37.26" width="3.4" height="5.25"/>
|
||||
<rect x="47.79" y="26.77" width="3.4" height="5.25"/>
|
||||
<rect x="47.79" y="16.28" width="3.4" height="5.25"/>
|
||||
<rect x="44.39" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="44.39" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="44.39" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="44.39" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="44.39" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="44.39" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="44.39" y="37.26" width="3.4" height="5.25"/>
|
||||
<rect x="44.39" y="26.77" width="3.4" height="5.25"/>
|
||||
<rect x="41" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="41" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="41" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="41" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="41" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="41" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="41" y="37.26" width="3.4" height="5.25"/>
|
||||
<rect x="37.6" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="37.6" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="37.6" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="37.6" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="37.6" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="37.6" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="37.6" y="47.75" width="3.4" height="5.25"/>
|
||||
<rect x="34.2" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="34.2" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="34.2" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="34.2" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="34.2" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="34.2" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="34.2" y="58.25" width="3.4" height="5.25"/>
|
||||
<rect x="30.8" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="30.8" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="30.8" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="30.8" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="30.8" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="30.8" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="30.8" y="68.74" width="3.4" height="5.28"/>
|
||||
<rect x="27.4" y="142.22" width="3.4" height="5.28"/>
|
||||
<rect x="27.4" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="27.4" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="27.4" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="27.4" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="27.4" y="89.76" width="3.4" height="5.25"/>
|
||||
<rect x="27.4" y="79.27" width="3.4" height="5.25"/>
|
||||
<rect x="24.04" y="142.22" width="3.36" height="5.28"/>
|
||||
<rect x="24.04" y="131.72" width="3.36" height="5.25"/>
|
||||
<rect x="24.04" y="121.23" width="3.36" height="5.25"/>
|
||||
<rect x="24.04" y="110.74" width="3.36" height="5.25"/>
|
||||
<rect x="24.04" y="100.25" width="3.36" height="5.25"/>
|
||||
<rect x="24.04" y="89.76" width="3.36" height="5.25"/>
|
||||
<rect x="20.64" y="142.22" width="3.4" height="5.28"/>
|
||||
<rect x="20.64" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="20.64" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="20.64" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="20.64" y="100.25" width="3.4" height="5.25"/>
|
||||
<rect x="17.24" y="142.22" width="3.4" height="5.28"/>
|
||||
<rect x="17.24" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="17.24" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="17.24" y="110.74" width="3.4" height="5.25"/>
|
||||
<rect x="13.84" y="142.22" width="3.4" height="5.28"/>
|
||||
<rect x="13.84" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="13.84" y="121.23" width="3.4" height="5.25"/>
|
||||
<rect x="10.45" y="142.22" width="3.4" height="5.28"/>
|
||||
<rect x="10.45" y="131.72" width="3.4" height="5.25"/>
|
||||
<rect x="7.05" y="142.22" width="3.4" height="5.28"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 13 KiB |
236
frontend/src/assets/images/animation/Ag1200.svg
Normal file
@@ -0,0 +1,236 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Livello_2" data-name="Livello 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 126.16 164">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: #ffdf07;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
fill: #575756;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<g id="Livello_1-2" data-name="Livello 1">
|
||||
<g>
|
||||
<rect class="cls-2" x=".25" y="157.08" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="146.6" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="136.13" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="125.66" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="115.19" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="104.72" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="94.25" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="83.77" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="73.3" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="62.83" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="52.36" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="41.89" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="31.42" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="20.94" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="10.47" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" width="125.66" height="1.05"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect class="cls-1" x="115.71" y="142.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="112.34" y="142.77" width="3.36" height="5.25"/>
|
||||
<rect class="cls-1" x="112.34" y="132.24" width="3.36" height="5.25"/>
|
||||
<rect class="cls-1" x="108.94" y="142.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="108.94" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="108.94" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="105.55" y="142.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="105.55" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="105.55" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="105.55" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="102.15" y="142.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="102.15" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="102.15" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="102.15" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="102.15" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="98.75" y="142.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="98.75" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="98.75" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="98.75" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="98.75" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="98.75" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="95.35" y="142.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="95.35" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="95.35" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="95.35" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="95.35" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="95.35" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="95.35" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="91.95" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="91.95" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="91.95" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="91.95" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="91.95" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="91.95" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="91.95" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="88.55" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="88.55" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="88.55" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="88.55" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="88.55" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="88.55" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="88.55" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="85.15" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="85.15" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="85.15" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="85.15" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="85.15" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="85.15" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="85.15" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="81.76" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="81.76" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="81.76" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="81.76" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="81.76" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="81.76" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="81.76" y="37.78" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="78.36" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="78.36" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="78.36" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="78.36" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="78.36" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="78.36" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="78.36" y="37.78" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="78.36" y="27.29" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="74.96" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="74.96" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="74.96" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="74.96" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="74.96" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="74.96" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="74.96" y="37.78" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="74.96" y="27.29" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="74.96" y="16.8" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="71.56" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="71.56" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="71.56" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="71.56" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="71.56" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="71.56" y="37.78" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="71.56" y="27.29" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="71.56" y="16.8" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="71.56" y="6.31" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="68.16" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="68.16" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="68.16" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="68.16" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="68.16" y="37.78" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="68.16" y="27.29" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="68.16" y="16.8" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="68.16" y="6.31" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="64.76" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="64.76" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="64.76" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="64.76" y="37.78" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="64.76" y="27.29" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="64.76" y="16.8" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="64.76" y="6.31" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="61.4" y="100.77" width="3.36" height="5.25"/>
|
||||
<rect class="cls-1" x="61.4" y="90.28" width="3.36" height="5.25"/>
|
||||
<rect class="cls-1" x="61.4" y="37.78" width="3.36" height="5.25"/>
|
||||
<rect class="cls-1" x="61.4" y="27.29" width="3.36" height="5.25"/>
|
||||
<rect class="cls-1" x="61.4" y="16.8" width="3.36" height="5.25"/>
|
||||
<rect class="cls-1" x="61.4" y="6.31" width="3.36" height="5.25"/>
|
||||
<rect class="cls-1" x="58" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="58" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="58" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="58" y="37.78" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="58" y="27.29" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="58" y="16.8" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="58" y="6.31" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="54.6" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="54.6" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="54.6" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="54.6" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="54.6" y="37.78" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="54.6" y="27.29" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="54.6" y="16.8" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="54.6" y="6.31" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="51.2" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="51.2" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="51.2" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="51.2" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="51.2" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="51.2" y="37.78" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="51.2" y="27.29" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="51.2" y="16.8" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="51.2" y="6.31" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="47.81" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="47.81" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="47.81" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="47.81" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="47.81" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="47.81" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="47.81" y="37.78" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="47.81" y="27.29" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="47.81" y="16.8" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="44.41" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="44.41" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="44.41" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="44.41" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="44.41" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="44.41" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="44.41" y="37.78" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="44.41" y="27.29" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="41.01" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="41.01" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="41.01" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="41.01" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="41.01" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="41.01" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="41.01" y="37.78" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="37.61" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="37.61" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="37.61" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="37.61" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="37.61" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="37.61" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="37.61" y="48.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="34.21" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="34.21" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="34.21" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="34.21" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="34.21" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="34.21" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="34.21" y="58.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="30.81" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="30.81" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="30.81" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="30.81" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="30.81" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="30.81" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="30.81" y="69.3" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="27.41" y="142.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="27.41" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="27.41" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="27.41" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="27.41" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="27.41" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="27.41" y="79.79" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="24.01" y="142.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="24.01" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="24.01" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="24.01" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="24.01" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="24.01" y="90.28" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="20.62" y="142.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="20.62" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="20.62" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="20.62" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="20.62" y="100.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="17.22" y="142.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="17.22" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="17.22" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="17.22" y="111.26" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="13.82" y="142.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="13.82" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="13.82" y="121.75" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="10.42" y="142.77" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="10.42" y="132.24" width="3.4" height="5.25"/>
|
||||
<rect class="cls-1" x="7.06" y="142.77" width="3.36" height="5.25"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
232
frontend/src/assets/images/animation/B1200.svg
Normal file
@@ -0,0 +1,232 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Livello_2" data-name="Livello 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 129.61 163.48">
|
||||
<g id="Livello_1-2" data-name="Livello 1">
|
||||
<g>
|
||||
<rect y="157.08" width="125.66" height="1.05"/>
|
||||
<rect y="146.6" width="125.66" height="1.05"/>
|
||||
<rect y="136.13" width="125.66" height="1.05"/>
|
||||
<rect y="125.66" width="125.66" height="1.05"/>
|
||||
<rect y="115.19" width="125.66" height="1.05"/>
|
||||
<rect y="104.72" width="125.66" height="1.05"/>
|
||||
<rect y="94.25" width="125.66" height="1.05"/>
|
||||
<rect y="83.77" width="125.66" height="1.05"/>
|
||||
<rect y="73.3" width="125.66" height="1.05"/>
|
||||
<rect y="62.83" width="125.66" height="1.05"/>
|
||||
<rect y="52.36" width="125.66" height="1.05"/>
|
||||
<rect y="41.89" width="125.66" height="1.05"/>
|
||||
<rect y="31.42" width="125.66" height="1.05"/>
|
||||
<rect y="20.94" width="125.66" height="1.05"/>
|
||||
<rect y="10.47" width="125.66" height="1.05"/>
|
||||
<rect width="125.66" height="1.05"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="114.29" y="121.36" width="5.02" height="5.25"/>
|
||||
<rect x="114.29" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="114.29" y="100.45" width="5.02" height="5.25"/>
|
||||
<rect x="109.27" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="109.27" y="121.36" width="5.02" height="5.25"/>
|
||||
<rect x="109.27" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="109.27" y="100.45" width="5.02" height="5.25"/>
|
||||
<rect x="109.27" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="109.27" y="48.14" width="5.02" height="5.21"/>
|
||||
<rect x="109.27" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="109.27" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="104.21" y="131.85" width="5.06" height="5.21"/>
|
||||
<rect x="104.21" y="121.36" width="5.06" height="5.25"/>
|
||||
<rect x="104.21" y="110.9" width="5.06" height="5.25"/>
|
||||
<rect x="104.21" y="100.45" width="5.06" height="5.25"/>
|
||||
<rect x="104.21" y="89.99" width="5.06" height="5.21"/>
|
||||
<rect x="104.21" y="58.59" width="5.06" height="5.25"/>
|
||||
<rect x="104.21" y="48.14" width="5.06" height="5.21"/>
|
||||
<rect x="104.21" y="37.68" width="5.06" height="5.21"/>
|
||||
<rect x="104.21" y="27.19" width="5.06" height="5.25"/>
|
||||
<rect x="104.21" y="16.74" width="5.06" height="5.25"/>
|
||||
<rect x="99.18" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="99.18" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="99.18" y="121.36" width="5.02" height="5.25"/>
|
||||
<rect x="99.18" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="99.18" y="100.45" width="5.02" height="5.25"/>
|
||||
<rect x="99.18" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="99.18" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="99.18" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="99.18" y="48.14" width="5.02" height="5.21"/>
|
||||
<rect x="99.18" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="99.18" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="99.18" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="94.16" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="94.16" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="94.16" y="121.36" width="5.02" height="5.25"/>
|
||||
<rect x="94.16" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="94.16" y="100.45" width="5.02" height="5.25"/>
|
||||
<rect x="94.16" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="94.16" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="94.16" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="94.16" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="94.16" y="48.14" width="5.02" height="5.21"/>
|
||||
<rect x="94.16" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="94.16" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="94.16" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="94.16" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="89.13" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="89.13" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="89.13" y="121.36" width="5.02" height="5.25"/>
|
||||
<rect x="89.13" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="89.13" y="100.45" width="5.02" height="5.25"/>
|
||||
<rect x="89.13" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="89.13" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="89.13" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="89.13" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="89.13" y="48.14" width="5.02" height="5.21"/>
|
||||
<rect x="89.13" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="89.13" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="89.13" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="89.13" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="84.11" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="84.11" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="84.11" y="121.36" width="5.02" height="5.25"/>
|
||||
<rect x="84.11" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="84.11" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="84.11" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="84.11" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="84.11" y="48.14" width="5.02" height="5.21"/>
|
||||
<rect x="84.11" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="84.11" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="84.11" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="84.11" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="79.09" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="79.09" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="79.09" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="79.09" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="79.09" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="79.09" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="79.09" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="79.09" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="74.06" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="74.06" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="74.06" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="74.06" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="74.06" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="74.06" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="69.04" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="69.04" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="69.04" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="69.04" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="69.04" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="69.04" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="64.01" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="64.01" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="64.01" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="64.01" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="64.01" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="64.01" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="58.99" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="58.99" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="58.99" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="58.99" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="58.99" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="58.99" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="53.96" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="53.96" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="53.96" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="53.96" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="53.96" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="53.96" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="48.94" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="48.94" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="48.94" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="48.94" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="48.94" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="48.94" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="43.92" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="43.92" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="43.92" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="43.92" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="43.92" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="43.92" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="38.89" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="38.89" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="38.89" y="121.36" width="5.02" height="5.25"/>
|
||||
<rect x="38.89" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="38.89" y="100.45" width="5.02" height="5.25"/>
|
||||
<rect x="38.89" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="38.89" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="38.89" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="38.89" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="38.89" y="48.14" width="5.02" height="5.21"/>
|
||||
<rect x="38.89" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="38.89" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="38.89" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="38.89" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="33.87" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="33.87" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="33.87" y="121.36" width="5.02" height="5.25"/>
|
||||
<rect x="33.87" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="33.87" y="100.45" width="5.02" height="5.25"/>
|
||||
<rect x="33.87" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="33.87" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="33.87" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="33.87" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="33.87" y="48.14" width="5.02" height="5.21"/>
|
||||
<rect x="33.87" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="33.87" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="33.87" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="33.87" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="28.84" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="28.84" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="28.84" y="121.36" width="5.02" height="5.25"/>
|
||||
<rect x="28.84" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="28.84" y="100.45" width="5.02" height="5.25"/>
|
||||
<rect x="28.84" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="28.84" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="28.84" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="28.84" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="28.84" y="48.14" width="5.02" height="5.21"/>
|
||||
<rect x="28.84" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="28.84" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="28.84" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="28.84" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="23.78" y="142.3" width="5.06" height="5.25"/>
|
||||
<rect x="23.78" y="131.85" width="5.06" height="5.21"/>
|
||||
<rect x="23.78" y="121.36" width="5.06" height="5.25"/>
|
||||
<rect x="23.78" y="110.9" width="5.06" height="5.25"/>
|
||||
<rect x="23.78" y="100.45" width="5.06" height="5.25"/>
|
||||
<rect x="23.78" y="89.99" width="5.06" height="5.21"/>
|
||||
<rect x="23.78" y="79.54" width="5.06" height="5.21"/>
|
||||
<rect x="23.78" y="69.05" width="5.06" height="5.25"/>
|
||||
<rect x="23.78" y="58.59" width="5.06" height="5.25"/>
|
||||
<rect x="23.78" y="48.14" width="5.06" height="5.21"/>
|
||||
<rect x="23.78" y="37.68" width="5.06" height="5.21"/>
|
||||
<rect x="23.78" y="27.19" width="5.06" height="5.25"/>
|
||||
<rect x="23.78" y="16.74" width="5.06" height="5.25"/>
|
||||
<rect x="23.78" y="6.28" width="5.06" height="5.25"/>
|
||||
<rect x="18.76" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="18.76" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="18.76" y="121.36" width="5.02" height="5.25"/>
|
||||
<rect x="18.76" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="18.76" y="100.45" width="5.02" height="5.25"/>
|
||||
<rect x="18.76" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="18.76" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="18.76" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="18.76" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="18.76" y="48.14" width="5.02" height="5.21"/>
|
||||
<rect x="18.76" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="18.76" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="18.76" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="18.76" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="13.73" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="13.73" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="13.73" y="121.36" width="5.02" height="5.25"/>
|
||||
<rect x="13.73" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="13.73" y="100.45" width="5.02" height="5.25"/>
|
||||
<rect x="13.73" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="13.73" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="13.73" y="69.05" width="5.02" height="5.25"/>
|
||||
<rect x="13.73" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="13.73" y="48.14" width="5.02" height="5.21"/>
|
||||
<rect x="13.73" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="13.73" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="13.73" y="16.74" width="5.02" height="5.25"/>
|
||||
<rect x="13.73" y="6.28" width="5.02" height="5.25"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 13 KiB |
243
frontend/src/assets/images/animation/Bg1200.svg
Normal file
@@ -0,0 +1,243 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Livello_2" data-name="Livello 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 129.61 163.63">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: #ffdf07;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
fill: #575756;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<g id="Livello_1-2" data-name="Livello 1">
|
||||
<g>
|
||||
<rect class="cls-2" y="157.08" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="146.6" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="136.13" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="125.66" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="115.19" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="104.72" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="94.25" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="83.77" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="73.3" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="62.83" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="52.36" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="41.89" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="31.42" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="20.94" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" y="10.47" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" width="125.66" height="1.05"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect class="cls-1" x="114.27" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="114.27" y="111.05" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="114.27" y="100.59" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="109.24" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="109.24" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="109.24" y="111.05" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="109.24" y="100.59" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="109.24" y="90.14" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="109.24" y="48.28" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="109.24" y="37.83" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="109.24" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="104.22" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="104.22" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="104.22" y="111.05" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="104.22" y="100.59" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="104.22" y="90.14" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="104.22" y="58.74" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="104.22" y="48.28" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="104.22" y="37.83" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="104.22" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="104.22" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="99.19" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="99.19" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="99.19" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="99.19" y="111.05" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="99.19" y="100.59" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="99.19" y="90.14" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="99.19" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="99.19" y="58.74" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="99.19" y="48.28" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="99.19" y="37.83" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="99.19" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="99.19" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="94.17" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="94.17" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="94.17" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="94.17" y="111.05" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="94.17" y="100.59" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="94.17" y="90.14" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="94.17" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="94.17" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="94.17" y="58.74" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="94.17" y="48.28" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="94.17" y="37.83" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="94.17" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="94.17" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="94.17" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="89.15" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="89.15" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="89.15" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="89.15" y="111.05" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="89.15" y="100.59" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="89.15" y="90.14" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="89.15" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="89.15" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="89.15" y="58.74" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="89.15" y="48.28" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="89.15" y="37.83" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="89.15" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="89.15" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="89.15" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="84.12" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="84.12" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="84.12" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="84.12" y="90.14" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="84.12" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="84.12" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="84.12" y="58.74" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="84.12" y="48.28" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="84.12" y="37.83" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="84.12" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="84.12" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="84.12" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="79.1" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="79.1" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="79.1" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="79.1" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="79.1" y="58.74" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="79.1" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="79.1" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="79.1" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="74.07" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="74.07" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="74.07" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="74.07" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="74.07" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="74.07" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="69.05" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="69.05" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="69.05" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="69.05" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="69.05" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="69.05" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="64.03" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="64.03" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="64.03" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="64.03" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="64.03" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="64.03" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="59" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="59" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="59" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="59" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="59" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="59" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="53.98" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="53.98" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="53.98" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="53.98" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="53.98" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="53.98" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="48.92" y="142.45" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="48.92" y="131.99" width="5.06" height="5.21"/>
|
||||
<rect class="cls-1" x="48.92" y="79.68" width="5.06" height="5.21"/>
|
||||
<rect class="cls-1" x="48.92" y="69.19" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="48.92" y="16.88" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="48.92" y="6.43" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="43.89" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="43.89" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="43.89" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="43.89" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="43.89" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="43.89" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="38.87" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="38.87" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="38.87" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="38.87" y="111.05" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="38.87" y="100.59" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="38.87" y="90.14" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="38.87" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="38.87" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="38.87" y="58.74" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="38.87" y="48.28" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="38.87" y="37.83" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="38.87" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="38.87" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="38.87" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="33.84" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="33.84" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="33.84" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="33.84" y="111.05" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="33.84" y="100.59" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="33.84" y="90.14" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="33.84" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="33.84" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="33.84" y="58.74" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="33.84" y="48.28" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="33.84" y="37.83" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="33.84" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="33.84" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="33.84" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="28.82" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="28.82" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="28.82" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="28.82" y="111.05" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="28.82" y="100.59" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="28.82" y="90.14" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="28.82" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="28.82" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="28.82" y="58.74" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="28.82" y="48.28" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="28.82" y="37.83" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="28.82" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="28.82" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="28.82" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="23.8" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="23.8" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="23.8" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="23.8" y="111.05" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="23.8" y="100.59" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="23.8" y="90.14" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="23.8" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="23.8" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="23.8" y="58.74" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="23.8" y="48.28" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="23.8" y="37.83" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="23.8" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="23.8" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="23.8" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="18.77" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="18.77" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="18.77" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="18.77" y="111.05" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="18.77" y="100.59" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="18.77" y="90.14" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="18.77" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="18.77" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="18.77" y="58.74" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="18.77" y="48.28" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="18.77" y="37.83" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="18.77" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="18.77" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="18.77" y="6.43" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="13.75" y="142.45" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="13.75" y="131.99" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="13.75" y="121.54" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="13.75" y="111.05" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="13.75" y="100.59" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="13.75" y="90.14" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="13.75" y="79.68" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="13.75" y="69.19" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="13.75" y="58.74" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="13.75" y="48.28" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="13.75" y="37.83" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="13.75" y="27.34" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="13.75" y="16.88" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="13.75" y="6.43" width="5.02" height="5.25"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 17 KiB |
252
frontend/src/assets/images/animation/Dg1200.svg
Normal file
@@ -0,0 +1,252 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Livello_2" data-name="Livello 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 126.16 163.48">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: #1d1d1b;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
fill: #575756;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<g id="Livello_1-2" data-name="Livello 1">
|
||||
<g>
|
||||
<rect class="cls-2" x=".25" y="157.08" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="146.6" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="136.13" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="125.66" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="115.19" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="104.72" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="94.25" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="83.77" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="73.3" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="62.83" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="52.36" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="41.89" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="31.42" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="20.94" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" y="10.47" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".25" width="125.66" height="1.05"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect class="cls-1" x="110.84" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.84" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.84" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="110.84" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="110.84" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.84" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.84" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="110.84" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="110.84" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.84" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.82" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.82" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.82" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.82" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="105.82" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="105.82" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.82" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.82" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="105.82" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="105.82" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.82" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.82" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.79" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.79" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.79" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.79" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="100.79" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="100.79" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.79" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.79" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="100.79" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="100.79" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.79" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.79" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.77" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="95.77" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.77" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.77" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.77" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="95.77" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="95.77" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.77" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.77" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="95.77" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="95.77" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.77" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.77" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.77" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.74" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.74" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.74" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.74" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.74" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.74" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.74" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.74" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.74" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.74" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.74" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.74" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.74" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.74" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="85.68" y="142.31" width="5.06" height="5.21"/>
|
||||
<rect class="cls-1" x="85.68" y="131.82" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="85.68" y="121.37" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="85.68" y="110.91" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="85.68" y="100.46" width="5.06" height="5.21"/>
|
||||
<rect class="cls-1" x="85.68" y="90" width="5.06" height="5.21"/>
|
||||
<rect class="cls-1" x="85.68" y="79.51" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="85.68" y="69.06" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="85.68" y="58.6" width="5.06" height="5.21"/>
|
||||
<rect class="cls-1" x="85.68" y="48.15" width="5.06" height="5.21"/>
|
||||
<rect class="cls-1" x="85.68" y="37.65" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="85.68" y="27.2" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="85.68" y="16.75" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="85.68" y="6.29" width="5.06" height="5.21"/>
|
||||
<rect class="cls-1" x="80.66" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="80.66" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.66" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.66" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.66" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.66" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.66" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.66" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="75.63" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="75.63" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.63" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.63" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.63" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.63" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="70.61" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="70.61" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.61" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.61" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.61" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.61" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="65.59" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="65.59" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="65.59" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="65.59" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="65.59" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="65.59" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="60.56" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="60.56" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.56" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.56" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.56" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.56" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="55.54" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="55.54" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.54" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.54" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.54" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.54" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="50.51" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="50.51" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.51" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.51" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.51" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.51" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="45.49" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="45.49" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="45.49" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="45.49" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="45.49" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="45.49" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="40.47" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="40.47" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="40.47" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="40.47" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="40.47" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="40.47" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.44" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.44" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.44" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.44" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.44" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.44" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.44" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.44" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.44" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.44" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.44" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.44" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.44" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.44" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.42" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.42" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.42" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.42" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.42" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.42" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.42" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.42" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.42" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.42" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.42" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.42" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.42" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.42" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.39" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.39" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.39" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.39" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.39" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.39" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.39" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.39" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.39" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.39" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.39" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.39" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.39" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.39" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.37" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.37" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.37" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.37" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.37" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.37" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.37" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.37" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.37" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.37" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.37" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.37" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.37" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.37" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.35" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.35" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.35" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.35" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.35" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.35" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.35" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.35" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.35" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.35" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.35" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.35" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.35" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.35" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="10.32" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="10.32" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.32" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.32" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.32" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="10.32" y="90" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="10.32" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.32" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.32" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="10.32" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="10.32" y="37.65" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.32" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.32" y="16.75" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.32" y="6.29" width="5.02" height="5.21"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 17 KiB |
170
frontend/src/assets/images/animation/F1200.svg
Normal file
@@ -0,0 +1,170 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Livello_2" data-name="Livello 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 126.16 163.48">
|
||||
<g id="Livello_1-2" data-name="Livello 1">
|
||||
<g>
|
||||
<rect x=".25" y="157.08" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="146.6" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="136.13" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="125.66" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="115.19" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="104.72" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="94.25" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="83.77" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="73.3" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="62.83" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="52.36" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="41.89" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="31.42" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="20.94" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="10.47" width="125.66" height="1.05"/>
|
||||
<rect x=".25" width="125.66" height="1.05"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="110.85" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="110.85" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="110.85" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="105.82" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="105.82" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="105.82" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="100.8" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="100.8" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="100.8" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="95.74" y="27.19" width="5.06" height="5.25"/>
|
||||
<rect x="95.74" y="16.73" width="5.06" height="5.25"/>
|
||||
<rect x="95.74" y="6.28" width="5.06" height="5.25"/>
|
||||
<rect x="90.71" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="90.71" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="90.71" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="85.69" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="85.69" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="85.69" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="80.66" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="80.66" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="80.66" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="75.64" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="75.64" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="75.64" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="75.64" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="75.64" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="70.62" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="70.62" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="70.62" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="70.62" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="70.62" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="65.59" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="65.59" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="65.59" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="65.59" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="65.59" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="60.57" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="60.57" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="60.57" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="60.57" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="60.57" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="55.54" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="55.54" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="55.54" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="55.54" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="55.54" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="50.52" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="50.52" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="50.52" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="50.52" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="50.52" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="45.49" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="45.49" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="45.49" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="45.49" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="45.49" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="40.47" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="40.47" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="40.47" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="40.47" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="40.47" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="35.45" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="35.45" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="35.45" y="121.39" width="5.02" height="5.21"/>
|
||||
<rect x="35.45" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="35.45" y="100.44" width="5.02" height="5.25"/>
|
||||
<rect x="35.45" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="35.45" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="35.45" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="35.45" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="35.45" y="48.13" width="5.02" height="5.25"/>
|
||||
<rect x="35.45" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="35.45" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="35.45" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="35.45" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="30.42" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="30.42" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="30.42" y="121.39" width="5.02" height="5.21"/>
|
||||
<rect x="30.42" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="30.42" y="100.44" width="5.02" height="5.25"/>
|
||||
<rect x="30.42" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="30.42" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="30.42" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="30.42" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="30.42" y="48.13" width="5.02" height="5.25"/>
|
||||
<rect x="30.42" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="30.42" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="30.42" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="30.42" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="25.4" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="25.4" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="25.4" y="121.39" width="5.02" height="5.21"/>
|
||||
<rect x="25.4" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="25.4" y="100.44" width="5.02" height="5.25"/>
|
||||
<rect x="25.4" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="25.4" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="25.4" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="25.4" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="25.4" y="48.13" width="5.02" height="5.25"/>
|
||||
<rect x="25.4" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="25.4" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="25.4" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="25.4" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="20.34" y="142.3" width="5.06" height="5.25"/>
|
||||
<rect x="20.34" y="131.85" width="5.06" height="5.21"/>
|
||||
<rect x="20.34" y="121.39" width="5.06" height="5.21"/>
|
||||
<rect x="20.34" y="110.9" width="5.06" height="5.25"/>
|
||||
<rect x="20.34" y="100.44" width="5.06" height="5.25"/>
|
||||
<rect x="20.34" y="89.99" width="5.06" height="5.21"/>
|
||||
<rect x="20.34" y="79.54" width="5.06" height="5.21"/>
|
||||
<rect x="20.34" y="69.04" width="5.06" height="5.25"/>
|
||||
<rect x="20.34" y="58.59" width="5.06" height="5.25"/>
|
||||
<rect x="20.34" y="48.13" width="5.06" height="5.25"/>
|
||||
<rect x="20.34" y="37.68" width="5.06" height="5.21"/>
|
||||
<rect x="20.34" y="27.19" width="5.06" height="5.25"/>
|
||||
<rect x="20.34" y="16.73" width="5.06" height="5.25"/>
|
||||
<rect x="20.34" y="6.28" width="5.06" height="5.25"/>
|
||||
<rect x="15.31" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="15.31" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="15.31" y="121.39" width="5.02" height="5.21"/>
|
||||
<rect x="15.31" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="15.31" y="100.44" width="5.02" height="5.25"/>
|
||||
<rect x="15.31" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="15.31" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="15.31" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="15.31" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="15.31" y="48.13" width="5.02" height="5.25"/>
|
||||
<rect x="15.31" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="15.31" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="15.31" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="15.31" y="6.28" width="5.02" height="5.25"/>
|
||||
<rect x="10.29" y="142.3" width="5.02" height="5.25"/>
|
||||
<rect x="10.29" y="131.85" width="5.02" height="5.21"/>
|
||||
<rect x="10.29" y="121.39" width="5.02" height="5.21"/>
|
||||
<rect x="10.29" y="110.9" width="5.02" height="5.25"/>
|
||||
<rect x="10.29" y="100.44" width="5.02" height="5.25"/>
|
||||
<rect x="10.29" y="89.99" width="5.02" height="5.21"/>
|
||||
<rect x="10.29" y="79.54" width="5.02" height="5.21"/>
|
||||
<rect x="10.29" y="69.04" width="5.02" height="5.25"/>
|
||||
<rect x="10.29" y="58.59" width="5.02" height="5.25"/>
|
||||
<rect x="10.29" y="48.13" width="5.02" height="5.25"/>
|
||||
<rect x="10.29" y="37.68" width="5.02" height="5.21"/>
|
||||
<rect x="10.29" y="27.19" width="5.02" height="5.25"/>
|
||||
<rect x="10.29" y="16.73" width="5.02" height="5.25"/>
|
||||
<rect x="10.29" y="6.28" width="5.02" height="5.25"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.8 KiB |
181
frontend/src/assets/images/animation/Fg1200.svg
Normal file
@@ -0,0 +1,181 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Livello_2" data-name="Livello 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 126.16 163.62">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: #ffdf07;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
fill: #575756;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<g id="Livello_1-2" data-name="Livello 1">
|
||||
<g>
|
||||
<rect class="cls-2" x=".27" y="157.08" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="146.6" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="136.13" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="125.66" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="115.19" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="104.72" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="94.25" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="83.77" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="73.3" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="62.83" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="52.36" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="41.89" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="31.42" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="20.94" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" y="10.47" width="125.66" height="1.05"/>
|
||||
<rect class="cls-2" x=".27" width="125.66" height="1.05"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect class="cls-1" x="110.82" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="110.82" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="110.82" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.8" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="105.8" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="105.8" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.77" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="100.77" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="100.77" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.75" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="95.75" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="95.75" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.72" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="90.72" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="90.72" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="85.7" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="85.7" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="85.7" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.68" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="80.68" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="80.68" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.65" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.65" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.65" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="75.65" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="75.65" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.63" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.63" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.63" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="70.63" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="70.63" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="65.6" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="65.6" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="65.6" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="65.6" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="65.6" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.58" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.58" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.58" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="60.58" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="60.58" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.56" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.56" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.56" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="55.56" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="55.56" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.53" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.53" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.53" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="50.53" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="50.53" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="45.47" y="69.18" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="45.47" y="58.73" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="45.47" y="27.36" width="5.06" height="5.21"/>
|
||||
<rect class="cls-1" x="45.47" y="16.87" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="45.47" y="6.42" width="5.06" height="5.25"/>
|
||||
<rect class="cls-1" x="40.45" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="40.45" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="40.45" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="40.45" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="40.45" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.42" y="142.44" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.42" y="131.98" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.42" y="121.53" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.42" y="111.04" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.42" y="100.58" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.42" y="90.13" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.42" y="79.67" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.42" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.42" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.42" y="48.27" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.42" y="37.82" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.42" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="35.42" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="35.42" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.4" y="142.44" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.4" y="131.98" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.4" y="121.53" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.4" y="111.04" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.4" y="100.58" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.4" y="90.13" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.4" y="79.67" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.4" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.4" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.4" y="48.27" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.4" y="37.82" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.4" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="30.4" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="30.4" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.37" y="142.44" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.37" y="131.98" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.37" y="121.53" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.37" y="111.04" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.37" y="100.58" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.37" y="90.13" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.37" y="79.67" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.37" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.37" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.37" y="48.27" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.37" y="37.82" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.37" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="25.37" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="25.37" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.35" y="142.44" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.35" y="131.98" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.35" y="121.53" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.35" y="111.04" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.35" y="100.58" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.35" y="90.13" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.35" y="79.67" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.35" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.35" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.35" y="48.27" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.35" y="37.82" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.35" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="20.35" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="20.35" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.33" y="142.44" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.33" y="131.98" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.33" y="121.53" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.33" y="111.04" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.33" y="100.58" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.33" y="90.13" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.33" y="79.67" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.33" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.33" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.33" y="48.27" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.33" y="37.82" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.33" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="15.33" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="15.33" y="6.42" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.3" y="142.44" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.3" y="131.98" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="10.3" y="121.53" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="10.3" y="111.04" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.3" y="100.58" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.3" y="90.13" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.3" y="79.67" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="10.3" y="69.18" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.3" y="58.73" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.3" y="48.27" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.3" y="37.82" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="10.3" y="27.36" width="5.02" height="5.21"/>
|
||||
<rect class="cls-1" x="10.3" y="16.87" width="5.02" height="5.25"/>
|
||||
<rect class="cls-1" x="10.3" y="6.42" width="5.02" height="5.25"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 12 KiB |
241
frontend/src/assets/images/animation/d1200.svg
Normal file
@@ -0,0 +1,241 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Livello_2" data-name="Livello 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 126.16 163.48">
|
||||
<g id="Livello_1-2" data-name="Livello 1">
|
||||
<g>
|
||||
<rect x=".25" y="157.08" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="146.6" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="136.13" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="125.66" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="115.19" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="104.72" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="94.25" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="83.77" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="73.3" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="62.83" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="52.36" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="41.89" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="31.42" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="20.94" width="125.66" height="1.05"/>
|
||||
<rect x=".25" y="10.47" width="125.66" height="1.05"/>
|
||||
<rect x=".25" width="125.66" height="1.05"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="110.83" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="110.83" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="110.83" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="110.83" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="110.83" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="110.83" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="110.83" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="110.83" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="110.83" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="110.83" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="105.8" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="105.8" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="105.8" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="105.8" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="105.8" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="105.8" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="105.8" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="105.8" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="105.8" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="105.8" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="105.8" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="105.8" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="100.78" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="100.78" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="100.78" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="100.78" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="100.78" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="100.78" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="100.78" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="100.78" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="100.78" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="100.78" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="100.78" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="100.78" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="95.76" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="95.76" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="95.76" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="95.76" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="95.76" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="95.76" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="95.76" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="95.76" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="95.76" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="95.76" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="95.76" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="95.76" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="95.76" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="95.76" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="90.73" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="90.73" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="90.73" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="90.73" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="90.73" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="90.73" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="90.73" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="90.73" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="90.73" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="90.73" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="90.73" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="90.73" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="90.73" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="90.73" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="85.71" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="85.71" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="85.71" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="85.71" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="85.71" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="85.71" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="85.71" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="85.71" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="85.71" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="85.71" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="85.71" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="85.71" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="85.71" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="85.71" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="80.68" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="80.68" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="80.68" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="80.68" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="80.68" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="80.68" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="80.68" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="80.68" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="75.66" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="75.66" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="75.66" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="75.66" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="75.66" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="75.66" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="70.64" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="70.64" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="70.64" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="70.64" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="70.64" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="70.64" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="65.61" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="65.61" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="65.61" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="65.61" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="65.61" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="65.61" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="60.55" y="142.31" width="5.06" height="5.21"/>
|
||||
<rect x="60.55" y="131.82" width="5.06" height="5.25"/>
|
||||
<rect x="60.55" y="121.37" width="5.06" height="5.25"/>
|
||||
<rect x="60.55" y="27.2" width="5.06" height="5.25"/>
|
||||
<rect x="60.55" y="16.75" width="5.06" height="5.21"/>
|
||||
<rect x="60.55" y="6.29" width="5.06" height="5.21"/>
|
||||
<rect x="55.53" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="55.53" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="55.53" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="55.53" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="55.53" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="55.53" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="50.5" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="50.5" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="50.5" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="50.5" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="50.5" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="50.5" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="45.48" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="45.48" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="45.48" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="45.48" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="45.48" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="45.48" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="40.45" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="40.45" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="40.45" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="40.45" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="40.45" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="40.45" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="35.43" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="35.43" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="35.43" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="35.43" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="35.43" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="35.43" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="35.43" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="35.43" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="35.43" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="35.43" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="35.43" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="35.43" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="35.43" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="35.43" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="30.41" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="30.41" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="30.41" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="30.41" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="30.41" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="30.41" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="30.41" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="30.41" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="30.41" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="30.41" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="30.41" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="30.41" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="30.41" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="30.41" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="25.38" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="25.38" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="25.38" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="25.38" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="25.38" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="25.38" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="25.38" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="25.38" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="25.38" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="25.38" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="25.38" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="25.38" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="25.38" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="25.38" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="20.36" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="20.36" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="20.36" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="20.36" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="20.36" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="20.36" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="20.36" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="20.36" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="20.36" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="20.36" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="20.36" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="20.36" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="20.36" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="20.36" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="15.33" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="15.33" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="15.33" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="15.33" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="15.33" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="15.33" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="15.33" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="15.33" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="15.33" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="15.33" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="15.33" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="15.33" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="15.33" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="15.33" y="6.29" width="5.02" height="5.21"/>
|
||||
<rect x="10.31" y="142.31" width="5.02" height="5.21"/>
|
||||
<rect x="10.31" y="131.82" width="5.02" height="5.25"/>
|
||||
<rect x="10.31" y="121.37" width="5.02" height="5.25"/>
|
||||
<rect x="10.31" y="110.91" width="5.02" height="5.25"/>
|
||||
<rect x="10.31" y="100.46" width="5.02" height="5.21"/>
|
||||
<rect x="10.31" y="89.97" width="5.02" height="5.25"/>
|
||||
<rect x="10.31" y="79.51" width="5.02" height="5.25"/>
|
||||
<rect x="10.31" y="69.06" width="5.02" height="5.25"/>
|
||||
<rect x="10.31" y="58.6" width="5.02" height="5.21"/>
|
||||
<rect x="10.31" y="48.15" width="5.02" height="5.21"/>
|
||||
<rect x="10.31" y="37.66" width="5.02" height="5.25"/>
|
||||
<rect x="10.31" y="27.2" width="5.02" height="5.25"/>
|
||||
<rect x="10.31" y="16.75" width="5.02" height="5.21"/>
|
||||
<rect x="10.31" y="6.29" width="5.02" height="5.21"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 14 KiB |
1066
frontend/src/assets/images/brand-logo-navbar2.svg
Normal file
|
After Width: | Height: | Size: 62 KiB |
1078
frontend/src/assets/images/brand-logo-navbar3.svg
Normal file
|
After Width: | Height: | Size: 74 KiB |
976
frontend/src/assets/images/brand-logo-white.svg
Normal file
@@ -0,0 +1,976 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 318.9 65.08">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: #fedf02;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
fill: #fff;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<g id="Layer_1-2" data-name="Layer 1">
|
||||
<g>
|
||||
<rect class="cls-2" x="46.1" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="46.1" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="46.1" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="46.1" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="46.1" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="46.1" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="46.1" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="46.1" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="46.1" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="46.1" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="46.1" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="46.1" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="43.8" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="43.8" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="43.8" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="43.8" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="43.8" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="43.8" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="43.8" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="43.8" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="43.8" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="43.8" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="43.8" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="43.8" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="43.8" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="43.8" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="41.49" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="41.49" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="41.49" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="41.49" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="41.49" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="41.49" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="41.49" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="41.49" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="41.49" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="41.49" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="41.49" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="41.49" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="41.49" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="41.49" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="39.19" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="39.19" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="39.19" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="39.19" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="39.19" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="39.19" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="39.19" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="39.19" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="39.19" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="39.19" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="39.19" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="39.19" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="39.19" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="39.19" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="36.88" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="36.88" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="36.88" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="36.88" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="36.88" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="36.88" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="36.88" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="36.88" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="36.88" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="36.88" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="36.88" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="36.88" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="36.88" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="36.88" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="34.58" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="34.58" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="34.58" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="34.58" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="34.58" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="34.58" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="34.58" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="34.58" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="34.58" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="34.58" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="34.58" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="34.58" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="34.58" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="34.58" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="32.28" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="32.28" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="32.28" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="32.28" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="32.28" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="32.28" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="32.28" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="32.28" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="29.97" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="29.97" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="29.97" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="29.97" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="29.97" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="29.97" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="29.97" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="29.97" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="27.67" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="27.67" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="27.67" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="27.67" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="27.67" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="27.67" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="27.67" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="27.67" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="25.35" y="62.4" width="2.32" height="2.39"/>
|
||||
<rect class="cls-2" x="25.35" y="57.58" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="25.35" y="52.79" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="25.35" y="33.59" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="25.35" y="28.8" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="25.35" y="9.6" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="25.35" y="4.81" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="25.35" y=".01" width="2.32" height="2.39"/>
|
||||
<rect class="cls-2" x="23.04" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="23.04" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="23.04" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="23.04" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="23.04" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="23.04" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="23.04" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="23.04" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="20.74" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="20.74" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="20.74" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="20.74" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="20.74" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="20.74" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="20.74" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="20.74" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="18.43" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="18.43" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="18.43" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="18.43" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="18.43" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="18.43" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="18.43" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="18.43" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="16.13" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="16.13" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="16.13" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="16.13" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="16.13" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="16.13" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="13.83" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="13.83" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="13.83" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="13.83" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="13.83" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="13.83" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="11.52" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="11.52" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="11.52" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="11.52" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="11.52" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="11.52" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="9.22" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="9.22" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="9.22" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="9.22" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="9.22" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="9.22" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="6.91" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="6.91" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="6.91" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="6.91" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="6.91" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="6.91" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="4.61" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="4.61" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="4.61" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="4.61" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="4.61" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="4.61" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="2.31" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="2.31" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="2.31" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="2.31" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="2.31" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="2.31" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" y="4.81" width="2.3" height="2.41"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect class="cls-2" x="110.7" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="110.7" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="110.7" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="110.7" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="110.7" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="110.7" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="110.7" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="110.7" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="110.7" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="110.7" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="108.39" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="108.39" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="108.39" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="108.39" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="108.39" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="108.39" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="108.39" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="108.39" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="108.39" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="108.39" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="108.39" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="108.39" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="106.09" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="106.09" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="106.09" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="106.09" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="106.09" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="106.09" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="106.09" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="106.09" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="106.09" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="106.09" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="106.09" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="106.09" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="103.79" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="103.79" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="103.79" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="103.79" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="103.79" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="103.79" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="103.79" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="103.79" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="103.79" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="103.79" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="103.79" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="103.79" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="103.79" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="103.79" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="101.48" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="101.48" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="101.48" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="101.48" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="101.48" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="101.48" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="101.48" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="101.48" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="101.48" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="101.48" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="101.48" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="101.48" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="101.48" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="101.48" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="99.16" y="62.4" width="2.32" height="2.39"/>
|
||||
<rect class="cls-2" x="99.16" y="57.58" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="99.16" y="52.79" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="99.16" y="47.99" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="99.16" y="43.2" width="2.32" height="2.39"/>
|
||||
<rect class="cls-2" x="99.16" y="38.4" width="2.32" height="2.39"/>
|
||||
<rect class="cls-2" x="99.16" y="33.59" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="99.16" y="28.8" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="99.16" y="24" width="2.32" height="2.39"/>
|
||||
<rect class="cls-2" x="99.16" y="19.21" width="2.32" height="2.39"/>
|
||||
<rect class="cls-2" x="99.16" y="14.4" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="99.16" y="9.6" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="99.16" y="4.81" width="2.32" height="2.41"/>
|
||||
<rect class="cls-2" x="99.16" y=".01" width="2.32" height="2.39"/>
|
||||
<rect class="cls-2" x="96.86" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="96.86" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="96.86" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="96.86" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="96.86" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="96.86" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="96.86" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="96.86" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="94.55" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="94.55" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="94.55" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="94.55" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="94.55" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="94.55" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="92.25" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="92.25" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="92.25" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="92.25" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="92.25" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="92.25" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="89.94" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="89.94" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="89.94" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="89.94" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="89.94" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="89.94" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="87.64" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="87.64" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="87.64" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="87.64" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="87.64" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="87.64" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="85.34" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="85.34" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="85.34" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="85.34" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="85.34" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="85.34" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="83.03" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="83.03" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="83.03" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="83.03" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="83.03" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="83.03" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="80.73" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="80.73" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="80.73" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="80.73" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="80.73" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="80.73" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="78.42" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="78.42" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="78.42" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="78.42" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="78.42" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="78.42" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="76.12" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="76.12" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="76.12" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="76.12" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="76.12" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="76.12" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="76.12" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="76.12" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="76.12" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="76.12" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="76.12" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="76.12" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="76.12" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="76.12" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="73.81" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="73.81" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="73.81" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="73.81" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="73.81" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="73.81" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="73.81" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="73.81" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="73.81" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="73.81" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="73.81" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="73.81" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="73.81" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="73.81" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="71.51" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="71.51" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="71.51" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="71.51" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="71.51" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="71.51" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="71.51" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="71.51" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="71.51" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="71.51" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="71.51" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="71.51" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="71.51" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="71.51" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="69.21" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="69.21" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="69.21" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="69.21" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="69.21" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="69.21" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="69.21" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="69.21" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="69.21" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="69.21" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="69.21" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="69.21" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="69.21" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="69.21" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="66.9" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="66.9" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="66.9" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="66.9" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="66.9" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="66.9" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="66.9" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="66.9" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="66.9" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="66.9" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="66.9" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="66.9" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="66.9" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="66.9" y=".01" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="64.6" y="62.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="64.6" y="57.58" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="64.6" y="52.79" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="64.6" y="47.99" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="64.6" y="43.2" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="64.6" y="38.4" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="64.6" y="33.59" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="64.6" y="28.8" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="64.6" y="24" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="64.6" y="19.21" width="2.3" height="2.39"/>
|
||||
<rect class="cls-2" x="64.6" y="14.4" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="64.6" y="9.6" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="64.6" y="4.81" width="2.3" height="2.41"/>
|
||||
<rect class="cls-2" x="64.6" y=".01" width="2.3" height="2.39"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect class="cls-1" x="184.85" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="184.85" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="184.85" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="182.55" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="182.55" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="182.55" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="180.24" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="180.24" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="180.24" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="177.94" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="177.94" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="177.94" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="175.63" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="175.63" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="175.63" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="173.33" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="173.33" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="173.33" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="171.03" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="171.03" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="171.03" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="168.72" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="168.72" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="168.72" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="168.72" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="168.72" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="166.42" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="166.42" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="166.42" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="166.42" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="166.42" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="164.11" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="164.11" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="164.11" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="164.11" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="164.11" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="161.81" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="161.81" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="161.81" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="161.81" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="161.81" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="159.5" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="159.5" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="159.5" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="159.5" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="159.5" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="157.2" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="157.2" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="157.2" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="157.2" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="157.2" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="154.88" y="28.83" width="2.32" height="2.41"/>
|
||||
<rect class="cls-1" x="154.88" y="24.04" width="2.32" height="2.41"/>
|
||||
<rect class="cls-1" x="154.88" y="9.65" width="2.32" height="2.39"/>
|
||||
<rect class="cls-1" x="154.88" y="4.84" width="2.32" height="2.41"/>
|
||||
<rect class="cls-1" x="154.88" y=".05" width="2.32" height="2.41"/>
|
||||
<rect class="cls-1" x="152.58" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="152.58" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="152.58" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="152.58" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="152.58" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="150.27" y="62.43" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="150.27" y="57.63" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="150.27" y="52.84" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="150.27" y="48.03" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="150.27" y="43.23" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="150.27" y="38.44" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="150.27" y="33.64" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="150.27" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="150.27" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="150.27" y="19.24" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="150.27" y="14.45" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="150.27" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="150.27" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="150.27" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="147.97" y="62.43" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="147.97" y="57.63" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="147.97" y="52.84" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="147.97" y="48.03" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="147.97" y="43.23" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="147.97" y="38.44" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="147.97" y="33.64" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="147.97" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="147.97" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="147.97" y="19.24" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="147.97" y="14.45" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="147.97" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="147.97" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="147.97" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="145.66" y="62.43" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="145.66" y="57.63" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="145.66" y="52.84" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="145.66" y="48.03" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="145.66" y="43.23" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="145.66" y="38.44" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="145.66" y="33.64" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="145.66" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="145.66" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="145.66" y="19.24" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="145.66" y="14.45" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="145.66" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="145.66" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="145.66" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="143.36" y="62.43" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="143.36" y="57.63" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="143.36" y="52.84" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="143.36" y="48.03" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="143.36" y="43.23" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="143.36" y="38.44" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="143.36" y="33.64" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="143.36" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="143.36" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="143.36" y="19.24" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="143.36" y="14.45" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="143.36" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="143.36" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="143.36" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="141.05" y="62.43" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="141.05" y="57.63" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="141.05" y="52.84" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="141.05" y="48.03" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="141.05" y="43.23" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="141.05" y="38.44" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="141.05" y="33.64" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="141.05" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="141.05" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="141.05" y="19.24" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="141.05" y="14.45" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="141.05" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="141.05" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="141.05" y=".05" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="138.75" y="62.43" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="138.75" y="57.63" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="138.75" y="52.84" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="138.75" y="48.03" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="138.75" y="43.23" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="138.75" y="38.44" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="138.75" y="33.64" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="138.75" y="28.83" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="138.75" y="24.04" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="138.75" y="19.24" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="138.75" y="14.45" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="138.75" y="9.65" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="138.75" y="4.84" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="138.75" y=".05" width="2.3" height="2.41"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect class="cls-1" x="316.59" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="316.59" y="48.27" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="316.59" y="43.48" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="314.29" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="314.29" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="314.29" y="48.27" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="314.29" y="43.48" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="314.29" y="38.68" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="314.29" y="19.49" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="314.29" y="14.69" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="314.29" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="311.99" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="311.99" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="311.99" y="48.27" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="311.99" y="43.48" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="311.99" y="38.68" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="311.99" y="24.28" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="311.99" y="19.49" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="311.99" y="14.69" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="311.99" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="311.99" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="309.68" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="309.68" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="309.68" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="309.68" y="48.27" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="309.68" y="43.48" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="309.68" y="38.68" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="309.68" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="309.68" y="24.28" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="309.68" y="19.49" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="309.68" y="14.69" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="309.68" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="309.68" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="307.38" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="307.38" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="307.38" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="307.38" y="48.27" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="307.38" y="43.48" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="307.38" y="38.68" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="307.38" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="307.38" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="307.38" y="24.28" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="307.38" y="19.49" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="307.38" y="14.69" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="307.38" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="307.38" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="307.38" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="305.07" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="305.07" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="305.07" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="305.07" y="48.27" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="305.07" y="43.48" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="305.07" y="38.68" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="305.07" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="305.07" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="305.07" y="24.28" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="305.07" y="19.49" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="305.07" y="14.69" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="305.07" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="305.07" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="305.07" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="302.77" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="302.77" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="302.77" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="302.77" y="38.68" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="302.77" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="302.77" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="302.77" y="24.28" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="302.77" y="19.49" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="302.77" y="14.69" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="302.77" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="302.77" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="302.77" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="300.46" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="300.46" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="300.46" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="300.46" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="300.46" y="24.28" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="300.46" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="300.46" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="300.46" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="298.16" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="298.16" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="298.16" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="298.16" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="298.16" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="298.16" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="295.86" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="295.86" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="295.86" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="295.86" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="295.86" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="295.86" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="293.55" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="293.55" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="293.55" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="293.55" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="293.55" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="293.55" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="291.25" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="291.25" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="291.25" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="291.25" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="291.25" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="291.25" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="288.94" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="288.94" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="288.94" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="288.94" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="288.94" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="288.94" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="286.62" y="62.68" width="2.32" height="2.41"/>
|
||||
<rect class="cls-1" x="286.62" y="57.88" width="2.32" height="2.39"/>
|
||||
<rect class="cls-1" x="286.62" y="33.89" width="2.32" height="2.39"/>
|
||||
<rect class="cls-1" x="286.62" y="29.08" width="2.32" height="2.41"/>
|
||||
<rect class="cls-1" x="286.62" y="5.09" width="2.32" height="2.41"/>
|
||||
<rect class="cls-1" x="286.62" y=".29" width="2.32" height="2.41"/>
|
||||
<rect class="cls-1" x="284.32" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="284.32" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="284.32" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="284.32" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="284.32" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="284.32" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="282.01" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="282.01" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="282.01" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="282.01" y="48.27" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="282.01" y="43.48" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="282.01" y="38.68" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="282.01" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="282.01" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="282.01" y="24.28" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="282.01" y="19.49" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="282.01" y="14.69" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="282.01" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="282.01" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="282.01" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="279.71" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="279.71" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="279.71" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="279.71" y="48.27" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="279.71" y="43.48" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="279.71" y="38.68" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="279.71" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="279.71" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="279.71" y="24.28" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="279.71" y="19.49" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="279.71" y="14.69" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="279.71" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="279.71" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="279.71" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="277.41" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="277.41" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="277.41" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="277.41" y="48.27" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="277.41" y="43.48" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="277.41" y="38.68" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="277.41" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="277.41" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="277.41" y="24.28" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="277.41" y="19.49" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="277.41" y="14.69" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="277.41" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="277.41" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="277.41" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="275.1" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="275.1" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="275.1" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="275.1" y="48.27" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="275.1" y="43.48" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="275.1" y="38.68" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="275.1" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="275.1" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="275.1" y="24.28" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="275.1" y="19.49" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="275.1" y="14.69" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="275.1" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="275.1" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="275.1" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="272.8" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="272.8" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="272.8" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="272.8" y="48.27" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="272.8" y="43.48" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="272.8" y="38.68" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="272.8" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="272.8" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="272.8" y="24.28" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="272.8" y="19.49" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="272.8" y="14.69" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="272.8" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="272.8" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="272.8" y=".29" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="270.49" y="62.68" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="270.49" y="57.88" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="270.49" y="53.09" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="270.49" y="48.27" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="270.49" y="43.48" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="270.49" y="38.68" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="270.49" y="33.89" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="270.49" y="29.08" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="270.49" y="24.28" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="270.49" y="19.49" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="270.49" y="14.69" width="2.3" height="2.39"/>
|
||||
<rect class="cls-1" x="270.49" y="9.88" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="270.49" y="5.09" width="2.3" height="2.41"/>
|
||||
<rect class="cls-1" x="270.49" y=".29" width="2.3" height="2.41"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect class="cls-1" x="250.75" y="62.58" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="249.2" y="62.58" width="1.54" height="2.41"/>
|
||||
<rect class="cls-1" x="249.2" y="57.75" width="1.54" height="2.41"/>
|
||||
<rect class="cls-1" x="247.65" y="62.58" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="247.65" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="247.65" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="246.09" y="62.58" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="246.09" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="246.09" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="246.09" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="244.53" y="62.58" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="244.53" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="244.53" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="244.53" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="244.53" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="242.97" y="62.58" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="242.97" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="242.97" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="242.97" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="242.97" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="242.97" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="241.41" y="62.58" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="241.41" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="241.41" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="241.41" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="241.41" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="241.41" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="241.41" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="239.85" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="239.85" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="239.85" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="239.85" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="239.85" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="239.85" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="239.85" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="238.29" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="238.29" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="238.29" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="238.29" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="238.29" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="238.29" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="238.29" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="236.74" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="236.74" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="236.74" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="236.74" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="236.74" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="236.74" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="236.74" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="235.18" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="235.18" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="235.18" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="235.18" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="235.18" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="235.18" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="235.18" y="14.43" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="233.62" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="233.62" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="233.62" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="233.62" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="233.62" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="233.62" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="233.62" y="14.43" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="233.62" y="9.62" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="232.06" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="232.06" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="232.06" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="232.06" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="232.06" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="232.06" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="232.06" y="14.43" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="232.06" y="9.62" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="232.06" y="4.81" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="230.5" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="230.5" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="230.5" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="230.5" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="230.5" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="230.5" y="14.43" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="230.5" y="9.62" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="230.5" y="4.81" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="230.5" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="228.94" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="228.94" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="228.94" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="228.94" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="228.94" y="14.43" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="228.94" y="9.62" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="228.94" y="4.81" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="228.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="227.38" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="227.38" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="227.38" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="227.38" y="14.43" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="227.38" y="9.62" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="227.38" y="4.81" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="227.38" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="225.84" y="43.32" width="1.54" height="2.41"/>
|
||||
<rect class="cls-1" x="225.84" y="38.51" width="1.54" height="2.41"/>
|
||||
<rect class="cls-1" x="225.84" y="14.43" width="1.54" height="2.41"/>
|
||||
<rect class="cls-1" x="225.84" y="9.62" width="1.54" height="2.41"/>
|
||||
<rect class="cls-1" x="225.84" y="4.81" width="1.54" height="2.41"/>
|
||||
<rect class="cls-1" x="225.84" width="1.54" height="2.41"/>
|
||||
<rect class="cls-1" x="224.28" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="224.28" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="224.28" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="224.28" y="14.43" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="224.28" y="9.62" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="224.28" y="4.81" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="224.28" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="222.72" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="222.72" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="222.72" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="222.72" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="222.72" y="14.43" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="222.72" y="9.62" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="222.72" y="4.81" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="222.72" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="221.16" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="221.16" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="221.16" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="221.16" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="221.16" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="221.16" y="14.43" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="221.16" y="9.62" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="221.16" y="4.81" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="221.16" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="219.61" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="219.61" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="219.61" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="219.61" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="219.61" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="219.61" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="219.61" y="14.43" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="219.61" y="9.62" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="219.61" y="4.81" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="218.05" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="218.05" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="218.05" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="218.05" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="218.05" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="218.05" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="218.05" y="14.43" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="218.05" y="9.62" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="216.49" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="216.49" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="216.49" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="216.49" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="216.49" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="216.49" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="216.49" y="14.43" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="214.93" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="214.93" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="214.93" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="214.93" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="214.93" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="214.93" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="214.93" y="19.24" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="213.37" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="213.37" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="213.37" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="213.37" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="213.37" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="213.37" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="213.37" y="24.05" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="211.81" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="211.81" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="211.81" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="211.81" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="211.81" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="211.81" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="211.81" y="28.88" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="210.25" y="62.58" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="210.25" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="210.25" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="210.25" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="210.25" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="210.25" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="210.25" y="33.69" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="208.7" y="62.58" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="208.7" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="208.7" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="208.7" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="208.7" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="208.7" y="38.51" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="207.14" y="62.58" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="207.14" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="207.14" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="207.14" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="207.14" y="43.32" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="205.58" y="62.58" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="205.58" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="205.58" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="205.58" y="48.13" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="204.02" y="62.58" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="204.02" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="204.02" y="52.94" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="202.46" y="62.58" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="202.46" y="57.75" width="1.56" height="2.41"/>
|
||||
<rect class="cls-1" x="200.92" y="62.58" width="1.54" height="2.41"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 69 KiB |
1078
frontend/src/assets/images/brand-logo-yellow.svg
Normal file
|
After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 3.1 MiB |
|
Before Width: | Height: | Size: 398 KiB |
|
Before Width: | Height: | Size: 2.1 MiB |
|
Before Width: | Height: | Size: 1.6 MiB |
|
Before Width: | Height: | Size: 4.0 MiB |
|
Before Width: | Height: | Size: 1018 KiB |
|
Before Width: | Height: | Size: 1.8 MiB |
2118
frontend/src/assets/images/logo.svg
Normal file
|
After Width: | Height: | Size: 133 KiB |
2119
frontend/src/assets/images/logo2.svg
Normal file
|
After Width: | Height: | Size: 132 KiB |
@@ -10,7 +10,26 @@
|
||||
<meta name="robots" content="index, follow" />
|
||||
<base href="/" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="icon" type="image/png" href="assets/images/Fav-icon.png" />
|
||||
<link rel="icon" type="image/png" href="/assets/images/Fav-icon.png" />
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="192x192"
|
||||
href="/assets/images/Fav-icon-browser-192x192.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="512x512"
|
||||
href="/assets/images/Fav-icon-512x512.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="192x192"
|
||||
href="/assets/images/Fav-icon-192x192.png"
|
||||
/>
|
||||
<link rel="manifest" href="/site.webmanifest" />
|
||||
<meta name="theme-color" content="#ffffff" />
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link
|
||||
|
||||
47
frontend/src/server-routing.spec.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
import { resolvePublicRedirectTarget } from './server-routing';
|
||||
|
||||
describe('server routing redirects', () => {
|
||||
it('does not force a fixed-language redirect for the root path', () => {
|
||||
expect(resolvePublicRedirectTarget('/')).toBeNull();
|
||||
});
|
||||
|
||||
it('redirects unprefixed public pages to the default language', () => {
|
||||
expect(resolvePublicRedirectTarget('/about')).toBe('/it/about');
|
||||
expect(resolvePublicRedirectTarget('/about/')).toBe('/it/about');
|
||||
});
|
||||
|
||||
it('redirects calculator paths directly to the canonical basic route', () => {
|
||||
expect(resolvePublicRedirectTarget('/calculator')).toBe(
|
||||
'/it/calculator/basic',
|
||||
);
|
||||
expect(resolvePublicRedirectTarget('/it/calculator')).toBe(
|
||||
'/it/calculator/basic',
|
||||
);
|
||||
});
|
||||
|
||||
it('redirects legacy shop product aliases to the canonical product route', () => {
|
||||
expect(
|
||||
resolvePublicRedirectTarget('/shop/accessories/desk-cable-clip'),
|
||||
).toBe('/it/shop/p/desk-cable-clip');
|
||||
expect(
|
||||
resolvePublicRedirectTarget('/de/shop/zubehor/schreibtisch-kabelhalter'),
|
||||
).toBe('/de/shop/p/schreibtisch-kabelhalter');
|
||||
});
|
||||
|
||||
it('drops unsupported language-like prefixes instead of nesting them', () => {
|
||||
expect(resolvePublicRedirectTarget('/es/about')).toBe('/it/about');
|
||||
expect(resolvePublicRedirectTarget('/de-CH/about')).toBe('/it/about');
|
||||
});
|
||||
|
||||
it('normalizes supported language prefixes and trailing slashes', () => {
|
||||
expect(resolvePublicRedirectTarget('/DE/about')).toBe('/de/about');
|
||||
expect(resolvePublicRedirectTarget('/it/about/')).toBe('/it/about');
|
||||
expect(resolvePublicRedirectTarget('/fr')).toBeNull();
|
||||
});
|
||||
|
||||
it('does not redirect static files and sitemap resources', () => {
|
||||
expect(resolvePublicRedirectTarget('/assets/logo.svg')).toBeNull();
|
||||
expect(resolvePublicRedirectTarget('/robots.txt')).toBeNull();
|
||||
expect(resolvePublicRedirectTarget('/sitemap.xml')).toBeNull();
|
||||
});
|
||||
});
|
||||
105
frontend/src/server-routing.ts
Normal file
@@ -0,0 +1,105 @@
|
||||
const SUPPORTED_LANG_LIST = ['it', 'en', 'de', 'fr'] as const;
|
||||
|
||||
export const SUPPORTED_LANGS = new Set<string>(SUPPORTED_LANG_LIST);
|
||||
export const DEFAULT_LANG = 'it';
|
||||
|
||||
export function resolvePublicRedirectTarget(pathname: string): string | null {
|
||||
const normalizedPath = normalizePathname(pathname);
|
||||
if (shouldBypassRedirect(normalizedPath)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const trimmedPath =
|
||||
normalizedPath === '/' ? '/' : normalizedPath.replace(/\/+$/, '');
|
||||
const segments = splitSegments(trimmedPath);
|
||||
if (segments.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const firstSegment = segments[0].toLowerCase();
|
||||
if (SUPPORTED_LANGS.has(firstSegment)) {
|
||||
const canonicalSegments = [firstSegment, ...segments.slice(1)];
|
||||
const canonicalPath = `/${canonicalSegments.join('/')}`;
|
||||
const directRedirect = resolveCanonicalRedirect(canonicalSegments);
|
||||
if (directRedirect) {
|
||||
return directRedirect;
|
||||
}
|
||||
return canonicalPath === normalizedPath ? null : canonicalPath;
|
||||
}
|
||||
|
||||
const effectiveSegments = looksLikeLangToken(firstSegment)
|
||||
? segments.slice(1)
|
||||
: segments;
|
||||
if (effectiveSegments.length === 0) {
|
||||
return `/${DEFAULT_LANG}`;
|
||||
}
|
||||
|
||||
const directRedirect = resolveCanonicalRedirect([
|
||||
DEFAULT_LANG,
|
||||
...effectiveSegments,
|
||||
]);
|
||||
if (directRedirect) {
|
||||
return directRedirect;
|
||||
}
|
||||
|
||||
return `/${[DEFAULT_LANG, ...effectiveSegments].join('/')}`;
|
||||
}
|
||||
|
||||
function resolveCanonicalRedirect(segments: string[]): string | null {
|
||||
const [lang, section, thirdSegment, fourthSegment] = segments;
|
||||
|
||||
if (section?.toLowerCase() === 'calculator' && segments.length === 2) {
|
||||
return `/${lang}/calculator/basic`;
|
||||
}
|
||||
|
||||
if (
|
||||
section?.toLowerCase() === 'shop' &&
|
||||
segments.length === 4 &&
|
||||
thirdSegment?.toLowerCase() !== 'p' &&
|
||||
fourthSegment
|
||||
) {
|
||||
return `/${lang}/shop/p/${fourthSegment}`;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function normalizePathname(pathname: string): string {
|
||||
const rawValue = String(pathname || '/').trim();
|
||||
if (!rawValue) {
|
||||
return '/';
|
||||
}
|
||||
|
||||
return rawValue.startsWith('/') ? rawValue : `/${rawValue}`;
|
||||
}
|
||||
|
||||
function shouldBypassRedirect(pathname: string): boolean {
|
||||
if (
|
||||
pathname.startsWith('/api/') ||
|
||||
pathname.startsWith('/assets/') ||
|
||||
pathname.startsWith('/media/')
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (
|
||||
pathname === '/robots.txt' ||
|
||||
pathname === '/sitemap.xml' ||
|
||||
pathname === '/sitemap-static.xml' ||
|
||||
pathname === '/favicon.ico'
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return /\.[^/]+$/.test(pathname);
|
||||
}
|
||||
|
||||
function splitSegments(pathname: string): string[] {
|
||||
return pathname.split('/').filter(Boolean);
|
||||
}
|
||||
|
||||
function looksLikeLangToken(segment: string | null | undefined): boolean {
|
||||
return (
|
||||
typeof segment === 'string' && /^[a-z]{2}(?:-[a-z]{2})?$/i.test(segment)
|
||||
);
|
||||
}
|
||||
@@ -5,6 +5,11 @@ import { dirname, join, resolve } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import bootstrap from './main.server';
|
||||
import { resolveRequestOrigin } from './core/request-origin';
|
||||
import {
|
||||
parseAcceptLanguage,
|
||||
resolveInitialLanguage,
|
||||
} from './app/core/i18n/language-resolution';
|
||||
import { resolvePublicRedirectTarget } from './server-routing';
|
||||
|
||||
const serverDistFolder = dirname(fileURLToPath(import.meta.url));
|
||||
const browserDistFolder = resolve(serverDistFolder, '../browser');
|
||||
@@ -36,6 +41,28 @@ app.get(
|
||||
}),
|
||||
);
|
||||
|
||||
app.get('/', (req, res) => {
|
||||
const acceptLanguage = req.get('accept-language');
|
||||
const preferredLanguages = parseAcceptLanguage(acceptLanguage);
|
||||
const lang = resolveInitialLanguage({
|
||||
preferredLanguages,
|
||||
});
|
||||
|
||||
res.setHeader('Vary', 'Accept-Language');
|
||||
res.setHeader('Cache-Control', 'private, no-store');
|
||||
res.redirect(302, `/${lang}${querySuffix(req.originalUrl)}`);
|
||||
});
|
||||
|
||||
app.get('**', (req, res, next) => {
|
||||
const targetPath = resolvePublicRedirectTarget(req.path);
|
||||
if (!targetPath) {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
|
||||
res.redirect(308, `${targetPath}${querySuffix(req.originalUrl)}`);
|
||||
});
|
||||
|
||||
/**
|
||||
* Handle all other requests by rendering the Angular application.
|
||||
*/
|
||||
@@ -67,3 +94,8 @@ if (isMainModule(import.meta.url)) {
|
||||
}
|
||||
|
||||
export default app;
|
||||
|
||||
function querySuffix(url: string): string {
|
||||
const queryIndex = String(url ?? '').indexOf('?');
|
||||
return queryIndex >= 0 ? String(url).slice(queryIndex) : '';
|
||||
}
|
||||
|
||||