From 76457d3a83b60dae252a2dab2907c83300653c92 Mon Sep 17 00:00:00 2001 From: Githan Mayurathan Date: Tue, 17 Feb 2026 18:00:54 +0100 Subject: [PATCH 1/7] Hentet raw-data fra sanity --- app/components/nav.tsx | 4 +- app/routes.ts | 1 + app/routes/om-oss-Sanity.tsx | 60 ++++++++++++++ app/sanityClient.ts | 8 ++ package.json | 1 + pnpm-lock.yaml | 153 +++++++++++++++++++++++++++++++++++ 6 files changed, 225 insertions(+), 2 deletions(-) create mode 100644 app/routes/om-oss-Sanity.tsx create mode 100644 app/sanityClient.ts diff --git a/app/components/nav.tsx b/app/components/nav.tsx index fdf51ba..c8fd10d 100644 --- a/app/components/nav.tsx +++ b/app/components/nav.tsx @@ -16,9 +16,9 @@ export function Nav() { Prosjekter - {/* + Om oss - */} + ); diff --git a/app/routes.ts b/app/routes.ts index 96697fe..4f895ac 100644 --- a/app/routes.ts +++ b/app/routes.ts @@ -5,4 +5,5 @@ export default [ route("/tjenester", "routes/tjenester.tsx"), route("/prosjekter", "routes/projectOverview.tsx"), route("/prosjekter/:slug", "routes/projectPage.tsx"), + route("/om-oss", "routes/om-oss-Sanity.tsx"), ] satisfies RouteConfig; diff --git a/app/routes/om-oss-Sanity.tsx b/app/routes/om-oss-Sanity.tsx new file mode 100644 index 0000000..16e34ef --- /dev/null +++ b/app/routes/om-oss-Sanity.tsx @@ -0,0 +1,60 @@ +import { client } from "../sanityClient"; + +export default async function OmOssPage() { + // Vi henter hele dokumentet med alle felt (...) + const data = await client.fetch(` + *[_type == "studentGroup" && slug.current == "consulting"][0] + `); + + // Sjekk om vi i det hele tatt får svar + if (!data) { + return ( +
+ Kunne ikke koble til Sanity eller fant ikke dokumentet. +
+ ); + } + + return ( +
+ {/* 1. Viser tittelen */} +

{data.title}

+ + {/* 2. Enkel rendering av tekstblokker (Portable Text manuelt) */} +
+ {data.content?.map((block: any, index: number) => { + // Sanity lagrer vanligvis tekst i 'children'-arrayet til en blokk + if (block._type === "block" && block.children) { + const text = block.children.map((child: any) => child.text).join(""); + return ( +

+ {text} +

+ ); + } + return null; + })} +
+ +
+ + {/* 3. DEBUG: Viser alt som ligger i Sanity-dokumentet som tekst */} +
+

+ // Rådata fra Sanity (Alt innhold): +

