a8fdc9ebcc
Webbplatsen och plattformen är ett system. Samma komponentbibliotek, samma rutnät, samma ord — besökaren lämnar aldrig marknadswebben när den loggar in, eftersom den inte gör det. När apparna kommer återanvänder de samma bibliotek. Det som saknas på startsidan är lika avsiktligt som det som finns: ingen hjältebild, ingen gradient, ingen animation, inga kundlogotyper, ingen uppmaning att boka demo. En sida som försöker övertyga läser som marknadsföring; en sida som redovisar läser som dokumentation. Den senare är vad en teknisk chef fattar beslut utifrån. Kunskapskällorna är byggda som Operational Knowledge Infrastructure: leverantörsoberoende gränssnitt där organisationen ansluter det den har licens till. Det gör att produkten aldrig behöver marknadsföras med "vi stödjer X". En betainstallation fungerar på enbart egna dokument. Livscykeln har fem tillstånd med avsikt. Configured och Connected är inte samma sak — en nyckel kan vara ifylld och ändå fel — och Validated skiljer sig från Connected: anslutningen svarar, men har den data för de fordon organisationen faktiskt arbetar med? Det är den frågan som avgör om källan är till nytta. Portalens nyckeltal visas som NOT APPLICABLE i stället för som tomma grafer. Att visa noll vore att lova något som inte finns; att dölja raderna vore att dölja riktningen. Ett test läser den faktiska källkoden och låser disciplinen: inga gradienter, ingen animation, inga emojier utanför ✓ ○ □ →, ingen färg utanför paletten, inga marknadsföringsord. Ett designsystem som bara finns i ett dokument blir urvattnat på tredje sidan någon lägger till. Testet avslöjade att min egen kod använde py-3 — 12 px — och alltså bröt 8 px-rutnätet på sju ställen. Jag rättade koden, inte testet. Ett rutnät med undantag är inget rutnät. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
92 lines
4.2 KiB
TypeScript
92 lines
4.2 KiB
TypeScript
import { Toaster } from "@/components/ui/toaster";
|
|
import { Toaster as Sonner } from "@/components/ui/sonner";
|
|
import { TooltipProvider } from "@/components/ui/tooltip";
|
|
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
import { BrowserRouter, HashRouter, Routes, Route } from "react-router-dom";
|
|
import Index from "./pages/Index";
|
|
import NotFound from "./pages/NotFound";
|
|
import ResetPassword from "./pages/ResetPassword";
|
|
import Profile from "./pages/Profile";
|
|
import Account from "./pages/Account";
|
|
import AccountConfirmation from "./pages/AccountConfirmation";
|
|
import Contact from "./pages/Contact";
|
|
import Admin from "./pages/Admin";
|
|
import FAQ from "./pages/FAQ";
|
|
import OrderConfirmation from "./pages/OrderConfirmation";
|
|
import ChangeSubscription from "./pages/ChangeSubscription";
|
|
import Arendelista from "./pages/felsokning/Arendelista";
|
|
import NyttArende from "./pages/felsokning/NyttArende";
|
|
import ArendeSida from "./pages/felsokning/ArendeSida";
|
|
import DelatArende from "./pages/felsokning/DelatArende";
|
|
import PublikDelning from "./pages/felsokning/PublikDelning";
|
|
import Oversikt from "./pages/felsokning/Oversikt";
|
|
import Installningar from "./pages/felsokning/Installningar";
|
|
import AlvaStart from "./pages/alva/Start";
|
|
import AlvaAnsokan from "./pages/alva/Ansokan";
|
|
import AlvaLoggaIn from "./pages/alva/LoggaIn";
|
|
import AlvaPortal from "./pages/alva/Portal";
|
|
import AlvaKunskapskallor from "./pages/alva/Kunskapskallor";
|
|
import { PaymentTestModeBanner } from "@/components/PaymentTestModeBanner";
|
|
|
|
const queryClient = new QueryClient();
|
|
|
|
// Hash-baserad routing för miljöer utan SPA-rewrites (t.ex. förhandsvisning
|
|
// på en statisk sida). Standard är vanlig historik-routing.
|
|
//
|
|
// Historik-routing kräver att sidan serveras från roten: ligger den under
|
|
// en sökväg matchar ingen route och besökaren får 404-sidan. I
|
|
// förhandsvisningsläge går routingen därför via hash — då spelar
|
|
// sökvägen ingen roll — och startsidan är Guidad Felsökning i stället för
|
|
// värdapplikationens startsida.
|
|
const forhandsvisning = !!import.meta.env.VITE_HASH_ROUTER;
|
|
const Router = forhandsvisning ? HashRouter : BrowserRouter;
|
|
|
|
function AppContent() {
|
|
return (
|
|
<Router>
|
|
<PaymentTestModeBanner />
|
|
<Routes>
|
|
<Route path="/" element={forhandsvisning ? <Arendelista /> : <Index />} />
|
|
<Route path="/contact" element={<Contact />} />
|
|
<Route path="/faq" element={<FAQ />} />
|
|
<Route path="/reset-password" element={<ResetPassword />} />
|
|
<Route path="/profile" element={<Profile />} />
|
|
<Route path="/account" element={<Account />} />
|
|
<Route path="/account/confirmation" element={<AccountConfirmation />} />
|
|
<Route path="/admin" element={<Admin />} />
|
|
<Route path="/order-confirmation" element={<OrderConfirmation />} />
|
|
<Route path="/account/change-subscription" element={<ChangeSubscription />} />
|
|
{/* ALVA — publik webbplats och kundportal. Samma system, samma
|
|
komponentbibliotek: besökaren lämnar aldrig marknadswebben
|
|
när den loggar in. */}
|
|
<Route path="/alva" element={<AlvaStart />} />
|
|
<Route path="/alva/ansokan" element={<AlvaAnsokan />} />
|
|
<Route path="/alva/logga-in" element={<AlvaLoggaIn />} />
|
|
<Route path="/alva/portal" element={<AlvaPortal />} />
|
|
<Route path="/alva/portal/kunskapskallor" element={<AlvaKunskapskallor />} />
|
|
<Route path="/felsokning" element={<Arendelista />} />
|
|
<Route path="/felsokning/nytt" element={<NyttArende />} />
|
|
<Route path="/felsokning/arende/:id" element={<ArendeSida />} />
|
|
<Route path="/felsokning/dela/:id" element={<DelatArende />} />
|
|
<Route path="/felsokning/delad/:kod" element={<PublikDelning />} />
|
|
<Route path="/felsokning/oversikt" element={<Oversikt />} />
|
|
<Route path="/felsokning/installningar" element={<Installningar />} />
|
|
{/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */}
|
|
<Route path="*" element={<NotFound />} />
|
|
</Routes>
|
|
</Router>
|
|
);
|
|
}
|
|
|
|
const App = () => (
|
|
<QueryClientProvider client={queryClient}>
|
|
<TooltipProvider>
|
|
<Toaster />
|
|
<Sonner />
|
|
<AppContent />
|
|
</TooltipProvider>
|
|
</QueryClientProvider>
|
|
);
|
|
|
|
export default App;
|