From 5755b00d7b6734aed0448e6970adb5cbc911175f Mon Sep 17 00:00:00 2001 From: Marco Pedone Date: Fri, 29 Aug 2025 16:18:32 +0200 Subject: [PATCH] formatt --- apps/infoalloggi/.vscode/settings.json | 20 +- apps/infoalloggi/TypeHelpers.type.ts | 10 +- apps/infoalloggi/biome.json | 95 +- apps/infoalloggi/components.json | 40 +- apps/infoalloggi/emails/VerificaEmail.tsx | 54 +- apps/infoalloggi/emails/base.tsx | 10 +- apps/infoalloggi/emails/gereric-email.tsx | 70 +- .../emails/onboarding-servizio.tsx | 8 +- apps/infoalloggi/emails/pagamento-errore.tsx | 54 +- .../emails/pagamento-ricezione.tsx | 54 +- apps/infoalloggi/emails/recesso.tsx | 62 +- .../emails/registrazione-avvenuta.tsx | 52 +- apps/infoalloggi/knip.json | 4 +- apps/infoalloggi/next.config.mjs | 126 +- apps/infoalloggi/package.json | 42 +- apps/infoalloggi/src/_app/layout.tsx | 60 +- apps/infoalloggi/src/_app/lib/annunci.ts | 28 +- .../src/components/IconComponents.tsx | 50 +- .../src/components/ImageWithFallback.tsx | 6 +- .../src/components/InformationBubble.tsx | 6 +- apps/infoalloggi/src/components/Layout.tsx | 20 +- apps/infoalloggi/src/components/MapDialog.tsx | 10 +- .../src/components/accordionComp.tsx | 2 +- .../src/components/acquisto_processing.tsx | 20 +- .../src/components/acquisto_receipt.tsx | 8 +- .../src/components/allegato-iframe.tsx | 8 +- .../src/components/annunci_grid.tsx | 22 +- .../src/components/annunci_map.tsx | 40 +- .../src/components/annunci_tutorial.tsx | 12 +- .../annuncio_interactions.tsx | 26 +- .../annuncio-interactions/contatto_modal.tsx | 2 +- .../src/components/annuncio_card.tsx | 48 +- .../components/area-riservata/allegati.tsx | 66 +- .../area-riservata/comunicazioni.tsx | 18 +- .../components/area-riservata/dashboard.tsx | 10 +- .../src/components/area-riservata/ordini.tsx | 40 +- .../src/components/area-riservata/sidebar.tsx | 12 +- apps/infoalloggi/src/components/banners.tsx | 6 +- .../src/components/chat/chat-attachments.tsx | 16 +- .../src/components/chat/chat-bottombar.tsx | 30 +- .../src/components/chat/chat-bubble.tsx | 44 +- .../src/components/chat/chat-list.tsx | 113 +- .../src/components/chat/chat-message-list.tsx | 24 +- .../src/components/chat/chat-sidebar.tsx | 70 +- .../src/components/chat/chat-topbar.tsx | 22 +- apps/infoalloggi/src/components/chat/chat.tsx | 6 +- .../src/components/chat/message-loading.tsx | 26 +- .../src/components/codiceRicerca.tsx | 40 +- .../src/components/come_funziona.tsx | 36 +- apps/infoalloggi/src/components/confirm.tsx | 2 +- apps/infoalloggi/src/components/counter.tsx | 18 +- .../components/custom_ui/animated-button.tsx | 16 +- .../components/custom_ui/animated-number.tsx | 2 +- .../custom_ui/autoResizeTextArea.tsx | 12 +- .../src/components/custom_ui/data-table.tsx | 40 +- .../custom_ui/dataTable-FacetedFilter.tsx | 16 +- .../custom_ui/dataTable-ViewToggle.tsx | 8 +- .../components/custom_ui/dataTable-header.tsx | 4 +- .../custom_ui/dataTable-pagination.tsx | 18 +- .../custom_ui/dataTable-toolbar.tsx | 28 +- .../src/components/custom_ui/emoji-picker.tsx | 24 +- .../src/components/custom_ui/fileUpload.tsx | 178 +- .../src/components/custom_ui/form.tsx | 22 +- .../src/components/custom_ui/input.tsx | 2 +- .../components/custom_ui/loading-button.tsx | 4 +- .../src/components/custom_ui/multi-select.tsx | 40 +- .../src/components/custom_ui/multiselect.tsx | 158 +- .../components/custom_ui/nestableDialog.tsx | 32 +- .../components/custom_ui/staggered-fade.tsx | 29 +- apps/infoalloggi/src/components/etichette.tsx | 20 +- .../src/components/failed-loading.tsx | 6 +- apps/infoalloggi/src/components/footer.tsx | 12 +- apps/infoalloggi/src/components/map/Map.tsx | 36 +- .../src/components/map/custom_marker.tsx | 12 +- .../src/components/map/map_marker.tsx | 62 +- .../src/components/navbar/lang-toggle.tsx | 4 +- .../src/components/navbar/login-button.tsx | 24 +- .../src/components/navbar/main-nav.tsx | 6 +- .../src/components/navbar/mobile-nav.tsx | 76 +- .../src/components/navbar/ricerca_command.tsx | 6 +- .../src/components/navbar/settings-modal.tsx | 2 +- .../src/components/navbar/site-header.tsx | 4 +- .../src/components/navbar/theme-toggle.tsx | 8 +- .../src/components/payment_status.tsx | 28 +- .../src/components/phone-input.tsx | 42 +- apps/infoalloggi/src/components/prezzi.tsx | 56 +- .../src/components/progress_redirect.tsx | 4 +- .../components/servizio/annuncio_actions.tsx | 148 +- .../src/components/servizio/annuncio_card.tsx | 30 +- .../src/components/servizio/conferma.tsx | 2 +- .../src/components/servizio/interactions.tsx | 70 +- .../src/components/servizio/main.tsx | 428 ++-- .../servizio/service-duration-display.tsx | 14 +- .../components/servizio/servizio_actions.tsx | 74 +- .../servizio/servizio_annunci_accordions.tsx | 26 +- .../src/components/status-page.tsx | 6 +- .../src/components/subscriptionDbg.tsx | 4 +- apps/infoalloggi/src/components/svgs.tsx | 148 +- .../src/components/tables/banlist-table.tsx | 24 +- .../src/components/tables/banners-table.tsx | 139 +- .../src/components/tables/etichette.tsx | 55 +- .../src/components/tables/flags-table.tsx | 29 +- .../src/components/tables/orders-table.tsx | 124 +- .../src/components/tables/payments-table.tsx | 64 +- .../components/tables/prezziario-tables.tsx | 122 +- .../src/components/tables/ricerca-table.tsx | 16 +- .../src/components/tables/servizio-table.tsx | 50 +- .../src/components/tables/storage-table.tsx | 125 +- .../src/components/tables/stringhe-table.tsx | 35 +- .../src/components/tables/users-table.tsx | 83 +- apps/infoalloggi/src/components/timeline.tsx | 34 +- .../src/components/timeserieBarChart.tsx | 18 +- .../components/timeserieBarChartStacked.tsx | 24 +- .../src/components/tip-tap/editor.tsx | 16 +- .../src/components/tip-tap/toolbar.tsx | 96 +- .../src/components/ui/accordion.tsx | 6 +- .../src/components/ui/alert-dialog.tsx | 12 +- apps/infoalloggi/src/components/ui/avatar.tsx | 6 +- apps/infoalloggi/src/components/ui/badge.tsx | 12 +- .../src/components/ui/breadcrumb.tsx | 20 +- apps/infoalloggi/src/components/ui/button.tsx | 46 +- .../src/components/ui/calendar.tsx | 124 +- apps/infoalloggi/src/components/ui/card.tsx | 14 +- .../src/components/ui/carousel.tsx | 32 +- apps/infoalloggi/src/components/ui/chart.tsx | 16 +- .../src/components/ui/checkbox.tsx | 4 +- .../infoalloggi/src/components/ui/command.tsx | 18 +- .../src/components/ui/context-menu.tsx | 28 +- apps/infoalloggi/src/components/ui/dialog.tsx | 14 +- apps/infoalloggi/src/components/ui/drawer.tsx | 12 +- .../src/components/ui/dropdown-menu.tsx | 30 +- apps/infoalloggi/src/components/ui/form.tsx | 20 +- apps/infoalloggi/src/components/ui/input.tsx | 4 +- apps/infoalloggi/src/components/ui/label.tsx | 2 +- .../src/components/ui/pagination.tsx | 20 +- .../infoalloggi/src/components/ui/popover.tsx | 4 +- .../src/components/ui/progress.tsx | 4 +- .../src/components/ui/scroll-area.tsx | 10 +- apps/infoalloggi/src/components/ui/select.tsx | 16 +- .../src/components/ui/separator.tsx | 6 +- apps/infoalloggi/src/components/ui/sheet.tsx | 12 +- .../src/components/ui/skeleton.tsx | 2 +- apps/infoalloggi/src/components/ui/slider.tsx | 18 +- apps/infoalloggi/src/components/ui/switch.tsx | 4 +- apps/infoalloggi/src/components/ui/table.tsx | 18 +- apps/infoalloggi/src/components/ui/tabs.tsx | 8 +- .../src/components/ui/textarea.tsx | 2 +- apps/infoalloggi/src/components/ui/toggle.tsx | 20 +- .../infoalloggi/src/components/ui/tooltip.tsx | 4 +- .../src/components/upload_modal.tsx | 18 +- .../src/components/videoPlayer.tsx | 28 +- apps/infoalloggi/src/env.mjs | 64 +- apps/infoalloggi/src/forms/FormBanlist.tsx | 10 +- apps/infoalloggi/src/forms/FormBanners.tsx | 70 +- .../src/forms/FormChangePassword.tsx | 50 +- .../src/forms/FormContattoAnnuncio.tsx | 26 +- .../src/forms/FormEditAnnuncio.tsx | 322 +-- .../src/forms/FormEditServizioAdmin.tsx | 56 +- apps/infoalloggi/src/forms/FormEtichette.tsx | 14 +- apps/infoalloggi/src/forms/FormFlags.tsx | 4 +- apps/infoalloggi/src/forms/FormLogin.tsx | 38 +- .../infoalloggi/src/forms/FormNewPswReset.tsx | 10 +- .../infoalloggi/src/forms/FormNewServizio.tsx | 174 +- .../src/forms/FormNewServizioAcquisto.tsx | 460 ++-- apps/infoalloggi/src/forms/FormNewUser.tsx | 54 +- .../src/forms/FormOverridePassword.tsx | 50 +- apps/infoalloggi/src/forms/FormPrezzo.tsx | 110 +- .../src/forms/FormProfilo_Account.tsx | 24 +- .../src/forms/FormProfilo_Anagrafica.tsx | 198 +- apps/infoalloggi/src/forms/FormPwSetup.tsx | 56 +- .../src/forms/FormRstPwFromToken.tsx | 48 +- apps/infoalloggi/src/forms/FormStringhe.tsx | 8 +- .../src/forms/MotivazioneTransitorio.tsx | 6 +- apps/infoalloggi/src/hooks/chatHooks.ts | 12 +- .../src/hooks/schedaAnnuncioUtils.ts | 14 +- .../src/hooks/useStrongPassword.ts | 8 +- .../src/i18n/FormErrorsTranslation.ts | 583 +++-- apps/infoalloggi/src/i18n/en.ts | 2142 ++++++++--------- apps/infoalloggi/src/i18n/it.ts | 2118 ++++++++-------- apps/infoalloggi/src/i18n/locales.ts | 1516 ++++++------ apps/infoalloggi/src/lib/form_utils.ts | 28 +- apps/infoalloggi/src/lib/storage_manager.ts | 14 +- apps/infoalloggi/src/lib/useIsTyping.ts | 2 +- apps/infoalloggi/src/lib/utils.ts | 4 +- apps/infoalloggi/src/middleware.ts | 8 +- .../src/middlewares/auth_middleware.ts | 8 +- apps/infoalloggi/src/pages/404.tsx | 6 +- apps/infoalloggi/src/pages/500.tsx | 6 +- apps/infoalloggi/src/pages/500Auth.tsx | 4 +- apps/infoalloggi/src/pages/_app.tsx | 8 +- apps/infoalloggi/src/pages/_document.tsx | 28 +- apps/infoalloggi/src/pages/annunci.tsx | 108 +- apps/infoalloggi/src/pages/annuncio/[cod].tsx | 82 +- apps/infoalloggi/src/pages/api/panel.ts | 2 +- .../src/pages/api/stripe-webhook.ts | 4 +- apps/infoalloggi/src/pages/api/trpc/[trpc].ts | 2 +- .../pages/area-riservata/admin/annunci.tsx | 4 +- .../pages/area-riservata/admin/banners.tsx | 38 +- .../pages/area-riservata/admin/blacklist.tsx | 38 +- .../src/pages/area-riservata/admin/chats.tsx | 2 +- .../area-riservata/admin/chats/[chatId].tsx | 4 +- .../admin/edit-annuncio/[id].tsx | 4 +- .../pages/area-riservata/admin/etichette.tsx | 38 +- .../src/pages/area-riservata/admin/flags.tsx | 30 +- .../src/pages/area-riservata/admin/ordini.tsx | 2 +- .../pages/area-riservata/admin/prezziario.tsx | 62 +- .../pages/area-riservata/admin/storage.tsx | 38 +- .../area-riservata/admin/testi-stringhe.tsx | 38 +- .../admin/user-view/allegati/[userId].tsx | 4 +- .../user-view/comunicazioni/[userId].tsx | 2 +- .../admin/user-view/edit-user/[userId].tsx | 30 +- .../admin/user-view/onboard/[servizioId].tsx | 4 +- .../admin/user-view/ordini/[userId].tsx | 2 +- .../admin/user-view/ricerca/[userId].tsx | 4 +- .../admin/user-view/servizio/[userId].tsx | 28 +- .../src/pages/area-riservata/admin/utenti.tsx | 6 +- .../src/pages/area-riservata/allegati.tsx | 4 +- .../allegato-view/[allegatoId].tsx | 20 +- .../src/pages/area-riservata/chat.tsx | 4 +- .../pages/area-riservata/comunicazioni.tsx | 2 +- .../src/pages/area-riservata/dashboard.tsx | 2 +- .../src/pages/area-riservata/ordini.tsx | 2 +- .../payment-recap/[ordineId].tsx | 4 +- .../src/pages/area-riservata/profilo.tsx | 14 +- .../src/pages/auth/new-password-reset.tsx | 2 +- .../src/pages/auth/password-reset/[token].tsx | 2 +- apps/infoalloggi/src/pages/chi-siamo.tsx | 6 +- apps/infoalloggi/src/pages/contatti.tsx | 18 +- apps/infoalloggi/src/pages/guida.tsx | 12 +- apps/infoalloggi/src/pages/index.tsx | 18 +- apps/infoalloggi/src/pages/login.tsx | 2 +- apps/infoalloggi/src/pages/prezzi.tsx | 34 +- apps/infoalloggi/src/pages/privacy-policy.tsx | 2 +- apps/infoalloggi/src/pages/proprietari.tsx | 10 +- .../pages/servizio/acquisto-processing.tsx | 32 +- .../pages/servizio/condizioni/[stringaId].tsx | 4 +- .../servizio/conferma-immobile/[...slug].tsx | 26 +- .../contratto-registrazione/[...slug].tsx | 10 +- .../pages/servizio/contratto/[...slug].tsx | 10 +- .../pages/servizio/onboard/[servizioId].tsx | 4 +- .../pages/servizio/pagamento/[ordineId].tsx | 6 +- .../servizio/pre-onboard/[servizioId].tsx | 12 +- .../servizio/riapri-conferma/[...slug].tsx | 10 +- .../src/pages/termini-condizioni.tsx | 2 +- .../src/providers/RicercaProvider.tsx | 28 +- .../src/providers/ServizioProvider.tsx | 4 +- .../src/providers/SessionProvider.tsx | 12 +- .../src/providers/StorageTableProvider.tsx | 16 +- apps/infoalloggi/src/schemas/Database.ts | 2 +- .../infoalloggi/src/schemas/public/Annunci.ts | 126 +- .../infoalloggi/src/schemas/public/BanType.ts | 10 +- .../infoalloggi/src/schemas/public/Banlist.ts | 12 +- .../infoalloggi/src/schemas/public/Banners.ts | 30 +- apps/infoalloggi/src/schemas/public/Chats.ts | 14 +- .../src/schemas/public/ChatsEtichette.ts | 14 +- apps/infoalloggi/src/schemas/public/Emails.ts | 14 +- .../src/schemas/public/Etichette.ts | 14 +- .../src/schemas/public/EventQueue.ts | 16 +- apps/infoalloggi/src/schemas/public/Flags.ts | 8 +- .../src/schemas/public/GenericStatusEnum.ts | 8 +- .../src/schemas/public/Messages.ts | 24 +- .../src/schemas/public/MiogestImagesRef.ts | 14 +- .../src/schemas/public/OrderTypeEnum.ts | 10 +- apps/infoalloggi/src/schemas/public/Ordini.ts | 38 +- .../src/schemas/public/PaymentStatusEnum.ts | 8 +- .../src/schemas/public/Payments.ts | 42 +- .../src/schemas/public/Prezziario.ts | 36 +- .../src/schemas/public/PublicSchema.ts | 96 +- .../src/schemas/public/Ratelimiter.ts | 8 +- .../src/schemas/public/Servizio.ts | 74 +- .../src/schemas/public/ServizioAnnunci.ts | 86 +- .../src/schemas/public/ServizioInteressi.ts | 10 +- .../src/schemas/public/Storageindex.ts | 20 +- .../src/schemas/public/TempTokens.ts | 12 +- .../src/schemas/public/TestiEStringhe.ts | 14 +- .../schemas/public/TipologiaPosizioneEnum.ts | 6 +- apps/infoalloggi/src/schemas/public/Users.ts | 46 +- .../src/schemas/public/UsersAnagrafica.ts | 60 +- .../src/schemas/public/UsersStorage.ts | 10 +- apps/infoalloggi/src/server/api/root.ts | 30 +- .../src/server/api/routers/annunci.ts | 69 +- .../src/server/api/routers/auth.ts | 108 +- .../src/server/api/routers/banlist.ts | 30 +- .../src/server/api/routers/chat.ts | 82 +- .../src/server/api/routers/chat_sse.ts | 193 +- .../src/server/api/routers/comunicazioni.ts | 40 +- .../src/server/api/routers/contact.ts | 12 +- .../src/server/api/routers/event_queue.ts | 2 +- .../src/server/api/routers/fatture.ts | 36 +- .../src/server/api/routers/interests.ts | 63 +- .../src/server/api/routers/messages_sse.ts | 68 +- .../src/server/api/routers/prezziario.ts | 64 +- .../src/server/api/routers/servizio.ts | 488 ++-- .../src/server/api/routers/settings.ts | 242 +- .../src/server/api/routers/stats.ts | 8 +- .../src/server/api/routers/storage.ts | 139 +- .../src/server/api/routers/stripe.ts | 34 +- .../src/server/api/routers/users.ts | 86 +- apps/infoalloggi/src/server/api/trpc.ts | 14 +- .../server/controllers/annunci.controller.ts | 12 +- .../src/server/controllers/auth.controller.ts | 30 +- .../src/server/controllers/chat.controller.ts | 10 +- .../controllers/etichette.controller.ts | 4 +- .../server/controllers/servizio.controller.ts | 154 +- .../server/controllers/skebby.controller.ts | 16 +- .../server/controllers/storage.controller.ts | 8 +- .../server/controllers/stripe.controller.ts | 62 +- .../src/server/controllers/user.controller.ts | 4 +- apps/infoalloggi/src/server/db.ts | 10 +- .../src/server/services/auth.service.ts | 12 +- .../src/server/services/chat.service.ts | 2 +- .../src/server/services/email.service.ts | 2 +- .../src/server/services/fic.service.ts | 86 +- .../infoalloggi/src/server/services/mailer.ts | 32 +- .../src/server/services/storage.service.ts | 2 +- .../infoalloggi/src/server/utils/ssgHelper.ts | 6 +- apps/infoalloggi/src/utils/api.ts | 14 +- apps/infoalloggi/src/utils/fonts.ts | 4 +- apps/infoalloggi/tsconfig.json | 128 +- 319 files changed, 9017 insertions(+), 8869 deletions(-) diff --git a/apps/infoalloggi/.vscode/settings.json b/apps/infoalloggi/.vscode/settings.json index e4f1d96..316d48b 100644 --- a/apps/infoalloggi/.vscode/settings.json +++ b/apps/infoalloggi/.vscode/settings.json @@ -1,16 +1,20 @@ { - "typescript.tsdk": "node_modules\\typescript\\lib", + "editor.codeActionsOnSave": { + "source.fixAll.biome": "explicit" + }, + "editor.formatOnSave": true, + "npm.exclude": "**/.next/**", "sqltools.connections": [ { - "previewLimit": 50, - "server": "localhost", - "port": 5432, + "database": "postgres", "driver": "PostgreSQL", "name": "DB", - "database": "postgres", - "username": "postgres", - "password": "rootpost" + "password": "rootpost", + "port": 5432, + "previewLimit": 50, + "server": "localhost", + "username": "postgres" } ], - "editor.formatOnSave": true, + "typescript.tsdk": "node_modules\\typescript\\lib" } \ No newline at end of file diff --git a/apps/infoalloggi/TypeHelpers.type.ts b/apps/infoalloggi/TypeHelpers.type.ts index a0f8d56..3affacc 100644 --- a/apps/infoalloggi/TypeHelpers.type.ts +++ b/apps/infoalloggi/TypeHelpers.type.ts @@ -16,15 +16,15 @@ * ``` */ export type Prettify = { - [K in keyof T]: T[K]; + [K in keyof T]: T[K]; } & {}; // export type PrettifyR = T extends object - ? T extends infer O - ? { [K in keyof O]: PrettifyR } - : never - : T; + ? T extends infer O + ? { [K in keyof O]: PrettifyR } + : never + : T; /** * @example diff --git a/apps/infoalloggi/biome.json b/apps/infoalloggi/biome.json index 66a27d7..89d2e42 100644 --- a/apps/infoalloggi/biome.json +++ b/apps/infoalloggi/biome.json @@ -1,10 +1,14 @@ { "$schema": "https://biomejs.dev/schemas/2.2.2/schema.json", - "vcs": { - "enabled": true, - "root": "../../", - "clientKind": "git", - "useIgnoreFile": false + "assist": { + "actions": { + "source": { + "organizeImports": "on", + "useSortedAttributes": "on", + "useSortedKeys": "on" + } + }, + "enabled": true }, "files": { @@ -21,6 +25,7 @@ "headers", "schemas" ], + "ignoreUnknown": true, "includes": [ "**", "!node_modules", @@ -49,60 +54,56 @@ "!src/i18n/nazioni.ts", "!src/i18n/provincie.ts", "!src/styles/globals.css" - ], - "ignoreUnknown": true + ] }, "formatter": { "enabled": true, "indentStyle": "tab" }, - "linter": { - "enabled": true, - - "domains": { - "next": "recommended", - "react": "recommended" - }, - "rules": { - "recommended": true, - "a11y": { - "noNoninteractiveElementInteractions": "error", - "useSemanticElements": "off", - "noAutofocus": "off" - }, - "suspicious": { - "useIterableCallbackReturn": "off", - "noArrayIndexKey": "off", - "noUnknownAtRules": "off" - }, - "complexity": { - "noUselessFragments": "off" - }, - - "correctness": { - "useHookAtTopLevel": "off", - "useExhaustiveDependencies": "off", - "useParseIntRadix": "off" - }, - "performance": { - "noImgElement": "off" - }, - "security": { - "noDangerouslySetInnerHtml": "off" - } - } - }, "javascript": { "formatter": { "quoteStyle": "double" } }, - "assist": { + "linter": { + "domains": { + "next": "recommended", + "react": "recommended" + }, "enabled": true, - "actions": { - "source": { - "organizeImports": "on" + "rules": { + "a11y": { + "noAutofocus": "off", + "noNoninteractiveElementInteractions": "error", + "useSemanticElements": "off" + }, + "complexity": { + "noUselessFragments": "off" + }, + + "correctness": { + "useExhaustiveDependencies": "off", + "useHookAtTopLevel": "off", + "useParseIntRadix": "off" + }, + "performance": { + "noImgElement": "off" + }, + "recommended": true, + "security": { + "noDangerouslySetInnerHtml": "off" + }, + "suspicious": { + "noArrayIndexKey": "off", + "noUnknownAtRules": "off", + "useIterableCallbackReturn": "off" } } + }, + "vcs": { + "clientKind": "git", + "enabled": true, + "root": "../../", + "useIgnoreFile": false } } diff --git a/apps/infoalloggi/components.json b/apps/infoalloggi/components.json index aeceae7..ed017d8 100644 --- a/apps/infoalloggi/components.json +++ b/apps/infoalloggi/components.json @@ -1,21 +1,21 @@ { - "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", - "rsc": false, - "tsx": true, - "tailwind": { - "config": "", - "css": "src/styles/global.css", - "baseColor": "neutral", - "cssVariables": true, - "prefix": "" - }, - "aliases": { - "components": "~/components", - "utils": "~/lib/utils", - "ui": "~/components/ui", - "lib": "~/lib", - "hooks": "~/hooks" - }, - "iconLibrary": "lucide" -} \ No newline at end of file + "$schema": "https://ui.shadcn.com/schema.json", + "aliases": { + "components": "~/components", + "hooks": "~/hooks", + "lib": "~/lib", + "ui": "~/components/ui", + "utils": "~/lib/utils" + }, + "iconLibrary": "lucide", + "rsc": false, + "style": "new-york", + "tailwind": { + "baseColor": "neutral", + "config": "", + "css": "src/styles/global.css", + "cssVariables": true, + "prefix": "" + }, + "tsx": true +} diff --git a/apps/infoalloggi/emails/VerificaEmail.tsx b/apps/infoalloggi/emails/VerificaEmail.tsx index 4ef8edc..e8e3a64 100644 --- a/apps/infoalloggi/emails/VerificaEmail.tsx +++ b/apps/infoalloggi/emails/VerificaEmail.tsx @@ -1,40 +1,40 @@ import { Button, Heading, Row, Section, Text } from "@react-email/components"; import Base from "./base"; export type VerificaEmail_NewMail = { - mailType: "verificaEmail"; - props: VerificaEmailProps; + mailType: "verificaEmail"; + props: VerificaEmailProps; }; type VerificaEmailProps = { - token: string; - userId: string; - redirect?: string; + token: string; + userId: string; + redirect?: string; }; const VerificaEmail = ({ token, userId, redirect }: VerificaEmailProps) => { - return ( - - <> - - Verifica la tua email - -
- - - Clicca sul pulsante qui sotto per verificare la tua email. - - + return ( + + <> + + Verifica la tua email + +
+ + + Clicca sul pulsante qui sotto per verificare la tua email. + + - -
- - - ); + +
+ + + ); }; export default VerificaEmail; diff --git a/apps/infoalloggi/emails/base.tsx b/apps/infoalloggi/emails/base.tsx index 0bf37ad..8960f73 100644 --- a/apps/infoalloggi/emails/base.tsx +++ b/apps/infoalloggi/emails/base.tsx @@ -42,13 +42,13 @@ const Base = ({ Infoalloggi.it
diff --git a/apps/infoalloggi/emails/gereric-email.tsx b/apps/infoalloggi/emails/gereric-email.tsx index 455c4c0..eb17d0b 100644 --- a/apps/infoalloggi/emails/gereric-email.tsx +++ b/apps/infoalloggi/emails/gereric-email.tsx @@ -1,48 +1,48 @@ import { Button, Heading, Row, Section, Text } from "@react-email/components"; import Base from "./base"; export type Generic_NewMail = { - mailType: "generic"; - props: GenericProps; + mailType: "generic"; + props: GenericProps; }; type GenericProps = { - title: string; - noreply?: boolean; - testo: string; - link?: { - href: string; - label?: string; - }; + title: string; + noreply?: boolean; + testo: string; + link?: { + href: string; + label?: string; + }; }; const Generic = ({ - title, - noreply = false, - testo, - link = undefined, + title, + noreply = false, + testo, + link = undefined, }: GenericProps) => { - return ( - - <> - {title} -
- - {testo} - - {link && ( -
- -
- )} -
- - - ); + return ( + + <> + {title} +
+ + {testo} + + {link && ( +
+ +
+ )} +
+ + + ); }; export default Generic; diff --git a/apps/infoalloggi/emails/onboarding-servizio.tsx b/apps/infoalloggi/emails/onboarding-servizio.tsx index 5c76497..27662e1 100644 --- a/apps/infoalloggi/emails/onboarding-servizio.tsx +++ b/apps/infoalloggi/emails/onboarding-servizio.tsx @@ -61,11 +61,11 @@ const OnboardingServizio = ({
{`Annuncio @@ -83,8 +83,8 @@ const OnboardingServizio = ({ {(annuncio.prezzo / 1e2).toFixed(2)} Scheda dell'annuncio → diff --git a/apps/infoalloggi/emails/pagamento-errore.tsx b/apps/infoalloggi/emails/pagamento-errore.tsx index 1c96305..79884f8 100644 --- a/apps/infoalloggi/emails/pagamento-errore.tsx +++ b/apps/infoalloggi/emails/pagamento-errore.tsx @@ -1,36 +1,36 @@ import { Button, Heading, Row, Section, Text } from "@react-email/components"; import Base from "./base"; export type PagamentoErrore_NewMail = { - mailType: "pagamentoErrore"; + mailType: "pagamentoErrore"; }; const PagamentoErrore = () => { - return ( - - <> - - Errore Pagamento - -
- - - Gentile Cliente, la informiamo che il pagamento non è andato a - buon fine. Si prega di riprovare o contattare il nostro servizio - clienti per ulteriori informazioni. - - -
- -
-
- - - ); + return ( + + <> + + Errore Pagamento + +
+ + + Gentile Cliente, la informiamo che il pagamento non è andato a + buon fine. Si prega di riprovare o contattare il nostro servizio + clienti per ulteriori informazioni. + + +
+ +
+
+ + + ); }; export default PagamentoErrore; diff --git a/apps/infoalloggi/emails/pagamento-ricezione.tsx b/apps/infoalloggi/emails/pagamento-ricezione.tsx index d795eff..6fafb79 100644 --- a/apps/infoalloggi/emails/pagamento-ricezione.tsx +++ b/apps/infoalloggi/emails/pagamento-ricezione.tsx @@ -1,36 +1,36 @@ import { Button, Heading, Row, Section, Text } from "@react-email/components"; import Base from "./base"; export type PagamentoRicezione_NewMail = { - mailType: "pagamentoRicezione"; + mailType: "pagamentoRicezione"; }; const PagamentoRicezione = () => { - return ( - - <> - - Ricezione Pagamento - -
- - - Gentile Cliente, le confermiamo la ricezione del pagamento. Le - invieremo una mail di conferma quando il pagamento sarà stato - processato. - - -
- -
-
- - - ); + return ( + + <> + + Ricezione Pagamento + +
+ + + Gentile Cliente, le confermiamo la ricezione del pagamento. Le + invieremo una mail di conferma quando il pagamento sarà stato + processato. + + +
+ +
+
+ + + ); }; export default PagamentoRicezione; diff --git a/apps/infoalloggi/emails/recesso.tsx b/apps/infoalloggi/emails/recesso.tsx index ff8d0ee..b079647 100644 --- a/apps/infoalloggi/emails/recesso.tsx +++ b/apps/infoalloggi/emails/recesso.tsx @@ -1,39 +1,39 @@ import { Heading, Row, Section, Text } from "@react-email/components"; import Base from "./base"; export type Recesso_NewMail = { - mailType: "recesso"; + mailType: "recesso"; }; const Recesso = () => { - return ( - - <> - - Richiesta di recesso - -
- - - Gentile cliente, abbiamo ricevuto la tua richiesta di recesso. - Procederemo ad elaborare la richiesta e termineremo i servizi - attualemte attivi nel tuo account. - - - Per ulteriori informazioni e chiarimenti non esiti a contattarci - all'indirizzo{" "} - - amministrazione@infoalloggi.it{" "} - - - Cordiali saluti -
-
-
- - - ); + return ( + + <> + + Richiesta di recesso + +
+ + + Gentile cliente, abbiamo ricevuto la tua richiesta di recesso. + Procederemo ad elaborare la richiesta e termineremo i servizi + attualemte attivi nel tuo account. + + + Per ulteriori informazioni e chiarimenti non esiti a contattarci + all'indirizzo{" "} + + amministrazione@infoalloggi.it{" "} + + + Cordiali saluti +
+
+
+ + + ); }; export default Recesso; diff --git a/apps/infoalloggi/emails/registrazione-avvenuta.tsx b/apps/infoalloggi/emails/registrazione-avvenuta.tsx index 5ca80e3..ebfd892 100644 --- a/apps/infoalloggi/emails/registrazione-avvenuta.tsx +++ b/apps/infoalloggi/emails/registrazione-avvenuta.tsx @@ -1,35 +1,35 @@ import { Button, Heading, Row, Section, Text } from "@react-email/components"; import Base from "./base"; export type RegistrazioneAvvenuta_NewMail = { - mailType: "registrazioneAvvenuta"; + mailType: "registrazioneAvvenuta"; }; const RegistrazioneAvvenuta = () => { - return ( - - <> - - Registrazione avvenuta - -
- - - La tua registrazione è avvenuta con successo! Ora puoi accedere al - nostro sito con le tue credenziali. - - -
- -
-
- - - ); + return ( + + <> + + Registrazione avvenuta + +
+ + + La tua registrazione è avvenuta con successo! Ora puoi accedere al + nostro sito con le tue credenziali. + + +
+ +
+
+ + + ); }; export default RegistrazioneAvvenuta; diff --git a/apps/infoalloggi/knip.json b/apps/infoalloggi/knip.json index ae422c6..fe5a81d 100644 --- a/apps/infoalloggi/knip.json +++ b/apps/infoalloggi/knip.json @@ -1,6 +1,5 @@ { "$schema": "https://unpkg.com/knip@5/schema.json", - "project": ["src/**", "**", "!src/schemas/public/*.ts", "!emails/**"], "ignore": [ ".kanelrc.js", "TypeHelpers.type.ts", @@ -36,5 +35,6 @@ "@radix-ui/react-slot", "@radix-ui/react-tooltip", "@radix-ui/react-popover" - ] + ], + "project": ["src/**", "**", "!src/schemas/public/*.ts", "!emails/**"] } diff --git a/apps/infoalloggi/next.config.mjs b/apps/infoalloggi/next.config.mjs index 45674fd..b1637f3 100644 --- a/apps/infoalloggi/next.config.mjs +++ b/apps/infoalloggi/next.config.mjs @@ -7,86 +7,86 @@ import { env } from "node:process"; /** @type {import("next").NextConfig} */ const nextConfig = { - output: env.NODE_ENV === "production" ? "standalone" : undefined, // This is for docker builds - reactStrictMode: true, compiler: { removeConsole: false, }, - i18n: { - locales: ["it", "en"], - defaultLocale: "it", - }, - images: { - remotePatterns: [ - { - protocol: "https", - hostname: "*.googleusercontent.com", - port: "", - pathname: "**", - }, - { - hostname: env.BACKENDSERVER_URL || "localhost:1323", - }, - ], - minimumCacheTTL: 86400, // 1 day in seconds - }, - - typescript: { - ignoreBuildErrors: true, - }, devIndicators: false, - rewrites: async () => { - return [ - { - source: "/api/panel", - destination: env.NODE_ENV === "production" ? "/404" : "/api/panel", - }, - { - source: "/go-api/images/get/:slug*", - destination: `${env.BACKENDSERVER_URL}/images/get/:slug*`, - }, - { - source: "/go-api/storage/get/:slug*", - destination: `${env.BACKENDSERVER_URL}/storage/get/:slug*`, - has: [ - { type: "cookie", key: "access_token" }, - { - type: "query", - key: "token", - value: - "(?^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$)", - }, - ], - }, - { - source: "/go-api/storage/upload:slug*", - destination: `${env.BACKENDSERVER_URL}/storage/upload:slug*`, - has: [ - { type: "cookie", key: "access_token" }, - { - type: "query", - key: "token", - value: - "(?^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$)", - }, - ], - }, - ]; - }, headers: async () => { return [ { - source: "/:path*", headers: [ { key: "X-Frame-Options", value: "", }, ], + source: "/:path*", }, ]; }, + i18n: { + defaultLocale: "it", + locales: ["it", "en"], + }, + images: { + minimumCacheTTL: 86400, // 1 day in seconds + remotePatterns: [ + { + hostname: "*.googleusercontent.com", + pathname: "**", + port: "", + protocol: "https", + }, + { + hostname: env.BACKENDSERVER_URL || "localhost:1323", + }, + ], + }, + output: env.NODE_ENV === "production" ? "standalone" : undefined, // This is for docker builds + reactStrictMode: true, + rewrites: async () => { + return [ + { + destination: env.NODE_ENV === "production" ? "/404" : "/api/panel", + source: "/api/panel", + }, + { + destination: `${env.BACKENDSERVER_URL}/images/get/:slug*`, + source: "/go-api/images/get/:slug*", + }, + { + destination: `${env.BACKENDSERVER_URL}/storage/get/:slug*`, + has: [ + { key: "access_token", type: "cookie" }, + { + key: "token", + type: "query", + value: + "(?^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$)", + }, + ], + source: "/go-api/storage/get/:slug*", + }, + { + destination: `${env.BACKENDSERVER_URL}/storage/upload:slug*`, + has: [ + { key: "access_token", type: "cookie" }, + { + key: "token", + type: "query", + value: + "(?^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$)", + }, + ], + source: "/go-api/storage/upload:slug*", + }, + ]; + }, + + typescript: { + ignoreBuildErrors: true, + }, }; export default nextConfig; diff --git a/apps/infoalloggi/package.json b/apps/infoalloggi/package.json index a0aa46f..3b1d7df 100644 --- a/apps/infoalloggi/package.json +++ b/apps/infoalloggi/package.json @@ -1,22 +1,6 @@ { - "name": "infoalloggi", - "version": "0.1.0", - "private": true, - "scripts": { - "build": "next build", - "dev": "node ./headers/dev.js && next dev --turbopack", - "dev-https": "node ./headers/dev-https.js && cross-env NEXT_PUBLIC_BASE_URL='https://localhost:3000' INTERNAL_BASE_URL='https://localhost:3000' next dev --experimental-https --turbopack", - "idev": "cross-env NODE_OPTIONS='--inspect' next dev --turbopack", - "lint": "node ./headers/lint.js && biome lint && node check-env-vars.js", - "start": "next start", - "types": "node ./headers/type.js && tsc --noEmit", - "pg-typegen": "node ./headers/pg-typegen.js && npx kanel", - "email": "cross-env NEXT_PUBLIC_BASE_URL='https://localhost:3000' email dev --port 3500", - "test": "npm run lint && npm run types", - "knip": "knip --no-exit-code", - "stripe-dev": "stripe listen --forward-to https://localhost:3000/api/stripe-webhook", - "d": "npm run-p dev stripe-dev -cl", - "test-kr": "node ./kyselyRules/rules/select.test.js && node ./kyselyRules/rules/where.test.js&& node ./kyselyRules/rules/null.test.js" + "ct3aMetadata": { + "initVersion": "7.9.0" }, "dependencies": { "@fattureincloud/fattureincloud-ts-sdk": "^2.1.1", @@ -122,7 +106,23 @@ "npm-run-all": "^4.1.5", "typescript": "^5.9.2" }, - "ct3aMetadata": { - "initVersion": "7.9.0" - } + "name": "infoalloggi", + "private": true, + "scripts": { + "build": "next build", + "d": "npm run-p dev stripe-dev -cl", + "dev": "node ./headers/dev.js && next dev --turbopack", + "dev-https": "node ./headers/dev-https.js && cross-env NEXT_PUBLIC_BASE_URL='https://localhost:3000' INTERNAL_BASE_URL='https://localhost:3000' next dev --experimental-https --turbopack", + "email": "cross-env NEXT_PUBLIC_BASE_URL='https://localhost:3000' email dev --port 3500", + "idev": "cross-env NODE_OPTIONS='--inspect' next dev --turbopack", + "knip": "knip --no-exit-code", + "lint": "node ./headers/lint.js && biome lint && node check-env-vars.js", + "pg-typegen": "node ./headers/pg-typegen.js && npx kanel", + "start": "next start", + "stripe-dev": "stripe listen --forward-to https://localhost:3000/api/stripe-webhook", + "test": "npm run lint && npm run types", + "test-kr": "node ./kyselyRules/rules/select.test.js && node ./kyselyRules/rules/where.test.js&& node ./kyselyRules/rules/null.test.js", + "types": "node ./headers/type.js && tsc --noEmit" + }, + "version": "0.1.0" } diff --git a/apps/infoalloggi/src/_app/layout.tsx b/apps/infoalloggi/src/_app/layout.tsx index fea34bf..b978800 100644 --- a/apps/infoalloggi/src/_app/layout.tsx +++ b/apps/infoalloggi/src/_app/layout.tsx @@ -1,39 +1,39 @@ import type { Metadata } from "next"; import "~/styles/globals.css"; export const metadata: Metadata = { - title: "Home", - description: "Welcome to Next.js", - icons: { - apple: { - url: "/favicon/apple-touch-icon.png", - sizes: "180x180", - type: "image/png", - }, - icon: [ - { url: "/favicon/favicon-32x32.png", sizes: "32x32", type: "image/png" }, - { url: "/favicon/favicon-16x16.png", sizes: "16x16", type: "image/png" }, - ], - other: [ - { - rel: "mask-icon", - url: "/favicon/safari-pinned-tab.svg", - color: "#5bbad5", - }, - ], - }, - manifest: "/site.webmanifest", + description: "Welcome to Next.js", + icons: { + apple: { + sizes: "180x180", + type: "image/png", + url: "/favicon/apple-touch-icon.png", + }, + icon: [ + { sizes: "32x32", type: "image/png", url: "/favicon/favicon-32x32.png" }, + { sizes: "16x16", type: "image/png", url: "/favicon/favicon-16x16.png" }, + ], + other: [ + { + color: "#5bbad5", + rel: "mask-icon", + url: "/favicon/safari-pinned-tab.svg", + }, + ], + }, + manifest: "/site.webmanifest", + title: "Home", }; export default function RootLayout({ - // Layouts must accept a children prop. - // This will be populated with nested layouts or pages - children, + // Layouts must accept a children prop. + // This will be populated with nested layouts or pages + children, }: { - children: React.ReactNode; + children: React.ReactNode; }) { - return ( - - {children} - - ); + return ( + + {children} + + ); } diff --git a/apps/infoalloggi/src/_app/lib/annunci.ts b/apps/infoalloggi/src/_app/lib/annunci.ts index bfae57f..398c1df 100644 --- a/apps/infoalloggi/src/_app/lib/annunci.ts +++ b/apps/infoalloggi/src/_app/lib/annunci.ts @@ -2,19 +2,19 @@ import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import { db } from "~/server/db"; export async function getDataFromDB() { - try { - // Example query - adjust to your database schema - const data = await db - .selectFrom("annunci") - .select("codice") - .where("web", "=", true) - .where("tipo", "=", TipologiaPosizioneEnum.Transitorio) - .where("stato", "=", "Attivo") - .execute(); + try { + // Example query - adjust to your database schema + const data = await db + .selectFrom("annunci") + .select("codice") + .where("web", "=", true) + .where("tipo", "=", TipologiaPosizioneEnum.Transitorio) + .where("stato", "=", "Attivo") + .execute(); - return data; - } catch (error) { - console.error("Database error:", error); - return []; - } + return data; + } catch (error) { + console.error("Database error:", error); + return []; + } } diff --git a/apps/infoalloggi/src/components/IconComponents.tsx b/apps/infoalloggi/src/components/IconComponents.tsx index fb40f14..391dd3f 100644 --- a/apps/infoalloggi/src/components/IconComponents.tsx +++ b/apps/infoalloggi/src/components/IconComponents.tsx @@ -216,15 +216,15 @@ export const IconMatrixTooltip = () => {
{iconOptions.map((icon) => ( ))} @@ -310,16 +310,16 @@ export const ShieldExclamationIcon = ({ className?: string; }) => ( Shield ); @@ -330,49 +330,49 @@ export const QuestionMarkCircleIcon = ({ className?: string; }) => ( QuestionMark ); export const HomeIcon = ({ className }: { className?: string }) => ( Home ); const CheckCircleIcon = ({ className }: { className?: string }) => ( CheckCircle ); diff --git a/apps/infoalloggi/src/components/ImageWithFallback.tsx b/apps/infoalloggi/src/components/ImageWithFallback.tsx index 4b78bb3..83427d5 100644 --- a/apps/infoalloggi/src/components/ImageWithFallback.tsx +++ b/apps/infoalloggi/src/components/ImageWithFallback.tsx @@ -6,14 +6,14 @@ export const ImageFlbk = (props: ComponentProps) => { return ( { + e.currentTarget.src = fallbackImage; + }} onLoad={(e) => { if (e.currentTarget.naturalWidth === 0) { e.currentTarget.src = fallbackImage; } }} - onError={(e) => { - e.currentTarget.src = fallbackImage; - }} /> ); }; diff --git a/apps/infoalloggi/src/components/InformationBubble.tsx b/apps/infoalloggi/src/components/InformationBubble.tsx index 2cd8ba3..4fe045f 100644 --- a/apps/infoalloggi/src/components/InformationBubble.tsx +++ b/apps/infoalloggi/src/components/InformationBubble.tsx @@ -59,20 +59,20 @@ const InformationBubble = ({ )} > {href ? (

{txt}

diff --git a/apps/infoalloggi/src/components/Layout.tsx b/apps/infoalloggi/src/components/Layout.tsx index 382e878..a6b909f 100644 --- a/apps/infoalloggi/src/components/Layout.tsx +++ b/apps/infoalloggi/src/components/Layout.tsx @@ -145,8 +145,8 @@ export const AreaRiservataLayoutUserView = ({ {t.heads.area_riservata_titolo}
@@ -191,8 +191,8 @@ const UserViewHeader = () => { @@ -212,8 +212,8 @@ const UserViewHeader = () => { @@ -222,8 +222,8 @@ const UserViewHeader = () => { @@ -231,10 +231,10 @@ const UserViewHeader = () => { @@ -243,8 +243,8 @@ const UserViewHeader = () => { @@ -252,8 +252,8 @@ const UserViewHeader = () => { @@ -272,21 +272,21 @@ const UserViewHeader = () => { > diff --git a/apps/infoalloggi/src/components/MapDialog.tsx b/apps/infoalloggi/src/components/MapDialog.tsx index ec0e118..76f3d67 100644 --- a/apps/infoalloggi/src/components/MapDialog.tsx +++ b/apps/infoalloggi/src/components/MapDialog.tsx @@ -27,7 +27,7 @@ export const MappaDialogFullscreen = ({ const { t } = useTranslation(); const [open, setOpen] = useState(false); return ( - + @@ -188,10 +188,10 @@ const CheckoutForm = ({ setIsLoading(true); const { error } = await stripe.confirmPayment({ - elements, confirmParams: { return_url: `${env.NEXT_PUBLIC_BASE_URL}/servizio/acquisto-processing`, }, + elements, }); if (error.type === "card_error" || error.type === "validation_error") { setMessage(error.message || "An unexpected error occurred."); @@ -218,7 +218,7 @@ const CheckoutForm = ({ -
+ {t.procedi} diff --git a/apps/infoalloggi/src/components/acquisto_receipt.tsx b/apps/infoalloggi/src/components/acquisto_receipt.tsx index f483d81..5c92124 100644 --- a/apps/infoalloggi/src/components/acquisto_receipt.tsx +++ b/apps/infoalloggi/src/components/acquisto_receipt.tsx @@ -22,7 +22,7 @@ export function ReceiptGenerator({ data }: { data: PurchaseData }) {

Ricevuta di cortesia

-
@@ -79,10 +79,10 @@ function Receipt({ data }: ReceiptProps) {
{`${companyName}
@@ -131,7 +131,7 @@ function Receipt({ data }: ReceiptProps) { {data.items.map((item, idx) => ( - + {item.description} {formatCurrency(item.price)} diff --git a/apps/infoalloggi/src/components/allegato-iframe.tsx b/apps/infoalloggi/src/components/allegato-iframe.tsx index f514db3..b3254b7 100644 --- a/apps/infoalloggi/src/components/allegato-iframe.tsx +++ b/apps/infoalloggi/src/components/allegato-iframe.tsx @@ -45,12 +45,12 @@ export const AllegatoIframe = ({ > {/** biome-ignore lint/a11y/noNoninteractiveElementInteractions: */}