+
{JSON.stringify(data, null, 2)}
+
+
+ ); +} diff --git a/app/sanityClient.ts b/app/sanityClient.ts new file mode 100644 index 0000000..5e90efe --- /dev/null +++ b/app/sanityClient.ts @@ -0,0 +1,8 @@ +import { createClient } from "@sanity/client"; + +export const client = createClient({ + projectId: "pgq2pd26", + dataset: "production", + apiVersion: "2026-02-12", + useCdn: true, +}); diff --git a/package.json b/package.json index b1ce387..7583ff0 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ }, "dependencies": { "@mantine/core": "^7.17.1", + "@sanity/client": "^7.14.1", "isbot": "^5.1.27", "lucide-react": "^0.503.0", "react": "^19.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3626c3d..c83103a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@mantine/core': specifier: ^7.17.1 version: 7.17.5(@mantine/hooks@7.17.5(react@19.1.0))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@sanity/client': + specifier: ^7.14.1 + version: 7.14.1 isbot: specifier: ^5.1.27 version: 5.1.27 @@ -977,6 +980,13 @@ packages: cpu: [x64] os: [win32] + '@sanity/client@7.14.1': + resolution: {integrity: sha512-lCDx0vuNUgg9FL2E5Hiv1q7u6iHd1Z+jjMZAaYtfzzFPoBKOiyZlaFwqyLVHRyTbwnXQdIGDPmx2AvfBTbGQsQ==} + engines: {node: '>=20'} + + '@sanity/eventsource@5.0.2': + resolution: {integrity: sha512-/B9PMkUvAlUrpRq0y+NzXgRv5lYCLxZNsBJD2WXVnqZYOfByL9oQBV7KiTaARuObp5hcQYuPfOAVjgXe3hrixA==} + '@tailwindcss/node@4.1.4': resolution: {integrity: sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==} @@ -1070,6 +1080,15 @@ packages: '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/event-source-polyfill@1.0.5': + resolution: {integrity: sha512-iaiDuDI2aIFft7XkcwMzDWLqo7LVDixd2sR6B4wxJut9xcp/Ev9bO4EFg4rm6S9QxATLBj5OPxdeocgmhjwKaw==} + + '@types/eventsource@1.1.15': + resolution: {integrity: sha512-XQmGcbnxUNa06HR3VBVkc9+A2Vpi9ZyLJcdS5dwaQQ/4ZMWFO+5c90FnMUpbtMZwB/FChoYHwuVg8TvkECacTA==} + + '@types/follow-redirects@1.14.4': + resolution: {integrity: sha512-GWXfsD0Jc1RWiFmMuMFCpXMzi9L7oPDVwxUnZdg89kDNnqsRfUKXEtUYtA98A6lig1WXH/CYY/fvPW9HuN5fTA==} + '@types/node@20.17.32': resolution: {integrity: sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==} @@ -1218,6 +1237,10 @@ packages: supports-color: optional: true + decompress-response@7.0.0: + resolution: {integrity: sha512-6IvPrADQyyPGLpMnUh6kfKiqy7SrbXbjoUuZ90WMBJKErzv2pCiwlGEXjRX9/54OnTq+XFVnkOnOMzclLI5aEA==} + engines: {node: '>=10'} + dedent@1.5.3: resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: @@ -1278,6 +1301,13 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + event-source-polyfill@1.0.31: + resolution: {integrity: sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA==} + + eventsource@2.0.2: + resolution: {integrity: sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==} + engines: {node: '>=12.0.0'} + exit-hook@2.2.1: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} @@ -1299,6 +1329,15 @@ packages: picomatch: optional: true + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -1319,6 +1358,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-it@8.7.0: + resolution: {integrity: sha512-uong/+jOz0GiuIWIUJXp2tnQKgQKukC99LEqOxLckPUoHYoerQbV6vC0Tu+/pSgk0tgHh1xX2aJtCk4y35LLLg==} + engines: {node: '>=14.0.0'} + get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -1359,6 +1402,9 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -1373,6 +1419,10 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + isbot@5.1.27: resolution: {integrity: sha512-V3W56Hnztt4Wdh3VUlAMbdNicX/tOM38eChW3a2ixP6KEBJAeehxzYzTD59JrU5NCTgBZwRt9lRWr8D7eMZVYQ==} engines: {node: '>=18'} @@ -1511,6 +1561,10 @@ packages: engines: {node: '>=10.0.0'} hasBin: true + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + miniflare@4.20250428.0: resolution: {integrity: sha512-3kKJNcdh5zUSXoFD3kGSRWc+ETZS36O7ygkCJJF/bwN7lxcB5mOXq+2DPqV/nVyu2DGLDAqsAvjXhpPKCHuPOQ==} engines: {node: '>=18.0.0'} @@ -1712,6 +1766,10 @@ packages: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1737,6 +1795,12 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} @@ -1816,6 +1880,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1838,6 +1905,9 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + tinyglobby@0.2.13: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} @@ -1855,6 +1925,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + turbo-stream@2.4.0: resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==} @@ -1944,6 +2017,9 @@ packages: '@types/react': optional: true + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + valibot@0.41.0: resolution: {integrity: sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng==} peerDependencies: @@ -2856,6 +2932,22 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.40.1': optional: true + '@sanity/client@7.14.1': + dependencies: + '@sanity/eventsource': 5.0.2 + get-it: 8.7.0 + nanoid: 3.3.11 + rxjs: 7.8.2 + transitivePeerDependencies: + - debug + + '@sanity/eventsource@5.0.2': + dependencies: + '@types/event-source-polyfill': 1.0.5 + '@types/eventsource': 1.1.15 + event-source-polyfill: 1.0.31 + eventsource: 2.0.2 + '@tailwindcss/node@4.1.4': dependencies: enhanced-resolve: 5.18.1 @@ -2923,6 +3015,14 @@ snapshots: '@types/estree@1.0.7': {} + '@types/event-source-polyfill@1.0.5': {} + + '@types/eventsource@1.1.15': {} + + '@types/follow-redirects@1.14.4': + dependencies: + '@types/node': 20.17.32 + '@types/node@20.17.32': dependencies: undici-types: 6.19.8 @@ -3067,6 +3167,10 @@ snapshots: dependencies: ms: 2.1.3 + decompress-response@7.0.0: + dependencies: + mimic-response: 3.1.0 + dedent@1.5.3(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 @@ -3159,6 +3263,10 @@ snapshots: estree-walker@2.0.2: {} + event-source-polyfill@1.0.31: {} + + eventsource@2.0.2: {} + exit-hook@2.2.1: {} exsolve@1.0.5: {} @@ -3173,6 +3281,8 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + follow-redirects@1.15.11: {} + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -3191,6 +3301,17 @@ snapshots: gensync@1.0.0-beta.2: {} + get-it@8.7.0: + dependencies: + '@types/follow-redirects': 1.14.4 + decompress-response: 7.0.0 + follow-redirects: 1.15.11 + is-retry-allowed: 2.2.0 + through2: 4.0.2 + tunnel-agent: 0.6.0 + transitivePeerDependencies: + - debug + get-nonce@1.0.1: {} get-port@7.1.0: {} @@ -3231,6 +3352,8 @@ snapshots: resolve-from: 4.0.0 optional: true + inherits@2.0.4: {} + is-arrayish@0.2.1: optional: true @@ -3243,6 +3366,8 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-retry-allowed@2.2.0: {} + isbot@5.1.27: {} isexe@2.0.0: {} @@ -3346,6 +3471,8 @@ snapshots: mime@3.0.0: {} + mimic-response@3.1.0: {} + miniflare@4.20250428.0: dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -3533,6 +3660,12 @@ snapshots: react@19.1.0: {} + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@4.1.2: {} regenerator-runtime@0.14.1: {} @@ -3575,6 +3708,12 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.40.1 fsevents: 2.3.3 + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.2.1: {} + scheduler@0.26.0: {} semver@6.3.1: {} @@ -3669,6 +3808,10 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -3686,6 +3829,10 @@ snapshots: tapable@2.2.1: {} + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + tinyglobby@0.2.13: dependencies: fdir: 6.4.4(picomatch@4.0.2) @@ -3697,6 +3844,10 @@ snapshots: tslib@2.8.1: {} + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + turbo-stream@2.4.0: {} type-fest@4.40.1: {} @@ -3765,6 +3916,8 @@ snapshots: optionalDependencies: '@types/react': 19.1.2 + util-deprecate@1.0.2: {} + valibot@0.41.0(typescript@5.8.3): optionalDependencies: typescript: 5.8.3 From ee91c1bea282335569bf39b4caba791544cf3cc0 Mon Sep 17 00:00:00 2001 From: Githan Mayurathan Date: Thu, 26 Feb 2026 17:57:58 +0100 Subject: [PATCH 2/7] =?UTF-8?q?om=20oss=20siden,=20og=20sanity=20hentet=20?= =?UTF-8?q?riktig.=20Mangler=20kun=20=C3=A5=20hente=20profilbilder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/root.tsx | 6 +- app/routes.ts | 2 +- app/routes/om-oss-Sanity.tsx | 209 +++-- app/routes/{om-oss.tsx => om-oss-offline.tsx} | 0 package.json | 3 + pnpm-lock.yaml | 732 ++++++++++++++++++ 6 files changed, 896 insertions(+), 56 deletions(-) rename app/routes/{om-oss.tsx => om-oss-offline.tsx} (100%) diff --git a/app/root.tsx b/app/root.tsx index 21a2874..6371994 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -40,13 +40,13 @@ export function Layout({ children }: { children: React.ReactNode }) { -
+
diff --git a/app/routes.ts b/app/routes.ts index 4f895ac..e13c02c 100644 --- a/app/routes.ts +++ b/app/routes.ts @@ -5,5 +5,5 @@ export default [ route("/tjenester", "routes/tjenester.tsx"), route("/prosjekter", "routes/projectOverview.tsx"), route("/prosjekter/:slug", "routes/projectPage.tsx"), - route("/om-oss", "routes/om-oss-Sanity.tsx"), + route("/om-oss", "routes/om-oss-sanity.tsx"), ] satisfies RouteConfig; diff --git a/app/routes/om-oss-Sanity.tsx b/app/routes/om-oss-Sanity.tsx index 16e34ef..c3928ba 100644 --- a/app/routes/om-oss-Sanity.tsx +++ b/app/routes/om-oss-Sanity.tsx @@ -1,60 +1,165 @@ import { client } from "../sanityClient"; +import imageUrlBuilder from "@sanity/image-url"; +import ReactMarkdown from "react-markdown"; +import { useEffect, useState } from "react"; +import { Mail, Instagram, Linkedin, Facebook, User } from "lucide-react"; -export default async function OmOssPage() { - // Vi henter hele dokumentet med alle felt (...) - const data = await client.fetch(` - *[_type == "studentGroup" && slug.current == "consulting"][0] - `); - - // Sjekk om vi i det hele tatt får svar - if (!data) { - return ( -
- Kunne ikke koble til Sanity eller fant ikke dokumentet. -
- ); - } +const builder = imageUrlBuilder(client); +function urlFor(source: any) { + return builder.image(source); +} + +export default function OmOssSanity() { + const [data, setData] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + client + .fetch(` + *[_type == "studentGroup" && slug.current == "consulting"][0]{ + name, + description, + image, + socials, + members[]{ + role, + profile->{ + _id, + name, + image + } + } + } + `) + .then((res) => { + console.log("DATA:", JSON.stringify(res, null, 2)); + setData(res); + setLoading(false); + }) + .catch((err) => { + console.error("Sanity error:", err); + setLoading(false); + }); + }, []); + + if (loading) return
Laster innhold...
; + if (!data) + return
Fant ikke gruppen "consulting"
; return ( -
- {/* 1. Viser tittelen */} -

{data.title}

- - {/* 2. Enkel rendering av tekstblokker (Portable Text manuelt) */} -
- {data.content?.map((block: any, index: number) => { - // Sanity lagrer vanligvis tekst i 'children'-arrayet til en blokk - if (block._type === "block" && block.children) { - const text = block.children.map((child: any) => child.text).join(""); - return ( -

- {text} +

+ {/* 1. HOVEDBILDE */} + {data.image && ( +
+ {data.name} +
+ )} + + {/* 2. TITTEL OG BESKRIVELSE */} +

{data.name}

+ + {data.description && ( +
+ {data.description} +
+ )} + + {/* 3. VÅRT TEAM (Medlemmer med bilder) */} +
+

Vårt Team

+
+ {data.members?.map((member: any, idx: number) => ( +
+
+ {member.profile?.image ? ( + {member.profile.name} + ) : ( +
+ +
+ )} +
+

{member.profile?.name}

+

+ {member.role}

- ); - } - return null; - })} -
- -
- - {/* 3. DEBUG: Viser alt som ligger i Sanity-dokumentet som tekst */} -
-

- // Rådata fra Sanity (Alt innhold): -

-
{JSON.stringify(data, null, 2)}
-
+
+ ))} +
+ + + {/* 4. KONTAKT & SOSIALE MEDIER (Med ikoner) */} +
+

