From c6759186cb3ef8350497b89d4756085422edabe8 Mon Sep 17 00:00:00 2001 From: khaccount Date: Wed, 1 Jul 2026 10:34:48 +0200 Subject: [PATCH] DEV CommiDEV Committ --- README.md | 7 +- config/sites/vitec/config.yaml | 2 + .../StructuredDataGeneratorWizard.php | 65 +++ .../Backend/StructuredDataController.php | 262 +++++++++++++ .../Classes/Service/StructuredDataService.php | 370 ++++++++++++++++++ .../UserFunc/DownloadcardJsonRenderer.php | 31 +- .../DownloadcardcollectionJsonRenderer.php | 17 + .../Classes/UserFunc/PageJsonLdRenderer.php | 228 +++++++++++ .../UserFunc/ProductShowJsonRenderer.php | 78 +++- .../Configuration/Backend/AjaxRoutes.php | 19 + .../Configuration/FlexForms/Downloadcard.xml | 52 +-- .../vitec/Configuration/JavaScriptModules.php | 16 + .../Sets/Vitecset/settings.definitions.yaml | 83 ++++ .../Sets/Vitecset/setup.typoscript | 10 + .../tt_content_vitec_cols_25_25_25_25.php | 2 +- .../tt_content_vitec_cols_33_33_33.php | 2 +- .../Overrides/tt_content_vitec_cols_33_66.php | 2 +- .../Overrides/tt_content_vitec_cols_50_50.php | 2 +- .../Overrides/tt_content_vitec_cols_66_33.php | 2 +- .../Overrides/tt_content_vitec_container.php | 2 +- .../TCA/tx_vitec_domain_model_product.php | 9 +- packages/vitec/Configuration/page.tsconfig | 8 +- .../ContentBlocks/Basics/ButtonStyle.yaml | 23 ++ .../Basics/SecondaryButtonStyle.yaml | 23 ++ .../ContentElements/card/config.yaml | 8 +- .../ContentElements/cta-banner/config.yaml | 8 +- .../ContentElements/hero-section/config.yaml | 97 ++++- .../hero-section/language/labels.xlf | 75 +++- .../intro-paragraph/assets/icon.svg | 7 + .../intro-paragraph/config.yaml | 117 ++++++ .../intro-paragraph/language/labels.xlf | 97 +++++ .../templates/backend-preview.html | 76 ++++ .../intro-paragraph/templates/frontend.html | 3 + .../ContentElements/video/assets/icon.svg | 4 + .../ContentElements/video/config.yaml | 46 +++ .../ContentElements/video/language/labels.xlf | 45 +++ .../video/templates/backend-preview.html | 78 ++++ .../video/templates/frontend.html | 3 + .../Private/Language/locallang_buttons.xlf | 59 +++ .../Private/Language/locallang_containers.xlf | 3 + .../Partials/Product/Structureddata.html | 25 -- .../Downloadcard/Backendpreview.html | 39 ++ .../Backendpreview.html | 38 ++ .../Resources/Public/Css/backend-preview.css | 6 +- .../Javascript/structured-data-generator.js | 91 +++++ packages/vitec/ext_localconf.php | 8 + public/.htaccess | 5 + public/.htpasswd | 2 + public/_frontend/.htaccess | 8 +- .../assets/VitecDebugToggle-9pp4AW9x.js | 1 + .../assets/VitecDebugToggle-BzU_nymF.js | 1 + .../assets/VitecDebugToggle-C8gYxgVq.js | 1 + .../assets/VitecDebugToggle-D50ebvSn.js | 1 + public/_frontend/assets/header-BCPgsUEc.js | 1 + public/_frontend/assets/header-CMkDHNN8.js | 1 + public/_frontend/assets/header-CbcGCvAq.js | 1 + public/_frontend/assets/header-DV30IKp8.js | 1 + public/_frontend/assets/index-5XMvTCBl.js | 120 ------ public/_frontend/assets/index-B-ARIO24.css | 1 - public/_frontend/assets/index-BI31wk8i.js | 121 ++++++ public/_frontend/assets/index-BXbyImyv.js | 121 ++++++ public/_frontend/assets/index-C2f_wFri.css | 1 + public/_frontend/assets/index-C_hI5eIM.js | 120 ------ public/_frontend/assets/index-Cq4vmvLV.js | 121 ++++++ public/_frontend/assets/index-DA8NWTnl.css | 1 - public/_frontend/assets/index-DSSM3bkw.css | 1 + public/_frontend/assets/index-Dg4a87qg.js | 120 ------ public/_frontend/assets/index-Dsu1vSvE.css | 1 - public/_frontend/assets/index-JMQ9Ot1Q.css | 1 - public/_frontend/assets/index-QAXHHeve.js | 119 ------ public/_frontend/assets/index-jouuqNaB.js | 121 ++++++ public/_frontend/assets/index-lpUAu6vv.css | 1 + public/_frontend/assets/jszip.min-CXx7QQuN.js | 2 + public/_frontend/assets/jszip.min-Df29-9GY.js | 2 + public/_frontend/assets/jszip.min-DwEIuiR-.js | 2 + public/_frontend/assets/jszip.min-PsHYDUlW.js | 2 + public/_frontend/assets/text-BJeSE9y2.js | 1 + public/_frontend/assets/text-DC_eQsul.js | 1 + public/_frontend/assets/text-Dp3AIh-4.js | 1 + public/_frontend/assets/text-Dq9lSgUc.js | 1 + public/_frontend/assets/textpic-BPDk9WiS.js | 1 + public/_frontend/assets/textpic-C5BEsMbL.js | 1 + public/_frontend/assets/textpic-C_Bm3Pra.js | 1 + public/_frontend/assets/textpic-MhQPwqZV.js | 1 + .../_frontend/assets/vitec_card-BeOiYQ4P.js | 1 + .../_frontend/assets/vitec_card-ChowkB3a.js | 1 + .../_frontend/assets/vitec_card-D8OSg1v2.js | 1 + .../_frontend/assets/vitec_card-DvvsWZfb.js | 1 + .../_frontend/assets/vitec_cols-2cWKAEap.js | 1 + .../_frontend/assets/vitec_cols-BVGaK0W-.js | 1 + .../_frontend/assets/vitec_cols-D2y4u0OF.js | 1 + .../_frontend/assets/vitec_cols-PU_VyQ7B.js | 1 + .../assets/vitec_container-B2PT_nmh.js | 1 + .../assets/vitec_container-CjsIqmJl.js | 1 + .../assets/vitec_container-D_UF3jTW.js | 1 + .../assets/vitec_container-DxJb8k2z.js | 1 + .../assets/vitec_ctabanner-9hTz9dda.js | 1 + .../assets/vitec_ctabanner-BVGHlOTR.js | 1 + .../assets/vitec_ctabanner-CR41er8v.js | 1 + .../assets/vitec_ctabanner-z2lMbSUf.js | 1 + .../assets/vitec_datasheets-BiCTxfiq.js | 1 + .../assets/vitec_datasheets-CGEIbvsG.js | 1 + .../assets/vitec_datasheets-CLQYzRk1.js | 1 + .../assets/vitec_datasheets-Chy9IC_0.js | 1 + .../assets/vitec_divider-BW1eXCSB.js | 1 + .../assets/vitec_divider-CRGjdIHI.js | 1 + .../assets/vitec_divider-DFrVEpj4.js | 1 + .../assets/vitec_divider-DdhJi7h4.js | 1 + .../assets/vitec_downloadcard-B1bJLmJY.js | 1 + .../assets/vitec_downloadcard-BW8Vi_bS.js | 1 + .../assets/vitec_downloadcard-DEEmKBX9.js | 1 + .../assets/vitec_downloadcard-VJxl82jk.js | 1 + .../vitec_downloadcardcollection-Bw2XmxMX.js | 1 + .../vitec_downloadcardcollection-CPiNsMSZ.js | 1 + .../vitec_downloadcardcollection-OugWP7GR.js | 1 + .../vitec_downloadcardcollection-htwkZy4M.js | 1 + .../assets/vitec_herosection-BP18eN1V.js | 1 + .../assets/vitec_herosection-CfBguiN2.js | 1 + .../assets/vitec_herosection-DE8AnNdt.js | 1 + .../assets/vitec_herosection-dC77VTJ6.js | 1 + .../assets/vitec_introparagraph-CofMtcTJ.js | 1 + .../assets/vitec_introparagraph-DBYpkACd.js | 1 + .../assets/vitec_introparagraph-DwJBlymb.js | 1 + .../assets/vitec_introparagraph-TGdmmr1P.js | 1 + .../assets/vitec_marketshow-BRsBoPN9.js | 1 + .../assets/vitec_marketshow-BsWkUOPg.js | 1 + .../assets/vitec_marketshow-DdayTTQJ.js | 1 + .../assets/vitec_marketshow-DgggxTO_.js | 1 + .../assets/vitec_productlist-83Xx5YeO.js | 1 + .../assets/vitec_productlist-Blnqx60b.js | 1 + .../assets/vitec_productlist-DlfIGFmO.js | 1 + .../assets/vitec_productlist-dVtXtUJt.js | 1 + .../assets/vitec_productshow-BFboxFcg.js | 1 + .../assets/vitec_productshow-CV7IOthg.js | 1 + .../assets/vitec_productshow-Cf1HHiJg.js | 1 + .../assets/vitec_productshow-rBnXkhEE.js | 1 + .../assets/vitec_usecaseshow-BJLsYJVo.js | 1 + .../assets/vitec_usecaseshow-CclIdchx.js | 1 + .../assets/vitec_usecaseshow-DoFLUQZ8.js | 1 + .../assets/vitec_usecaseshow-DuYn_ml6.js | 1 + .../_frontend/assets/vitec_video-8BP8QnbS.js | 1 + .../_frontend/assets/vitec_video-BdZpN8Ss.js | 1 + .../_frontend/assets/vitec_video-CvNYBDRQ.js | 1 + .../_frontend/assets/vitec_video-nSTDKcwT.js | 1 + public/_frontend/index.html | 4 +- 145 files changed, 2742 insertions(+), 579 deletions(-) create mode 100755 packages/vitec/Classes/Backend/FormEngine/StructuredDataGeneratorWizard.php create mode 100755 packages/vitec/Classes/Controller/Backend/StructuredDataController.php create mode 100755 packages/vitec/Classes/Service/StructuredDataService.php create mode 100755 packages/vitec/Classes/UserFunc/PageJsonLdRenderer.php create mode 100755 packages/vitec/Configuration/Backend/AjaxRoutes.php mode change 100644 => 100755 packages/vitec/Configuration/FlexForms/Downloadcard.xml create mode 100755 packages/vitec/Configuration/JavaScriptModules.php mode change 100644 => 100755 packages/vitec/Configuration/page.tsconfig create mode 100755 packages/vitec/ContentBlocks/Basics/ButtonStyle.yaml create mode 100755 packages/vitec/ContentBlocks/Basics/SecondaryButtonStyle.yaml mode change 100644 => 100755 packages/vitec/ContentBlocks/ContentElements/cta-banner/config.yaml mode change 100644 => 100755 packages/vitec/ContentBlocks/ContentElements/hero-section/config.yaml mode change 100644 => 100755 packages/vitec/ContentBlocks/ContentElements/hero-section/language/labels.xlf create mode 100755 packages/vitec/ContentBlocks/ContentElements/intro-paragraph/assets/icon.svg create mode 100755 packages/vitec/ContentBlocks/ContentElements/intro-paragraph/config.yaml create mode 100755 packages/vitec/ContentBlocks/ContentElements/intro-paragraph/language/labels.xlf create mode 100755 packages/vitec/ContentBlocks/ContentElements/intro-paragraph/templates/backend-preview.html create mode 100755 packages/vitec/ContentBlocks/ContentElements/intro-paragraph/templates/frontend.html create mode 100755 packages/vitec/ContentBlocks/ContentElements/video/assets/icon.svg create mode 100755 packages/vitec/ContentBlocks/ContentElements/video/config.yaml create mode 100755 packages/vitec/ContentBlocks/ContentElements/video/language/labels.xlf create mode 100755 packages/vitec/ContentBlocks/ContentElements/video/templates/backend-preview.html create mode 100755 packages/vitec/ContentBlocks/ContentElements/video/templates/frontend.html create mode 100755 packages/vitec/Resources/Private/Language/locallang_buttons.xlf delete mode 100644 packages/vitec/Resources/Private/Partials/Product/Structureddata.html create mode 100755 packages/vitec/Resources/Private/Templates/Downloadcard/Backendpreview.html create mode 100755 packages/vitec/Resources/Private/Templates/Downloadcardcollection/Backendpreview.html mode change 100644 => 100755 packages/vitec/Resources/Public/Css/backend-preview.css create mode 100755 packages/vitec/Resources/Public/Javascript/structured-data-generator.js create mode 100644 public/.htpasswd create mode 100644 public/_frontend/assets/VitecDebugToggle-9pp4AW9x.js create mode 100644 public/_frontend/assets/VitecDebugToggle-BzU_nymF.js create mode 100644 public/_frontend/assets/VitecDebugToggle-C8gYxgVq.js create mode 100644 public/_frontend/assets/VitecDebugToggle-D50ebvSn.js create mode 100644 public/_frontend/assets/header-BCPgsUEc.js create mode 100644 public/_frontend/assets/header-CMkDHNN8.js create mode 100644 public/_frontend/assets/header-CbcGCvAq.js create mode 100644 public/_frontend/assets/header-DV30IKp8.js delete mode 100644 public/_frontend/assets/index-5XMvTCBl.js delete mode 100644 public/_frontend/assets/index-B-ARIO24.css create mode 100644 public/_frontend/assets/index-BI31wk8i.js create mode 100644 public/_frontend/assets/index-BXbyImyv.js create mode 100644 public/_frontend/assets/index-C2f_wFri.css delete mode 100644 public/_frontend/assets/index-C_hI5eIM.js create mode 100644 public/_frontend/assets/index-Cq4vmvLV.js delete mode 100644 public/_frontend/assets/index-DA8NWTnl.css create mode 100644 public/_frontend/assets/index-DSSM3bkw.css delete mode 100644 public/_frontend/assets/index-Dg4a87qg.js delete mode 100644 public/_frontend/assets/index-Dsu1vSvE.css delete mode 100644 public/_frontend/assets/index-JMQ9Ot1Q.css delete mode 100644 public/_frontend/assets/index-QAXHHeve.js create mode 100644 public/_frontend/assets/index-jouuqNaB.js create mode 100644 public/_frontend/assets/index-lpUAu6vv.css create mode 100644 public/_frontend/assets/jszip.min-CXx7QQuN.js create mode 100644 public/_frontend/assets/jszip.min-Df29-9GY.js create mode 100644 public/_frontend/assets/jszip.min-DwEIuiR-.js create mode 100644 public/_frontend/assets/jszip.min-PsHYDUlW.js create mode 100644 public/_frontend/assets/text-BJeSE9y2.js create mode 100644 public/_frontend/assets/text-DC_eQsul.js create mode 100644 public/_frontend/assets/text-Dp3AIh-4.js create mode 100644 public/_frontend/assets/text-Dq9lSgUc.js create mode 100644 public/_frontend/assets/textpic-BPDk9WiS.js create mode 100644 public/_frontend/assets/textpic-C5BEsMbL.js create mode 100644 public/_frontend/assets/textpic-C_Bm3Pra.js create mode 100644 public/_frontend/assets/textpic-MhQPwqZV.js create mode 100644 public/_frontend/assets/vitec_card-BeOiYQ4P.js create mode 100644 public/_frontend/assets/vitec_card-ChowkB3a.js create mode 100644 public/_frontend/assets/vitec_card-D8OSg1v2.js create mode 100644 public/_frontend/assets/vitec_card-DvvsWZfb.js create mode 100644 public/_frontend/assets/vitec_cols-2cWKAEap.js create mode 100644 public/_frontend/assets/vitec_cols-BVGaK0W-.js create mode 100644 public/_frontend/assets/vitec_cols-D2y4u0OF.js create mode 100644 public/_frontend/assets/vitec_cols-PU_VyQ7B.js create mode 100644 public/_frontend/assets/vitec_container-B2PT_nmh.js create mode 100644 public/_frontend/assets/vitec_container-CjsIqmJl.js create mode 100644 public/_frontend/assets/vitec_container-D_UF3jTW.js create mode 100644 public/_frontend/assets/vitec_container-DxJb8k2z.js create mode 100644 public/_frontend/assets/vitec_ctabanner-9hTz9dda.js create mode 100644 public/_frontend/assets/vitec_ctabanner-BVGHlOTR.js create mode 100644 public/_frontend/assets/vitec_ctabanner-CR41er8v.js create mode 100644 public/_frontend/assets/vitec_ctabanner-z2lMbSUf.js create mode 100644 public/_frontend/assets/vitec_datasheets-BiCTxfiq.js create mode 100644 public/_frontend/assets/vitec_datasheets-CGEIbvsG.js create mode 100644 public/_frontend/assets/vitec_datasheets-CLQYzRk1.js create mode 100644 public/_frontend/assets/vitec_datasheets-Chy9IC_0.js create mode 100644 public/_frontend/assets/vitec_divider-BW1eXCSB.js create mode 100644 public/_frontend/assets/vitec_divider-CRGjdIHI.js create mode 100644 public/_frontend/assets/vitec_divider-DFrVEpj4.js create mode 100644 public/_frontend/assets/vitec_divider-DdhJi7h4.js create mode 100644 public/_frontend/assets/vitec_downloadcard-B1bJLmJY.js create mode 100644 public/_frontend/assets/vitec_downloadcard-BW8Vi_bS.js create mode 100644 public/_frontend/assets/vitec_downloadcard-DEEmKBX9.js create mode 100644 public/_frontend/assets/vitec_downloadcard-VJxl82jk.js create mode 100644 public/_frontend/assets/vitec_downloadcardcollection-Bw2XmxMX.js create mode 100644 public/_frontend/assets/vitec_downloadcardcollection-CPiNsMSZ.js create mode 100644 public/_frontend/assets/vitec_downloadcardcollection-OugWP7GR.js create mode 100644 public/_frontend/assets/vitec_downloadcardcollection-htwkZy4M.js create mode 100644 public/_frontend/assets/vitec_herosection-BP18eN1V.js create mode 100644 public/_frontend/assets/vitec_herosection-CfBguiN2.js create mode 100644 public/_frontend/assets/vitec_herosection-DE8AnNdt.js create mode 100644 public/_frontend/assets/vitec_herosection-dC77VTJ6.js create mode 100644 public/_frontend/assets/vitec_introparagraph-CofMtcTJ.js create mode 100644 public/_frontend/assets/vitec_introparagraph-DBYpkACd.js create mode 100644 public/_frontend/assets/vitec_introparagraph-DwJBlymb.js create mode 100644 public/_frontend/assets/vitec_introparagraph-TGdmmr1P.js create mode 100644 public/_frontend/assets/vitec_marketshow-BRsBoPN9.js create mode 100644 public/_frontend/assets/vitec_marketshow-BsWkUOPg.js create mode 100644 public/_frontend/assets/vitec_marketshow-DdayTTQJ.js create mode 100644 public/_frontend/assets/vitec_marketshow-DgggxTO_.js create mode 100644 public/_frontend/assets/vitec_productlist-83Xx5YeO.js create mode 100644 public/_frontend/assets/vitec_productlist-Blnqx60b.js create mode 100644 public/_frontend/assets/vitec_productlist-DlfIGFmO.js create mode 100644 public/_frontend/assets/vitec_productlist-dVtXtUJt.js create mode 100644 public/_frontend/assets/vitec_productshow-BFboxFcg.js create mode 100644 public/_frontend/assets/vitec_productshow-CV7IOthg.js create mode 100644 public/_frontend/assets/vitec_productshow-Cf1HHiJg.js create mode 100644 public/_frontend/assets/vitec_productshow-rBnXkhEE.js create mode 100644 public/_frontend/assets/vitec_usecaseshow-BJLsYJVo.js create mode 100644 public/_frontend/assets/vitec_usecaseshow-CclIdchx.js create mode 100644 public/_frontend/assets/vitec_usecaseshow-DoFLUQZ8.js create mode 100644 public/_frontend/assets/vitec_usecaseshow-DuYn_ml6.js create mode 100644 public/_frontend/assets/vitec_video-8BP8QnbS.js create mode 100644 public/_frontend/assets/vitec_video-BdZpN8Ss.js create mode 100644 public/_frontend/assets/vitec_video-CvNYBDRQ.js create mode 100644 public/_frontend/assets/vitec_video-nSTDKcwT.js diff --git a/README.md b/README.md index 313885e..8624cbb 100644 --- a/README.md +++ b/README.md @@ -18,4 +18,9 @@ $debugMode = $request->getAttribute('site')->getSettings()->get('vitec.debugMode -https://www.figma.com/design/0EZHIXmmRoIRk0BljKzhXq/VITEC?node-id=61-220&p=f \ No newline at end of file +https://www.figma.com/design/0EZHIXmmRoIRk0BljKzhXq/VITEC?node-id=61-220&p=f + + + +vitecdev +17ZJfy75sJoU68J6 \ No newline at end of file diff --git a/config/sites/vitec/config.yaml b/config/sites/vitec/config.yaml index 98a6d17..070e13f 100644 --- a/config/sites/vitec/config.yaml +++ b/config/sites/vitec/config.yaml @@ -13,6 +13,8 @@ dependencies: - vitec/cta-banner - vitec/herosection - vitec/card + - vitec/intro-paragraph + - vitec/video frontendBase: '' headless: 1 languages: diff --git a/packages/vitec/Classes/Backend/FormEngine/StructuredDataGeneratorWizard.php b/packages/vitec/Classes/Backend/FormEngine/StructuredDataGeneratorWizard.php new file mode 100755 index 0000000..0745873 --- /dev/null +++ b/packages/vitec/Classes/Backend/FormEngine/StructuredDataGeneratorWizard.php @@ -0,0 +1,65 @@ +initializeResultArray(); + + $row = $this->data['databaseRow'] ?? []; + $rawUid = $row['uid'] ?? null; + $uid = (int)$rawUid; + $isNew = !is_numeric($rawUid) || $uid <= 0; + + $itemName = (string)($this->data['parameterArray']['itemFormElName'] ?? ''); + $buttonId = 'vitec-sd-generate-' . md5($itemName); + + $hint = $isNew + ? 'Bitte das Produkt zuerst speichern, dann steht die Generierung zur Verfügung.' + : 'Erzeugt das JSON-LD aus den gespeicherten Produktdaten und überschreibt den Feldinhalt.'; + + $html = []; + $html[] = '
'; + $html[] = sprintf( + ''; + $html[] = '
' . $hint . '
'; + $html[] = '
'; + + $result['html'] = implode("\n", $html); + $result['javaScriptModules'][] = JavaScriptModuleInstruction::create( + '@evomedien/vitec/structured-data-generator.js' + ); + + return $result; + } +} diff --git a/packages/vitec/Classes/Controller/Backend/StructuredDataController.php b/packages/vitec/Classes/Controller/Backend/StructuredDataController.php new file mode 100755 index 0000000..b75fe61 --- /dev/null +++ b/packages/vitec/Classes/Controller/Backend/StructuredDataController.php @@ -0,0 +1,262 @@ +getQueryParams()['uid'] ?? 0); + if ($uid <= 0) { + return new JsonResponse([ + 'success' => false, + 'message' => 'Bitte das Produkt zuerst speichern, dann erneut generieren.', + ]); + } + + $product = $this->loadProduct($uid); + if ($product === null) { + return new JsonResponse([ + 'success' => false, + 'message' => 'Produkt nicht gefunden.', + ]); + } + + $base = $this->resolveCanonicalBase((int)($product['pid'] ?? 0), $request); + + $data = [ + 'uid' => $uid, + 'title' => (string)($product['title'] ?? ''), + 'slug' => (string)($product['slug'] ?? ''), + 'teaser' => (string)($product['teaser'] ?? ''), + 'description' => (string)($product['description'] ?? ''), + 'video' => (string)($product['video'] ?? ''), + 'categories' => $this->categories($uid), + 'videofile' => $this->videoFile($uid, $base), + ]; + + $images = $this->imageUrls($uid, $base); + + // Self-contained snippet → no @id reference to the page-level Organization. + $productNode = $this->structuredDataService->buildProduct($data, $base, $images, false); + $videoNode = $this->structuredDataService->buildVideoObject( + $data, + $base, + $images, + (int)($product['crdate'] ?? $product['tstamp'] ?? 0) + ); + + $nodes = array_values(array_filter([$productNode, $videoNode])); + + // One node → standalone object with @context; multiple → @graph. + if (count($nodes) === 1) { + $document = array_merge(['@context' => 'https://schema.org'], $nodes[0]); + } else { + $document = ['@context' => 'https://schema.org', '@graph' => $nodes]; + } + + $json = (string)json_encode( + $document, + JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE + ); + + return new JsonResponse([ + 'success' => true, + 'jsonLd' => $json, + ]); + } + + /** + * @return array|null + */ + private function loadProduct(int $uid): ?array + { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) + ->getQueryBuilderForTable('tx_vitec_domain_model_product'); + + $row = $queryBuilder + ->select('*') + ->from('tx_vitec_domain_model_product') + ->where( + $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($uid, ParameterType::INTEGER)), + $queryBuilder->expr()->eq('deleted', 0) + ) + ->executeQuery() + ->fetchAssociative(); + + return $row ?: null; + } + + /** + * @return list + */ + private function categories(int $productUid): array + { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) + ->getQueryBuilderForTable('sys_category'); + + $rows = $queryBuilder + ->select('c.title') + ->from('sys_category', 'c') + ->join( + 'c', + 'sys_category_record_mm', + 'mm', + 'mm.uid_local = c.uid AND mm.tablenames = ' . + $queryBuilder->createNamedParameter('tx_vitec_domain_model_product', ParameterType::STRING) . + ' AND mm.fieldname = ' . + $queryBuilder->createNamedParameter('categories', ParameterType::STRING) + ) + ->where( + $queryBuilder->expr()->eq('mm.uid_foreign', $queryBuilder->createNamedParameter($productUid, ParameterType::INTEGER)), + $queryBuilder->expr()->eq('c.deleted', 0), + $queryBuilder->expr()->eq('c.hidden', 0) + ) + ->orderBy('mm.sorting', 'ASC') + ->executeQuery() + ->fetchAllAssociative(); + + return array_map(static fn ($r) => ['title' => (string)($r['title'] ?? '')], $rows); + } + + /** + * Absolute URLs of the product images (original file public URLs). + * Falls back to the OG image when no product images exist. + * + * @return string[] + */ + private function imageUrls(int $productUid, string $base): array + { + $urls = $this->publicUrlsForField($productUid, 'productimage', $base); + if ($urls === []) { + $urls = $this->publicUrlsForField($productUid, 'ogimage', $base); + } + return $urls; + } + + /** + * @return string[] + */ + private function publicUrlsForField(int $productUid, string $fieldName, string $base): array + { + $rows = $this->fileReferences($productUid, $fieldName); + if ($rows === []) { + return []; + } + + $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class); + $urls = []; + foreach ($rows as $row) { + try { + $fileReference = $resourceFactory->getFileReferenceObject((int)$row['uid']); + $publicUrl = (string)$fileReference->getOriginalFile()->getPublicUrl(); + if ($publicUrl !== '') { + $urls[] = $this->structuredDataService->absUrl($publicUrl, $base); + } + } catch (\Throwable $e) { + continue; + } + } + + return $urls; + } + + /** + * @return array{url:string}|null + */ + private function videoFile(int $productUid, string $base): ?array + { + $rows = $this->fileReferences($productUid, 'videofile'); + if ($rows === []) { + return null; + } + + $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class); + try { + $fileReference = $resourceFactory->getFileReferenceObject((int)$rows[0]['uid']); + $publicUrl = (string)$fileReference->getOriginalFile()->getPublicUrl(); + if ($publicUrl === '') { + return null; + } + return ['url' => $this->structuredDataService->absUrl($publicUrl, $base)]; + } catch (\Throwable $e) { + return null; + } + } + + /** + * @return array> + */ + private function fileReferences(int $productUid, string $fieldName): array + { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) + ->getQueryBuilderForTable('sys_file_reference'); + + return $queryBuilder + ->select('uid') + ->from('sys_file_reference') + ->where( + $queryBuilder->expr()->eq('uid_foreign', $queryBuilder->createNamedParameter($productUid, ParameterType::INTEGER)), + $queryBuilder->expr()->eq('tablenames', $queryBuilder->createNamedParameter('tx_vitec_domain_model_product', ParameterType::STRING)), + $queryBuilder->expr()->eq('fieldname', $queryBuilder->createNamedParameter($fieldName, ParameterType::STRING)), + $queryBuilder->expr()->eq('deleted', 0), + $queryBuilder->expr()->eq('hidden', 0) + ) + ->orderBy('sorting_foreign', 'ASC') + ->executeQuery() + ->fetchAllAssociative(); + } + + private function resolveCanonicalBase(int $pid, ServerRequestInterface $request): string + { + if ($pid > 0) { + try { + $site = GeneralUtility::makeInstance(SiteFinder::class)->getSiteByPageId($pid); + $configured = trim((string)($site->getSettings()->get('seo.site.canonicalBase') ?? '')); + if ($configured !== '') { + return rtrim($configured, '/'); + } + } catch (\Throwable $e) { + // fall through to request host + } + } + + $normalizedParams = $request->getAttribute('normalizedParams'); + if ($normalizedParams !== null) { + return rtrim($normalizedParams->getSiteUrl(), '/'); + } + + return ''; + } +} diff --git a/packages/vitec/Classes/Service/StructuredDataService.php b/packages/vitec/Classes/Service/StructuredDataService.php new file mode 100755 index 0000000..9793c31 --- /dev/null +++ b/packages/vitec/Classes/Service/StructuredDataService.php @@ -0,0 +1,370 @@ +` payload that + * the JS frontend injects into the page . + * + * Conventions: + * - Absolute URLs everywhere (Google requirement). Use {@see absUrl()}. + * - Stable @id anchors per entity so nodes can reference each other across + * the different scripts on a page (Organization is the central publisher). + */ +final class StructuredDataService +{ + public const ORGANIZATION_FRAGMENT = '#organization'; + public const WEBSITE_FRAGMENT = '#website'; + + /** + * schema.org/Organization — the central publisher node. Emitted on every + * page so its @id can be referenced by WebSite, Article and Product. + * + * @param array{ + * name?:string, legalName?:string, base:string, logoUrl?:string, + * sameAs?:string[], email?:string, phone?:string, + * street?:string, postalCode?:string, locality?:string, country?:string + * } $cfg + * @return array + */ + public function buildOrganization(array $cfg): array + { + $base = $this->normalizeBase($cfg['base'] ?? '/'); + + $org = [ + '@type' => 'Organization', + '@id' => $base . self::ORGANIZATION_FRAGMENT, + 'name' => (string)($cfg['name'] ?? ''), + 'url' => $base . '/', + ]; + + if (!empty($cfg['legalName'])) { + $org['legalName'] = (string)$cfg['legalName']; + } + + if (!empty($cfg['logoUrl'])) { + $logo = $this->absUrl((string)$cfg['logoUrl'], $base); + $org['logo'] = [ + '@type' => 'ImageObject', + 'url' => $logo, + ]; + // Google reuses logo as the Organization image fallback. + $org['image'] = $logo; + } + + $sameAs = array_values(array_filter(array_map('trim', $cfg['sameAs'] ?? []))); + if ($sameAs !== []) { + $org['sameAs'] = $sameAs; + } + + $contact = []; + if (!empty($cfg['phone'])) { + $contact['telephone'] = (string)$cfg['phone']; + } + if (!empty($cfg['email'])) { + $contact['email'] = (string)$cfg['email']; + } + if ($contact !== []) { + $org['contactPoint'] = array_merge([ + '@type' => 'ContactPoint', + 'contactType' => 'customer support', + ], $contact); + } + + $address = array_filter([ + 'streetAddress' => (string)($cfg['street'] ?? ''), + 'postalCode' => (string)($cfg['postalCode'] ?? ''), + 'addressLocality' => (string)($cfg['locality'] ?? ''), + 'addressCountry' => (string)($cfg['country'] ?? ''), + ], static fn ($v) => $v !== ''); + if ($address !== []) { + $org['address'] = array_merge(['@type' => 'PostalAddress'], $address); + } + + return $org; + } + + /** + * schema.org/WebSite — emitted on the home page. Links to Organization as + * publisher. + * + * @return array + */ + public function buildWebSite(string $base, string $name, bool $hasOrganization): array + { + $base = $this->normalizeBase($base); + + $site = [ + '@type' => 'WebSite', + '@id' => $base . self::WEBSITE_FRAGMENT, + 'url' => $base . '/', + 'name' => $name, + ]; + + if ($hasOrganization) { + $site['publisher'] = ['@id' => $base . self::ORGANIZATION_FRAGMENT]; + } + + return $site; + } + + /** + * schema.org/BreadcrumbList from an ordered rootline. + * + * @param list $items absolute or root-relative urls + * @return array|null null when fewer than 2 levels (no useful breadcrumb) + */ + public function buildBreadcrumbList(array $items, string $base): ?array + { + $base = $this->normalizeBase($base); + + $listElements = []; + $position = 1; + foreach ($items as $item) { + $name = trim((string)($item['name'] ?? '')); + if ($name === '') { + continue; + } + $element = [ + '@type' => 'ListItem', + 'position' => $position, + 'name' => $name, + ]; + $url = (string)($item['url'] ?? ''); + if ($url !== '') { + $element['item'] = $this->absUrl($url, $base); + } + $listElements[] = $element; + $position++; + } + + if (count($listElements) < 2) { + return null; + } + + return [ + '@type' => 'BreadcrumbList', + 'itemListElement' => $listElements, + ]; + } + + /** + * schema.org/NewsArticle for a news detail page. + * + * @param array $page pages record (title, author, crdate, …) + * @param string[] $images absolute image urls (may be empty) + * @return array + */ + public function buildNewsArticle(array $page, string $base, array $images, bool $hasOrganization): array + { + $base = $this->normalizeBase($base); + + $headline = trim((string)($page['seo_title'] ?? '')) ?: trim((string)($page['title'] ?? '')); + $description = trim((string)($page['description'] ?? '')) ?: trim((string)($page['abstract'] ?? '')); + + $article = [ + '@type' => 'NewsArticle', + 'headline' => $headline, + 'datePublished' => $this->isoDate((int)($page['crdate'] ?? 0)), + 'dateModified' => $this->isoDate((int)($page['SYS_LASTCHANGED'] ?? $page['tstamp'] ?? 0)), + ]; + + if (!empty($page['slug'])) { + $article['mainEntityOfPage'] = [ + '@type' => 'WebPage', + '@id' => $this->absUrl((string)$page['slug'], $base), + ]; + } + if ($description !== '') { + $article['description'] = $description; + } + if ($images !== []) { + $article['image'] = array_values($images); + } + + $author = trim((string)($page['author'] ?? '')); + if ($author !== '') { + $person = ['@type' => 'Person', 'name' => $author]; + if (!empty($page['author_email'])) { + $person['email'] = (string)$page['author_email']; + } + $article['author'] = $person; + } + + if ($hasOrganization) { + $article['publisher'] = ['@id' => $base . self::ORGANIZATION_FRAGMENT]; + } + + return $article; + } + + /** + * schema.org/Product. VITEC products are B2B AV/broadcast tech without + * public pricing, so no `offers` node is emitted (would be invalid empty). + * + * @param array $p serialized product (title, description, images, …) + * @param string[] $images absolute image urls + * @return array + */ + public function buildProduct(array $p, string $base, array $images, bool $hasOrganization): array + { + $base = $this->normalizeBase($base); + + $name = trim((string)($p['title'] ?? '')); + $description = $this->plainText((string)($p['teaser'] ?? '')) ?: $this->plainText((string)($p['description'] ?? '')); + + $product = [ + '@type' => 'Product', + 'name' => $name, + ]; + + if ($description !== '') { + $product['description'] = $description; + } + if ($images !== []) { + $product['image'] = array_values($images); + } + if (!empty($p['slug'])) { + $product['url'] = $this->absUrl('/product/' . (string)$p['slug'], $base); + } + if (!empty($p['uid'])) { + $product['sku'] = 'VITEC-' . (int)$p['uid']; + } + + // First category as schema.org category. + $categories = $p['categories'] ?? []; + if (is_array($categories) && isset($categories[0]['title'])) { + $product['category'] = (string)$categories[0]['title']; + } + + $product['brand'] = ['@type' => 'Brand', 'name' => 'VITEC']; + + if ($hasOrganization) { + $product['manufacturer'] = ['@id' => $base . self::ORGANIZATION_FRAGMENT]; + } + + return $product; + } + + /** + * schema.org/VideoObject from a product's video. Supports both an external + * embed URL (`video`) and an uploaded FAL file (`videofile`). Returns null + * when there is too little data for valid markup (Google requires at least + * name + thumbnailUrl + uploadDate). + * + * @param array $p serialized product + * @param string[] $thumbnails absolute image urls (used as thumbnailUrl) + * @param int $uploadTs unix timestamp for uploadDate + * @return array|null + */ + public function buildVideoObject(array $p, string $base, array $thumbnails, int $uploadTs): ?array + { + $base = $this->normalizeBase($base); + + $embedUrl = trim((string)($p['video'] ?? '')); + $fileUrl = ''; + if (is_array($p['videofile'] ?? null) && !empty($p['videofile']['url'])) { + $fileUrl = $this->absUrl((string)$p['videofile']['url'], $base); + } + + if ($embedUrl === '' && $fileUrl === '') { + return null; + } + if ($thumbnails === []) { + // Without a thumbnail Google rejects the VideoObject; skip rather + // than emit invalid markup. + return null; + } + + $name = trim((string)($p['title'] ?? '')); + $description = $this->plainText((string)($p['teaser'] ?? '')) ?: $name; + + $video = [ + '@type' => 'VideoObject', + 'name' => $name !== '' ? $name : 'Video', + 'description' => $description !== '' ? $description : $name, + 'thumbnailUrl' => array_values($thumbnails), + 'uploadDate' => $this->isoDate($uploadTs), + ]; + + if ($embedUrl !== '') { + $video['embedUrl'] = $embedUrl; + } + if ($fileUrl !== '') { + $video['contentUrl'] = $fileUrl; + } + + return $video; + } + + /** + * Wrap one or more schema nodes into a single @graph document string. + * + * @param list|null> $nodes + */ + public function encodeGraph(array $nodes): string + { + $nodes = array_values(array_filter($nodes)); + if ($nodes === []) { + return ''; + } + + $document = [ + '@context' => 'https://schema.org', + '@graph' => $nodes, + ]; + + return (string)json_encode($document, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + } + + /** + * Make a possibly root-relative URL absolute against the canonical base. + */ + public function absUrl(string $url, string $base): string + { + $url = trim($url); + if ($url === '') { + return ''; + } + if (preg_match('#^https?://#i', $url) === 1) { + return $url; + } + return $this->normalizeBase($base) . '/' . ltrim($url, '/'); + } + + /** + * Strip a trailing slash and whitespace from the canonical base. + */ + private function normalizeBase(string $base): string + { + $base = rtrim(trim($base), '/'); + return $base; + } + + private function isoDate(int $timestamp): string + { + if ($timestamp <= 0) { + return ''; + } + return date('c', $timestamp); + } + + /** + * Collapse HTML/whitespace to a plain single-line string for schema text + * fields (descriptions must not contain markup). + */ + private function plainText(string $value): string + { + $value = strip_tags($value); + $value = preg_replace('/\s+/u', ' ', $value) ?? $value; + return trim($value); + } +} diff --git a/packages/vitec/Classes/UserFunc/DownloadcardJsonRenderer.php b/packages/vitec/Classes/UserFunc/DownloadcardJsonRenderer.php index fd3983f..eff7c91 100755 --- a/packages/vitec/Classes/UserFunc/DownloadcardJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/DownloadcardJsonRenderer.php @@ -217,6 +217,20 @@ class DownloadcardJsonRenderer return null; } + + $thumbnailUrl = null; + try { + $fileObj = GeneralUtility::makeInstance(TYPO3CMSCoreResourceResourceFactory::class) + ->getFileObject((int)$row["file_uid"]); + $processed = $fileObj->process( + TYPO3CMSCoreResourceProcessedFile::CONTEXT_IMAGEPREVIEW, + ["width" => 400, "height" => 566] + ); + $thumbnailUrl = $processed->getPublicUrl(); + } catch (Throwable $e) { + // ignore — keep null + } + return [ 'uid' => (int)$row['uid'], 'title' => (string)($row['title'] ?? ''), @@ -284,11 +298,26 @@ class DownloadcardJsonRenderer return null; } + $thumbnailUrl = null; + try { + $fileObj = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Resource\ResourceFactory::class) + ->getFileObject((int)$row['file_uid']); + $processed = $fileObj->process( + \TYPO3\CMS\Core\Resource\ProcessedFile::CONTEXT_IMAGEPREVIEW, + ['width' => 400, 'height' => 566] + ); + $thumbnailUrl = $processed->getPublicUrl(); + } catch (\Throwable $e) { + // ignore — keep null + } + return [ + 'uid' => (int)$row['file_uid'], 'name' => (string)($row['name'] ?? ''), 'url' => '/fileadmin' . ($row['identifier'] ?? ''), - 'size' => (int)($row['size'] ?? 0), + 'thumbnail' => $thumbnailUrl, + 'size' => (int)($row['size'] ?? 0), 'extension' => (string)($row['extension'] ?? ''), 'mimeType' => (string)($row['mime_type'] ?? ''), 'title' => (string)($row['title'] ?? ''), diff --git a/packages/vitec/Classes/UserFunc/DownloadcardcollectionJsonRenderer.php b/packages/vitec/Classes/UserFunc/DownloadcardcollectionJsonRenderer.php index c31e527..e742ff5 100755 --- a/packages/vitec/Classes/UserFunc/DownloadcardcollectionJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/DownloadcardcollectionJsonRenderer.php @@ -212,6 +212,7 @@ class DownloadcardcollectionJsonRenderer ); $srcset[] = [ 'url' => $imageService->getImageUri($variant), + 'thumbnail' => $thumbnailUrl, 'width' => $width, 'descriptor' => $width . 'w', ]; @@ -225,6 +226,7 @@ class DownloadcardcollectionJsonRenderer return [ 'uid' => (int)$fileRefData['uid'], 'url' => $imageService->getImageUri($default), + 'thumbnail' => $thumbnailUrl, 'title' => $fileRefData['title'] ?? '', 'alternative' => $fileRefData['alternative'] ?? '', 'description' => $fileRefData['description'] ?? '', @@ -297,10 +299,25 @@ class DownloadcardcollectionJsonRenderer return null; } + + $thumbnailUrl = null; + try { + $fileObj = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Resource\ResourceFactory::class) + ->getFileObject((int)$row['file_uid']); + $processed = $fileObj->process( + \TYPO3\CMS\Core\Resource\ProcessedFile::CONTEXT_IMAGEPREVIEW, + ['width' => 400, 'height' => 566] + ); + $thumbnailUrl = $processed->getPublicUrl(); + } catch (\Throwable $e) { + // ignore — keep null + } + return [ 'uid' => (int)$row['file_uid'], 'name' => (string)($row['name'] ?? ''), 'url' => '/fileadmin' . ($row['identifier'] ?? ''), + 'thumbnail' => $thumbnailUrl, 'size' => (int)($row['size'] ?? 0), 'extension' => (string)($row['extension'] ?? ''), 'mimeType' => (string)($row['mime_type'] ?? ''), diff --git a/packages/vitec/Classes/UserFunc/PageJsonLdRenderer.php b/packages/vitec/Classes/UserFunc/PageJsonLdRenderer.php new file mode 100755 index 0000000..05482c9 --- /dev/null +++ b/packages/vitec/Classes/UserFunc/PageJsonLdRenderer.php @@ -0,0 +1,228 @@ +render + * + * The JS frontend wraps the returned string in + * `` inside the page . + * + * Organization data is pulled from site settings (category "seo"); the + * canonical absolute base URL likewise (with a request-host fallback) because + * the headless site base is "/". + * + * Exception-safe: returns '' on any failure, never breaks the page JSON. + */ +final class PageJsonLdRenderer +{ + /** News-detail backend layouts (see BackendLayoutDataProvider::LAYOUT_MAP). */ + private const NEWS_DETAIL_LAYOUTS = [13, 14, 15]; + + #[AsAllowedCallable] + public function render(string $content, array $conf): string + { + try { + $request = $GLOBALS['TYPO3_REQUEST'] ?? null; + if ($request === null) { + return ''; + } + + $pageInfo = $request->getAttribute('frontend.page.information'); + if ($pageInfo === null) { + return ''; + } + + $pageId = (int)$pageInfo->getId(); + $pageRecord = $pageInfo->getPageRecord(); + $rootLine = $pageInfo->getRootLine(); + + $site = $request->getAttribute('site'); + $settings = $site?->getSettings(); + $base = $this->resolveCanonicalBase($request, $settings); + + $service = GeneralUtility::makeInstance(StructuredDataService::class); + + $orgCfg = $this->organizationConfig($settings, $base); + $hasOrganization = ($orgCfg['name'] ?? '') !== ''; + + $nodes = []; + + // Organization on every page (anchors @id references). + if ($hasOrganization) { + $nodes[] = $service->buildOrganization($orgCfg); + } + + // WebSite only on the site root / home page. + $isHome = $site !== null && $pageId === (int)$site->getRootPageId(); + if ($isHome) { + $siteName = (string)($settings?->get('seo.site.name') ?? ''); + if ($siteName === '') { + $siteName = (string)($orgCfg['name'] ?? ''); + } + $nodes[] = $service->buildWebSite($base, $siteName, $hasOrganization); + } + + // BreadcrumbList from the rootline. + $breadcrumb = $service->buildBreadcrumbList($this->breadcrumbItems($rootLine), $base); + if ($breadcrumb !== null) { + $nodes[] = $breadcrumb; + } + + // NewsArticle on news-detail pages. + if (in_array((int)($pageRecord['layout'] ?? 0), self::NEWS_DETAIL_LAYOUTS, true)) { + $nodes[] = $service->buildNewsArticle( + $pageRecord, + $base, + $this->pageMediaUrls($pageId, $base, $service), + $hasOrganization + ); + } + + return $service->encodeGraph($nodes); + } catch (\Throwable $e) { + return ''; + } + } + + /** + * Canonical absolute base, e.g. "https://www.vitec.com". + * Prefers the explicit site setting, falls back to the request host. + */ + private function resolveCanonicalBase($request, $settings): string + { + $configured = trim((string)($settings?->get('seo.site.canonicalBase') ?? '')); + if ($configured !== '') { + return rtrim($configured, '/'); + } + + $normalizedParams = $request->getAttribute('normalizedParams'); + if ($normalizedParams !== null) { + return rtrim($normalizedParams->getSiteUrl(), '/'); + } + + return ''; + } + + /** + * Assemble the Organization config from site settings. + * + * @return array + */ + private function organizationConfig($settings, string $base): array + { + $get = static fn (string $key): string => trim((string)($settings?->get($key) ?? '')); + + $sameAsRaw = $get('seo.organization.sameAs'); + $sameAs = $sameAsRaw !== '' + ? array_filter(array_map('trim', preg_split('/[\r\n,]+/', $sameAsRaw) ?: [])) + : []; + + return [ + 'name' => $get('seo.organization.name'), + 'legalName' => $get('seo.organization.legalName'), + 'base' => $base, + 'logoUrl' => $get('seo.organization.logoUrl'), + 'sameAs' => array_values($sameAs), + 'email' => $get('seo.organization.email'), + 'phone' => $get('seo.organization.phone'), + 'street' => $get('seo.organization.street'), + 'postalCode' => $get('seo.organization.postalCode'), + 'locality' => $get('seo.organization.locality'), + 'country' => $get('seo.organization.country'), + ]; + } + + /** + * Build ordered breadcrumb items (root → current) from the rootline. + * Skips spacers, folders and recyclers; uses nav_title with title fallback. + * + * @param array> $rootLine + * @return list + */ + private function breadcrumbItems(array $rootLine): array + { + $skipDoktypes = [199, 254, 255]; + $items = []; + + // Rootline is ordered current → root; reverse for breadcrumb order. + foreach (array_reverse($rootLine) as $page) { + $doktype = (int)($page['doktype'] ?? 1); + if (in_array($doktype, $skipDoktypes, true)) { + continue; + } + // Matches the visible headless breadcrumb (HMENU special=rootline), + // which keeps nav_hide pages for path integrity. + $name = trim((string)($page['nav_title'] ?? '')) ?: trim((string)($page['title'] ?? '')); + if ($name === '') { + continue; + } + $items[] = [ + 'name' => $name, + 'url' => (string)($page['slug'] ?? ''), + ]; + } + + return $items; + } + + /** + * Absolute URLs of the page's `media` images (used as NewsArticle image). + * + * @return string[] + */ + private function pageMediaUrls(int $pageId, string $base, StructuredDataService $service): array + { + $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) + ->getQueryBuilderForTable('sys_file_reference'); + + $rows = $queryBuilder + ->select('uid') + ->from('sys_file_reference') + ->where( + $queryBuilder->expr()->eq('uid_foreign', $queryBuilder->createNamedParameter($pageId, ParameterType::INTEGER)), + $queryBuilder->expr()->eq('tablenames', $queryBuilder->createNamedParameter('pages', ParameterType::STRING)), + $queryBuilder->expr()->eq('fieldname', $queryBuilder->createNamedParameter('media', ParameterType::STRING)), + $queryBuilder->expr()->eq('deleted', 0), + $queryBuilder->expr()->eq('hidden', 0) + ) + ->orderBy('sorting_foreign', 'ASC') + ->executeQuery() + ->fetchAllAssociative(); + + if ($rows === []) { + return []; + } + + $resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class); + $imageService = GeneralUtility::makeInstance(ImageService::class); + $urls = []; + + foreach ($rows as $row) { + try { + $fileReference = $resourceFactory->getFileReferenceObject((int)$row['uid']); + $processed = $imageService->applyProcessingInstructions($fileReference, ['width' => 1200]); + $urls[] = $service->absUrl($imageService->getImageUri($processed), $base); + } catch (\Throwable $e) { + continue; + } + } + + return $urls; + } +} diff --git a/packages/vitec/Classes/UserFunc/ProductShowJsonRenderer.php b/packages/vitec/Classes/UserFunc/ProductShowJsonRenderer.php index 78b84a3..4ba8f80 100755 --- a/packages/vitec/Classes/UserFunc/ProductShowJsonRenderer.php +++ b/packages/vitec/Classes/UserFunc/ProductShowJsonRenderer.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Evomedien\Vitec\UserFunc; +use Evomedien\Vitec\Service\StructuredDataService; use TYPO3\CMS\Core\Attribute\AsAllowedCallable; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Service\FlexFormService; @@ -12,7 +13,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Resource\ResourceFactory; use TYPO3\CMS\Core\Imaging\ImageManipulation\CropVariantCollection; use TYPO3\CMS\Core\Resource\FileReference; -use TYPO3\CMS\Core\Imaging\ImageService; +use TYPO3\CMS\Extbase\Service\ImageService; use Doctrine\DBAL\ParameterType; /** @@ -176,7 +177,7 @@ class ProductShowJsonRenderer { $uid = (int)$product['uid']; - return [ + $data = [ 'uid' => $uid, 'title' => (string)($product['title'] ?? ''), @@ -215,6 +216,79 @@ class ProductShowJsonRenderer 'videofile' => $this->getProductVideoFile($uid), 'relatedprodukt' => $this->getRelatedProducts($uid), ]; + + // schema.org JSON-LD (Product + optional VideoObject) as a ready-to-emit + // @graph string. The frontend injects it as \ No newline at end of file diff --git a/packages/vitec/Resources/Private/Templates/Downloadcard/Backendpreview.html b/packages/vitec/Resources/Private/Templates/Downloadcard/Backendpreview.html new file mode 100755 index 0000000..c904f43 --- /dev/null +++ b/packages/vitec/Resources/Private/Templates/Downloadcard/Backendpreview.html @@ -0,0 +1,39 @@ + + + + +
+ +
+ +
+
VITEC · Download Card
+ +

+ + {data.header} + + Download Card (kein Header) + + +

+ +
+ + Konfiguration im FlexForm: + Produkt oder Download wählen, + Layout-Variante setzen. + +
+
+ +
+ ⬇ Single Download / Product + + ⚙ FlexForm configured + +
+ +
+ + diff --git a/packages/vitec/Resources/Private/Templates/Downloadcardcollection/Backendpreview.html b/packages/vitec/Resources/Private/Templates/Downloadcardcollection/Backendpreview.html new file mode 100755 index 0000000..01f01ca --- /dev/null +++ b/packages/vitec/Resources/Private/Templates/Downloadcardcollection/Backendpreview.html @@ -0,0 +1,38 @@ + + + + +
+ +
⬇⬇
+ +
+
VITEC · Download Card Collection
+ +

+ + {data.header} + + Download Card Collection (kein Header) + + +

+ +
+ + Multi-Download-Auswahl mit optionalem Header-Image. + Konfiguration im FlexForm. + +
+
+ +
+ ⬇⬇ Multi-Download + + ⚙ FlexForm configured + +
+ +
+ + diff --git a/packages/vitec/Resources/Public/Css/backend-preview.css b/packages/vitec/Resources/Public/Css/backend-preview.css old mode 100644 new mode 100755 index 89cb68c..ba5ffeb --- a/packages/vitec/Resources/Public/Css/backend-preview.css +++ b/packages/vitec/Resources/Public/Css/backend-preview.css @@ -56,6 +56,8 @@ /* Content-Slot */ .vitec-preview__body { min-width: 0; + overflow-wrap: anywhere; + word-break: break-word; } .vitec-preview__label { @@ -106,7 +108,7 @@ flex-direction: column; gap: 0.25rem; align-items: flex-end; - min-width: 120px; + min-width: 80px; } .vitec-badge { @@ -193,7 +195,7 @@ } /* Responsive Fallback */ -@media (max-width: 680px) { +@media (max-width: 900px) { .vitec-preview { grid-template-columns: 1fr; } diff --git a/packages/vitec/Resources/Public/Javascript/structured-data-generator.js b/packages/vitec/Resources/Public/Javascript/structured-data-generator.js new file mode 100755 index 0000000..3a02f8d --- /dev/null +++ b/packages/vitec/Resources/Public/Javascript/structured-data-generator.js @@ -0,0 +1,91 @@ +/** + * VITEC – Structured Data generator button (FormEngine fieldWizard). + * EXT:vitec/Resources/Public/Javascript/structured-data-generator.js + * + * Self-initializing: on load it installs a single delegated click handler for + * any button matching [data-vitec-sd-generate]. This avoids relying on the + * JavaScriptModuleInstruction ->instance() payload (which is unreliable for + * fieldWizards) and also works for fields added to the DOM later. + * + * On click it calls the backend AJAX endpoint for the product uid and writes + * the returned JSON-LD string into the associated `structureddata` textarea. + * The textarea is resolved by its form name (data-field-name) with a fallback + * to the surrounding FormEngine field-item container. + */ +import DocumentService from "@typo3/core/document-service.js"; +import AjaxRequest from "@typo3/core/ajax/ajax-request.js"; +import Notification from "@typo3/backend/notification.js"; + +const SELECTOR = "[data-vitec-sd-generate]"; + +function findField(button) { + const name = button.dataset.fieldName; + if (name) { + const byName = document.querySelector('[name="' + name + '"]'); + if (byName !== null) { + return byName; + } + } + const item = button.closest(".t3js-formengine-field-item"); + if (item !== null) { + return item.querySelector("textarea, input[type=text], input:not([type])"); + } + return null; +} + +async function generate(button) { + const field = findField(button); + if (!field) { + Notification.error("Fehler", "Das Structured-Data-Feld wurde nicht gefunden."); + return; + } + + const ajaxUrl = TYPO3.settings.ajaxUrls["vitec_structureddata_generate"]; + if (!ajaxUrl) { + Notification.error("Fehler", "AJAX-Route nicht registriert."); + return; + } + + button.disabled = true; + try { + const response = await new AjaxRequest(ajaxUrl) + .withQueryArguments({ uid: button.dataset.uid }) + .get(); + const data = await response.resolve(); + + if (data.success) { + field.value = data.jsonLd; + field.dispatchEvent(new Event("change", { bubbles: true })); + Notification.success( + "Structured Data", + "JSON-LD wurde generiert und in das Feld geschrieben." + ); + } else { + Notification.warning("Hinweis", data.message || "Generierung nicht möglich."); + } + } catch (error) { + Notification.error("Fehler", "Die Generierung ist fehlgeschlagen."); + } finally { + button.disabled = false; + } +} + +function init() { + // Guard against binding more than once (the module instruction may be + // emitted per field instance, but the module itself is a singleton). + if (document.body.dataset.vitecSdBound === "1") { + return; + } + document.body.dataset.vitecSdBound = "1"; + + document.addEventListener("click", (event) => { + const button = event.target.closest(SELECTOR); + if (button === null) { + return; + } + event.preventDefault(); + generate(button); + }); +} + +DocumentService.ready().then(init); diff --git a/packages/vitec/ext_localconf.php b/packages/vitec/ext_localconf.php index 5da9272..b57ed44 100755 --- a/packages/vitec/ext_localconf.php +++ b/packages/vitec/ext_localconf.php @@ -28,6 +28,14 @@ $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][\TYPO3\CMS\Backend\View\BackendLay // Register custom VITEC CKEditor RTE preset $GLOBALS['TYPO3_CONF_VARS']['RTE']['Presets']['vitec'] = 'EXT:vitec/Configuration/RTE/Vitec.yaml'; +// FormEngine fieldWizard: "Structured Data generieren" button below the +// product structureddata field (see TCA + StructuredDataGeneratorWizard). +$GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['nodeRegistry'][1750000000] = [ + 'nodeName' => 'structuredDataGenerator', + 'priority' => 40, + 'class' => \Evomedien\Vitec\Backend\FormEngine\StructuredDataGeneratorWizard::class, +]; + (static function () { // Register plugins ExtensionUtility::configurePlugin( diff --git a/public/.htaccess b/public/.htaccess index 100555f..522d097 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -391,3 +391,8 @@ FileETag None # Add your own rules here. + +AuthUserFile "/usr/www/users/vitecevo/live/public/.htpasswd" +AuthName "DEV" +AuthType Basic +require valid-user diff --git a/public/.htpasswd b/public/.htpasswd new file mode 100644 index 0000000..2b25d74 --- /dev/null +++ b/public/.htpasswd @@ -0,0 +1,2 @@ +vitecdev:$2y$10$V7ZRX1QgxDzDg286o0SdOuwXvwMueb0Hsgucep6zi1yZnD0CQiEh6 +ae:$2y$10$x4WxcCKQxxIQRituKIoWr.NF27Em/XFxCbFw84oMYAq5zBHwb9Wiu diff --git a/public/_frontend/.htaccess b/public/_frontend/.htaccess index fec2ba7..3ca08b9 100644 --- a/public/_frontend/.htaccess +++ b/public/_frontend/.htaccess @@ -7,4 +7,10 @@ RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] -RewriteRule ^ index.html [L] \ No newline at end of file +RewriteRule ^ index.html [L] + + + Header set Cache-Control "no-cache, no-store, must-revalidate" + Header set Pragma "no-cache" + Header set Expires 0 + \ No newline at end of file diff --git a/public/_frontend/assets/VitecDebugToggle-9pp4AW9x.js b/public/_frontend/assets/VitecDebugToggle-9pp4AW9x.js new file mode 100644 index 0000000..4346a66 --- /dev/null +++ b/public/_frontend/assets/VitecDebugToggle-9pp4AW9x.js @@ -0,0 +1 @@ +import{B as e,E as t,F as n,I as r,K as i,L as a,M as o,N as s,O as c,P as l,R as u,U as d,V as f,j as p,k as m,r as h,w as g,z as _}from"./index-BI31wk8i.js";var v=i(d());function y(e){let{controlled:t,default:n,name:r,state:i=`value`}=e,{current:a}=v.useRef(t!==void 0),[o,s]=v.useState(n);return[a?t:o,v.useCallback(e=>{a||s(e)},[])]}var b=y,x=v.createContext(void 0);function S(){return v.useContext(x)}function C(e){return _(`PrivateSwitchBase`,e)}u(`PrivateSwitchBase`,[`root`,`checked`,`disabled`,`input`,`edgeStart`,`edgeEnd`]);var w=f(),T=e=>{let{classes:t,checked:n,disabled:r,edge:i}=e;return a({root:[`root`,n&&`checked`,r&&`disabled`,i&&`edge${l(i)}`],input:[`input`]},C,t)},E=n(m,{name:`MuiSwitchBase`})({padding:9,borderRadius:`50%`,variants:[{props:{edge:`start`,size:`small`},style:{marginLeft:-3}},{props:({edge:e,ownerState:t})=>e===`start`&&t.size!==`small`,style:{marginLeft:-12}},{props:{edge:`end`,size:`small`},style:{marginRight:-3}},{props:({edge:e,ownerState:t})=>e===`end`&&t.size!==`small`,style:{marginRight:-12}}]}),D=n(`input`,{name:`MuiSwitchBase`,shouldForwardProp:r})({cursor:`inherit`,position:`absolute`,opacity:0,width:`100%`,height:`100%`,top:0,left:0,margin:0,padding:0,zIndex:1}),O=v.forwardRef(function(e,t){let{autoFocus:n,checked:r,checkedIcon:i,defaultChecked:a,disabled:o,disableFocusRipple:s=!1,edge:c=!1,icon:l,id:u,inputProps:d,inputRef:f,name:m,onBlur:h,onChange:g,onFocus:_,readOnly:v,required:y=!1,tabIndex:x,type:C,value:O,slots:k={},slotProps:A={},...j}=e,[M,N]=b({controlled:r,default:!!a,name:`SwitchBase`,state:`checked`}),P=S(),F=e=>{_&&_(e),P&&P.onFocus&&P.onFocus(e)},I=e=>{h&&h(e),P&&P.onBlur&&P.onBlur(e)},L=e=>{if(e.nativeEvent.defaultPrevented)return;let t=e.target.checked;N(t),g&&g(e,t)},R=o;P&&R===void 0&&(R=P.disabled);let z=C===`checkbox`||C===`radio`,B={...e,checked:M,disabled:R,disableFocusRipple:s,edge:c},V=T(B),H={slots:k,slotProps:{input:d,...A}},[U,W]=p(`root`,{ref:t,elementType:E,className:V.root,shouldForwardComponentProp:!0,externalForwardedProps:{...H,component:`span`,...j},getSlotProps:e=>({...e,onFocus:t=>{e.onFocus?.(t),F(t)},onBlur:t=>{e.onBlur?.(t),I(t)}}),ownerState:B,additionalProps:{centerRipple:!0,focusRipple:!s,disabled:R,role:void 0,tabIndex:null}}),[G,K]=p(`input`,{ref:f,elementType:D,className:V.input,externalForwardedProps:H,getSlotProps:e=>({...e,onChange:t=>{e.onChange?.(t),L(t)}}),ownerState:B,additionalProps:{autoFocus:n,checked:r,defaultChecked:a,disabled:R,id:z?u:void 0,name:m,readOnly:v,required:y,tabIndex:x,type:C,...C===`checkbox`&&O===void 0?{}:{value:O}}});return(0,w.jsxs)(U,{...W,children:[(0,w.jsx)(G,{...K}),M?i:l]})});function k(e){return _(`MuiSwitch`,e)}var A=u(`MuiSwitch`,[`root`,`edgeStart`,`edgeEnd`,`switchBase`,`colorPrimary`,`colorSecondary`,`sizeSmall`,`sizeMedium`,`checked`,`disabled`,`input`,`thumb`,`track`]),j=e=>{let{classes:t,edge:n,size:r,color:i,checked:o,disabled:s}=e,c=a({root:[`root`,n&&`edge${l(n)}`,`size${l(r)}`],switchBase:[`switchBase`,`color${l(i)}`,o&&`checked`,s&&`disabled`],thumb:[`thumb`],track:[`track`],input:[`input`]},k,t);return{...t,...c}},M=n(`span`,{name:`MuiSwitch`,slot:`Root`,overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.root,n.edge&&t[`edge${l(n.edge)}`],t[`size${l(n.size)}`]]}})({display:`inline-flex`,width:58,height:38,overflow:`hidden`,padding:12,boxSizing:`border-box`,position:`relative`,flexShrink:0,zIndex:0,verticalAlign:`middle`,"@media print":{colorAdjust:`exact`},variants:[{props:{edge:`start`},style:{marginLeft:-8}},{props:{edge:`end`},style:{marginRight:-8}},{props:{size:`small`},style:{width:40,height:24,padding:7,[`& .${A.thumb}`]:{width:16,height:16},[`& .${A.switchBase}`]:{padding:4,[`&.${A.checked}`]:{transform:`translateX(16px)`}}}}]}),N=n(O,{name:`MuiSwitch`,slot:`SwitchBase`,overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.switchBase,{[`& .${A.input}`]:t.input},n.color!==`default`&&t[`color${l(n.color)}`]]}})(s(({theme:e})=>({position:`absolute`,top:0,left:0,zIndex:1,color:e.vars?e.vars.palette.Switch.defaultColor:`${e.palette.mode===`light`?e.palette.common.white:e.palette.grey[300]}`,transition:e.transitions.create([`left`,`transform`],{duration:e.transitions.duration.shortest}),[`&.${A.checked}`]:{transform:`translateX(20px)`},[`&.${A.disabled}`]:{color:e.vars?e.vars.palette.Switch.defaultDisabledColor:`${e.palette.mode===`light`?e.palette.grey[100]:e.palette.grey[600]}`},[`&.${A.checked} + .${A.track}`]:{opacity:.5},[`&.${A.disabled} + .${A.track}`]:{opacity:e.vars?e.vars.opacity.switchTrackDisabled:`${e.palette.mode===`light`?.12:.2}`},[`& .${A.input}`]:{left:`-100%`,width:`300%`}})),s(({theme:e})=>({"&:hover":{backgroundColor:e.alpha((e.vars||e).palette.action.active,(e.vars||e).palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:`transparent`}},variants:[...Object.entries(e.palette).filter(c([`light`])).map(([t])=>({props:{color:t},style:{[`&.${A.checked}`]:{color:(e.vars||e).palette[t].main,"&:hover":{backgroundColor:e.alpha((e.vars||e).palette[t].main,(e.vars||e).palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:`transparent`}},[`&.${A.disabled}`]:{color:e.vars?e.vars.palette.Switch[`${t}DisabledColor`]:`${e.palette.mode===`light`?e.lighten(e.palette[t].main,.62):e.darken(e.palette[t].main,.55)}`}},[`&.${A.checked} + .${A.track}`]:{backgroundColor:(e.vars||e).palette[t].main}}}))]}))),P=n(`span`,{name:`MuiSwitch`,slot:`Track`})(s(({theme:e})=>({height:`100%`,width:`100%`,borderRadius:14/2,zIndex:-1,transition:e.transitions.create([`opacity`,`background-color`],{duration:e.transitions.duration.shortest}),backgroundColor:e.vars?e.vars.palette.common.onBackground:`${e.palette.mode===`light`?e.palette.common.black:e.palette.common.white}`,opacity:e.vars?e.vars.opacity.switchTrack:`${e.palette.mode===`light`?.38:.3}`}))),F=n(`span`,{name:`MuiSwitch`,slot:`Thumb`})(s(({theme:e})=>({boxShadow:(e.vars||e).shadows[1],backgroundColor:`currentColor`,width:20,height:20,borderRadius:`50%`}))),I=v.forwardRef(function(t,n){let r=o({props:t,name:`MuiSwitch`}),{className:i,color:a=`primary`,edge:s=!1,size:c=`medium`,sx:l,slots:u={},slotProps:d={},...f}=r,m={...r,color:a,edge:s,size:c},h=j(m),g={slots:u,slotProps:d},[_,v]=p(`root`,{className:e(h.root,i),elementType:M,externalForwardedProps:g,ownerState:m,additionalProps:{sx:l}}),[y,b]=p(`thumb`,{className:h.thumb,elementType:F,externalForwardedProps:g,ownerState:m}),x=(0,w.jsx)(y,{...b}),[S,C]=p(`track`,{className:h.track,elementType:P,externalForwardedProps:g,ownerState:m});return(0,w.jsxs)(_,{...v,children:[(0,w.jsx)(N,{type:`checkbox`,icon:x,checkedIcon:x,ref:n,ownerState:m,...f,classes:{...h,root:h.switchBase},slots:{...u.switchBase&&{root:u.switchBase},...u.input&&{input:u.input}},slotProps:{...d.switchBase&&{root:typeof d.switchBase==`function`?d.switchBase(m):d.switchBase},input:{role:`switch`},...d.input&&{input:typeof d.input==`function`?d.input(m):d.input}}}),(0,w.jsx)(S,{...C})]})});function L({enabled:e,onChange:n}){return h?(0,w.jsxs)(g,{sx:{position:`fixed`,bottom:`1rem`,right:`1rem`,zIndex:9999,display:`flex`,alignItems:`center`,gap:`0.5rem`,bgcolor:`background.paper`,border:`1px solid`,borderColor:`divider`,borderRadius:`2rem`,px:`0.75rem`,py:`0.25rem`,boxShadow:3},children:[(0,w.jsx)(t,{variant:`caption`,sx:{userSelect:`none`,fontWeight:600,letterSpacing:`0.05em`},children:`Debug`}),(0,w.jsx)(I,{size:`small`,checked:e,onChange:(e,t)=>n(t)})]}):null}export{L as VitecDebugToggle}; \ No newline at end of file diff --git a/public/_frontend/assets/VitecDebugToggle-BzU_nymF.js b/public/_frontend/assets/VitecDebugToggle-BzU_nymF.js new file mode 100644 index 0000000..768adce --- /dev/null +++ b/public/_frontend/assets/VitecDebugToggle-BzU_nymF.js @@ -0,0 +1 @@ +import{B as e,E as t,F as n,I as r,K as i,L as a,M as o,N as s,O as c,P as l,R as u,U as d,V as f,j as p,k as m,r as h,w as g,z as _}from"./index-jouuqNaB.js";var v=i(d());function y(e){let{controlled:t,default:n,name:r,state:i=`value`}=e,{current:a}=v.useRef(t!==void 0),[o,s]=v.useState(n);return[a?t:o,v.useCallback(e=>{a||s(e)},[])]}var b=y,x=v.createContext(void 0);function S(){return v.useContext(x)}function C(e){return _(`PrivateSwitchBase`,e)}u(`PrivateSwitchBase`,[`root`,`checked`,`disabled`,`input`,`edgeStart`,`edgeEnd`]);var w=f(),T=e=>{let{classes:t,checked:n,disabled:r,edge:i}=e;return a({root:[`root`,n&&`checked`,r&&`disabled`,i&&`edge${l(i)}`],input:[`input`]},C,t)},E=n(m,{name:`MuiSwitchBase`})({padding:9,borderRadius:`50%`,variants:[{props:{edge:`start`,size:`small`},style:{marginLeft:-3}},{props:({edge:e,ownerState:t})=>e===`start`&&t.size!==`small`,style:{marginLeft:-12}},{props:{edge:`end`,size:`small`},style:{marginRight:-3}},{props:({edge:e,ownerState:t})=>e===`end`&&t.size!==`small`,style:{marginRight:-12}}]}),D=n(`input`,{name:`MuiSwitchBase`,shouldForwardProp:r})({cursor:`inherit`,position:`absolute`,opacity:0,width:`100%`,height:`100%`,top:0,left:0,margin:0,padding:0,zIndex:1}),O=v.forwardRef(function(e,t){let{autoFocus:n,checked:r,checkedIcon:i,defaultChecked:a,disabled:o,disableFocusRipple:s=!1,edge:c=!1,icon:l,id:u,inputProps:d,inputRef:f,name:m,onBlur:h,onChange:g,onFocus:_,readOnly:v,required:y=!1,tabIndex:x,type:C,value:O,slots:k={},slotProps:A={},...j}=e,[M,N]=b({controlled:r,default:!!a,name:`SwitchBase`,state:`checked`}),P=S(),F=e=>{_&&_(e),P&&P.onFocus&&P.onFocus(e)},I=e=>{h&&h(e),P&&P.onBlur&&P.onBlur(e)},L=e=>{if(e.nativeEvent.defaultPrevented)return;let t=e.target.checked;N(t),g&&g(e,t)},R=o;P&&R===void 0&&(R=P.disabled);let z=C===`checkbox`||C===`radio`,B={...e,checked:M,disabled:R,disableFocusRipple:s,edge:c},V=T(B),H={slots:k,slotProps:{input:d,...A}},[U,W]=p(`root`,{ref:t,elementType:E,className:V.root,shouldForwardComponentProp:!0,externalForwardedProps:{...H,component:`span`,...j},getSlotProps:e=>({...e,onFocus:t=>{e.onFocus?.(t),F(t)},onBlur:t=>{e.onBlur?.(t),I(t)}}),ownerState:B,additionalProps:{centerRipple:!0,focusRipple:!s,disabled:R,role:void 0,tabIndex:null}}),[G,K]=p(`input`,{ref:f,elementType:D,className:V.input,externalForwardedProps:H,getSlotProps:e=>({...e,onChange:t=>{e.onChange?.(t),L(t)}}),ownerState:B,additionalProps:{autoFocus:n,checked:r,defaultChecked:a,disabled:R,id:z?u:void 0,name:m,readOnly:v,required:y,tabIndex:x,type:C,...C===`checkbox`&&O===void 0?{}:{value:O}}});return(0,w.jsxs)(U,{...W,children:[(0,w.jsx)(G,{...K}),M?i:l]})});function k(e){return _(`MuiSwitch`,e)}var A=u(`MuiSwitch`,[`root`,`edgeStart`,`edgeEnd`,`switchBase`,`colorPrimary`,`colorSecondary`,`sizeSmall`,`sizeMedium`,`checked`,`disabled`,`input`,`thumb`,`track`]),j=e=>{let{classes:t,edge:n,size:r,color:i,checked:o,disabled:s}=e,c=a({root:[`root`,n&&`edge${l(n)}`,`size${l(r)}`],switchBase:[`switchBase`,`color${l(i)}`,o&&`checked`,s&&`disabled`],thumb:[`thumb`],track:[`track`],input:[`input`]},k,t);return{...t,...c}},M=n(`span`,{name:`MuiSwitch`,slot:`Root`,overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.root,n.edge&&t[`edge${l(n.edge)}`],t[`size${l(n.size)}`]]}})({display:`inline-flex`,width:58,height:38,overflow:`hidden`,padding:12,boxSizing:`border-box`,position:`relative`,flexShrink:0,zIndex:0,verticalAlign:`middle`,"@media print":{colorAdjust:`exact`},variants:[{props:{edge:`start`},style:{marginLeft:-8}},{props:{edge:`end`},style:{marginRight:-8}},{props:{size:`small`},style:{width:40,height:24,padding:7,[`& .${A.thumb}`]:{width:16,height:16},[`& .${A.switchBase}`]:{padding:4,[`&.${A.checked}`]:{transform:`translateX(16px)`}}}}]}),N=n(O,{name:`MuiSwitch`,slot:`SwitchBase`,overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.switchBase,{[`& .${A.input}`]:t.input},n.color!==`default`&&t[`color${l(n.color)}`]]}})(s(({theme:e})=>({position:`absolute`,top:0,left:0,zIndex:1,color:e.vars?e.vars.palette.Switch.defaultColor:`${e.palette.mode===`light`?e.palette.common.white:e.palette.grey[300]}`,transition:e.transitions.create([`left`,`transform`],{duration:e.transitions.duration.shortest}),[`&.${A.checked}`]:{transform:`translateX(20px)`},[`&.${A.disabled}`]:{color:e.vars?e.vars.palette.Switch.defaultDisabledColor:`${e.palette.mode===`light`?e.palette.grey[100]:e.palette.grey[600]}`},[`&.${A.checked} + .${A.track}`]:{opacity:.5},[`&.${A.disabled} + .${A.track}`]:{opacity:e.vars?e.vars.opacity.switchTrackDisabled:`${e.palette.mode===`light`?.12:.2}`},[`& .${A.input}`]:{left:`-100%`,width:`300%`}})),s(({theme:e})=>({"&:hover":{backgroundColor:e.alpha((e.vars||e).palette.action.active,(e.vars||e).palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:`transparent`}},variants:[...Object.entries(e.palette).filter(c([`light`])).map(([t])=>({props:{color:t},style:{[`&.${A.checked}`]:{color:(e.vars||e).palette[t].main,"&:hover":{backgroundColor:e.alpha((e.vars||e).palette[t].main,(e.vars||e).palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:`transparent`}},[`&.${A.disabled}`]:{color:e.vars?e.vars.palette.Switch[`${t}DisabledColor`]:`${e.palette.mode===`light`?e.lighten(e.palette[t].main,.62):e.darken(e.palette[t].main,.55)}`}},[`&.${A.checked} + .${A.track}`]:{backgroundColor:(e.vars||e).palette[t].main}}}))]}))),P=n(`span`,{name:`MuiSwitch`,slot:`Track`})(s(({theme:e})=>({height:`100%`,width:`100%`,borderRadius:14/2,zIndex:-1,transition:e.transitions.create([`opacity`,`background-color`],{duration:e.transitions.duration.shortest}),backgroundColor:e.vars?e.vars.palette.common.onBackground:`${e.palette.mode===`light`?e.palette.common.black:e.palette.common.white}`,opacity:e.vars?e.vars.opacity.switchTrack:`${e.palette.mode===`light`?.38:.3}`}))),F=n(`span`,{name:`MuiSwitch`,slot:`Thumb`})(s(({theme:e})=>({boxShadow:(e.vars||e).shadows[1],backgroundColor:`currentColor`,width:20,height:20,borderRadius:`50%`}))),I=v.forwardRef(function(t,n){let r=o({props:t,name:`MuiSwitch`}),{className:i,color:a=`primary`,edge:s=!1,size:c=`medium`,sx:l,slots:u={},slotProps:d={},...f}=r,m={...r,color:a,edge:s,size:c},h=j(m),g={slots:u,slotProps:d},[_,v]=p(`root`,{className:e(h.root,i),elementType:M,externalForwardedProps:g,ownerState:m,additionalProps:{sx:l}}),[y,b]=p(`thumb`,{className:h.thumb,elementType:F,externalForwardedProps:g,ownerState:m}),x=(0,w.jsx)(y,{...b}),[S,C]=p(`track`,{className:h.track,elementType:P,externalForwardedProps:g,ownerState:m});return(0,w.jsxs)(_,{...v,children:[(0,w.jsx)(N,{type:`checkbox`,icon:x,checkedIcon:x,ref:n,ownerState:m,...f,classes:{...h,root:h.switchBase},slots:{...u.switchBase&&{root:u.switchBase},...u.input&&{input:u.input}},slotProps:{...d.switchBase&&{root:typeof d.switchBase==`function`?d.switchBase(m):d.switchBase},input:{role:`switch`},...d.input&&{input:typeof d.input==`function`?d.input(m):d.input}}}),(0,w.jsx)(S,{...C})]})});function L({enabled:e,onChange:n}){return h?(0,w.jsxs)(g,{sx:{position:`fixed`,bottom:`1rem`,right:`1rem`,zIndex:9999,display:`flex`,alignItems:`center`,gap:`0.5rem`,bgcolor:`background.paper`,border:`1px solid`,borderColor:`divider`,borderRadius:`2rem`,px:`0.75rem`,py:`0.25rem`,boxShadow:3},children:[(0,w.jsx)(t,{variant:`caption`,sx:{userSelect:`none`,fontWeight:600,letterSpacing:`0.05em`},children:`Debug`}),(0,w.jsx)(I,{size:`small`,checked:e,onChange:(e,t)=>n(t)})]}):null}export{L as VitecDebugToggle}; \ No newline at end of file diff --git a/public/_frontend/assets/VitecDebugToggle-C8gYxgVq.js b/public/_frontend/assets/VitecDebugToggle-C8gYxgVq.js new file mode 100644 index 0000000..3fa9794 --- /dev/null +++ b/public/_frontend/assets/VitecDebugToggle-C8gYxgVq.js @@ -0,0 +1 @@ +import{B as e,E as t,F as n,I as r,K as i,L as a,M as o,N as s,O as c,P as l,R as u,U as d,V as f,j as p,k as m,r as h,w as g,z as _}from"./index-BXbyImyv.js";var v=i(d());function y(e){let{controlled:t,default:n,name:r,state:i=`value`}=e,{current:a}=v.useRef(t!==void 0),[o,s]=v.useState(n);return[a?t:o,v.useCallback(e=>{a||s(e)},[])]}var b=y,x=v.createContext(void 0);function S(){return v.useContext(x)}function C(e){return _(`PrivateSwitchBase`,e)}u(`PrivateSwitchBase`,[`root`,`checked`,`disabled`,`input`,`edgeStart`,`edgeEnd`]);var w=f(),T=e=>{let{classes:t,checked:n,disabled:r,edge:i}=e;return a({root:[`root`,n&&`checked`,r&&`disabled`,i&&`edge${l(i)}`],input:[`input`]},C,t)},E=n(m,{name:`MuiSwitchBase`})({padding:9,borderRadius:`50%`,variants:[{props:{edge:`start`,size:`small`},style:{marginLeft:-3}},{props:({edge:e,ownerState:t})=>e===`start`&&t.size!==`small`,style:{marginLeft:-12}},{props:{edge:`end`,size:`small`},style:{marginRight:-3}},{props:({edge:e,ownerState:t})=>e===`end`&&t.size!==`small`,style:{marginRight:-12}}]}),D=n(`input`,{name:`MuiSwitchBase`,shouldForwardProp:r})({cursor:`inherit`,position:`absolute`,opacity:0,width:`100%`,height:`100%`,top:0,left:0,margin:0,padding:0,zIndex:1}),O=v.forwardRef(function(e,t){let{autoFocus:n,checked:r,checkedIcon:i,defaultChecked:a,disabled:o,disableFocusRipple:s=!1,edge:c=!1,icon:l,id:u,inputProps:d,inputRef:f,name:m,onBlur:h,onChange:g,onFocus:_,readOnly:v,required:y=!1,tabIndex:x,type:C,value:O,slots:k={},slotProps:A={},...j}=e,[M,N]=b({controlled:r,default:!!a,name:`SwitchBase`,state:`checked`}),P=S(),F=e=>{_&&_(e),P&&P.onFocus&&P.onFocus(e)},I=e=>{h&&h(e),P&&P.onBlur&&P.onBlur(e)},L=e=>{if(e.nativeEvent.defaultPrevented)return;let t=e.target.checked;N(t),g&&g(e,t)},R=o;P&&R===void 0&&(R=P.disabled);let z=C===`checkbox`||C===`radio`,B={...e,checked:M,disabled:R,disableFocusRipple:s,edge:c},V=T(B),H={slots:k,slotProps:{input:d,...A}},[U,W]=p(`root`,{ref:t,elementType:E,className:V.root,shouldForwardComponentProp:!0,externalForwardedProps:{...H,component:`span`,...j},getSlotProps:e=>({...e,onFocus:t=>{e.onFocus?.(t),F(t)},onBlur:t=>{e.onBlur?.(t),I(t)}}),ownerState:B,additionalProps:{centerRipple:!0,focusRipple:!s,disabled:R,role:void 0,tabIndex:null}}),[G,K]=p(`input`,{ref:f,elementType:D,className:V.input,externalForwardedProps:H,getSlotProps:e=>({...e,onChange:t=>{e.onChange?.(t),L(t)}}),ownerState:B,additionalProps:{autoFocus:n,checked:r,defaultChecked:a,disabled:R,id:z?u:void 0,name:m,readOnly:v,required:y,tabIndex:x,type:C,...C===`checkbox`&&O===void 0?{}:{value:O}}});return(0,w.jsxs)(U,{...W,children:[(0,w.jsx)(G,{...K}),M?i:l]})});function k(e){return _(`MuiSwitch`,e)}var A=u(`MuiSwitch`,[`root`,`edgeStart`,`edgeEnd`,`switchBase`,`colorPrimary`,`colorSecondary`,`sizeSmall`,`sizeMedium`,`checked`,`disabled`,`input`,`thumb`,`track`]),j=e=>{let{classes:t,edge:n,size:r,color:i,checked:o,disabled:s}=e,c=a({root:[`root`,n&&`edge${l(n)}`,`size${l(r)}`],switchBase:[`switchBase`,`color${l(i)}`,o&&`checked`,s&&`disabled`],thumb:[`thumb`],track:[`track`],input:[`input`]},k,t);return{...t,...c}},M=n(`span`,{name:`MuiSwitch`,slot:`Root`,overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.root,n.edge&&t[`edge${l(n.edge)}`],t[`size${l(n.size)}`]]}})({display:`inline-flex`,width:58,height:38,overflow:`hidden`,padding:12,boxSizing:`border-box`,position:`relative`,flexShrink:0,zIndex:0,verticalAlign:`middle`,"@media print":{colorAdjust:`exact`},variants:[{props:{edge:`start`},style:{marginLeft:-8}},{props:{edge:`end`},style:{marginRight:-8}},{props:{size:`small`},style:{width:40,height:24,padding:7,[`& .${A.thumb}`]:{width:16,height:16},[`& .${A.switchBase}`]:{padding:4,[`&.${A.checked}`]:{transform:`translateX(16px)`}}}}]}),N=n(O,{name:`MuiSwitch`,slot:`SwitchBase`,overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.switchBase,{[`& .${A.input}`]:t.input},n.color!==`default`&&t[`color${l(n.color)}`]]}})(s(({theme:e})=>({position:`absolute`,top:0,left:0,zIndex:1,color:e.vars?e.vars.palette.Switch.defaultColor:`${e.palette.mode===`light`?e.palette.common.white:e.palette.grey[300]}`,transition:e.transitions.create([`left`,`transform`],{duration:e.transitions.duration.shortest}),[`&.${A.checked}`]:{transform:`translateX(20px)`},[`&.${A.disabled}`]:{color:e.vars?e.vars.palette.Switch.defaultDisabledColor:`${e.palette.mode===`light`?e.palette.grey[100]:e.palette.grey[600]}`},[`&.${A.checked} + .${A.track}`]:{opacity:.5},[`&.${A.disabled} + .${A.track}`]:{opacity:e.vars?e.vars.opacity.switchTrackDisabled:`${e.palette.mode===`light`?.12:.2}`},[`& .${A.input}`]:{left:`-100%`,width:`300%`}})),s(({theme:e})=>({"&:hover":{backgroundColor:e.alpha((e.vars||e).palette.action.active,(e.vars||e).palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:`transparent`}},variants:[...Object.entries(e.palette).filter(c([`light`])).map(([t])=>({props:{color:t},style:{[`&.${A.checked}`]:{color:(e.vars||e).palette[t].main,"&:hover":{backgroundColor:e.alpha((e.vars||e).palette[t].main,(e.vars||e).palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:`transparent`}},[`&.${A.disabled}`]:{color:e.vars?e.vars.palette.Switch[`${t}DisabledColor`]:`${e.palette.mode===`light`?e.lighten(e.palette[t].main,.62):e.darken(e.palette[t].main,.55)}`}},[`&.${A.checked} + .${A.track}`]:{backgroundColor:(e.vars||e).palette[t].main}}}))]}))),P=n(`span`,{name:`MuiSwitch`,slot:`Track`})(s(({theme:e})=>({height:`100%`,width:`100%`,borderRadius:14/2,zIndex:-1,transition:e.transitions.create([`opacity`,`background-color`],{duration:e.transitions.duration.shortest}),backgroundColor:e.vars?e.vars.palette.common.onBackground:`${e.palette.mode===`light`?e.palette.common.black:e.palette.common.white}`,opacity:e.vars?e.vars.opacity.switchTrack:`${e.palette.mode===`light`?.38:.3}`}))),F=n(`span`,{name:`MuiSwitch`,slot:`Thumb`})(s(({theme:e})=>({boxShadow:(e.vars||e).shadows[1],backgroundColor:`currentColor`,width:20,height:20,borderRadius:`50%`}))),I=v.forwardRef(function(t,n){let r=o({props:t,name:`MuiSwitch`}),{className:i,color:a=`primary`,edge:s=!1,size:c=`medium`,sx:l,slots:u={},slotProps:d={},...f}=r,m={...r,color:a,edge:s,size:c},h=j(m),g={slots:u,slotProps:d},[_,v]=p(`root`,{className:e(h.root,i),elementType:M,externalForwardedProps:g,ownerState:m,additionalProps:{sx:l}}),[y,b]=p(`thumb`,{className:h.thumb,elementType:F,externalForwardedProps:g,ownerState:m}),x=(0,w.jsx)(y,{...b}),[S,C]=p(`track`,{className:h.track,elementType:P,externalForwardedProps:g,ownerState:m});return(0,w.jsxs)(_,{...v,children:[(0,w.jsx)(N,{type:`checkbox`,icon:x,checkedIcon:x,ref:n,ownerState:m,...f,classes:{...h,root:h.switchBase},slots:{...u.switchBase&&{root:u.switchBase},...u.input&&{input:u.input}},slotProps:{...d.switchBase&&{root:typeof d.switchBase==`function`?d.switchBase(m):d.switchBase},input:{role:`switch`},...d.input&&{input:typeof d.input==`function`?d.input(m):d.input}}}),(0,w.jsx)(S,{...C})]})});function L({enabled:e,onChange:n}){return h?(0,w.jsxs)(g,{sx:{position:`fixed`,bottom:`1rem`,right:`1rem`,zIndex:9999,display:`flex`,alignItems:`center`,gap:`0.5rem`,bgcolor:`background.paper`,border:`1px solid`,borderColor:`divider`,borderRadius:`2rem`,px:`0.75rem`,py:`0.25rem`,boxShadow:3},children:[(0,w.jsx)(t,{variant:`caption`,sx:{userSelect:`none`,fontWeight:600,letterSpacing:`0.05em`},children:`Debug`}),(0,w.jsx)(I,{size:`small`,checked:e,onChange:(e,t)=>n(t)})]}):null}export{L as VitecDebugToggle}; \ No newline at end of file diff --git a/public/_frontend/assets/VitecDebugToggle-D50ebvSn.js b/public/_frontend/assets/VitecDebugToggle-D50ebvSn.js new file mode 100644 index 0000000..91ced12 --- /dev/null +++ b/public/_frontend/assets/VitecDebugToggle-D50ebvSn.js @@ -0,0 +1 @@ +import{B as e,E as t,F as n,I as r,K as i,L as a,M as o,N as s,O as c,P as l,R as u,U as d,V as f,j as p,k as m,r as h,w as g,z as _}from"./index-Cq4vmvLV.js";var v=i(d());function y(e){let{controlled:t,default:n,name:r,state:i=`value`}=e,{current:a}=v.useRef(t!==void 0),[o,s]=v.useState(n);return[a?t:o,v.useCallback(e=>{a||s(e)},[])]}var b=y,x=v.createContext(void 0);function S(){return v.useContext(x)}function C(e){return _(`PrivateSwitchBase`,e)}u(`PrivateSwitchBase`,[`root`,`checked`,`disabled`,`input`,`edgeStart`,`edgeEnd`]);var w=f(),T=e=>{let{classes:t,checked:n,disabled:r,edge:i}=e;return a({root:[`root`,n&&`checked`,r&&`disabled`,i&&`edge${l(i)}`],input:[`input`]},C,t)},E=n(m,{name:`MuiSwitchBase`})({padding:9,borderRadius:`50%`,variants:[{props:{edge:`start`,size:`small`},style:{marginLeft:-3}},{props:({edge:e,ownerState:t})=>e===`start`&&t.size!==`small`,style:{marginLeft:-12}},{props:{edge:`end`,size:`small`},style:{marginRight:-3}},{props:({edge:e,ownerState:t})=>e===`end`&&t.size!==`small`,style:{marginRight:-12}}]}),D=n(`input`,{name:`MuiSwitchBase`,shouldForwardProp:r})({cursor:`inherit`,position:`absolute`,opacity:0,width:`100%`,height:`100%`,top:0,left:0,margin:0,padding:0,zIndex:1}),O=v.forwardRef(function(e,t){let{autoFocus:n,checked:r,checkedIcon:i,defaultChecked:a,disabled:o,disableFocusRipple:s=!1,edge:c=!1,icon:l,id:u,inputProps:d,inputRef:f,name:m,onBlur:h,onChange:g,onFocus:_,readOnly:v,required:y=!1,tabIndex:x,type:C,value:O,slots:k={},slotProps:A={},...j}=e,[M,N]=b({controlled:r,default:!!a,name:`SwitchBase`,state:`checked`}),P=S(),F=e=>{_&&_(e),P&&P.onFocus&&P.onFocus(e)},I=e=>{h&&h(e),P&&P.onBlur&&P.onBlur(e)},L=e=>{if(e.nativeEvent.defaultPrevented)return;let t=e.target.checked;N(t),g&&g(e,t)},R=o;P&&R===void 0&&(R=P.disabled);let z=C===`checkbox`||C===`radio`,B={...e,checked:M,disabled:R,disableFocusRipple:s,edge:c},V=T(B),H={slots:k,slotProps:{input:d,...A}},[U,W]=p(`root`,{ref:t,elementType:E,className:V.root,shouldForwardComponentProp:!0,externalForwardedProps:{...H,component:`span`,...j},getSlotProps:e=>({...e,onFocus:t=>{e.onFocus?.(t),F(t)},onBlur:t=>{e.onBlur?.(t),I(t)}}),ownerState:B,additionalProps:{centerRipple:!0,focusRipple:!s,disabled:R,role:void 0,tabIndex:null}}),[G,K]=p(`input`,{ref:f,elementType:D,className:V.input,externalForwardedProps:H,getSlotProps:e=>({...e,onChange:t=>{e.onChange?.(t),L(t)}}),ownerState:B,additionalProps:{autoFocus:n,checked:r,defaultChecked:a,disabled:R,id:z?u:void 0,name:m,readOnly:v,required:y,tabIndex:x,type:C,...C===`checkbox`&&O===void 0?{}:{value:O}}});return(0,w.jsxs)(U,{...W,children:[(0,w.jsx)(G,{...K}),M?i:l]})});function k(e){return _(`MuiSwitch`,e)}var A=u(`MuiSwitch`,[`root`,`edgeStart`,`edgeEnd`,`switchBase`,`colorPrimary`,`colorSecondary`,`sizeSmall`,`sizeMedium`,`checked`,`disabled`,`input`,`thumb`,`track`]),j=e=>{let{classes:t,edge:n,size:r,color:i,checked:o,disabled:s}=e,c=a({root:[`root`,n&&`edge${l(n)}`,`size${l(r)}`],switchBase:[`switchBase`,`color${l(i)}`,o&&`checked`,s&&`disabled`],thumb:[`thumb`],track:[`track`],input:[`input`]},k,t);return{...t,...c}},M=n(`span`,{name:`MuiSwitch`,slot:`Root`,overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.root,n.edge&&t[`edge${l(n.edge)}`],t[`size${l(n.size)}`]]}})({display:`inline-flex`,width:58,height:38,overflow:`hidden`,padding:12,boxSizing:`border-box`,position:`relative`,flexShrink:0,zIndex:0,verticalAlign:`middle`,"@media print":{colorAdjust:`exact`},variants:[{props:{edge:`start`},style:{marginLeft:-8}},{props:{edge:`end`},style:{marginRight:-8}},{props:{size:`small`},style:{width:40,height:24,padding:7,[`& .${A.thumb}`]:{width:16,height:16},[`& .${A.switchBase}`]:{padding:4,[`&.${A.checked}`]:{transform:`translateX(16px)`}}}}]}),N=n(O,{name:`MuiSwitch`,slot:`SwitchBase`,overridesResolver:(e,t)=>{let{ownerState:n}=e;return[t.switchBase,{[`& .${A.input}`]:t.input},n.color!==`default`&&t[`color${l(n.color)}`]]}})(s(({theme:e})=>({position:`absolute`,top:0,left:0,zIndex:1,color:e.vars?e.vars.palette.Switch.defaultColor:`${e.palette.mode===`light`?e.palette.common.white:e.palette.grey[300]}`,transition:e.transitions.create([`left`,`transform`],{duration:e.transitions.duration.shortest}),[`&.${A.checked}`]:{transform:`translateX(20px)`},[`&.${A.disabled}`]:{color:e.vars?e.vars.palette.Switch.defaultDisabledColor:`${e.palette.mode===`light`?e.palette.grey[100]:e.palette.grey[600]}`},[`&.${A.checked} + .${A.track}`]:{opacity:.5},[`&.${A.disabled} + .${A.track}`]:{opacity:e.vars?e.vars.opacity.switchTrackDisabled:`${e.palette.mode===`light`?.12:.2}`},[`& .${A.input}`]:{left:`-100%`,width:`300%`}})),s(({theme:e})=>({"&:hover":{backgroundColor:e.alpha((e.vars||e).palette.action.active,(e.vars||e).palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:`transparent`}},variants:[...Object.entries(e.palette).filter(c([`light`])).map(([t])=>({props:{color:t},style:{[`&.${A.checked}`]:{color:(e.vars||e).palette[t].main,"&:hover":{backgroundColor:e.alpha((e.vars||e).palette[t].main,(e.vars||e).palette.action.hoverOpacity),"@media (hover: none)":{backgroundColor:`transparent`}},[`&.${A.disabled}`]:{color:e.vars?e.vars.palette.Switch[`${t}DisabledColor`]:`${e.palette.mode===`light`?e.lighten(e.palette[t].main,.62):e.darken(e.palette[t].main,.55)}`}},[`&.${A.checked} + .${A.track}`]:{backgroundColor:(e.vars||e).palette[t].main}}}))]}))),P=n(`span`,{name:`MuiSwitch`,slot:`Track`})(s(({theme:e})=>({height:`100%`,width:`100%`,borderRadius:14/2,zIndex:-1,transition:e.transitions.create([`opacity`,`background-color`],{duration:e.transitions.duration.shortest}),backgroundColor:e.vars?e.vars.palette.common.onBackground:`${e.palette.mode===`light`?e.palette.common.black:e.palette.common.white}`,opacity:e.vars?e.vars.opacity.switchTrack:`${e.palette.mode===`light`?.38:.3}`}))),F=n(`span`,{name:`MuiSwitch`,slot:`Thumb`})(s(({theme:e})=>({boxShadow:(e.vars||e).shadows[1],backgroundColor:`currentColor`,width:20,height:20,borderRadius:`50%`}))),I=v.forwardRef(function(t,n){let r=o({props:t,name:`MuiSwitch`}),{className:i,color:a=`primary`,edge:s=!1,size:c=`medium`,sx:l,slots:u={},slotProps:d={},...f}=r,m={...r,color:a,edge:s,size:c},h=j(m),g={slots:u,slotProps:d},[_,v]=p(`root`,{className:e(h.root,i),elementType:M,externalForwardedProps:g,ownerState:m,additionalProps:{sx:l}}),[y,b]=p(`thumb`,{className:h.thumb,elementType:F,externalForwardedProps:g,ownerState:m}),x=(0,w.jsx)(y,{...b}),[S,C]=p(`track`,{className:h.track,elementType:P,externalForwardedProps:g,ownerState:m});return(0,w.jsxs)(_,{...v,children:[(0,w.jsx)(N,{type:`checkbox`,icon:x,checkedIcon:x,ref:n,ownerState:m,...f,classes:{...h,root:h.switchBase},slots:{...u.switchBase&&{root:u.switchBase},...u.input&&{input:u.input}},slotProps:{...d.switchBase&&{root:typeof d.switchBase==`function`?d.switchBase(m):d.switchBase},input:{role:`switch`},...d.input&&{input:typeof d.input==`function`?d.input(m):d.input}}}),(0,w.jsx)(S,{...C})]})});function L({enabled:e,onChange:n}){return h?(0,w.jsxs)(g,{sx:{position:`fixed`,bottom:`1rem`,right:`1rem`,zIndex:9999,display:`flex`,alignItems:`center`,gap:`0.5rem`,bgcolor:`background.paper`,border:`1px solid`,borderColor:`divider`,borderRadius:`2rem`,px:`0.75rem`,py:`0.25rem`,boxShadow:3},children:[(0,w.jsx)(t,{variant:`caption`,sx:{userSelect:`none`,fontWeight:600,letterSpacing:`0.05em`},children:`Debug`}),(0,w.jsx)(I,{size:`small`,checked:e,onChange:(e,t)=>n(t)})]}):null}export{L as VitecDebugToggle}; \ No newline at end of file diff --git a/public/_frontend/assets/header-BCPgsUEc.js b/public/_frontend/assets/header-BCPgsUEc.js new file mode 100644 index 0000000..f510e88 --- /dev/null +++ b/public/_frontend/assets/header-BCPgsUEc.js @@ -0,0 +1 @@ +import{E as e,V as t,_ as n,b as r,c as i,d as a,h as o,l as s,m as c,n as l,p as u,u as d,x as f}from"./index-BXbyImyv.js";var p=t(),m={1:`h1`,2:`h2`,3:`h3`,4:`h4`,5:`h5`,6:`h6`};function h({element:t,className:h,nested:g,devInfoTags:_,uid:v,spaceBefore:y,spaceAfter:b}){let x=i(t),S=a(t),C=Number(s(t)??0),w=m[C]??`h3`,T=n(d(t)),E=T===`center`?`center`:T===`right`?`right`:`left`,D=T===`center`?`center`:T===`right`?`flex-end`:`flex-start`,O=u(t.content?.headerLink),k=o(t.content?.headerLink),A=c(t.content?.headerLink,`Mehr erfahren`);return C===100?null:(0,p.jsx)(l,{className:h,devInfoTags:_,nested:g,uid:v,spaceBefore:y,spaceAfter:b,children:(0,p.jsx)(`div`,{className:`header__inner`,children:(0,p.jsxs)(f,{spacing:.75,sx:{textAlign:E,alignItems:D},children:[x&&(0,p.jsx)(e,{variant:w,children:x}),S&&(0,p.jsx)(e,{variant:`subtitle1`,color:`text.secondary`,children:S}),O&&(0,p.jsx)(r,{href:O,target:k??`_self`,variant:`outlined`,size:`sm`,children:A})]})})})}export{h as VitecHeader}; \ No newline at end of file diff --git a/public/_frontend/assets/header-CMkDHNN8.js b/public/_frontend/assets/header-CMkDHNN8.js new file mode 100644 index 0000000..fd7f998 --- /dev/null +++ b/public/_frontend/assets/header-CMkDHNN8.js @@ -0,0 +1 @@ +import{E as e,V as t,_ as n,b as r,c as i,d as a,h as o,l as s,m as c,n as l,p as u,u as d,x as f}from"./index-Cq4vmvLV.js";var p=t(),m={1:`h1`,2:`h2`,3:`h3`,4:`h4`,5:`h5`,6:`h6`};function h({element:t,className:h,nested:g,devInfoTags:_,uid:v,spaceBefore:y,spaceAfter:b}){let x=i(t),S=a(t),C=Number(s(t)??0),w=m[C]??`h3`,T=n(d(t)),E=T===`center`?`center`:T===`right`?`right`:`left`,D=T===`center`?`center`:T===`right`?`flex-end`:`flex-start`,O=u(t.content?.headerLink),k=o(t.content?.headerLink),A=c(t.content?.headerLink,`Mehr erfahren`);return C===100?null:(0,p.jsx)(l,{className:h,devInfoTags:_,nested:g,uid:v,spaceBefore:y,spaceAfter:b,children:(0,p.jsx)(`div`,{className:`header__inner`,children:(0,p.jsxs)(f,{spacing:.75,sx:{textAlign:E,alignItems:D},children:[x&&(0,p.jsx)(e,{variant:w,children:x}),S&&(0,p.jsx)(e,{variant:`subtitle1`,color:`text.secondary`,children:S}),O&&(0,p.jsx)(r,{href:O,target:k??`_self`,variant:`outlined`,size:`sm`,children:A})]})})})}export{h as VitecHeader}; \ No newline at end of file diff --git a/public/_frontend/assets/header-CbcGCvAq.js b/public/_frontend/assets/header-CbcGCvAq.js new file mode 100644 index 0000000..e1d0a81 --- /dev/null +++ b/public/_frontend/assets/header-CbcGCvAq.js @@ -0,0 +1 @@ +import{E as e,V as t,_ as n,b as r,c as i,d as a,h as o,l as s,m as c,n as l,p as u,u as d,x as f}from"./index-jouuqNaB.js";var p=t(),m={1:`h1`,2:`h2`,3:`h3`,4:`h4`,5:`h5`,6:`h6`};function h({element:t,className:h,nested:g,devInfoTags:_,uid:v,spaceBefore:y,spaceAfter:b}){let x=i(t),S=a(t),C=Number(s(t)??0),w=m[C]??`h3`,T=n(d(t)),E=T===`center`?`center`:T===`right`?`right`:`left`,D=T===`center`?`center`:T===`right`?`flex-end`:`flex-start`,O=u(t.content?.headerLink),k=o(t.content?.headerLink),A=c(t.content?.headerLink,`Mehr erfahren`);return C===100?null:(0,p.jsx)(l,{className:h,devInfoTags:_,nested:g,uid:v,spaceBefore:y,spaceAfter:b,children:(0,p.jsx)(`div`,{className:`header__inner`,children:(0,p.jsxs)(f,{spacing:.75,sx:{textAlign:E,alignItems:D},children:[x&&(0,p.jsx)(e,{variant:w,children:x}),S&&(0,p.jsx)(e,{variant:`subtitle1`,color:`text.secondary`,children:S}),O&&(0,p.jsx)(r,{href:O,target:k??`_self`,variant:`outlined`,size:`sm`,children:A})]})})})}export{h as VitecHeader}; \ No newline at end of file diff --git a/public/_frontend/assets/header-DV30IKp8.js b/public/_frontend/assets/header-DV30IKp8.js new file mode 100644 index 0000000..f7a1ff1 --- /dev/null +++ b/public/_frontend/assets/header-DV30IKp8.js @@ -0,0 +1 @@ +import{E as e,V as t,_ as n,b as r,c as i,d as a,h as o,l as s,m as c,n as l,p as u,u as d,x as f}from"./index-BI31wk8i.js";var p=t(),m={1:`h1`,2:`h2`,3:`h3`,4:`h4`,5:`h5`,6:`h6`};function h({element:t,className:h,nested:g,devInfoTags:_,uid:v,spaceBefore:y,spaceAfter:b}){let x=i(t),S=a(t),C=Number(s(t)??0),w=m[C]??`h3`,T=n(d(t)),E=T===`center`?`center`:T===`right`?`right`:`left`,D=T===`center`?`center`:T===`right`?`flex-end`:`flex-start`,O=u(t.content?.headerLink),k=o(t.content?.headerLink),A=c(t.content?.headerLink,`Mehr erfahren`);return C===100?null:(0,p.jsx)(l,{className:h,devInfoTags:_,nested:g,uid:v,spaceBefore:y,spaceAfter:b,children:(0,p.jsx)(`div`,{className:`header__inner`,children:(0,p.jsxs)(f,{spacing:.75,sx:{textAlign:E,alignItems:D},children:[x&&(0,p.jsx)(e,{variant:w,children:x}),S&&(0,p.jsx)(e,{variant:`subtitle1`,color:`text.secondary`,children:S}),O&&(0,p.jsx)(r,{href:O,target:k??`_self`,variant:`outlined`,size:`sm`,children:A})]})})})}export{h as VitecHeader}; \ No newline at end of file diff --git a/public/_frontend/assets/index-5XMvTCBl.js b/public/_frontend/assets/index-5XMvTCBl.js deleted file mode 100644 index 1bbe027..0000000 --- a/public/_frontend/assets/index-5XMvTCBl.js +++ /dev/null @@ -1,120 +0,0 @@ -var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;li[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function D(e,t){return E(e.type,t,e.props)}function O(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ee(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var k=/\/+/g;function A(e,t){return typeof e==`object`&&e&&e.key!=null?ee(``+e.key):t.toString(36)}function te(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function ne(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,ne(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+A(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(k,`$&/`)+`/`),ne(o,r,i,``,function(e){return e})):o!=null&&(O(o)&&(o=D(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(k,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u{t.exports=l()})),d=o((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,S||(S=!0,O());else{var t=n(l);t!==null&&A(x,t.startTime-e)}}var S=!1,C=-1,w=5,T=-1;function E(){return g?!0:!(e.unstable_now()-Tt&&E());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&A(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?O():S=!1}}}var O;if(typeof y==`function`)O=function(){y(D)};else if(typeof MessageChannel<`u`){var ee=new MessageChannel,k=ee.port2;ee.port1.onmessage=D,O=function(){k.postMessage(null)}}else O=function(){_(D,0)};function A(t,n){C=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(C),C=-1):h=!0,A(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,S||(S=!0,O()))),r},e.unstable_shouldYield=E,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),f=o(((e,t)=>{t.exports=d()})),p=o((e=>{var t=u();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=p()})),h=o((e=>{var t=f(),n=u(),r=m();function i(e){var t=`https://react.dev/errors/`+e;if(1oe||(e.current=ae[oe],ae[oe]=null,oe--)}function le(e,t){oe++,ae[oe]=e.current,e.current=t}var ue=se(null),de=se(null),fe=se(null),pe=se(null);function me(e,t){switch(le(fe,t),le(de,e),le(ue,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Ud(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Ud(t),e=Wd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}ce(ue),le(ue,e)}function he(){ce(ue),ce(de),ce(fe)}function ge(e){e.memoizedState!==null&&le(pe,e);var t=ue.current,n=Wd(t,e.type);t!==n&&(le(de,e),le(ue,n))}function _e(e){de.current===e&&(ce(ue),ce(de)),pe.current===e&&(ce(pe),ep._currentValue=ie)}var ve,ye;function be(e){if(ve===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);ve=t&&t[1]||``,ye=-1)`:-1i||c[r]!==l[i]){var u=` -`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{xe=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?be(n):``}function Ce(e,t){switch(e.tag){case 26:case 27:case 5:return be(e.type);case 16:return be(`Lazy`);case 13:return e.child!==t&&t!==null?be(`Suspense Fallback`):be(`Suspense`);case 19:return be(`SuspenseList`);case 0:case 15:return Se(e.type,!1);case 11:return Se(e.type.render,!1);case 1:return Se(e.type,!0);case 31:return be(`Activity`);default:return``}}function we(e){try{var t=``,n=null;do t+=Ce(e,n),n=e,e=e.return;while(e);return t}catch(e){return` -Error generating stack: `+e.message+` -`+e.stack}}var Te=Object.prototype.hasOwnProperty,Ee=t.unstable_scheduleCallback,De=t.unstable_cancelCallback,Oe=t.unstable_shouldYield,ke=t.unstable_requestPaint,Ae=t.unstable_now,je=t.unstable_getCurrentPriorityLevel,Me=t.unstable_ImmediatePriority,Ne=t.unstable_UserBlockingPriority,Pe=t.unstable_NormalPriority,Fe=t.unstable_LowPriority,Ie=t.unstable_IdlePriority,Le=t.log,Re=t.unstable_setDisableYieldValue,ze=null,Be=null;function Ve(e){if(typeof Le==`function`&&Re(e),Be&&typeof Be.setStrictMode==`function`)try{Be.setStrictMode(ze,e)}catch{}}var He=Math.clz32?Math.clz32:Ge,Ue=Math.log,We=Math.LN2;function Ge(e){return e>>>=0,e===0?32:31-(Ue(e)/We|0)|0}var Ke=256,qe=262144,Je=4194304;function Ye(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Xe(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=Ye(n))):i=Ye(o):i=Ye(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=Ye(n))):i=Ye(o)):i=Ye(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function Ze(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function Qe(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function $e(){var e=Je;return Je<<=1,!(Je&62914560)&&(Je=4194304),e}function et(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function tt(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function nt(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),hn=!1;if(mn)try{var gn={};Object.defineProperty(gn,`passive`,{get:function(){hn=!0}}),window.addEventListener(`test`,gn,gn),window.removeEventListener(`test`,gn,gn)}catch{hn=!1}var _n=null,vn=null,yn=null;function bn(){if(yn)return yn;var e,t=vn,n=t.length,r,i=`value`in _n?_n.value:_n.textContent,a=i.length;for(e=0;e=Qn),tr=` `,nr=!1;function rr(e,t){switch(e){case`keyup`:return Xn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function ir(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var ar=!1;function or(e,t){switch(e){case`compositionend`:return ir(t);case`keypress`:return t.which===32?(nr=!0,tr):null;case`textInput`:return e=t.data,e===tr&&nr?null:e;default:return null}}function sr(e,t){if(ar)return e===`compositionend`||!Zn&&rr(e,t)?(e=bn(),yn=vn=_n=null,ar=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=kr(n)}}function jr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?jr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Mr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Vt(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Vt(e.document)}return t}function Nr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Pr=mn&&`documentMode`in document&&11>=document.documentMode,Fr=null,Ir=null,Lr=null,Rr=!1;function zr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Rr||Fr==null||Fr!==Vt(r)||(r=Fr,`selectionStart`in r&&Nr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Lr&&Or(Lr,r)||(Lr=r,r=Dd(Ir,`onSelect`),0>=o,i-=o,ki=1<<32-He(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),a=o(_,a,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),L&&ji(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(a,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(a,h),s=o(y,s,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(a,h),L&&ji(a,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(a,v.value,l),v!==null&&(s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return L&&ji(a,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,a,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),s=o(v,s,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(a,e)}),L&&ji(a,g),u}function b(e,r,o,c){if(typeof o==`object`&&o&&o.type===y&&o.key===null&&(o=o.props.children),typeof o==`object`&&o){switch(o.$$typeof){case _:a:{for(var l=o.key;r!==null;){if(r.key===l){if(l=o.type,l===y){if(r.tag===7){n(e,r.sibling),c=a(r,o.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===O&&Aa(l)===r.type){n(e,r.sibling),c=a(r,o.props),La(c,o),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}o.type===y?(c=_i(o.props.children,e.mode,c,o.key),c.return=e,e=c):(c=gi(o.type,o.key,o.props,null,e.mode,c),La(c,o),c.return=e,e=c)}return s(e);case v:a:{for(l=o.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===o.containerInfo&&r.stateNode.implementation===o.implementation){n(e,r.sibling),c=a(r,o.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=bi(o,e.mode,c),c.return=e,e=c}return s(e);case O:return o=Aa(o),b(e,r,o,c)}if(j(o))return h(e,r,o,c);if(te(o)){if(l=te(o),typeof l!=`function`)throw Error(i(150));return o=l.call(o),g(e,r,o,c)}if(typeof o.then==`function`)return b(e,r,Ia(o),c);if(o.$$typeof===C)return b(e,r,ia(e,o),c);Ra(e,o)}return typeof o==`string`&&o!==``||typeof o==`number`||typeof o==`bigint`?(o=``+o,r!==null&&r.tag===6?(n(e,r.sibling),c=a(r,o),c.return=e,e=c):(n(e,r),c=vi(o,e.mode,c),c.return=e,e=c),s(e)):n(e,r)}return function(e,t,n,r){try{Fa=0;var i=b(e,t,n,r);return Pa=null,i}catch(t){if(t===wa||t===Ea)throw t;var a=pi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ba=za(!0),Va=za(!1),Ha=!1;function Ua(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Wa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ga(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ka(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,U&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=ui(e),li(e,null,n),t}return oi(e,r,t,n),ui(e)}function qa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,it(e,n)}}function Ja(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ya=!1;function Xa(){if(Ya){var e=ha;if(e!==null)throw e}}function Za(e,t,n,r){Ya=!1;var i=e.updateQueue;Ha=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(G&f)===f:(r&f)===f){f!==0&&f===ma&&(Ya=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ha=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Xl|=o,e.lanes=o,e.memoizedState=d}}function Qa(e,t){if(typeof e!=`function`)throw Error(i(191,e));e.call(t)}function $a(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=M.T,s={};M.T=s,zs(e,!1,t,n);try{var c=i(),l=M.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Rs(e,t,va(c,r),vu(e)):Rs(e,t,r,vu(e))}catch(n){Rs(e,t,{then:function(){},status:`rejected`,reason:n},vu())}finally{N.p=a,o!==null&&s.types!==null&&(o.types=s.types),M.T=o}}function Os(){}function ks(e,t,n,r){if(e.tag!==5)throw Error(i(476));var a=As(e).queue;Ds(e,a,t,ie,n===null?Os:function(){return js(e),n(r)})}function As(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:ie,baseState:ie,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Bo,lastRenderedState:ie},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Bo,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function js(e){var t=As(e);t.next===null&&(t=e.alternate.memoizedState),Rs(e,t.next.queue,{},vu())}function Ms(){return ra(ep)}function Ns(){return Fo().memoizedState}function Ps(){return Fo().memoizedState}function Fs(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=vu();e=Ga(n);var r=Ka(t,e,n);r!==null&&(bu(r,t,n),qa(r,t,n)),t={cache:ua()},e.payload=t;return}t=t.return}}function Is(e,t,n){var r=vu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Bs(e)?Vs(t,n):(n=si(e,t,n,r),n!==null&&(bu(n,e,r),Hs(n,t,r)))}function Ls(e,t,n){Rs(e,t,n,vu())}function Rs(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Bs(e))Vs(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,Dr(s,o))return oi(e,t,i,0),Hl===null&&ai(),!1}catch{}if(n=si(e,t,i,r),n!==null)return bu(n,e,r),Hs(n,t,r),!0}return!1}function zs(e,t,n,r){if(r={lane:2,revertLane:fd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Bs(e)){if(t)throw Error(i(479))}else t=si(e,n,r,2),t!==null&&bu(t,e,2)}function Bs(e){var t=e.alternate;return e===R||t!==null&&t===R}function Vs(e,t){yo=vo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Hs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,it(e,n)}}var Us={readContext:ra,use:Ro,useCallback:To,useContext:To,useEffect:To,useImperativeHandle:To,useLayoutEffect:To,useInsertionEffect:To,useMemo:To,useReducer:To,useRef:To,useState:To,useDebugValue:To,useDeferredValue:To,useTransition:To,useSyncExternalStore:To,useId:To,useHostTransitionStatus:To,useFormState:To,useActionState:To,useOptimistic:To,useMemoCache:To,useCacheRefresh:To};Us.useEffectEvent=To;var Ws={readContext:ra,use:Ro,useCallback:function(e,t){return Po().memoizedState=[e,t===void 0?null:t],e},useContext:ra,useEffect:ms,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),fs(4194308,4,bs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return fs(4194308,4,e,t)},useInsertionEffect:function(e,t){fs(4,2,e,t)},useMemo:function(e,t){var n=Po();t=t===void 0?null:t;var r=e();if(bo){Ve(!0);try{e()}finally{Ve(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=Po();if(n!==void 0){var i=n(t);if(bo){Ve(!0);try{n(t)}finally{Ve(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Is.bind(null,R,e),[r.memoizedState,e]},useRef:function(e){var t=Po();return e={current:e},t.memoizedState=e},useState:function(e){e=Xo(e);var t=e.queue,n=Ls.bind(null,R,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Ss,useDeferredValue:function(e,t){return Ts(Po(),e,t)},useTransition:function(){var e=Xo(!1);return e=Ds.bind(null,R,e.queue,!0,!1),Po().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=R,a=Po();if(L){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),Hl===null)throw Error(i(349));G&127||Go(r,t,n)}a.memoizedState=n;var o={value:n,getSnapshot:t};return a.queue=o,ms(qo.bind(null,r,o,e),[e]),r.flags|=2048,us(9,{destroy:void 0},Ko.bind(null,r,o,n,t),null),n},useId:function(){var e=Po(),t=Hl.identifierPrefix;if(L){var n=Ai,r=ki;n=(r&~(1<<32-He(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=xo++,0<\/script>`,o=o.removeChild(o.firstChild);break;case`select`:o=typeof r.is==`string`?s.createElement(`select`,{is:r.is}):s.createElement(`select`),r.multiple?o.multiple=!0:r.size&&(o.size=r.size);break;default:o=typeof r.is==`string`?s.createElement(a,{is:r.is}):s.createElement(a)}}o[dt]=t,o[ft]=r;a:for(s=t.child;s!==null;){if(s.tag===5||s.tag===6)o.appendChild(s.stateNode);else if(s.tag!==4&&s.tag!==27&&s.child!==null){s.child.return=s,s=s.child;continue}if(s===t)break a;for(;s.sibling===null;){if(s.return===null||s.return===t)break a;s=s.return}s.sibling.return=s.return,s=s.sibling}t.stateNode=o;a:switch(Id(o,a,r),a){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Ic(t)}}return Vc(t),Lc(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Ic(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(i(166));if(e=fe.current,Ui(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,a=Ii,a!==null)switch(a.tag){case 27:case 5:r=a.memoizedProps}e[dt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Nd(e.nodeValue,n)),e||Bi(t,!0)}else e=Hd(e).createTextNode(r),e[dt]=t,t.stateNode=e}return Vc(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=Ui(t),n!==null){if(e===null){if(!r)throw Error(i(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(i(557));e[dt]=t}else Wi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Vc(t),e=!1}else n=Gi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(fo(t),t):(fo(t),null);if(t.flags&128)throw Error(i(558))}return Vc(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(a=Ui(t),r!==null&&r.dehydrated!==null){if(e===null){if(!a)throw Error(i(318));if(a=t.memoizedState,a=a===null?null:a.dehydrated,!a)throw Error(i(317));a[dt]=t}else Wi(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;Vc(t),a=!1}else a=Gi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(fo(t),t):(fo(t),null)}return fo(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,a=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(a=r.alternate.memoizedState.cachePool.pool),o=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(o=r.memoizedState.cachePool.pool),o!==a&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),zc(t,t.updateQueue),Vc(t),null);case 4:return he(),e===null&&Cd(t.stateNode.containerInfo),Vc(t),null;case 10:return Zi(t.type),Vc(t),null;case 19:if(ce(po),r=t.memoizedState,r===null)return Vc(t),null;if(a=(t.flags&128)!=0,o=r.rendering,o===null)if(a)Bc(r,!1);else{if(Yl!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(o=mo(e),o!==null){for(t.flags|=128,Bc(r,!1),e=o.updateQueue,t.updateQueue=e,zc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)hi(n,e),n=n.sibling;return le(po,po.current&1|2),L&&ji(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Ae()>ou&&(t.flags|=128,a=!0,Bc(r,!1),t.lanes=4194304)}else{if(!a)if(e=mo(o),e!==null){if(t.flags|=128,a=!0,e=e.updateQueue,t.updateQueue=e,zc(t,e),Bc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!o.alternate&&!L)return Vc(t),null}else 2*Ae()-r.renderingStartTime>ou&&n!==536870912&&(t.flags|=128,a=!0,Bc(r,!1),t.lanes=4194304);r.isBackwards?(o.sibling=t.child,t.child=o):(e=r.last,e===null?t.child=o:e.sibling=o,r.last=o)}return r.tail===null?(Vc(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Ae(),e.sibling=null,n=po.current,le(po,a?n&1|2:n&1),L&&ji(t,r.treeForkCount),e);case 22:case 23:return fo(t),io(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(Vc(t),t.subtreeFlags&6&&(t.flags|=8192)):Vc(t),n=t.updateQueue,n!==null&&zc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&ce(ba),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Zi(la),Vc(t),null;case 25:return null;case 30:return null}throw Error(i(156,t.tag))}function Uc(e,t){switch(Pi(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Zi(la),he(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return _e(t),null;case 31:if(t.memoizedState!==null){if(fo(t),t.alternate===null)throw Error(i(340));Wi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(fo(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));Wi()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return ce(po),null;case 4:return he(),null;case 10:return Zi(t.type),null;case 22:case 23:return fo(t),io(),e!==null&&ce(ba),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Zi(la),null;case 25:return null;default:return null}}function Wc(e,t){switch(Pi(t),t.tag){case 3:Zi(la),he();break;case 26:case 27:case 5:_e(t);break;case 4:he();break;case 31:t.memoizedState!==null&&fo(t);break;case 13:fo(t);break;case 19:ce(po);break;case 10:Zi(t.type);break;case 22:case 23:fo(t),io(),e!==null&&ce(ba);break;case 24:Zi(la)}}function V(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Yu(t,t.return,e)}}function Gc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Yu(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Yu(t,t.return,e)}}function H(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{$a(t,n)}catch(t){Yu(e,e.return,t)}}}function Kc(e,t,n){n.props=Zs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Yu(e,t,n)}}function qc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Yu(e,t,n)}}function Jc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Yu(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Yu(e,t,n)}else n.current=null}function Yc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Yu(e,e.return,t)}}function Xc(e,t,n){try{var r=e.stateNode;Ld(r,e.type,n,t),r[ft]=t}catch(t){Yu(e,e.return,t)}}function Zc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&$d(e.type)||e.tag===4}function Qc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Zc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&$d(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=an));else if(r!==4&&(r===27&&$d(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&$d(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(el(e,t,n),e=e.sibling;e!==null;)el(e,t,n),e=e.sibling}function tl(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Id(t,r,n),t[dt]=e,t[ft]=n}catch(t){Yu(e,e.return,t)}}var nl=!1,rl=!1,il=!1,al=typeof WeakSet==`function`?WeakSet:Set,ol=null;function sl(e,t){if(e=e.containerInfo,Bd=lp,e=Mr(e),Nr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var a=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break a}var s=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||a!==0&&f.nodeType!==3||(c=s+a),f!==o||r!==0&&f.nodeType!==3||(l=s+r),f.nodeType===3&&(s+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===a&&(c=s),p===o&&++d===r&&(l=s),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(Vd={focusedElem:e,selectionRange:n},lp=!1,ol=t;ol!==null;)if(t=ol,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,ol=e;else for(;ol!==null;){switch(t=ol,o=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Id(o,r,n),o[dt]=e,wt(o),r=o;break a;case`link`:var s=Uf(`link`,`href`,a).get(r+(n.href||``));if(s){for(var c=0;cg&&(o=g,g=h,h=o);var _=Ar(s,h),v=Ar(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,M.T=null,n=mu,mu=null;var o=uu,s=fu;if(lu=0,du=uu=null,fu=0,U&6)throw Error(i(331));var c=U;if(U|=4,Ll(o.current),kl(o,o.current,s,n),U=c,ad(0,!1),Be&&typeof Be.onPostCommitFiberRoot==`function`)try{Be.onPostCommitFiberRoot(ze,o)}catch{}return!0}finally{N.p=a,M.T=r,Gu(e,t)}}function Ju(e,t,n){t=Si(n,t),t=rc(e.stateNode,t,2),e=Ka(e,t,2),e!==null&&(tt(e,2),id(e))}function Yu(e,t,n){if(e.tag===3)Ju(e,e,n);else for(;t!==null;){if(t.tag===3){Ju(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(cu===null||!cu.has(r))){e=Si(n,e),n=ic(2),r=Ka(t,n,2),r!==null&&(ac(n,r,t,e),tt(r,2),id(r));break}}t=t.return}}function Xu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new Vl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(ql=!0,i.add(n),e=Zu.bind(null,e,t,n),t.then(e,e))}function Zu(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,Hl===e&&(G&n)===n&&(Yl===4||Yl===3&&(G&62914560)===G&&300>Ae()-iu?!(U&2)&&Du(e,0):Ql|=n,eu===G&&(eu=0)),id(e)}function q(e,t){t===0&&(t=$e()),e=ci(e,t),e!==null&&(tt(e,t),id(e))}function J(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),q(e,n)}function Qu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,a=e.memoizedState;a!==null&&(n=a.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}r!==null&&r.delete(t),q(e,n)}function $u(e,t){return Ee(e,t)}var Y=null,X=null,ed=!1,td=!1,nd=!1,rd=0;function id(e){e!==X&&e.next===null&&(X===null?Y=X=e:X=X.next=e),td=!0,ed||(ed=!0,dd())}function ad(e,t){if(!nd&&td){nd=!0;do for(var n=!1,r=Y;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-He(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ud(r,a))}else a=G,a=Xe(r,r===Hl?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||Ze(r,a)||(n=!0,ud(r,a));r=r.next}while(n);nd=!1}}function od(){sd()}function sd(){td=ed=!1;var e=0;rd!==0&&qd()&&(e=rd);for(var t=Ae(),n=null,r=Y;r!==null;){var i=r.next,a=cd(r,t);a===0?(r.next=null,n===null?Y=i:n.next=i,i===null&&(X=n)):(n=r,(e!==0||a&3)&&(td=!0)),r=i}lu!==0&&lu!==5||ad(e,!1),rd!==0&&(rd=0)}function cd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Rd(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function Cf(e,t,n){var r=Sf;if(r&&typeof t==`string`&&t){var i=Ut(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),_f.has(i)||(_f.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Id(t,`link`,e),wt(t),r.head.appendChild(t)))}}function wf(e){yf.D(e),Cf(`dns-prefetch`,e,null)}function Tf(e,t){yf.C(e,t),Cf(`preconnect`,e,t)}function Ef(e,t,n){yf.L(e,t,n);var r=Sf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Ut(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Ut(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Ut(n.imageSizes)+`"]`)):i+=`[href="`+Ut(e)+`"]`;var a=i;switch(t){case`style`:a=Mf(e);break;case`script`:a=If(e)}gf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),gf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Nf(a))||t===`script`&&r.querySelector(Lf(a))||(t=r.createElement(`link`),Id(t,`link`,e),wt(t),r.head.appendChild(t)))}}function Df(e,t){yf.m(e,t);var n=Sf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Ut(r)+`"][href="`+Ut(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=If(e)}if(!gf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),gf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Lf(a)))return}r=n.createElement(`link`),Id(r,`link`,e),wt(r),n.head.appendChild(r)}}}function Of(e,t,n){yf.S(e,t,n);var r=Sf;if(r&&e){var i=Ct(r).hoistableStyles,a=Mf(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Nf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=gf.get(a))&&Bf(e,n);var c=o=r.createElement(`link`);wt(c),Id(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,zf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function kf(e,t){yf.X(e,t);var n=Sf;if(n&&e){var r=Ct(n).hoistableScripts,i=If(e),a=r.get(i);a||(a=n.querySelector(Lf(i)),a||(e=h({src:e,async:!0},t),(t=gf.get(i))&&Vf(e,t),a=n.createElement(`script`),wt(a),Id(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Af(e,t){yf.M(e,t);var n=Sf;if(n&&e){var r=Ct(n).hoistableScripts,i=If(e),a=r.get(i);a||(a=n.querySelector(Lf(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=gf.get(i))&&Vf(e,t),a=n.createElement(`script`),wt(a),Id(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function jf(e,t,n,r){var a=(a=fe.current)?vf(a):null;if(!a)throw Error(i(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Mf(n.href),n=Ct(a).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Mf(n.href);var o=Ct(a).hoistableStyles,s=o.get(e);if(s||(a=a.ownerDocument||a,s={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},o.set(e,s),(o=a.querySelector(Nf(e)))&&!o._p&&(s.instance=o,s.state.loading=5),gf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},gf.set(e,n),o||Ff(a,e,n,s.state))),t&&r===null)throw Error(i(528,``));return s}if(t&&r!==null)throw Error(i(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=If(n),n=Ct(a).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Mf(e){return`href="`+Ut(e)+`"`}function Nf(e){return`link[rel="stylesheet"][`+e+`]`}function Pf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Ff(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Id(t,`link`,n),wt(t),e.head.appendChild(t))}function If(e){return`[src="`+Ut(e)+`"]`}function Lf(e){return`script[async]`+e}function Rf(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Ut(n.href)+`"]`);if(r)return t.instance=r,wt(r),r;var a=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),wt(r),Id(r,`style`,a),zf(r,n.precedence,e),t.instance=r;case`stylesheet`:a=Mf(n.href);var o=e.querySelector(Nf(a));if(o)return t.state.loading|=4,t.instance=o,wt(o),o;r=Pf(n),(a=gf.get(a))&&Bf(r,a),o=(e.ownerDocument||e).createElement(`link`),wt(o);var s=o;return s._p=new Promise(function(e,t){s.onload=e,s.onerror=t}),Id(o,`link`,r),t.state.loading|=4,zf(o,n.precedence,e),t.instance=o;case`script`:return o=If(n.src),(a=e.querySelector(Lf(o)))?(t.instance=a,wt(a),a):(r=n,(a=gf.get(o))&&(r=h({},n),Vf(r,a)),e=e.ownerDocument||e,a=e.createElement(`script`),wt(a),Id(a,`link`,r),e.head.appendChild(a),t.instance=a);case`void`:return null;default:throw Error(i(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,zf(r,n.precedence,e));return t.instance}function zf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Gf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Kf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function qf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Mf(r.href),a=t.querySelector(Nf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Xf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,wt(a);return}a=t.ownerDocument||t,r=Pf(r),(i=gf.get(i))&&Bf(r,i),a=a.createElement(`link`),wt(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Id(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Xf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Jf=0;function Yf(e,t){return e.stylesheets&&e.count===0&&Qf(e,e.stylesheets),0Jf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Xf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Qf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Zf=null;function Qf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Zf=new Map,t.forEach($f,e),Zf=null,Xf.call(e))}function $f(e,t){if(!(t.state.loading&4)){var n=Zf.get(e);if(n)var r=n.get(null);else{n=new Map,Zf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=h()})),_=o(((e,t)=>{var n=typeof Element<`u`,r=typeof Map==`function`,i=typeof Set==`function`,a=typeof ArrayBuffer==`function`&&!!ArrayBuffer.isView;function o(e,t){if(e===t)return!0;if(e&&t&&typeof e==`object`&&typeof t==`object`){if(e.constructor!==t.constructor)return!1;var s,c,l;if(Array.isArray(e)){if(s=e.length,s!=t.length)return!1;for(c=s;c--!==0;)if(!o(e[c],t[c]))return!1;return!0}var u;if(r&&e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(u=e.entries();!(c=u.next()).done;)if(!t.has(c.value[0]))return!1;for(u=e.entries();!(c=u.next()).done;)if(!o(c.value[1],t.get(c.value[0])))return!1;return!0}if(i&&e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(u=e.entries();!(c=u.next()).done;)if(!t.has(c.value[0]))return!1;return!0}if(a&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(t)){if(s=e.length,s!=t.length)return!1;for(c=s;c--!==0;)if(e[c]!==t[c])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf&&typeof e.valueOf==`function`&&typeof t.valueOf==`function`)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString&&typeof e.toString==`function`&&typeof t.toString==`function`)return e.toString()===t.toString();if(l=Object.keys(e),s=l.length,s!==Object.keys(t).length)return!1;for(c=s;c--!==0;)if(!Object.prototype.hasOwnProperty.call(t,l[c]))return!1;if(n&&e instanceof Element)return!1;for(c=s;c--!==0;)if(!((l[c]===`_owner`||l[c]===`__v`||l[c]===`__o`)&&e.$$typeof)&&!o(e[l[c]],t[l[c]]))return!1;return!0}return e!==e&&t!==t}t.exports=function(e,t){try{return o(e,t)}catch(e){if((e.message||``).match(/stack|recursion/i))return console.warn(`react-fast-compare cannot handle circular refs`),!1;throw e}}})),v=o(((e,t)=>{t.exports=function(e,t,n,r,i,a,o,s){if(!e){var c;if(t===void 0)c=Error(`Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.`);else{var l=[n,r,i,a,o,s],u=0;c=Error(t.replace(/%s/g,function(){return l[u++]})),c.name=`Invariant Violation`}throw c.framesToPop=1,c}}})),y=o(((e,t)=>{t.exports=function(e,t,n,r){var i=n?n.call(r,e,t):void 0;if(i!==void 0)return!!i;if(e===t)return!0;if(typeof e!=`object`||!e||typeof t!=`object`||!t)return!1;var a=Object.keys(e),o=Object.keys(t);if(a.length!==o.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),c=0;c(e.BASE=`base`,e.BODY=`body`,e.HEAD=`head`,e.HTML=`html`,e.LINK=`link`,e.META=`meta`,e.NOSCRIPT=`noscript`,e.SCRIPT=`script`,e.STYLE=`style`,e.TITLE=`title`,e.FRAGMENT=`Symbol(react.fragment)`,e))(T||{}),E={link:{rel:[`amphtml`,`canonical`,`alternate`]},script:{type:[`application/ld+json`]},meta:{charset:``,name:[`generator`,`robots`,`description`],property:[`og:type`,`og:title`,`og:url`,`og:image`,`og:image:alt`,`og:description`,`twitter:url`,`twitter:title`,`twitter:description`,`twitter:image`,`twitter:image:alt`,`twitter:card`,`twitter:site`]}},D=Object.values(T),O={accesskey:`accessKey`,charset:`charSet`,class:`className`,contenteditable:`contentEditable`,contextmenu:`contextMenu`,"http-equiv":`httpEquiv`,itemprop:`itemProp`,tabindex:`tabIndex`},ee=Object.entries(O).reduce((e,[t,n])=>(e[n]=t,e),{}),k=`data-rh`,A={DEFAULT_TITLE:`defaultTitle`,DEFER:`defer`,ENCODE_SPECIAL_CHARACTERS:`encodeSpecialCharacters`,ON_CHANGE_CLIENT_STATE:`onChangeClientState`,TITLE_TEMPLATE:`titleTemplate`,PRIORITIZE_SEO_TAGS:`prioritizeSeoTags`},te=(e,t)=>{for(let n=e.length-1;n>=0;--n){let r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},ne=e=>{let t=te(e,`title`),n=te(e,A.TITLE_TEMPLATE);if(Array.isArray(t)&&(t=t.join(``)),n&&t)return n.replace(/%s/g,()=>t);let r=te(e,A.DEFAULT_TITLE);return t||r||void 0},re=e=>te(e,A.ON_CHANGE_CLIENT_STATE)||(()=>{}),j=(e,t)=>t.filter(t=>t[e]!==void 0).map(t=>t[e]).reduce((e,t)=>({...e,...t}),{}),M=(e,t)=>t.filter(e=>e.base!==void 0).map(e=>e.base).reverse().reduce((t,n)=>{if(!t.length){let r=Object.keys(n);for(let i=0;iconsole&&typeof console.warn==`function`&&console.warn(e),ie=(e,t,n)=>{let r={};return n.filter(t=>Array.isArray(t[e])?!0:(t[e]!==void 0&&N(`Helmet: ${e} should be of type "Array". Instead found type "${typeof t[e]}"`),!1)).map(t=>t[e]).reverse().reduce((e,n)=>{let i={};n.filter(e=>{let n,a=Object.keys(e);for(let r=0;re.push(t));let a=Object.keys(i);for(let e=0;e{if(Array.isArray(e)&&e.length){for(let n=0;n({baseTag:M([`href`],e),bodyAttributes:j(`bodyAttributes`,e),defer:te(e,A.DEFER),encode:te(e,A.ENCODE_SPECIAL_CHARACTERS),htmlAttributes:j(`htmlAttributes`,e),linkTags:ie(`link`,[`rel`,`href`],e),metaTags:ie(`meta`,[`name`,`charset`,`http-equiv`,`property`,`itemprop`],e),noscriptTags:ie(`noscript`,[`innerHTML`],e),onChangeClientState:re(e),scriptTags:ie(`script`,[`src`,`innerHTML`],e),styleTags:ie(`style`,[`cssText`],e),title:ne(e),titleAttributes:j(`titleAttributes`,e),prioritizeSeoTags:ae(e,A.PRIORITIZE_SEO_TAGS)}),se=e=>Array.isArray(e)?e.join(``):e,ce=(e,t)=>{let n=Object.keys(e);for(let r=0;rArray.isArray(e)?e.reduce((e,n)=>(ce(n,t)?e.priority.push(n):e.default.push(n),e),{priority:[],default:[]}):{default:e,priority:[]},ue=(e,t)=>({...e,[t]:void 0}),de=[`noscript`,`script`,`style`],fe=(e,t=!0)=>t===!1?String(e):String(e).replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`).replace(/'/g,`'`),pe=e=>Object.keys(e).reduce((t,n)=>{let r=e[n]===void 0?`${n}`:`${n}="${e[n]}"`;return t?`${t} ${r}`:r},``),me=(e,t,n,r)=>{let i=pe(n),a=se(t);return i?`<${e} ${k}="true" ${i}>${fe(a,r)}`:`<${e} ${k}="true">${fe(a,r)}`},he=(e,t,n=!0)=>t.reduce((t,r)=>{let i=r,a=Object.keys(i).filter(e=>!(e===`innerHTML`||e===`cssText`)).reduce((e,t)=>{let r=i[t]===void 0?t:`${t}="${fe(i[t],n)}"`;return e?`${e} ${r}`:r},``),o=i.innerHTML||i.cssText||``;return`${t}<${e} ${k}="true" ${a}${de.indexOf(e)===-1?`/>`:`>${o}`}`},``),ge=(e,t={})=>Object.keys(e).reduce((t,n)=>{let r=O[n];return t[r||n]=e[n],t},t),_e=(e,t,n)=>{let r=ge(n,{key:t,[k]:!0});return[x.createElement(`title`,r,t)]},ve=(e,t)=>t.map((t,n)=>{let r={key:n,[k]:!0};return Object.keys(t).forEach(e=>{let n=O[e]||e;n===`innerHTML`||n===`cssText`?r.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:r[n]=t[e]}),x.createElement(e,r)}),ye=(e,t,n=!0)=>{switch(e){case`title`:return{toComponent:()=>_e(e,t.title,t.titleAttributes),toString:()=>me(e,t.title,t.titleAttributes,n)};case`bodyAttributes`:case`htmlAttributes`:return{toComponent:()=>ge(t),toString:()=>pe(t)};default:return{toComponent:()=>ve(e,t),toString:()=>he(e,t,n)}}},be=({metaTags:e,linkTags:t,scriptTags:n,encode:r})=>{let i=le(e,E.meta),a=le(t,E.link),o=le(n,E.script);return{priorityMethods:{toComponent:()=>[...ve(`meta`,i.priority),...ve(`link`,a.priority),...ve(`script`,o.priority)],toString:()=>`${ye(`meta`,i.priority,r)} ${ye(`link`,a.priority,r)} ${ye(`script`,o.priority,r)}`},metaTags:i.default,linkTags:a.default,scriptTags:o.default}},xe=e=>{let{baseTag:t,bodyAttributes:n,encode:r=!0,htmlAttributes:i,noscriptTags:a,styleTags:o,title:s=``,titleAttributes:c,prioritizeSeoTags:l}=e,{linkTags:u,metaTags:d,scriptTags:f}=e,p={toComponent:()=>[],toString:()=>``};return l&&({priorityMethods:p,linkTags:u,metaTags:d,scriptTags:f}=be(e)),{priority:p,base:ye(`base`,t,r),bodyAttributes:ye(`bodyAttributes`,n,r),htmlAttributes:ye(`htmlAttributes`,i,r),link:ye(`link`,u,r),meta:ye(`meta`,d,r),noscript:ye(`noscript`,a,r),script:ye(`script`,f,r),style:ye(`style`,o,r),title:ye(`title`,{title:s,titleAttributes:c},r)}},Se=[],Ce=!!(typeof window<`u`&&window.document&&window.document.createElement),we=class{instances=[];canUseDOM=Ce;context;value={setHelmet:e=>{this.context.helmet=e},helmetInstances:{get:()=>this.canUseDOM?Se:this.instances,add:e=>{(this.canUseDOM?Se:this.instances).push(e)},remove:e=>{let t=(this.canUseDOM?Se:this.instances).indexOf(e);(this.canUseDOM?Se:this.instances).splice(t,1)}}};constructor(e,t){this.context=e,this.canUseDOM=t||!1,t||(e.helmet=xe({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:``,titleAttributes:{}}))}},Te=parseInt(`19.2.0`.split(`.`)[0],10)>=19,Ee=x.createContext({}),De=class e extends x.Component{static canUseDOM=Ce;helmetData;constructor(t){super(t),Te?this.helmetData=null:this.helmetData=new we(this.props.context||{},e.canUseDOM)}render(){return Te?x.createElement(x.Fragment,null,this.props.children):x.createElement(Ee.Provider,{value:this.helmetData.value},this.props.children)}},Oe=(e,t)=>{let n=document.head||document.querySelector(`head`),r=n.querySelectorAll(`${e}[${k}]`),i=[].slice.call(r),a=[],o;return t&&t.length&&t.forEach(t=>{let n=document.createElement(e);for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e))if(e===`innerHTML`)n.innerHTML=t.innerHTML;else if(e===`cssText`){let e=t.cssText;n.appendChild(document.createTextNode(e))}else{let r=e,i=t[r]===void 0?``:t[r];n.setAttribute(e,i)}n.setAttribute(k,`true`),i.some((e,t)=>(o=t,n.isEqualNode(e)))?i.splice(o,1):a.push(n)}),i.forEach(e=>e.parentNode?.removeChild(e)),a.forEach(e=>n.appendChild(e)),{oldTags:i,newTags:a}},ke=(e,t)=>{let n=document.getElementsByTagName(e)[0];if(!n)return;let r=n.getAttribute(k),i=r?r.split(`,`):[],a=[...i],o=Object.keys(t);for(let e of o){let r=t[e]||``;n.getAttribute(e)!==r&&n.setAttribute(e,r),i.indexOf(e)===-1&&i.push(e);let o=a.indexOf(e);o!==-1&&a.splice(o,1)}for(let e=a.length-1;e>=0;--e)n.removeAttribute(a[e]);i.length===a.length?n.removeAttribute(k):n.getAttribute(k)!==o.join(`,`)&&n.setAttribute(k,o.join(`,`))},Ae=(e,t)=>{e!==void 0&&document.title!==e&&(document.title=se(e)),ke(`title`,t)},je=(e,t)=>{let{baseTag:n,bodyAttributes:r,htmlAttributes:i,linkTags:a,metaTags:o,noscriptTags:s,onChangeClientState:c,scriptTags:l,styleTags:u,title:d,titleAttributes:f}=e;ke(`body`,r),ke(`html`,i),Ae(d,f);let p={baseTag:Oe(`base`,n),linkTags:Oe(`link`,a),metaTags:Oe(`meta`,o),noscriptTags:Oe(`noscript`,s),scriptTags:Oe(`script`,l),styleTags:Oe(`style`,u)},m={},h={};Object.keys(p).forEach(e=>{let{newTags:t,oldTags:n}=p[e];t.length&&(m[e]=t),n.length&&(h[e]=p[e].oldTags)}),t&&t(),c(e,m,h)},Me=null,Ne=e=>{Me&&cancelAnimationFrame(Me),e.defer?Me=requestAnimationFrame(()=>{je(e,()=>{Me=null})}):(je(e),Me=null)},Pe=class extends x.Component{rendered=!1;shouldComponentUpdate(e){return!(0,w.default)(e,this.props)}componentDidUpdate(){this.emitChange()}componentWillUnmount(){let{helmetInstances:e}=this.props.context;e.remove(this),this.emitChange()}emitChange(){let{helmetInstances:e,setHelmet:t}=this.props.context,n=null,r=oe(e.get().map(e=>{let{context:t,...n}=e.props;return n}));De.canUseDOM?Ne(r):xe&&(n=xe(r)),t(n)}init(){if(this.rendered)return;this.rendered=!0;let{helmetInstances:e}=this.props.context;e.add(this),this.emitChange()}render(){return this.init(),null}},Fe=[],Ie=e=>{let t={};for(let n of Object.keys(e))t[ee[n]||n]=e[n];return t},Le=e=>{let t={};for(let n of Object.keys(e)){let r=O[n];t[r||n]=e[n]}return t},Re=(e,t)=>{if(!Ce)return;let n=document.getElementsByTagName(e)[0];if(!n)return;let r=`data-rh-managed`,i=n.getAttribute(r),a=i?i.split(`,`):[],o=Object.keys(t);for(let e of a)o.includes(e)||n.removeAttribute(e);for(let e of o){let r=t[e];r==null||r===!1?n.removeAttribute(e):r===!0?n.setAttribute(e,``):n.setAttribute(e,String(r))}o.length>0?n.setAttribute(r,o.join(`,`)):n.removeAttribute(r)},ze=()=>{let e={},t={};for(let n of Fe){let{htmlAttributes:r,bodyAttributes:i}=n.props;r&&Object.assign(e,Ie(r)),i&&Object.assign(t,Ie(i))}Re(`html`,e),Re(`body`,t)},Be=class extends x.Component{componentDidMount(){Fe.push(this),ze()}componentDidUpdate(){ze()}componentWillUnmount(){let e=Fe.indexOf(this);e!==-1&&Fe.splice(e,1),ze()}resolveTitle(){let{title:e,titleTemplate:t,defaultTitle:n}=this.props;return e&&t?t.replace(/%s/g,()=>Array.isArray(e)?e.join(``):e):e||n||void 0}renderTitle(){let e=this.resolveTitle();if(e===void 0)return null;let t=this.props.titleAttributes||{};return x.createElement(`title`,Le(t),e)}renderBase(){let{base:e}=this.props;return e?x.createElement(`base`,Le(e)):null}renderMeta(){let{meta:e}=this.props;return!e||!Array.isArray(e)?null:e.map((e,t)=>x.createElement(`meta`,{key:t,...Le(e)}))}renderLink(){let{link:e}=this.props;return!e||!Array.isArray(e)?null:e.map((e,t)=>x.createElement(`link`,{key:t,...Le(e)}))}renderScript(){let{script:e}=this.props;return!e||!Array.isArray(e)?null:e.map((e,t)=>{let{innerHTML:n,...r}=e,i=Le(r);return n&&(i.dangerouslySetInnerHTML={__html:n}),x.createElement(`script`,{key:t,...i})})}renderStyle(){let{style:e}=this.props;return!e||!Array.isArray(e)?null:e.map((e,t)=>{let{cssText:n,...r}=e,i=Le(r);return n&&(i.dangerouslySetInnerHTML={__html:n}),x.createElement(`style`,{key:t,...i})})}renderNoscript(){let{noscript:e}=this.props;return!e||!Array.isArray(e)?null:e.map((e,t)=>{let{innerHTML:n,...r}=e,i=Le(r);return n&&(i.dangerouslySetInnerHTML={__html:n}),x.createElement(`noscript`,{key:t,...i})})}render(){return x.createElement(x.Fragment,null,this.renderTitle(),this.renderBase(),this.renderMeta(),this.renderLink(),this.renderScript(),this.renderStyle(),this.renderNoscript())}},Ve=class extends x.Component{static defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1};shouldComponentUpdate(e){return!(0,S.default)(ue(this.props,`helmetData`),ue(e,`helmetData`))}mapNestedChildrenToProps(e,t){if(!t)return null;switch(e.type){case`script`:case`noscript`:return{innerHTML:t};case`style`:return{cssText:t};default:throw Error(`<${e.type} /> elements are self-closing and can not contain children. Refer to our API for more information.`)}}flattenArrayTypeChildren(e,t,n,r){return{...t,[e.type]:[...t[e.type]||[],{...n,...this.mapNestedChildrenToProps(e,r)}]}}mapObjectTypeChildren(e,t,n,r){switch(e.type){case`title`:return{...t,[e.type]:r,titleAttributes:{...n}};case`body`:return{...t,bodyAttributes:{...n}};case`html`:return{...t,htmlAttributes:{...n}};default:return{...t,[e.type]:{...n}}}}mapArrayTypeChildrenToProps(e,t){let n={...t};return Object.keys(e).forEach(t=>{n={...n,[t]:e[t]}}),n}warnOnInvalidChildren(e,t){return(0,C.default)(D.some(t=>e.type===t),typeof e.type==`function`?`You may be attempting to nest components within each other, which is not allowed. Refer to our API for more information.`:`Only elements types ${D.join(`, `)} are allowed. Helmet does not support rendering <${e.type}> elements. Refer to our API for more information.`),(0,C.default)(!t||typeof t==`string`||Array.isArray(t)&&!t.some(e=>typeof e!=`string`),`Helmet expects a string as a child of <${e.type}>. Did you forget to wrap your children in braces? ( <${e.type}>{\`\`} ) Refer to our API for more information.`),!0}mapChildrenToProps(e,t){let n={};return x.Children.forEach(e,e=>{if(!e||!e.props)return;let{children:r,...i}=e.props,a=Object.keys(i).reduce((e,t)=>(e[ee[t]||t]=i[t],e),{}),{type:o}=e;switch(typeof o==`symbol`?o=o.toString():this.warnOnInvalidChildren(e,r),o){case`Symbol(react.fragment)`:t=this.mapChildrenToProps(r,t);break;case`link`:case`meta`:case`noscript`:case`script`:case`style`:n=this.flattenArrayTypeChildren(e,n,a,r);break;default:t=this.mapObjectTypeChildren(e,t,a,r);break}}),this.mapArrayTypeChildrenToProps(n,t)}render(){let{children:e,...t}=this.props,n={...t},{helmetData:r}=t;return e&&(n=this.mapChildrenToProps(e,n)),r&&!(r instanceof we)&&(r=new we(r.context,!0),delete n.helmetData),Te?x.createElement(Be,{...n}):r?x.createElement(Pe,{...n,context:r.value}):x.createElement(Ee.Consumer,null,e=>x.createElement(Pe,{...n,context:e}))}},He=`modulepreload`,Ue=function(e){return`/_frontend/`+e},We={};const Ge=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=Ue(t,n),t in We)return;We[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:He,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};var Ke=`popstate`;function qe(e){return typeof e==`object`&&!!e&&`pathname`in e&&`search`in e&&`hash`in e&&`state`in e&&`key`in e}function Je(e={}){function t(e,t){let n=t.state?.masked,{pathname:r,search:i,hash:a}=n||e.location;return et(``,{pathname:r,search:i,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||`default`,n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)}function n(e,t){return typeof t==`string`?t:tt(t)}return rt(t,n,null,e)}function Ye(e={}){function t(e,t){let{pathname:n=`/`,search:r=``,hash:i=``}=nt(e.location.hash.substring(1));return!n.startsWith(`/`)&&!n.startsWith(`.`)&&(n=`/`+n),et(``,{pathname:n,search:r,hash:i},t.state&&t.state.usr||null,t.state&&t.state.key||`default`)}function n(e,t){let n=e.document.querySelector(`base`),r=``;if(n&&n.getAttribute(`href`)){let t=e.location.href,n=t.indexOf(`#`);r=n===-1?t:t.slice(0,n)}return r+`#`+(typeof t==`string`?t:tt(t))}function r(e,t){Ze(e.pathname.charAt(0)===`/`,`relative pathnames are not supported in hash history.push(${JSON.stringify(t)})`)}return rt(t,n,r,e)}function Xe(e,t){if(e===!1||e==null)throw Error(t)}function Ze(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function Qe(){return Math.random().toString(36).substring(2,10)}function $e(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function et(e,t,n=null,r,i){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?nt(t):t,state:n,key:t&&t.key||r||Qe(),mask:i}}function tt({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function nt(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function rt(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function d(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:h.location,delta:t})}function f(e,t){s=`PUSH`;let r=qe(e)?e:et(h.location,e,t);n&&n(r,e),l=u()+1;let d=$e(r,l),f=h.createHref(r.mask||r);try{o.pushState(d,``,f)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(f)}a&&c&&c({action:s,location:h.location,delta:1})}function p(e,t){s=`REPLACE`;let r=qe(e)?e:et(h.location,e,t);n&&n(r,e),l=u();let i=$e(r,l),d=h.createHref(r.mask||r);o.replaceState(i,``,d),a&&c&&c({action:s,location:h.location,delta:0})}function m(e){return it(e)}let h={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener(Ke,d),c=e,()=>{i.removeEventListener(Ke,d),c=null}},createHref(e){return t(i,e)},createURL:m,encodeLocation(e){let t=m(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:f,replace:p,go(e){return o.go(e)}};return h}function it(e,t=!1){let n=`http://localhost`;typeof window<`u`&&(n=window.location.origin===`null`?window.location.href:window.location.origin),Xe(n,`No window.location.(origin|href) available to create URL`);let r=typeof e==`string`?e:tt(e);return r=r.replace(/ $/,`%20`),!t&&r.startsWith(`//`)&&(r=n+r),new URL(r,n)}function at(e,t,n=`/`){return ot(e,t,n,!1)}function ot(e,t,n,r,i){let a=Tt((typeof t==`string`?nt(t):t).pathname||`/`,n);if(a==null)return null;let o=i??ct(e),s=null,c=wt(a);for(let e=0;s==null&&e{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;Xe(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=Pt([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(Xe(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),lt(e.children,t,u,l,o)),!(e.path==null&&!e.index)&&t.push({path:l,score:yt(l,e.index),routesMeta:u})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of ut(e.path))a(e,t,!0,n)}),t}function ut(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=ut(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function dt(e){e.sort((e,t)=>e.score===t.score?bt(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}var ft=/^:[\w-]+$/,pt=3,mt=2,ht=1,gt=10,_t=-2,vt=e=>e===`*`;function yt(e,t){let n=e.split(`/`),r=n.length;return n.some(vt)&&(r+=_t),t&&(r+=mt),n.filter(e=>!vt(e)).reduce((e,t)=>e+(ft.test(t)?pt:t===``?ht:gt),r)}function bt(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function xt(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e{if(t===`*`){let e=s[r]||``;o=a.slice(0,a.length-e.length).replace(/(.)\/+$/,`$1`)}let i=s[r];return n&&!i?e[t]=void 0:e[t]=(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function Ct(e,t=!1,n=!0){Ze(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n,i,a)=>{if(r.push({paramName:t,isOptional:n!=null}),n){let t=a.charAt(i+e.length);return t&&t!==`/`?`/([^\\/]*)`:`(?:/([^\\/]*))?`}return`/([^\\/]+)`}).replace(/\/([\w-]+)\?(\/|$)/g,`(/$1)?$2`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function wt(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return Ze(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function Tt(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}var Et=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function Dt(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?nt(e):e,a;return n?(n=Nt(n),a=n.startsWith(`/`)?Ot(n.substring(1),`/`):Ot(n,t)):a=t,{pathname:a,search:Lt(r),hash:Rt(i)}}function Ot(e,t){let n=Ft(t).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function kt(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function At(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function jt(e){let t=At(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function Mt(e,t,n,r=!1){let i;typeof e==`string`?i=nt(e):(i={...e},Xe(!i.pathname||!i.pathname.includes(`?`),kt(`?`,`pathname`,`search`,i)),Xe(!i.pathname||!i.pathname.includes(`#`),kt(`#`,`pathname`,`hash`,i)),Xe(!i.search||!i.search.includes(`#`),kt(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=Dt(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}var Nt=e=>e.replace(/\/\/+/g,`/`),Pt=e=>Nt(e.join(`/`)),Ft=e=>e.replace(/\/+$/,``),It=e=>Ft(e).replace(/^\/*/,`/`),Lt=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,Rt=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,zt=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function Bt(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function Vt(e){return Pt(e.map(e=>e.route.path).filter(Boolean))||`/`}var Ht=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function Ut(e,t){let n=e;if(typeof n!=`string`||!Et.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(Ht)try{let e=new URL(window.location.href),r=n.startsWith(`//`)?new URL(e.protocol+n):new URL(n),a=Tt(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{Ze(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);var Wt=x.createContext(null);Wt.displayName=`DataRouter`;var Gt=x.createContext(null);Gt.displayName=`DataRouterState`;var Kt=x.createContext(!1);function qt(){return x.useContext(Kt)}var Jt=x.createContext({isTransitioning:!1});Jt.displayName=`ViewTransition`;var Yt=x.createContext(new Map);Yt.displayName=`Fetchers`;var Xt=x.createContext(null);Xt.displayName=`Await`;var Zt=x.createContext(null);Zt.displayName=`Navigation`;var Qt=x.createContext(null);Qt.displayName=`Location`;var $t=x.createContext({outlet:null,matches:[],isDataRoute:!1});$t.displayName=`Route`;var en=x.createContext(null);en.displayName=`RouteError`;var tn=`REACT_ROUTER_ERROR`,nn=`REDIRECT`,rn=`ROUTE_ERROR_RESPONSE`;function an(e){if(e.startsWith(`${tn}:${nn}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function on(e){if(e.startsWith(`${tn}:${rn}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new zt(t.status,t.statusText,t.data)}catch{}}function sn(e,{relative:t}={}){Xe(cn(),`useHref() may be used only in the context of a component.`);let{basename:n,navigator:r}=x.useContext(Zt),{hash:i,pathname:a,search:o}=mn(e,{relative:t}),s=a;return n!==`/`&&(s=a===`/`?n:Pt([n,a])),r.createHref({pathname:s,search:o,hash:i})}function cn(){return x.useContext(Qt)!=null}function ln(){return Xe(cn(),`useLocation() may be used only in the context of a component.`),x.useContext(Qt).location}var un=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`;function dn(e){x.useContext(Zt).static||x.useLayoutEffect(e)}function fn(){let{isDataRoute:e}=x.useContext($t);return e?Mn():pn()}function pn(){Xe(cn(),`useNavigate() may be used only in the context of a component.`);let e=x.useContext(Wt),{basename:t,navigator:n}=x.useContext(Zt),{matches:r}=x.useContext($t),{pathname:i}=ln(),a=JSON.stringify(jt(r)),o=x.useRef(!1);return dn(()=>{o.current=!0}),x.useCallback((r,s={})=>{if(Ze(o.current,un),!o.current)return;if(typeof r==`number`){n.go(r);return}let c=Mt(r,JSON.parse(a),i,s.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:Pt([t,c.pathname])),(s.replace?n.replace:n.push)(c,s.state,s)},[t,n,a,i,e])}x.createContext(null);function mn(e,{relative:t}={}){let{matches:n}=x.useContext($t),{pathname:r}=ln(),i=JSON.stringify(jt(n));return x.useMemo(()=>Mt(e,JSON.parse(i),r,t===`path`),[e,i,r,t])}function hn(e,t,n){Xe(cn(),`useRoutes() may be used only in the context of a component.`);let{navigator:r}=x.useContext(Zt),{matches:i}=x.useContext($t),a=i[i.length-1],o=a?a.params:{},s=a?a.pathname:`/`,c=a?a.pathnameBase:`/`,l=a&&a.route;{let e=l&&l.path||``;Pn(s,!l||e.endsWith(`*`)||e.endsWith(`*?`),`You rendered descendant (or called \`useRoutes()\`) at "${s}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. - -Please change the parent to .`)}let u=ln(),d;if(t){let e=typeof t==`string`?nt(t):t;Xe(c===`/`||e.pathname?.startsWith(c),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${c}" but pathname "${e.pathname}" was given in the \`location\` prop.`),d=e}else d=u;let f=d.pathname||`/`,p=f;if(c!==`/`){let e=c.replace(/^\//,``).split(`/`);p=`/`+f.replace(/^\//,``).split(`/`).slice(e.length).join(`/`)}let m=n&&n.state.matches.length?n.state.matches.map(e=>Object.assign(e,{route:n.manifest[e.route.id]||e.route})):at(e,{pathname:p});Ze(l||m!=null,`No routes matched location "${d.pathname}${d.search}${d.hash}" `),Ze(m==null||m[m.length-1].route.element!==void 0||m[m.length-1].route.Component!==void 0||m[m.length-1].route.lazy!==void 0,`Matched leaf route at location "${d.pathname}${d.search}${d.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let h=Sn(m&&m.map(e=>Object.assign({},e,{params:Object.assign({},o,e.params),pathname:Pt([c,r.encodeLocation?r.encodeLocation(e.pathname.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathname]),pathnameBase:e.pathnameBase===`/`?c:Pt([c,r.encodeLocation?r.encodeLocation(e.pathnameBase.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathnameBase])})),i,n);return t&&h?x.createElement(Qt.Provider,{value:{location:{pathname:`/`,search:``,hash:``,state:null,key:`default`,mask:void 0,...d},navigationType:`POP`}},h):h}function gn(){let e=jn(),t=Bt(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r=`rgba(200,200,200, 0.5)`,i={padding:`0.5rem`,backgroundColor:r},a={padding:`2px 4px`,backgroundColor:r},o=null;return console.error(`Error handled by React Router default ErrorBoundary:`,e),o=x.createElement(x.Fragment,null,x.createElement(`p`,null,`💿 Hey developer 👋`),x.createElement(`p`,null,`You can provide a way better UX than this when your app throws errors by providing your own `,x.createElement(`code`,{style:a},`ErrorBoundary`),` or`,` `,x.createElement(`code`,{style:a},`errorElement`),` prop on your route.`)),x.createElement(x.Fragment,null,x.createElement(`h2`,null,`Unexpected Application Error!`),x.createElement(`h3`,{style:{fontStyle:`italic`}},t),n?x.createElement(`pre`,{style:i},n):null,o)}var _n=x.createElement(gn,null),vn=class extends x.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!==`idle`&&e.revalidation===`idle`?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error===void 0?t.error:e.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error(`React Router caught the following error during render`,e)}render(){let e=this.state.error;if(this.context&&typeof e==`object`&&e&&`digest`in e&&typeof e.digest==`string`){let t=on(e.digest);t&&(e=t)}let t=e===void 0?this.props.children:x.createElement($t.Provider,{value:this.props.routeContext},x.createElement(en.Provider,{value:e,children:this.props.component}));return this.context?x.createElement(bn,{error:e},t):t}};vn.contextType=Kt;var yn=new WeakMap;function bn({children:e,error:t}){let{basename:n}=x.useContext(Zt);if(typeof t==`object`&&t&&`digest`in t&&typeof t.digest==`string`){let e=an(t.digest);if(e){let r=yn.get(t);if(r)throw r;let i=Ut(e.location,n);if(Ht&&!yn.get(t))if(i.isExternal||e.reloadDocument)window.location.href=i.absoluteURL||i.to;else{let n=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(i.to,{replace:e.replace}));throw yn.set(t,n),n}return x.createElement(`meta`,{httpEquiv:`refresh`,content:`0;url=${i.absoluteURL||i.to}`})}}return e}function xn({routeContext:e,match:t,children:n}){let r=x.useContext(Wt);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),x.createElement($t.Provider,{value:e},n)}function Sn(e,t=[],n){let r=n?.state;if(e==null){if(!r)return null;if(r.errors)e=r.matches;else if(t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let i=e,a=r?.errors;if(a!=null){let e=i.findIndex(e=>e.route.id&&a?.[e.route.id]!==void 0);Xe(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(a).join(`,`)}`),i=i.slice(0,Math.min(i.length,e+1))}let o=!1,s=-1;if(n&&r){o=r.renderFallback;for(let e=0;e=0?i.slice(0,s+1):[i[0]];break}}}}let c=n?.onError,l=r&&c?(e,t)=>{c(e,{location:r.location,params:r.matches?.[0]?.params??{},pattern:Vt(r.matches),errorInfo:t})}:void 0;return i.reduceRight((e,n,c)=>{let u,d=!1,f=null,p=null;r&&(u=a&&n.route.id?a[n.route.id]:void 0,f=n.route.errorElement||_n,o&&(s<0&&c===0?(Pn(`route-fallback`,!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,p=null):s===c&&(d=!0,p=n.route.hydrateFallbackElement||null)));let m=t.concat(i.slice(0,c+1)),h=()=>{let t;return t=u?f:d?p:n.route.Component?x.createElement(n.route.Component,null):n.route.element?n.route.element:e,x.createElement(xn,{match:n,routeContext:{outlet:e,matches:m,isDataRoute:r!=null},children:t})};return r&&(n.route.ErrorBoundary||n.route.errorElement||c===0)?x.createElement(vn,{location:r.location,revalidation:r.revalidation,component:f,error:u,children:h(),routeContext:{outlet:null,matches:m,isDataRoute:!0},onError:l}):h()},null)}function Cn(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function wn(e){let t=x.useContext(Wt);return Xe(t,Cn(e)),t}function Tn(e){let t=x.useContext(Gt);return Xe(t,Cn(e)),t}function En(e){let t=x.useContext($t);return Xe(t,Cn(e)),t}function Dn(e){let t=En(e),n=t.matches[t.matches.length-1];return Xe(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function On(){return Dn(`useRouteId`)}function kn(){return Tn(`useNavigation`).navigation}function An(){let{matches:e,loaderData:t}=Tn(`useMatches`);return x.useMemo(()=>e.map(e=>st(e,t)),[e,t])}function jn(){let e=x.useContext(en),t=Tn(`useRouteError`),n=Dn(`useRouteError`);return e===void 0?t.errors?.[n]:e}function Mn(){let{router:e}=wn(`useNavigate`),t=Dn(`useNavigate`),n=x.useRef(!1);return dn(()=>{n.current=!0}),x.useCallback(async(r,i={})=>{Ze(n.current,un),n.current&&(typeof r==`number`?await e.navigate(r):await e.navigate(r,{fromRouteId:t,...i}))},[e,t])}var Nn={};function Pn(e,t,n){!t&&!Nn[e]&&(Nn[e]=!0,Ze(!1,n))}x.useOptimistic,x.memo(Fn);function Fn({routes:e,manifest:t,future:n,state:r,isStatic:i,onError:a}){return hn(e,void 0,{manifest:t,state:r,isStatic:i,onError:a,future:n})}function In({basename:e=`/`,children:t=null,location:n,navigationType:r=`POP`,navigator:i,static:a=!1,useTransitions:o}){Xe(!cn(),`You cannot render a inside another . You should never have more than one in your app.`);let s=e.replace(/^\/*/,`/`),c=x.useMemo(()=>({basename:s,navigator:i,static:a,useTransitions:o,future:{}}),[s,i,a,o]);typeof n==`string`&&(n=nt(n));let{pathname:l=`/`,search:u=``,hash:d=``,state:f=null,key:p=`default`,mask:m}=n,h=x.useMemo(()=>{let e=Tt(l,s);return e==null?null:{location:{pathname:e,search:u,hash:d,state:f,key:p,mask:m},navigationType:r}},[s,l,u,d,f,p,r,m]);return Ze(h!=null,` is not able to match the URL "${l}${u}${d}" because it does not start with the basename, so the won't render anything.`),h==null?null:x.createElement(Zt.Provider,{value:c},x.createElement(Qt.Provider,{children:t,value:h}))}var Ln=`get`,Rn=`application/x-www-form-urlencoded`;function zn(e){return typeof HTMLElement<`u`&&e instanceof HTMLElement}function Bn(e){return zn(e)&&e.tagName.toLowerCase()===`button`}function Vn(e){return zn(e)&&e.tagName.toLowerCase()===`form`}function Hn(e){return zn(e)&&e.tagName.toLowerCase()===`input`}function Un(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Wn(e,t){return e.button===0&&(!t||t===`_self`)&&!Un(e)}var Gn=null;function Kn(){if(Gn===null)try{new FormData(document.createElement(`form`),0),Gn=!1}catch{Gn=!0}return Gn}var qn=new Set([`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`]);function Jn(e){return e!=null&&!qn.has(e)?(Ze(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${Rn}"`),null):e}function Yn(e,t){let n,r,i,a,o;if(Vn(e)){let o=e.getAttribute(`action`);r=o?Tt(o,t):null,n=e.getAttribute(`method`)||Ln,i=Jn(e.getAttribute(`enctype`))||Rn,a=new FormData(e)}else if(Bn(e)||Hn(e)&&(e.type===`submit`||e.type===`image`)){let o=e.form;if(o==null)throw Error(`Cannot submit a