diff --git a/src/components/SchemaOrg.astro b/src/components/SchemaOrg.astro index 297af28..f2efdfe 100644 --- a/src/components/SchemaOrg.astro +++ b/src/components/SchemaOrg.astro @@ -12,7 +12,7 @@ export interface Props { description: string; path?: string; pageType?: 'WebPage' | 'AboutPage' | 'ContactPage' | 'CollectionPage'; - /** Namn i brödsmulan för undersidor, t.ex. "Tjänster". */ + /** Namn i brödsmulan för undersidor, t.ex. "Portfolio". */ breadcrumb?: string; faq?: FaqItem[]; /** Absolut URL till sidans huvudbild (og:image). */ @@ -80,7 +80,7 @@ const graph: Record[] = [ sameAs: [business.social.linkedin, business.social.lightroom], }, { - '@type': 'ProfessionalService', + '@type': 'Organization', '@id': ids.business, name: business.brand, url: `${site}/`, @@ -89,31 +89,9 @@ const graph: Record[] = [ telephone: business.phone, image: imageUrl, address, - areaServed: business.serviceArea, - priceRange: business.priceRange, founder: { '@id': ids.person }, employee: { '@id': ids.person }, sameAs: [business.social.instagram.url, business.social.facebook, business.social.flickr, business.social.lightroom], - potentialAction: { - '@type': 'ReserveAction', - name: 'Skicka en bokningsförfrågan', - target: business.portal.bookingUrl, - }, - hasOfferCatalog: { - '@type': 'OfferCatalog', - name: 'Fotografering', - itemListElement: business.genres.map((g) => ({ - '@type': 'Offer', - priceCurrency: business.priceFromSek != null ? 'SEK' : null, - price: business.priceFromSek, - itemOffered: { - '@type': 'Service', - name: g.name, - description: g.description, - provider: { '@id': ids.business }, - }, - })), - }, }, ]; diff --git a/src/data/faq.ts b/src/data/faq.ts index fe6f9eb..b4acc3f 100644 --- a/src/data/faq.ts +++ b/src/data/faq.ts @@ -1,63 +1,5 @@ // src/data/faq.ts -// Vanliga frågor för /tjanster. Samma text används på sidan och i FAQPage-JSON-LD. -// Svaren byggs ENBART av fakta i business.ts. Okända fakta (null) ger ett -// "kontakta mig"-svar i stället för en gissning. -import { business, basedIn, formatSek, genreList } from './business'; +// Typ för vanliga frågor (FAQPage-JSON-LD). Frågorna om bokning, offert och gallerier togs bort 2026-11-06: +// Linus erbjuder inga tjänster, bara posters och samarbeten. export type FaqItem = { question: string; answer: string }; - -function areaAnswer(): string { - if (business.serviceArea) { - return `Jag utgår från ${basedIn()} och tar uppdrag i ${business.serviceArea}. Hör av dig om du är osäker på om jag kan komma till dig.`; - } - return `Jag är baserad i ${basedIn()}. Kontakta mig så stämmer vi av om jag kan fotografera där du befinner dig.`; -} - -function priceAnswer(): string { - const from = formatSek(business.priceFromSek); - if (from) { - return `En fotografering kostar från ${from}. Det slutliga priset beror på uppdraget och står i offerten du får efter din förfrågan.`; - } - return 'Priset beror på uppdraget. Kontakta mig eller skicka en förfrågan i kundportalen, så får du en offert för just det du vill ha fotograferat.'; -} - -function deliveryAnswer(): string { - const base = 'Du får bilderna i ett privat galleri i kundportalen. När betalningen är klar kan du ladda ner originalfilerna i full upplösning.'; - if (business.deliveryTime) return `${base} Normal leveranstid är ${business.deliveryTime}.`; - return base; -} - -export const faq: FaqItem[] = [ - { - question: 'Vad fotograferar du?', - answer: `Jag fotograferar ${genreList()}.`, - }, - { - question: 'Var finns du och var kan du fotografera?', - answer: areaAnswer(), - }, - { - question: 'Vad kostar en fotografering?', - answer: priceAnswer(), - }, - { - question: 'Hur bokar jag en fotografering?', - answer: `Skicka en förfrågan i kundportalen (${business.portal.bookingUrl}). Jag återkommer med en offert, och när du har godkänt den bokar vi in fotograferingen.`, - }, - { - question: 'Hur får jag mina bilder?', - answer: deliveryAnswer(), - }, - { - question: 'Vilken utrustning använder du?', - answer: `Jag fotograferar med en ${business.camera} och redigerar i ${business.editing}.`, - }, - { - question: 'Har dina bilder uppmärksammats?', - answer: business.recognition, - }, - { - question: 'Hur kontaktar jag dig?', - answer: `Mejla ${business.email} eller skicka ett meddelande på Instagram (${business.social.instagram.handle}).`, - }, -]; diff --git a/src/layouts/MainLayout.astro b/src/layouts/MainLayout.astro index 82329ec..6c99bfa 100644 --- a/src/layouts/MainLayout.astro +++ b/src/layouts/MainLayout.astro @@ -13,7 +13,7 @@ export interface Props { title: string; /** Unik svensk meta description, ca 120–160 tecken. */ description: string; - /** Kanonisk sökväg, t.ex. "/tjanster". Utelämnas = härleds från URL:en. */ + /** Kanonisk sökväg, t.ex. "/portfolio". Utelämnas = härleds från URL:en. */ path?: string; image?: ImageMetadata; imageAlt?: string; @@ -46,7 +46,6 @@ const ogHeight = Number(og.attributes.height) || undefined; const nav = [ { href: '/portfolio', label: 'Portfolio' }, { href: '/posters', label: 'Posters' }, - { href: '/tjanster', label: 'Tjänster' }, { href: '/about', label: 'Om mig' }, { href: '/contact', label: 'Kontakt' }, ]; diff --git a/src/lib/url.ts b/src/lib/url.ts index 353a805..53af6bb 100644 --- a/src/lib/url.ts +++ b/src/lib/url.ts @@ -1,5 +1,5 @@ // src/lib/url.ts -// Gör om en byggsökväg till kanonisk form: "/", "/about", "/tjanster". +// Gör om en byggsökväg till kanonisk form: "/", "/about", "/portfolio". // Klarar både build.format "file" (/about.html) och "directory" (/about/). export function normalizePath(p: string): string { let out = p.replace(/\/index\.html$/, '/').replace(/\.html$/, ''); diff --git a/src/pages/404.astro b/src/pages/404.astro index ee65fc2..9a272c7 100644 --- a/src/pages/404.astro +++ b/src/pages/404.astro @@ -7,14 +7,13 @@ const links = [ { href: '/', label: 'Startsidan' }, { href: '/portfolio', label: 'Portfolio' }, { href: '/posters', label: 'Posters' }, - { href: '/tjanster', label: 'Tjänster och bokning' }, { href: '/contact', label: 'Kontakt' }, ]; --- diff --git a/src/pages/index.astro b/src/pages/index.astro index ca07661..937a992 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -8,7 +8,7 @@ import { business, basedIn, genreList } from '../data/business'; @@ -86,16 +86,16 @@ import { business, basedIn, genreList } from '../data/business'; - +
@@ -116,18 +116,14 @@ import { business, basedIn, genreList } from '../data/business';
-

Så bokar du

-
    - {business.bookingSteps.map((step, i) => ( -
  1. - {i + 1} - {step.title}. {step.text} -
  2. - ))} -
+

Posters och samarbeten

+

+ Fotografierna finns som posters: välj motiv, storlek och material. Vill du skapa något tillsammans, + eller synas genom reklam eller sponsring, hör av dig om ett samarbete. +

diff --git a/src/pages/llms.txt.ts b/src/pages/llms.txt.ts index 45a9c62..fcb2e59 100644 --- a/src/pages/llms.txt.ts +++ b/src/pages/llms.txt.ts @@ -2,15 +2,13 @@ // Byggs från src/data/business.ts så att fakta bara finns på ett ställe. // Okända fakta (null) skrivs som "lämnas på förfrågan", aldrig som gissningar. import type { APIRoute } from 'astro'; -import { business, basedIn, formatSek, genreList } from '../data/business'; -import { faq } from '../data/faq'; +import { business, basedIn, genreList } from '../data/business'; export const prerender = true; export const GET: APIRoute = ({ site }) => { const base = site ?? new URL(business.url); const url = (p: string) => new URL(p, base).toString(); - const price = formatSek(business.priceFromSek); const lines: (string | null)[] = [ `# ${business.brand}`, @@ -22,31 +20,21 @@ export const GET: APIRoute = ({ site }) => { `- Fotograf: ${business.person.name}`, `- Namn/varumärke: ${business.brand}`, `- Baserad i: ${basedIn()}`, - business.serviceArea ? `- Tar uppdrag i: ${business.serviceArea}` : '- Upptagningsområde: stäms av vid förfrågan', - price ? `- Pris från: ${price}` : '- Priser: lämnas som offert efter förfrågan', - business.deliveryTime ? `- Leveranstid: ${business.deliveryTime}` : null, business.phone ? `- Telefon: ${business.phone}` : null, `- E-post: ${business.email}`, `- Instagram: ${business.social.instagram.handle} (${business.social.instagram.url})`, `- Facebook: ${business.social.facebook}`, `- Kamera: ${business.camera}`, `- Redigering: ${business.editing}`, - `- Bokning: ${business.portal.bookingUrl}`, - `- Bokningsgång: ${business.bookingSteps.map((s) => s.title.toLowerCase()).join(' → ')}`, '', '## Sidor', '', `- [Startsida](${url('/')}): vem ${business.person.name} är och vad han fotograferar`, - `- [Tjänster och vanliga frågor](${url('/tjanster')}): vad du kan boka, hur bokningen går till och svar på vanliga frågor`, `- [Portfolio](${url('/portfolio')}): urval av fotografier`, `- [Om mig](${url('/about')}): ${business.person.name}, bakgrund och utrustning`, `- [Posters](${url('/posters')}): fotografier som posters, välj storlek och material`, `- [Kontakt och samarbeten](${url('/contact')}): samarbeten, reklam och sponsring`, '', - '## Vanliga frågor', - '', - ...faq.map((f) => `- ${f.question} ${f.answer}`), - '', '## Profiler', '', `- [Instagram](${business.social.instagram.url})`, diff --git a/src/pages/portfolio.astro b/src/pages/portfolio.astro index 1527bdb..3791077 100644 --- a/src/pages/portfolio.astro +++ b/src/pages/portfolio.astro @@ -131,7 +131,7 @@ const uniqueMonths = [...new Map(allMonths.map(item => [item.name, item])).value

Portfolio

Ett urval av mina bilder i olika stilar – {genreList()}. - Vill du boka en fotografering? Läs om tjänster och bokning.

+ Vill du ha en bild på väggen? Se posters.

diff --git a/src/pages/privacy.astro b/src/pages/privacy.astro index af72057..1f6d6f6 100644 --- a/src/pages/privacy.astro +++ b/src/pages/privacy.astro @@ -35,7 +35,7 @@ const link = 'text-white underline hover:text-gray-300';

Den här webbplatsen

    -
  • Det finns inga användarkonton och inga kontaktformulär på den här webbplatsen. Bokningar görs i den separata kundportalen.
  • +
  • Det finns inga användarkonton och inga kontaktformulär på den här webbplatsen. Beställningar av posters och samarbeten sköts i den separata kundportalen.
  • Om du mejlar mig används din adress och ditt meddelande bara för att svara dig och delas inte med någon.
  • Webbplatsen levereras via Cloudflare, som behandlar tekniska uppgifter som din IP-adress för att leverera diff --git a/src/pages/tjanster.astro b/src/pages/tjanster.astro deleted file mode 100644 index 0142fc1..0000000 --- a/src/pages/tjanster.astro +++ /dev/null @@ -1,127 +0,0 @@ ---- -// src/pages/tjanster.astro -// Vad Linus fotograferar, för vem, var, pris, leverans och hur man bokar + FAQ. -// Allt från src/data/business.ts och src/data/faq.ts – okända fakta visas inte. -import MainLayout from '../layouts/MainLayout.astro'; -import WaveBackground from '../components/WaveBackground.astro'; -import { business, basedIn, formatSek } from '../data/business'; -import { faq } from '../data/faq'; -import heroImg from '../assets/images/3d-scroll/img2.jpg'; - -const priceFrom = formatSek(business.priceFromSek); -const packages = business.packages ?? []; -const portalHost = new URL(business.portal.url).host; ---- - - - - -
    - -
    -

    Tjänster och bokning

    -

    - Jag heter {business.person.name} och är fotografen bakom {business.brand}, baserad i {basedIn()}. - Här ser du vad jag fotograferar, hur en bokning går till och hur du får dina bilder. -

    - -
    - -
    -

    Det här fotograferar jag

    -
      - {business.genres.map((g) => ( -
    • -

      {g.name}

      -

      {g.description}

      -
    • - ))} -
    -

    - Se exempel i min portfolio. - Har du något annat i tankarna? Beskriv det i din förfrågan, så återkommer jag med ett förslag. -

    -
    - -
    -
    -

    Var

    - {business.serviceArea ? ( -

    Jag utgår från {basedIn()} och tar uppdrag i {business.serviceArea}.

    - ) : ( -

    Jag är baserad i {basedIn()}. Kontakta mig så stämmer vi av om jag kan fotografera där du befinner dig.

    - )} -
    -
    -

    Pris

    - {priceFrom ? ( -

    Fotografering från {priceFrom}. Det slutliga priset står i offerten.

    - ) : ( -

    Priset beror på uppdraget. Kontakta mig eller skicka en förfrågan, så får du en offert för just det du vill ha fotograferat.

    - )} - {packages.length > 0 && ( -
      - {packages.map((p) => ( -
    • - {p.name} - {formatSek(p.priceSek) && – {formatSek(p.priceSek)}} - {p.includes.length > 0 && {p.includes.join(', ')}} -
    • - ))} -
    - )} -
    -
    - -
    -

    Så går en bokning till

    -
      - {business.bookingSteps.map((step, i) => ( -
    1. - {i + 1} -
      -

      {step.title}

      -

      {step.text}

      -
      -
    2. - ))} -
    -

    - Leverans: bilderna levereras i ett privat galleri i kundportalen - ({portalHost}).{business.deliveryTime && ` Normal leveranstid är ${business.deliveryTime}.`} -

    - Skicka en förfrågan i kundportalen -
    - -
    -

    Vanliga frågor

    -
    - {faq.map((item) => ( -
    - -

    {item.question}

    - -
    -

    {item.answer}

    -
    - ))} -
    -

    - Fler frågor? Mejla {business.email} - eller skriv på Instagram {business.social.instagram.handle}. -

    -
    - -
    -