Kontakt oss

+
+ {data.socials?.email && ( + +
+ +
+ E-post +
+ )} + + {data.socials?.instagram && ( + +
+ +
+ Instagram +
+ )} + + {data.socials?.linkedin && ( + +
+ +
+ LinkedIn +
+ )} + + {data.socials?.facebook && ( + +
+ +
+ Facebook +
+ )} +
+
); } diff --git a/app/routes/om-oss.tsx b/app/routes/om-oss-offline.tsx similarity index 100% rename from app/routes/om-oss.tsx rename to app/routes/om-oss-offline.tsx diff --git a/package.json b/package.json index 7583ff0..6bf4514 100644 --- a/package.json +++ b/package.json @@ -17,12 +17,15 @@ }, "dependencies": { "@mantine/core": "^7.17.1", + "@portabletext/react": "^6.0.2", "@sanity/client": "^7.14.1", + "@sanity/image-url": "^2.0.3", "isbot": "^5.1.27", "lucide-react": "^0.503.0", "react": "^19.1.0", "react-dom": "^19.1.0", "react-icons": "^5.5.0", + "react-markdown": "^10.1.0", "react-router": "^7.5.3", "react-simple-typewriter": "^5.0.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c83103a..4ecd3cd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,9 +11,15 @@ importers: '@mantine/core': specifier: ^7.17.1 version: 7.17.5(@mantine/hooks@7.17.5(react@19.1.0))(@types/react@19.1.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@portabletext/react': + specifier: ^6.0.2 + version: 6.0.2(react@19.1.0) '@sanity/client': specifier: ^7.14.1 version: 7.14.1 + '@sanity/image-url': + specifier: ^2.0.3 + version: 2.0.3 isbot: specifier: ^5.1.27 version: 5.1.27 @@ -29,6 +35,9 @@ importers: react-icons: specifier: ^5.5.0 version: 5.5.0(react@19.1.0) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@19.1.2)(react@19.1.0) react-router: specifier: ^7.5.3 version: 7.5.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -818,6 +827,13 @@ packages: '@mjackson/node-fetch-server@0.2.0': resolution: {integrity: sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==} + '@noble/ed25519@3.0.0': + resolution: {integrity: sha512-QyteqMNm0GLqfa5SoYbSC3+Pvykwpn95Zgth4MFVSMKBB75ELl9tX1LAVsN4c3HXOrakHsF2gL4zWDAYCcsnzg==} + + '@noble/hashes@2.0.1': + resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} + engines: {node: '>= 20.19.0'} + '@npmcli/git@4.1.0': resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -834,6 +850,20 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@portabletext/react@6.0.2': + resolution: {integrity: sha512-qE3/Fg8PqzGzZ6+lxVXKPDqthJTRG3T1R0R6wrUCVAYeC5e0JtXWwhOiWa0daLG9TEOwn2SUeB2SuWxQlTq+5g==} + engines: {node: '>=20.19 <22 || >=22.12'} + peerDependencies: + react: ^18.2 || ^19 + + '@portabletext/toolkit@5.0.1': + resolution: {integrity: sha512-qcwnWd15J2Ziwi0YfWHRx+DRqp87cPb+EBcYuEbDW0ChZwwxCdfIjDazzFpQeXnqhJn8own1c8UB3iHB61DiWg==} + engines: {node: '>=20.19 <22 || >=22.12'} + + '@portabletext/types@4.0.1': + resolution: {integrity: sha512-L8PZjVjmdKpW+82c1oNqGMqCOtQD2xORqJfr6Is7X5XXbz38eLYY79IM/1ok+Esf/iGOPtEYORdcf0ETmsWYew==} + engines: {node: '>=20.19 <22 || >=22.12'} + '@react-router/dev@7.5.3': resolution: {integrity: sha512-U+n8JYAREKg6eHIAXCjazsYlwPo/vcAbShpqePnDBUdDnePBwZ2JmoqhWV+7tIhyHvvHGQKlw6BcrSZtF549WQ==} engines: {node: '>=20.0.0'} @@ -987,6 +1017,13 @@ packages: '@sanity/eventsource@5.0.2': resolution: {integrity: sha512-/B9PMkUvAlUrpRq0y+NzXgRv5lYCLxZNsBJD2WXVnqZYOfByL9oQBV7KiTaARuObp5hcQYuPfOAVjgXe3hrixA==} + '@sanity/image-url@2.0.3': + resolution: {integrity: sha512-A/vOugFw/ROGgSeSGB6nimO0c35x9KztatOPIIVlhkL+zsOfP7khigCbdJup2FSv6C03FX2XaUAhXojCxANl2Q==} + engines: {node: '>=20.19.0'} + + '@sanity/signed-urls@2.0.2': + resolution: {integrity: sha512-w/Aq0JDYI44WC5w8mzJBAjCem8qlGrxGTzvNbUWwBfys6kSL+TZBSypV5waCc35XRgt0X5zdYZMJOrshcjJLFw==} + '@tailwindcss/node@4.1.4': resolution: {integrity: sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==} @@ -1077,6 +1114,12 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} @@ -1089,6 +1132,15 @@ packages: '@types/follow-redirects@1.14.4': resolution: {integrity: sha512-GWXfsD0Jc1RWiFmMuMFCpXMzi9L7oPDVwxUnZdg89kDNnqsRfUKXEtUYtA98A6lig1WXH/CYY/fvPW9HuN5fTA==} + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@20.17.32': resolution: {integrity: sha512-zeMXFn8zQ+UkjK4ws0RiOC9EWByyW1CcVmLe+2rQocXRsGEDxUCwPEIVgpsGcLHS/P8JkT0oa3839BRABS0oPw==} @@ -1103,6 +1155,15 @@ packages: '@types/react@19.1.2': resolution: {integrity: sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@whatwg-node/fetch@0.9.23': resolution: {integrity: sha512-7xlqWel9JsmxahJnYVUj/LLxWcnA93DR4c9xlw3U814jWTiYalryiH1qToik1hOxweKKRLi4haXHM5ycRksPBA==} engines: {node: '>=18.0.0'} @@ -1149,6 +1210,9 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1181,6 +1245,21 @@ packages: caniuse-lite@1.0.30001715: resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -1203,6 +1282,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1237,6 +1319,9 @@ packages: supports-color: optional: true + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + decompress-response@7.0.0: resolution: {integrity: sha512-6IvPrADQyyPGLpMnUh6kfKiqy7SrbXbjoUuZ90WMBJKErzv2pCiwlGEXjRX9/54OnTq+XFVnkOnOMzclLI5aEA==} engines: {node: '>=10'} @@ -1252,6 +1337,10 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-libc@2.0.4: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} @@ -1259,6 +1348,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1298,6 +1390,9 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -1315,6 +1410,9 @@ packages: exsolve@1.0.5: resolution: {integrity: sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -1394,10 +1492,19 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hosted-git-info@6.1.3: resolution: {integrity: sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -1405,6 +1512,15 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -1415,10 +1531,20 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-retry-allowed@2.2.0: resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} engines: {node: '>=10'} @@ -1530,6 +1656,9 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -1548,6 +1677,93 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -1626,6 +1842,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -1689,6 +1908,9 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + react-dom@19.1.0: resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} peerDependencies: @@ -1699,6 +1921,12 @@ packages: peerDependencies: react: '*' + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + react-number-format@5.4.4: resolution: {integrity: sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==} peerDependencies: @@ -1777,6 +2005,12 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -1846,6 +2080,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -1883,6 +2120,9 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1891,6 +2131,12 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -1912,6 +2158,12 @@ packages: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + tsconfck@3.1.5: resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} engines: {node: ^18 || >=20} @@ -1957,6 +2209,24 @@ packages: unenv@2.0.0-rc.15: resolution: {integrity: sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -2035,6 +2305,12 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@3.0.0-beta.2: resolution: {integrity: sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -2146,6 +2422,9 @@ packages: zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: '@ampproject/remapping@2.3.0': @@ -2765,6 +3044,10 @@ snapshots: '@mjackson/node-fetch-server@0.2.0': {} + '@noble/ed25519@3.0.0': {} + + '@noble/hashes@2.0.1': {} + '@npmcli/git@4.1.0': dependencies: '@npmcli/promise-spawn': 6.0.2 @@ -2797,6 +3080,18 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@portabletext/react@6.0.2(react@19.1.0)': + dependencies: + '@portabletext/toolkit': 5.0.1 + '@portabletext/types': 4.0.1 + react: 19.1.0 + + '@portabletext/toolkit@5.0.1': + dependencies: + '@portabletext/types': 4.0.1 + + '@portabletext/types@4.0.1': {} + '@react-router/dev@7.5.3(@types/node@20.17.32)(babel-plugin-macros@3.1.0)(jiti@2.4.2)(lightningcss@1.29.2)(react-router@7.5.3(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(typescript@5.8.3)(vite@6.3.3(@types/node@20.17.32)(jiti@2.4.2)(lightningcss@1.29.2))(wrangler@4.14.0(@cloudflare/workers-types@4.20250429.0))': dependencies: '@babel/core': 7.26.10 @@ -2948,6 +3243,15 @@ snapshots: event-source-polyfill: 1.0.31 eventsource: 2.0.2 + '@sanity/image-url@2.0.3': + dependencies: + '@sanity/signed-urls': 2.0.2 + + '@sanity/signed-urls@2.0.2': + dependencies: + '@noble/ed25519': 3.0.0 + '@noble/hashes': 2.0.1 + '@tailwindcss/node@4.1.4': dependencies: enhanced-resolve: 5.18.1 @@ -3013,6 +3317,14 @@ snapshots: tailwindcss: 4.1.4 vite: 6.3.3(@types/node@20.17.32)(jiti@2.4.2)(lightningcss@1.29.2) + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.7 + '@types/estree@1.0.7': {} '@types/event-source-polyfill@1.0.5': {} @@ -3023,6 +3335,16 @@ snapshots: dependencies: '@types/node': 20.17.32 + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + '@types/node@20.17.32': dependencies: undici-types: 6.19.8 @@ -3038,6 +3360,12 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@ungap/structured-clone@1.3.0': {} + '@whatwg-node/fetch@0.9.23': dependencies: '@whatwg-node/node-fetch': 0.6.0 @@ -3086,6 +3414,8 @@ snapshots: resolve: 1.22.10 optional: true + bail@2.0.2: {} + balanced-match@1.0.2: {} blake3-wasm@2.1.5: {} @@ -3114,6 +3444,16 @@ snapshots: caniuse-lite@1.0.30001715: {} + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -3138,6 +3478,8 @@ snapshots: color-string: 1.9.1 optional: true + comma-separated-tokens@2.0.3: {} + convert-source-map@2.0.0: {} cookie@0.7.2: {} @@ -3167,6 +3509,10 @@ snapshots: dependencies: ms: 2.1.3 + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + decompress-response@7.0.0: dependencies: mimic-response: 3.1.0 @@ -3177,10 +3523,16 @@ snapshots: defu@6.1.4: {} + dequal@2.0.3: {} + detect-libc@2.0.4: {} detect-node-es@1.1.0: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + eastasianwidth@0.2.0: {} electron-to-chromium@1.5.144: {} @@ -3261,6 +3613,8 @@ snapshots: escalade@3.2.0: {} + estree-util-is-identifier-name@3.0.0: {} + estree-walker@2.0.2: {} event-source-polyfill@1.0.31: {} @@ -3271,6 +3625,8 @@ snapshots: exsolve@1.0.5: {} + extend@3.0.2: {} + fast-decode-uri-component@1.0.1: {} fast-querystring@1.1.2: @@ -3342,10 +3698,36 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.7 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + hosted-git-info@6.1.3: dependencies: lru-cache: 7.18.3 + html-url-attributes@3.0.1: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -3354,6 +3736,15 @@ snapshots: inherits@2.0.4: {} + inline-style-parser@0.2.7: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-arrayish@0.2.1: optional: true @@ -3364,8 +3755,14 @@ snapshots: dependencies: hasown: 2.0.2 + is-decimal@2.0.1: {} + is-fullwidth-code-point@3.0.0: {} + is-hexadecimal@2.0.1: {} + + is-plain-obj@4.1.0: {} + is-retry-allowed@2.2.0: {} isbot@5.1.27: {} @@ -3447,6 +3844,8 @@ snapshots: lodash@4.17.21: {} + longest-streak@3.1.0: {} + lru-cache@10.4.3: {} lru-cache@5.1.1: @@ -3463,6 +3862,228 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + mime-db@1.52.0: {} mime-types@2.1.35: @@ -3542,6 +4163,16 @@ snapshots: callsites: 3.1.0 optional: true + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.26.2 @@ -3592,6 +4223,8 @@ snapshots: err-code: 2.0.3 retry: 0.12.0 + property-information@7.1.0: {} + react-dom@19.1.0(react@19.1.0): dependencies: react: 19.1.0 @@ -3601,6 +4234,24 @@ snapshots: dependencies: react: 19.1.0 + react-markdown@10.1.0(@types/react@19.1.2)(react@19.1.0): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.1.2 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.1 + react: 19.1.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + react-number-format@5.4.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: react: 19.1.0 @@ -3670,6 +4321,23 @@ snapshots: regenerator-runtime@0.14.1: {} + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + resolve-from@4.0.0: optional: true @@ -3771,6 +4439,8 @@ snapshots: source-map@0.6.1: {} + space-separated-tokens@2.0.2: {} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -3812,6 +4482,11 @@ snapshots: dependencies: safe-buffer: 5.2.1 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -3820,6 +4495,14 @@ snapshots: dependencies: ansi-regex: 6.1.0 + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + supports-preserve-symlinks-flag@1.0.0: optional: true @@ -3838,6 +4521,10 @@ snapshots: fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 + trim-lines@3.0.1: {} + + trough@2.2.0: {} + tsconfck@3.1.5(typescript@5.8.3): optionalDependencies: typescript: 5.8.3 @@ -3872,6 +4559,39 @@ snapshots: pathe: 2.0.3 ufo: 1.6.1 + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + universalify@2.0.1: {} update-browserslist-db@1.1.3(browserslist@4.24.4): @@ -3929,6 +4649,16 @@ snapshots: validate-npm-package-name@5.0.1: {} + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + vite-node@3.0.0-beta.2(@types/node@20.17.32)(jiti@2.4.2)(lightningcss@1.29.2): dependencies: cac: 6.7.14 @@ -4035,3 +4765,5 @@ snapshots: stacktracey: 2.1.8 zod@3.22.3: {} + + zwitch@2.0.4: {} From 70857b72c243d72c14c19445dbda99113dae2de9 Mon Sep 17 00:00:00 2001 From: Githan Mayurathan Date: Thu, 19 Mar 2026 17:09:53 +0100 Subject: [PATCH 3/7] =?UTF-8?q?Hentet=20all=20informasjon=20til=20om-oss,?= =?UTF-8?q?=20men=20f=C3=A5r=20ikke=20hentet=20bilder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/routes/om-oss-Sanity.tsx | 61 ++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/app/routes/om-oss-Sanity.tsx b/app/routes/om-oss-Sanity.tsx index c3928ba..d5304de 100644 --- a/app/routes/om-oss-Sanity.tsx +++ b/app/routes/om-oss-Sanity.tsx @@ -1,14 +1,30 @@ import { client } from "../sanityClient"; -import imageUrlBuilder from "@sanity/image-url"; +import createImageUrlBuilder from "@sanity/image-url"; import ReactMarkdown from "react-markdown"; import { useEffect, useState } from "react"; import { Mail, Instagram, Linkedin, Facebook, User } from "lucide-react"; -const builder = imageUrlBuilder(client); +//Sanity query: *[_type == "studentGroup" && slug.current == "consulting"][0] +const builder = createImageUrlBuilder(client); function urlFor(source: any) { return builder.image(source); } +interface Member { + role: string; + profile?: { + _id: string; + name: string; + image?: { + asset: { + _ref: string; + _type: "reference"; + }; + _type: "image"; + }; + }; +} + export default function OmOssSanity() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); @@ -16,28 +32,28 @@ export default function OmOssSanity() { useEffect(() => { client .fetch(` - *[_type == "studentGroup" && slug.current == "consulting"][0]{ - name, - description, - image, - socials, - members[]{ - role, - profile->{ - _id, - name, - image - } + *[_type == "studentGroup" && slug.current == "consulting"][0]{ + name, + description, + image, // HENT KUN NAVNET PÅ FELTET (ikke {asset->}) + socials, + members[]{ + role, + profile->{ + _id, + name, + image // HENT KUN NAVNET PÅ FELTET HER OGSÅ } } - `) + } + `) .then((res) => { - console.log("DATA:", JSON.stringify(res, null, 2)); + console.log("Sjekk denne i console:", res.image); // Her skal du se _ref nå setData(res); setLoading(false); }) .catch((err) => { - console.error("Sanity error:", err); + console.error(err); setLoading(false); }); }, []); @@ -50,9 +66,14 @@ export default function OmOssSanity() {
{/* 1. HOVEDBILDE */} {data.image && ( -
+
+ {/* Denne linjen vil avsløre om URL-en faktisk blir laget */} +

+ DEBUG URL: {urlFor(data.image).url()} +

+ {data.name} @@ -72,7 +93,7 @@ export default function OmOssSanity() {

Vårt Team

- {data.members?.map((member: any, idx: number) => ( + {data.members?.map((member: Member, idx: number) => (
{member.profile?.image ? ( From 2155518aa505c398e44e81731ab2180778b905b5 Mon Sep 17 00:00:00 2001 From: Githan Mayurathan Date: Sun, 22 Mar 2026 17:50:44 +0100 Subject: [PATCH 4/7] =?UTF-8?q?om=20oss=20siden=20kj=C3=B8rer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/root.tsx | 32 +++++---- app/routes/om-oss-Sanity.tsx | 125 ++++++++++++++++------------------- app/sanityClient.ts | 4 +- 3 files changed, 73 insertions(+), 88 deletions(-) diff --git a/app/root.tsx b/app/root.tsx index 6371994..48eb829 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -37,23 +37,21 @@ export function Layout({ children }: { children: React.ReactNode }) { - - - -
-
-
- - - -
+ + +
+
+
+ + + ); } diff --git a/app/routes/om-oss-Sanity.tsx b/app/routes/om-oss-Sanity.tsx index d5304de..3626887 100644 --- a/app/routes/om-oss-Sanity.tsx +++ b/app/routes/om-oss-Sanity.tsx @@ -1,12 +1,20 @@ +// om-oss-sanity.tsx import { client } from "../sanityClient"; -import createImageUrlBuilder from "@sanity/image-url"; +import { createImageUrlBuilder } from "@sanity/image-url"; import ReactMarkdown from "react-markdown"; import { useEffect, useState } from "react"; -import { Mail, Instagram, Linkedin, Facebook, User } from "lucide-react"; +import { Mail, Instagram, Linkedin, User } from "lucide-react"; + +type SanityImage = { + _type: "image"; + asset: { + _ref: string; + _type: "reference"; + }; +}; -//Sanity query: *[_type == "studentGroup" && slug.current == "consulting"][0] const builder = createImageUrlBuilder(client); -function urlFor(source: any) { +function urlFor(source: SanityImage) { return builder.image(source); } @@ -15,18 +23,24 @@ interface Member { profile?: { _id: string; name: string; - image?: { - asset: { - _ref: string; - _type: "reference"; - }; - _type: "image"; - }; + picture?: SanityImage; + }; +} + +interface GroupData { + name: string; + description?: string; + image?: SanityImage; + socials?: { + email?: string; + instagram?: string; + linkedin?: string; }; + members?: Member[]; } export default function OmOssSanity() { - const [data, setData] = useState(null); + const [data, setData] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { @@ -35,20 +49,19 @@ export default function OmOssSanity() { *[_type == "studentGroup" && slug.current == "consulting"][0]{ name, description, - image, // HENT KUN NAVNET PÅ FELTET (ikke {asset->}) + image, socials, members[]{ role, profile->{ _id, name, - image // HENT KUN NAVNET PÅ FELTET HER OGSÅ + picture } } } `) .then((res) => { - console.log("Sjekk denne i console:", res.image); // Her skal du se _ref nå setData(res); setLoading(false); }) @@ -59,62 +72,58 @@ export default function OmOssSanity() { }, []); if (loading) return
Laster innhold...
; - if (!data) - return
Fant ikke gruppen "consulting"
; + if (!data) return
Fant ikke gruppen
; return (
{/* 1. HOVEDBILDE */} {data.image && ( -
- {/* Denne linjen vil avsløre om URL-en faktisk blir laget */} -

- DEBUG URL: {urlFor(data.image).url()} -

- +
{data.name}
)} - {/* 2. TITTEL OG BESKRIVELSE */}

{data.name}

{data.description && ( -
+
{data.description}
)} - {/* 3. VÅRT TEAM (Medlemmer med bilder) */} + {/* 3. VÅRT TEAM */}

Vårt Team

- {data.members?.map((member: Member, idx: number) => ( + {data.members?.map((member, idx) => (
-
- {member.profile?.image ? ( +
+ {member.profile?.picture ? ( {member.profile.name} ) : ( -
- +
+
)}
-

{member.profile?.name}

-

+

+ {member.profile?.name || "Navn mangler"} +

+

{member.role}

@@ -122,63 +131,41 @@ export default function OmOssSanity() {
- {/* 4. KONTAKT & SOSIALE MEDIER (Med ikoner) */} + {/* 4. KONTAKT */}
-

Kontakt oss

+

Kontakt oss

{data.socials?.email && ( -
- -
+ E-post
)} - {data.socials?.instagram && ( -
- -
+ Instagram
)} - {data.socials?.linkedin && ( -
- -
+ LinkedIn
)} - - {data.socials?.facebook && ( - -
- -
- Facebook -
- )}
diff --git a/app/sanityClient.ts b/app/sanityClient.ts index 5e90efe..cae1357 100644 --- a/app/sanityClient.ts +++ b/app/sanityClient.ts @@ -3,6 +3,6 @@ import { createClient } from "@sanity/client"; export const client = createClient({ projectId: "pgq2pd26", dataset: "production", - apiVersion: "2026-02-12", - useCdn: true, + apiVersion: "2026-03-21", + useCdn: false, }); From 9612d4d0b453d1d2922609749262bb6284f2dc60 Mon Sep 17 00:00:00 2001 From: Githan Mayurathan Date: Sun, 22 Mar 2026 17:52:29 +0100 Subject: [PATCH 5/7] fjernet en margin --- app/routes/projectOverview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/routes/projectOverview.tsx b/app/routes/projectOverview.tsx index d723061..958f027 100644 --- a/app/routes/projectOverview.tsx +++ b/app/routes/projectOverview.tsx @@ -27,7 +27,7 @@ export default function ProjectOverview() { > {/* Bilde med overlay */}
Date: Sun, 22 Mar 2026 22:34:47 +0100 Subject: [PATCH 6/7] lagt til clienLoader --- .../{om-oss-Sanity.tsx => om-oss-sanity.tsx} | 66 +++++++++---------- 1 file changed, 30 insertions(+), 36 deletions(-) rename app/routes/{om-oss-Sanity.tsx => om-oss-sanity.tsx} (82%) diff --git a/app/routes/om-oss-Sanity.tsx b/app/routes/om-oss-sanity.tsx similarity index 82% rename from app/routes/om-oss-Sanity.tsx rename to app/routes/om-oss-sanity.tsx index 3626887..c67681e 100644 --- a/app/routes/om-oss-Sanity.tsx +++ b/app/routes/om-oss-sanity.tsx @@ -1,9 +1,8 @@ -// om-oss-sanity.tsx import { client } from "../sanityClient"; import { createImageUrlBuilder } from "@sanity/image-url"; import ReactMarkdown from "react-markdown"; -import { useEffect, useState } from "react"; import { Mail, Instagram, Linkedin, User } from "lucide-react"; +import type { Route } from "./+types/om-oss-sanity"; type SanityImage = { _type: "image"; @@ -39,44 +38,37 @@ interface GroupData { members?: Member[]; } -export default function OmOssSanity() { - const [data, setData] = useState(null); - const [loading, setLoading] = useState(true); - - useEffect(() => { - client - .fetch(` - *[_type == "studentGroup" && slug.current == "consulting"][0]{ - name, - description, - image, - socials, - members[]{ - role, - profile->{ - _id, - name, - picture - } +export async function clientLoader() { + const data = await client.fetch(` + *[_type == "studentGroup" && slug.current == "consulting"][0]{ + name, + description, + image, + socials, + members[]{ + role, + profile->{ + _id, + name, + picture } } - `) - .then((res) => { - setData(res); - setLoading(false); - }) - .catch((err) => { - console.error(err); - setLoading(false); - }); - }, []); + } + `); + return data; +} + +export function HydrateFallback() { + return
Laster innhold...
; +} + +export default function OmOssSanity({ loaderData }: Route.ComponentProps) { + const data = loaderData; - if (loading) return
Laster innhold...
; if (!data) return
Fant ikke gruppen
; return (
- {/* 1. HOVEDBILDE */} {data.image && (
)} - {/* 3. VÅRT TEAM */}

Vårt Team

{data.members?.map((member, idx) => ( -
+
{member.profile?.picture ? (
- {/* 4. KONTAKT */}

Kontakt oss

From 0da68a8dc92c813cd0293ae1eac0f6b2e578130e Mon Sep 17 00:00:00 2001 From: Githan Mayurathan Date: Tue, 24 Mar 2026 14:59:01 +0100 Subject: [PATCH 7/7] useCdn til true, og kontakt oss flyttet opp --- app/routes/om-oss-sanity.tsx | 82 ++++++++++++++++++------------------ app/sanityClient.ts | 2 +- 2 files changed, 42 insertions(+), 42 deletions(-) diff --git a/app/routes/om-oss-sanity.tsx b/app/routes/om-oss-sanity.tsx index c67681e..b7ac3ba 100644 --- a/app/routes/om-oss-sanity.tsx +++ b/app/routes/om-oss-sanity.tsx @@ -70,7 +70,7 @@ export default function OmOssSanity({ loaderData }: Route.ComponentProps) { return (
{data.image && ( -
+
{data.name} )} -

{data.name}

+

{data.name}

{data.description && ( -
+
{data.description}
)} -
+
+

Kontakt oss

+
+ {data.socials?.email && ( + + + E-post + + )} + {data.socials?.instagram && ( + + + Instagram + + )} + {data.socials?.linkedin && ( + + + LinkedIn + + )} +
+
+ +

Vårt Team

{data.members?.map((member, idx) => ( @@ -125,43 +162,6 @@ export default function OmOssSanity({ loaderData }: Route.ComponentProps) { ))}
- -
-

Kontakt oss

-
- {data.socials?.email && ( - - - E-post - - )} - {data.socials?.instagram && ( - - - Instagram - - )} - {data.socials?.linkedin && ( - - - LinkedIn - - )} -
-
); } diff --git a/app/sanityClient.ts b/app/sanityClient.ts index cae1357..e6ac4c3 100644 --- a/app/sanityClient.ts +++ b/app/sanityClient.ts @@ -4,5 +4,5 @@ export const client = createClient({ projectId: "pgq2pd26", dataset: "production", apiVersion: "2026-03-21", - useCdn: false, + useCdn: true, });