Compare commits
8
Commits
08a8a10478
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cca2b20c3d | ||
|
|
105c454d73 | ||
|
|
cf6feefebc | ||
|
|
1857c8f771 | ||
|
|
542ad4ab9c | ||
|
|
9bf8599116 | ||
|
|
170c9a53f1 | ||
|
|
e0d5095099 |
Vendored
+17
-6
@@ -39,7 +39,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
urlset {
|
urlset {
|
||||||
display: block;
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Inter, Helvetica, Arial, sans-serif;
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Inter, Helvetica, Arial, sans-serif;
|
||||||
background-color: var(--bg);
|
background-color: var(--bg);
|
||||||
color: var(--text-main);
|
color: var(--text-main);
|
||||||
@@ -55,6 +56,7 @@ urlset {
|
|||||||
urlset::before {
|
urlset::before {
|
||||||
content: "XML Sitemap";
|
content: "XML Sitemap";
|
||||||
display: block;
|
display: block;
|
||||||
|
order: -2;
|
||||||
font-size: 1.35rem;
|
font-size: 1.35rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
letter-spacing: -0.02em;
|
letter-spacing: -0.02em;
|
||||||
@@ -66,6 +68,7 @@ urlset::before {
|
|||||||
urlset::after {
|
urlset::after {
|
||||||
content: "Intecion.com, Technology — engineered for modern digital experiences.";
|
content: "Intecion.com, Technology — engineered for modern digital experiences.";
|
||||||
display: block;
|
display: block;
|
||||||
|
order: -1;
|
||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
padding-bottom: 1.25rem;
|
padding-bottom: 1.25rem;
|
||||||
@@ -76,6 +79,8 @@ urlset::after {
|
|||||||
/* URL card */
|
/* URL card */
|
||||||
url {
|
url {
|
||||||
display: block;
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
order: 0;
|
||||||
background-color: var(--card);
|
background-color: var(--card);
|
||||||
border: 1px solid var(--border);
|
border: 1px solid var(--border);
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
@@ -114,17 +119,17 @@ priority {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lastmod::before {
|
lastmod::before {
|
||||||
content: "Zaktualizowano: ";
|
content: "Updated: ";
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
changefreq::before {
|
changefreq::before {
|
||||||
content: "Częstotliwość: ";
|
content: "Frequency: ";
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
priority::before {
|
priority::before {
|
||||||
content: "Priorytet: ";
|
content: "Priority: ";
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,7 +137,7 @@ priority::before {
|
|||||||
link {
|
link {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-size: 0.7rem;
|
font-size: 0.7rem;
|
||||||
font-weight: 500;
|
font-weight: 600;
|
||||||
background-color: var(--badge-bg);
|
background-color: var(--badge-bg);
|
||||||
border: 1px solid var(--badge-border);
|
border: 1px solid var(--badge-border);
|
||||||
color: var(--badge-text);
|
color: var(--badge-text);
|
||||||
@@ -140,4 +145,10 @@ link {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
margin-right: 0.3rem;
|
margin-right: 0.3rem;
|
||||||
margin-top: 0.35rem;
|
margin-top: 0.35rem;
|
||||||
}
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
link::before {
|
||||||
|
content: attr(hreflang);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
+16
-1
@@ -17,12 +17,27 @@ export type PageMetadata = {
|
|||||||
url: string;
|
url: string;
|
||||||
}[];
|
}[];
|
||||||
locale?: string;
|
locale?: string;
|
||||||
|
/** Site/brand name for the OG card. */
|
||||||
|
siteName?: string;
|
||||||
title: string;
|
title: string;
|
||||||
|
/** 'website' | 'article' etc. Defaults to 'website'. */
|
||||||
|
type?: string;
|
||||||
|
/** Canonical URL of this page. */
|
||||||
|
url?: string;
|
||||||
};
|
};
|
||||||
/** robots directives — set to noindex/follow for legal/thin/search pages. */
|
/**
|
||||||
|
* robots directives. Indexed pages get generous snippet/preview limits by
|
||||||
|
* default (Google shows richer results); noindex pages get index:false.
|
||||||
|
*/
|
||||||
robots?: {
|
robots?: {
|
||||||
follow: boolean;
|
follow: boolean;
|
||||||
index: boolean;
|
index: boolean;
|
||||||
|
/** 'none' | 'standard' | 'large' — image preview size in results. */
|
||||||
|
'max-image-preview'?: 'large' | 'none' | 'standard';
|
||||||
|
/** Max text snippet length; -1 = no limit. Next maps to max-snippet. */
|
||||||
|
'max-snippet'?: number;
|
||||||
|
/** Max video preview seconds; -1 = no limit. */
|
||||||
|
'max-video-preview'?: number;
|
||||||
};
|
};
|
||||||
title: string;
|
title: string;
|
||||||
};
|
};
|
||||||
|
|||||||
Vendored
+20
-4
@@ -71,16 +71,32 @@ import { buildHreflangAlternates } from './hreflang.js';
|
|||||||
...images && {
|
...images && {
|
||||||
images
|
images
|
||||||
},
|
},
|
||||||
locale
|
type: 'website',
|
||||||
|
locale,
|
||||||
|
...siteName ? {
|
||||||
|
siteName
|
||||||
|
} : {},
|
||||||
|
...canonical ? {
|
||||||
|
url: canonical
|
||||||
|
} : {}
|
||||||
},
|
},
|
||||||
// noindex → tell search engines to exclude the page but still follow links
|
// robots: noindex pages are excluded (follow keeps link authority). Indexed
|
||||||
// (authority flows through). For legal/thin/search-result pages.
|
// pages get generous snippet/preview limits so Google can show rich results
|
||||||
|
// (long snippets, large image previews, full video previews).
|
||||||
...meta?.noindex ? {
|
...meta?.noindex ? {
|
||||||
robots: {
|
robots: {
|
||||||
follow: true,
|
follow: true,
|
||||||
index: false
|
index: false
|
||||||
}
|
}
|
||||||
} : {}
|
} : {
|
||||||
|
robots: {
|
||||||
|
follow: true,
|
||||||
|
index: true,
|
||||||
|
'max-image-preview': 'large',
|
||||||
|
'max-snippet': -1,
|
||||||
|
'max-video-preview': -1
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+2
-2
@@ -67,8 +67,8 @@ import { buildSeoPlugin, injectAutoFillMeta, injectSeoTabs } from './modules/seo
|
|||||||
// optional peer dependency at build time (it isn't in the plugin's own
|
// optional peer dependency at build time (it isn't in the plugin's own
|
||||||
// node_modules). Avoids TS2307 without @ts-expect-error; the module
|
// node_modules). Avoids TS2307 without @ts-expect-error; the module
|
||||||
// exists at runtime in projects that installed it.
|
// exists at runtime in projects that installed it.
|
||||||
const pkg = '@clocklimited/payload-2fa';
|
// @ts-ignore
|
||||||
const mod = await import(pkg);
|
const mod = await import('@clocklimited/payload-2fa');
|
||||||
// The package exports `payloadTotp`; older/other builds may use
|
// The package exports `payloadTotp`; older/other builds may use
|
||||||
// `totpPlugin`. Accept either so a rename doesn't break us.
|
// `totpPlugin`. Accept either so a rename doesn't break us.
|
||||||
const totp = mod.payloadTotp ?? mod.totpPlugin;
|
const totp = mod.payloadTotp ?? mod.totpPlugin;
|
||||||
|
|||||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
+25
@@ -843,6 +843,31 @@ const jsonLd = buildArticleJsonLd({
|
|||||||
|
|
||||||
Dane z dokumentu/panelu. Google wymaga headline + dat dla rich result.
|
Dane z dokumentu/panelu. Google wymaga headline + dat dla rich result.
|
||||||
|
|
||||||
|
## Robots — rich results (max-snippet, image/video preview)
|
||||||
|
|
||||||
|
Strony indeksowane dostają automatycznie dyrektywy pozwalające Google na bogate
|
||||||
|
wyniki (buildMetadata generuje):
|
||||||
|
- `max-snippet: -1` — pełnej długości snippet (bez limitu)
|
||||||
|
- `max-image-preview: large` — duży podgląd obrazu w wynikach
|
||||||
|
- `max-video-preview: -1` — pełny podgląd wideo
|
||||||
|
|
||||||
|
Strony noindex (polityki) dostają `index: false, follow: true` — bez powyższych.
|
||||||
|
Zero konfiguracji — działa automatycznie dla każdej strony przez createPageMetadata.
|
||||||
|
|
||||||
|
## Open Graph — pełne pola (type, siteName, url, description)
|
||||||
|
|
||||||
|
buildMetadata generuje kompletny OG dla social share (Facebook, LinkedIn, Slack):
|
||||||
|
- `og:title` — tytuł strony
|
||||||
|
- `og:description` — meta.description → fallback siteDescription (dziedziczy)
|
||||||
|
- `og:image` — defaultShareImage / obraz strony
|
||||||
|
- `og:type` — 'website'
|
||||||
|
- `og:site_name` — siteName z panelu
|
||||||
|
- `og:url` — canonical strony
|
||||||
|
- `og:locale` — język strony
|
||||||
|
|
||||||
|
Wszystko z panelu, automatycznie. Opis OG dziedziczy z meta.description (albo
|
||||||
|
globalnego siteDescription gdy pusty) — patrz niżej.
|
||||||
|
|
||||||
## Fallback meta description (siteDescription)
|
## Fallback meta description (siteDescription)
|
||||||
|
|
||||||
Strona bez `meta.description` → plugin używa globalnego `siteDescription` z
|
Strona bez `meta.description` → plugin używa globalnego `siteDescription` z
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@intecion/ipal-kit",
|
"name": "@intecion/ipal-kit",
|
||||||
"version": "1.5.2",
|
"version": "1.5.6",
|
||||||
"description": "Intecion Payload Advanced Library — a Payload CMS 3 plugin: i18n, SEO, forms, consent, analytics, blog/archives.",
|
"description": "Intecion Payload Advanced Library — a Payload CMS 3 plugin: i18n, SEO, forms, consent, analytics, blog/archives.",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -39,7 +39,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
urlset {
|
urlset {
|
||||||
display: block;
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Inter, Helvetica, Arial, sans-serif;
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Inter, Helvetica, Arial, sans-serif;
|
||||||
background-color: var(--bg);
|
background-color: var(--bg);
|
||||||
color: var(--text-main);
|
color: var(--text-main);
|
||||||
@@ -55,6 +56,7 @@ urlset {
|
|||||||
urlset::before {
|
urlset::before {
|
||||||
content: "XML Sitemap";
|
content: "XML Sitemap";
|
||||||
display: block;
|
display: block;
|
||||||
|
order: -2;
|
||||||
font-size: 1.35rem;
|
font-size: 1.35rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
letter-spacing: -0.02em;
|
letter-spacing: -0.02em;
|
||||||
@@ -66,6 +68,7 @@ urlset::before {
|
|||||||
urlset::after {
|
urlset::after {
|
||||||
content: "Intecion.com, Technology — engineered for modern digital experiences.";
|
content: "Intecion.com, Technology — engineered for modern digital experiences.";
|
||||||
display: block;
|
display: block;
|
||||||
|
order: -1;
|
||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
padding-bottom: 1.25rem;
|
padding-bottom: 1.25rem;
|
||||||
@@ -76,6 +79,8 @@ urlset::after {
|
|||||||
/* URL card */
|
/* URL card */
|
||||||
url {
|
url {
|
||||||
display: block;
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
order: 0;
|
||||||
background-color: var(--card);
|
background-color: var(--card);
|
||||||
border: 1px solid var(--border);
|
border: 1px solid var(--border);
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
@@ -114,17 +119,17 @@ priority {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lastmod::before {
|
lastmod::before {
|
||||||
content: "Zaktualizowano: ";
|
content: "Updated: ";
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
changefreq::before {
|
changefreq::before {
|
||||||
content: "Częstotliwość: ";
|
content: "Frequency: ";
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
priority::before {
|
priority::before {
|
||||||
content: "Priorytet: ";
|
content: "Priority: ";
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,7 +137,7 @@ priority::before {
|
|||||||
link {
|
link {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-size: 0.7rem;
|
font-size: 0.7rem;
|
||||||
font-weight: 500;
|
font-weight: 600;
|
||||||
background-color: var(--badge-bg);
|
background-color: var(--badge-bg);
|
||||||
border: 1px solid var(--badge-border);
|
border: 1px solid var(--badge-border);
|
||||||
color: var(--badge-text);
|
color: var(--badge-text);
|
||||||
@@ -140,4 +145,10 @@ link {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
margin-right: 0.3rem;
|
margin-right: 0.3rem;
|
||||||
margin-top: 0.35rem;
|
margin-top: 0.35rem;
|
||||||
}
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
link::before {
|
||||||
|
content: attr(hreflang);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,12 +20,27 @@ export type PageMetadata = {
|
|||||||
description?: string
|
description?: string
|
||||||
images?: { url: string }[]
|
images?: { url: string }[]
|
||||||
locale?: string
|
locale?: string
|
||||||
|
/** Site/brand name for the OG card. */
|
||||||
|
siteName?: string
|
||||||
title: string
|
title: string
|
||||||
|
/** 'website' | 'article' etc. Defaults to 'website'. */
|
||||||
|
type?: string
|
||||||
|
/** Canonical URL of this page. */
|
||||||
|
url?: string
|
||||||
}
|
}
|
||||||
/** robots directives — set to noindex/follow for legal/thin/search pages. */
|
/**
|
||||||
|
* robots directives. Indexed pages get generous snippet/preview limits by
|
||||||
|
* default (Google shows richer results); noindex pages get index:false.
|
||||||
|
*/
|
||||||
robots?: {
|
robots?: {
|
||||||
follow: boolean
|
follow: boolean
|
||||||
index: boolean
|
index: boolean
|
||||||
|
/** 'none' | 'standard' | 'large' — image preview size in results. */
|
||||||
|
'max-image-preview'?: 'large' | 'none' | 'standard'
|
||||||
|
/** Max text snippet length; -1 = no limit. Next maps to max-snippet. */
|
||||||
|
'max-snippet'?: number
|
||||||
|
/** Max video preview seconds; -1 = no limit. */
|
||||||
|
'max-video-preview'?: number
|
||||||
}
|
}
|
||||||
title: string
|
title: string
|
||||||
}
|
}
|
||||||
@@ -140,10 +155,24 @@ export function buildMetadata({
|
|||||||
title,
|
title,
|
||||||
...(description && { description }),
|
...(description && { description }),
|
||||||
...(images && { images }),
|
...(images && { images }),
|
||||||
|
type: 'website',
|
||||||
locale,
|
locale,
|
||||||
|
...(siteName ? { siteName } : {}),
|
||||||
|
...(canonical ? { url: canonical } : {}),
|
||||||
},
|
},
|
||||||
// noindex → tell search engines to exclude the page but still follow links
|
// robots: noindex pages are excluded (follow keeps link authority). Indexed
|
||||||
// (authority flows through). For legal/thin/search-result pages.
|
// pages get generous snippet/preview limits so Google can show rich results
|
||||||
...(meta?.noindex ? { robots: { follow: true, index: false } } : {}),
|
// (long snippets, large image previews, full video previews).
|
||||||
|
...(meta?.noindex
|
||||||
|
? { robots: { follow: true, index: false } }
|
||||||
|
: {
|
||||||
|
robots: {
|
||||||
|
follow: true,
|
||||||
|
index: true,
|
||||||
|
'max-image-preview': 'large' as const,
|
||||||
|
'max-snippet': -1,
|
||||||
|
'max-video-preview': -1,
|
||||||
|
},
|
||||||
|
}),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -76,8 +76,8 @@ export const ipalKit = (options: IpalOptions): Plugin => {
|
|||||||
// optional peer dependency at build time (it isn't in the plugin's own
|
// optional peer dependency at build time (it isn't in the plugin's own
|
||||||
// node_modules). Avoids TS2307 without @ts-expect-error; the module
|
// node_modules). Avoids TS2307 without @ts-expect-error; the module
|
||||||
// exists at runtime in projects that installed it.
|
// exists at runtime in projects that installed it.
|
||||||
const pkg = '@clocklimited/payload-2fa'
|
// @ts-ignore
|
||||||
const mod = (await import(pkg)) as {
|
const mod = (await import('@clocklimited/payload-2fa')) as {
|
||||||
payloadTotp?: (opts: Record<string, unknown>) => Plugin
|
payloadTotp?: (opts: Record<string, unknown>) => Plugin
|
||||||
totpPlugin?: (opts: Record<string, unknown>) => Plugin
|
totpPlugin?: (opts: Record<string, unknown>) => Plugin
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user