Return

All tests / src/constants site.ts

58.62% Statements 17/29
20% Branches 1/5
100% Functions 1/1
61.9% Lines 13/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122    17x 42x   17x 17x 17x                       17x                                           17x                                                                                                                     17x 5x 5x   5x 5x                           5x    
import type { IntlShape } from 'react-intl';
 
export const MAX_STEPS = 10;
export const defaultLocale = 'en';
// SDD-004 A1: one canonical name form everywhere; the full legal name stays as alternateName
export const author = 'Xabier Lameiro';
export const authorAlternateName = 'Xabier Lameiro Cardama';
export const socialNetworks = [
    'https://www.linkedin.com/in/xabierlameiro',
    'https://github.com/xabierlameiro',
    'https://www.reddit.com/user/xlameiro',
    'https://x.com/xlameirodev',
];
 
// The Person JSON-LD renders from _document, which sits outside the IntlProvider and so cannot
// use useIntl() — hence a plain map keyed by locale rather than a translation id. Schema.org
// *vocabulary* stays English by design, but text values must match the language of the page they
// describe: Google requires structured data to be a true representation of the visible content,
// and it infers page language from that content, not from `lang` or the URL.
export const personDescription: Record<string, string> = {
    en: 'Software architect from Galicia, Spain. Builds web products for the banking and retail sectors — CaixaBank, Openbank and Inditex — working mainly with React, Next.js and TypeScript, with a strong interest in testing, automation and the IoT.',
    es: 'Arquitecto de software gallego. Desarrolla productos web para los sectores bancario y retail —CaixaBank, Openbank e Inditex— trabajando sobre todo con React, Next.js y TypeScript, con especial interés en testing, automatización y el IoT.',
    gl: 'Arquitecto de software galego. Desenvolve produtos web para os sectores bancario e retail —CaixaBank, Openbank e Inditex— traballando sobre todo con React, Next.js e TypeScript, con especial interese en testing, automatización e o IoT.',
};
 
/**
 * SDD-L12-T8 (decision D5, revised 2026-08-03). These eight are the header's **status items**, and
 * they render as icons on the right, the way a macOS menu bar does: text menus on the left, icons on
 * the right, clock last.
 *
 * T2 briefly deleted the five artifact entries to make the header fit. That bought the space but
 * lost the shelf, and the shelf is part of what the design is *for* — so the space comes from the
 * icons instead. Eight text labels cost 358 px; eight icons cost about a fifth of that.
 *
 * `shed` is the shedding step: the class `shedN` hides the item below the breakpoint derived for it
 * in `header.module.css`. The three profile icons are `shed6` (they survive down to 769 px); the five
 * artifact icons are `shed5` (they go below 1180 px), because a window-centred countdown and an
 * 867 px right zone cannot both fit before then. The numbers are measured, not chosen.
 *
 * The icon itself lives in the Header component, not here — this file stays data, no React.
 */
export const socialLinks = [
    {
        href: 'https://www.linkedin.com/in/xabierlameiro',
        title: 'Linkedin profile',
        name: 'Linkedin',
        testId: 'linkedin-link',
        shed: 6,
    },
    {
        href: 'https://github.com/xabierlameiro',
        title: 'Github profile',
        name: 'Github',
        testId: 'github-link',
        shed: 6,
    },
    {
        href: 'https://www.reddit.com/user/xlameiro',
        title: 'Reddit profile',
        name: 'Reddit',
        testId: 'reddit-link',
        shed: 6,
    },
    {
        href: 'https://storybook.xabierlameiro.com',
        title: 'Storybook',
        name: 'Storybook',
        testId: 'storybook-link',
        shed: 5,
    },
    {
        href: 'https://docs.xabierlameiro.com',
        title: 'Docs',
        name: 'Docs',
        testId: 'docs-link',
        shed: 5,
    },
    {
        href: 'https://coverage.xabierlameiro.com',
        title: 'Coverage',
        name: 'Coverage',
        testId: 'coverage-link',
        shed: 5,
    },
    {
        href: 'https://e2e.xabierlameiro.com',
        title: 'e2e',
        name: 'e2e',
        testId: 'e2e-link',
        shed: 5,
    },
    {
        href: 'https://performance.xabierlameiro.com',
        title: 'Lighthouse',
        name: 'Lighthouse',
        testId: 'lighthouse-link',
        shed: 5,
    },
];
 
export const translateRoute = (pathname: string, f: IntlShape['formatMessage']) => {
    let route = '';
    switch (pathname) {
        case '/':
            route = f({ id: 'home.breadcrumb' });
            break;
        case '/blog/[category]/[slug]':
            route = f({ id: 'blog.breadcrumb' });
            break;
        case '/legal/[slug]':
            route = f({ id: 'legal.breadcrumb' });
            break;
        case '/comments':
            route = f({ id: 'comments.breadcrumb' });
            break;
        case '/settings':
            route = f({ id: 'settings.breadcrumb' });
            break;
    }
    return route;
};