@alfadocs/ui-kit-debug 1.109.0 → 1.110.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/_chunks/{public-footer-3Jy1zHSs.js → public-footer-DGjLTtNK.js} +30 -30
  2. package/dist/_chunks/public-footer-DGjLTtNK.js.map +1 -0
  3. package/dist/_chunks/{reviews-panel-CtrwZOUS.js → reviews-panel-B03auSpQ.js} +210 -207
  4. package/dist/_chunks/reviews-panel-B03auSpQ.js.map +1 -0
  5. package/dist/_chunks/{signed-out-frame-Bs_LSPWe.js → signed-out-frame-CPow3aCZ.js} +2 -2
  6. package/dist/_chunks/{signed-out-frame-Bs_LSPWe.js.map → signed-out-frame-CPow3aCZ.js.map} +1 -1
  7. package/dist/agent-catalog.json +1 -1
  8. package/dist/components/public-footer/index.js +1 -1
  9. package/dist/components/reviews-panel/index.js +1 -1
  10. package/dist/components/reviews-panel/reviews-panel.d.ts +7 -0
  11. package/dist/components/reviews-panel/reviews-panel.d.ts.map +1 -1
  12. package/dist/i18n/locales/ar.d.ts +1 -0
  13. package/dist/i18n/locales/ar.d.ts.map +1 -1
  14. package/dist/i18n/locales/ar.js +1 -0
  15. package/dist/i18n/locales/ar.js.map +1 -1
  16. package/dist/i18n/locales/de.d.ts +1 -0
  17. package/dist/i18n/locales/de.d.ts.map +1 -1
  18. package/dist/i18n/locales/de.js +1 -0
  19. package/dist/i18n/locales/de.js.map +1 -1
  20. package/dist/i18n/locales/el.d.ts +1 -0
  21. package/dist/i18n/locales/el.d.ts.map +1 -1
  22. package/dist/i18n/locales/el.js +1 -0
  23. package/dist/i18n/locales/el.js.map +1 -1
  24. package/dist/i18n/locales/en.d.ts +1 -0
  25. package/dist/i18n/locales/en.d.ts.map +1 -1
  26. package/dist/i18n/locales/en.js +1 -0
  27. package/dist/i18n/locales/en.js.map +1 -1
  28. package/dist/i18n/locales/es.d.ts +1 -0
  29. package/dist/i18n/locales/es.d.ts.map +1 -1
  30. package/dist/i18n/locales/es.js +1 -0
  31. package/dist/i18n/locales/es.js.map +1 -1
  32. package/dist/i18n/locales/fr.d.ts +1 -0
  33. package/dist/i18n/locales/fr.d.ts.map +1 -1
  34. package/dist/i18n/locales/fr.js +1 -0
  35. package/dist/i18n/locales/fr.js.map +1 -1
  36. package/dist/i18n/locales/hi.d.ts +1 -0
  37. package/dist/i18n/locales/hi.d.ts.map +1 -1
  38. package/dist/i18n/locales/hi.js +1 -0
  39. package/dist/i18n/locales/hi.js.map +1 -1
  40. package/dist/i18n/locales/it.d.ts +1 -0
  41. package/dist/i18n/locales/it.d.ts.map +1 -1
  42. package/dist/i18n/locales/it.js +1 -0
  43. package/dist/i18n/locales/it.js.map +1 -1
  44. package/dist/i18n/locales/ja.d.ts +1 -0
  45. package/dist/i18n/locales/ja.d.ts.map +1 -1
  46. package/dist/i18n/locales/ja.js +1 -0
  47. package/dist/i18n/locales/ja.js.map +1 -1
  48. package/dist/i18n/locales/nl.d.ts +1 -0
  49. package/dist/i18n/locales/nl.d.ts.map +1 -1
  50. package/dist/i18n/locales/nl.js +1 -0
  51. package/dist/i18n/locales/nl.js.map +1 -1
  52. package/dist/i18n/locales/pl.d.ts +1 -0
  53. package/dist/i18n/locales/pl.d.ts.map +1 -1
  54. package/dist/i18n/locales/pl.js +1 -0
  55. package/dist/i18n/locales/pl.js.map +1 -1
  56. package/dist/i18n/locales/pt.d.ts +1 -0
  57. package/dist/i18n/locales/pt.d.ts.map +1 -1
  58. package/dist/i18n/locales/pt.js +1 -0
  59. package/dist/i18n/locales/pt.js.map +1 -1
  60. package/dist/i18n/locales/ro.d.ts +1 -0
  61. package/dist/i18n/locales/ro.d.ts.map +1 -1
  62. package/dist/i18n/locales/ro.js +1 -0
  63. package/dist/i18n/locales/ro.js.map +1 -1
  64. package/dist/i18n/locales/ru.d.ts +1 -0
  65. package/dist/i18n/locales/ru.d.ts.map +1 -1
  66. package/dist/i18n/locales/ru.js +1 -0
  67. package/dist/i18n/locales/ru.js.map +1 -1
  68. package/dist/i18n/locales/sq.d.ts +1 -0
  69. package/dist/i18n/locales/sq.d.ts.map +1 -1
  70. package/dist/i18n/locales/sq.js +1 -0
  71. package/dist/i18n/locales/sq.js.map +1 -1
  72. package/dist/i18n/locales/sv.d.ts +1 -0
  73. package/dist/i18n/locales/sv.d.ts.map +1 -1
  74. package/dist/i18n/locales/sv.js +1 -0
  75. package/dist/i18n/locales/sv.js.map +1 -1
  76. package/dist/i18n/locales/tr.d.ts +1 -0
  77. package/dist/i18n/locales/tr.d.ts.map +1 -1
  78. package/dist/i18n/locales/tr.js +1 -0
  79. package/dist/i18n/locales/tr.js.map +1 -1
  80. package/dist/i18n/locales/zh.d.ts +1 -0
  81. package/dist/i18n/locales/zh.d.ts.map +1 -1
  82. package/dist/i18n/locales/zh.js +1 -0
  83. package/dist/i18n/locales/zh.js.map +1 -1
  84. package/dist/index.js +3 -3
  85. package/dist/locales/ar.json +1 -0
  86. package/dist/locales/de.json +1 -0
  87. package/dist/locales/el.json +1 -0
  88. package/dist/locales/en.json +1 -0
  89. package/dist/locales/es.json +1 -0
  90. package/dist/locales/fr.json +1 -0
  91. package/dist/locales/hi.json +1 -0
  92. package/dist/locales/it.json +1 -0
  93. package/dist/locales/ja.json +1 -0
  94. package/dist/locales/nl.json +1 -0
  95. package/dist/locales/pl.json +1 -0
  96. package/dist/locales/pt.json +1 -0
  97. package/dist/locales/ro.json +1 -0
  98. package/dist/locales/ru.json +1 -0
  99. package/dist/locales/sq.json +1 -0
  100. package/dist/locales/sv.json +1 -0
  101. package/dist/locales/tr.json +1 -0
  102. package/dist/locales/zh.json +1 -0
  103. package/dist/patterns/signed-out-frame/index.js +1 -1
  104. package/package.json +1 -1
  105. package/dist/_chunks/public-footer-3Jy1zHSs.js.map +0 -1
  106. package/dist/_chunks/reviews-panel-CtrwZOUS.js.map +0 -1
@@ -36,7 +36,7 @@ const C = "https://www.alfadocs.com", M = {
36
36
  function Z(e) {
37
37
  return !e || !e.startsWith(Q) ? C : e.replace(/\/+$/, "");
38
38
  }
39
- function I(e, n, a) {
39
+ function A(e, n, a) {
40
40
  var o, l;
41
41
  const d = (o = a == null ? void 0 : a[n]) == null ? void 0 : o[e];
42
42
  if (d) return d;
@@ -46,9 +46,9 @@ function I(e, n, a) {
46
46
  function tt(e, n, a) {
47
47
  const d = Z(n), s = (e || "it").split("-")[0];
48
48
  return {
49
- privacy: `${d}${I(s, "privacy", a)}`,
50
- terms: `${d}${I(s, "terms", a)}`,
51
- contacts: `${d}${I(s, "contacts", a)}`
49
+ privacy: `${d}${A(s, "privacy", a)}`,
50
+ terms: `${d}${A(s, "terms", a)}`,
51
+ contacts: `${d}${A(s, "contacts", a)}`
52
52
  };
53
53
  }
54
54
  const et = [
@@ -66,7 +66,7 @@ const et = [
66
66
  youtube: N.youtube,
67
67
  instagram: N.instagram,
68
68
  facebook: N.facebook
69
- }, at = "AlfaDocs GmbH", dt = "P.IVA DE301955405", ot = K(
69
+ }, at = "AlfaDocs GmbH", dt = "DE301955405", ot = K(
70
70
  [
71
71
  "ds:w-full",
72
72
  "ds:text-[color:var(--muted-foreground)]",
@@ -158,7 +158,7 @@ function it({
158
158
  }
159
159
  );
160
160
  }
161
- function V({
161
+ function S({
162
162
  copyright: e,
163
163
  align: n = "center"
164
164
  }) {
@@ -186,28 +186,28 @@ const lt = G(
186
186
  logoSlot: v,
187
187
  extraNavSlot: p,
188
188
  trustBadgesSlot: h,
189
- showTagline: $ = !1,
189
+ showTagline: k = !1,
190
190
  showCopyright: m = !0,
191
191
  id: x,
192
192
  "aria-label": b
193
- }, H) {
193
+ }, D) {
194
194
  const { t: f, i18n: L } = Y("ui"), _ = E(
195
195
  () => tt(L.language, a, d),
196
196
  [L.language, a, d]
197
197
  );
198
198
  X(
199
- H,
199
+ D,
200
200
  () => ({
201
201
  getVariant: () => n,
202
202
  getLegalUrls: () => _
203
203
  }),
204
204
  [n, _]
205
205
  );
206
- const O = (/* @__PURE__ */ new Date()).getFullYear(), w = m ? f("footer.copyright", {
207
- year: O,
206
+ const H = (/* @__PURE__ */ new Date()).getFullYear(), w = m ? f("footer.copyright", {
207
+ year: H,
208
208
  entity: at,
209
- vat: dt
210
- }) : void 0, T = $ ? f("footer.tagline") : void 0, D = b ?? f("footer.nav.label"), A = {
209
+ vat: `${f("footer.vatLabel")} ${dt}`
210
+ }) : void 0, T = k ? f("footer.tagline") : void 0, O = b ?? f("footer.nav.label"), I = {
211
211
  privacy: f("footer.nav.privacy"),
212
212
  terms: f("footer.nav.terms"),
213
213
  contacts: f("footer.nav.contacts")
@@ -217,7 +217,7 @@ const lt = G(
217
217
  {
218
218
  id: x,
219
219
  role: "contentinfo",
220
- "aria-label": D,
220
+ "aria-label": O,
221
221
  "data-component": "public-footer",
222
222
  "data-component-id": x,
223
223
  "data-variant": n,
@@ -232,10 +232,10 @@ const lt = G(
232
232
  }
233
233
  ) : null,
234
234
  n === "minimal" && /* @__PURE__ */ t(
235
- ft,
235
+ mt,
236
236
  {
237
237
  legalUrls: _,
238
- labels: A,
238
+ labels: I,
239
239
  copyright: w,
240
240
  trustBadgesSlot: h,
241
241
  extraNavSlot: p
@@ -245,7 +245,7 @@ const lt = G(
245
245
  pt,
246
246
  {
247
247
  legalUrls: _,
248
- labels: A,
248
+ labels: I,
249
249
  copyright: w,
250
250
  tagline: T,
251
251
  socials: z,
@@ -258,7 +258,7 @@ const lt = G(
258
258
  gt,
259
259
  {
260
260
  legalUrls: _,
261
- labels: A,
261
+ labels: I,
262
262
  copyright: w,
263
263
  tagline: T,
264
264
  linkGroups: s,
@@ -273,7 +273,7 @@ const lt = G(
273
273
  }
274
274
  );
275
275
  }
276
- ), j = 'ds:relative ds:before:absolute ds:before:inset-x-0 ds:before:inset-y-[calc((var(--accessible-target-floor,var(--spacing-lg))-100%)/-2)] ds:before:content-[""]', k = [
276
+ ), j = 'ds:relative ds:before:absolute ds:before:inset-x-0 ds:before:inset-y-[calc((var(--accessible-target-floor,var(--spacing-lg))-100%)/-2)] ds:before:content-[""]', $ = [
277
277
  "ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:text-muted-foreground ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:no-underline ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:underline-offset-4",
278
278
  "ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:hover:text-foreground ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:hover:underline ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:active:opacity-80",
279
279
  "ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:focus-visible:outline-[length:var(--focus-ring-width)] ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:focus-visible:outline-solid",
@@ -288,8 +288,8 @@ const lt = G(
288
288
  "ds:[&_button]:focus-visible:outline-[length:var(--focus-ring-width)] ds:[&_button]:focus-visible:outline-solid",
289
289
  "ds:[&_button]:focus-visible:outline-ring ds:[&_button]:focus-visible:outline-offset-[length:var(--focus-ring-offset)]",
290
290
  "ds:[&_button]:forced-colors:focus-visible:outline-[CanvasText]"
291
- ].join(" "), ut = `${k} ${ct}`, mt = 'ds:[&_:is(a,button)]:relative ds:[&_:is(a,button)]:before:absolute ds:[&_:is(a,button)]:before:inset-x-0 ds:[&_:is(a,button)]:before:inset-y-[calc((var(--accessible-target-floor,var(--spacing-lg))-100%)/-2)] ds:[&_:is(a,button)]:before:block ds:[&_:is(a,button)]:before:content-[""]';
292
- function ft({
291
+ ].join(" "), ut = `${$} ${ct}`, ft = 'ds:[&_:is(a,button)]:relative ds:[&_:is(a,button)]:before:absolute ds:[&_:is(a,button)]:before:inset-x-0 ds:[&_:is(a,button)]:before:inset-y-[calc((var(--accessible-target-floor,var(--spacing-lg))-100%)/-2)] ds:[&_:is(a,button)]:before:block ds:[&_:is(a,button)]:before:content-[""]';
292
+ function mt({
293
293
  legalUrls: e,
294
294
  labels: n,
295
295
  copyright: a,
@@ -337,7 +337,7 @@ function ft({
337
337
  className: [
338
338
  "ds:inline-flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-sm)]",
339
339
  ut,
340
- mt
340
+ ft
341
341
  ].join(" "),
342
342
  children: s
343
343
  }
@@ -349,7 +349,7 @@ function ft({
349
349
  ] }) : null
350
350
  ] }) });
351
351
  }
352
- function S({
352
+ function V({
353
353
  socials: e,
354
354
  t: n,
355
355
  size: a
@@ -397,7 +397,7 @@ function pt({
397
397
  t: c
398
398
  }) {
399
399
  return /* @__PURE__ */ r("div", { className: "ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-md)]", children: [
400
- s.length > 0 ? /* @__PURE__ */ t(S, { socials: s, t: c, size: "sm" }) : null,
400
+ s.length > 0 ? /* @__PURE__ */ t(V, { socials: s, t: c, size: "sm" }) : null,
401
401
  /* @__PURE__ */ t("div", { className: "ds:@container/pfoot ds:w-full", children: /* @__PURE__ */ r("div", { className: "ds:flex ds:flex-wrap ds:items-center ds:justify-center ds:gap-x-[var(--spacing-md)] ds:@[1024px]/pfoot:gap-x-[var(--spacing-sm)] ds:gap-y-[var(--spacing-sm)]", children: [
402
402
  o !== void 0 ? o !== null && o !== !1 && o !== "" ? /* @__PURE__ */ r(g, { children: [
403
403
  /* @__PURE__ */ t(
@@ -458,10 +458,10 @@ function pt({
458
458
  ),
459
459
  l && /* @__PURE__ */ r(g, { children: [
460
460
  /* @__PURE__ */ t(u, {}),
461
- /* @__PURE__ */ t("span", { "data-slot": "extra-nav", className: k, children: l })
461
+ /* @__PURE__ */ t("span", { "data-slot": "extra-nav", className: $, children: l })
462
462
  ] })
463
463
  ] }) }),
464
- a ? /* @__PURE__ */ t(V, { copyright: a }) : null,
464
+ a ? /* @__PURE__ */ t(S, { copyright: a }) : null,
465
465
  d ? /* @__PURE__ */ t(
466
466
  "p",
467
467
  {
@@ -507,7 +507,7 @@ function gt({
507
507
  className: "ds:flex ds:flex-col ds:gap-[var(--spacing-md)]",
508
508
  children: [
509
509
  /* @__PURE__ */ t("div", { className: "ds:inline-flex", children: l ?? /* @__PURE__ */ t(F, { variant: "wordmark", tone: "auto", "aria-label": "Alfadocs" }) }),
510
- /* @__PURE__ */ t(S, { socials: o, t: p, size: "md" })
510
+ /* @__PURE__ */ t(V, { socials: o, t: p, size: "md" })
511
511
  ]
512
512
  }
513
513
  ) }),
@@ -547,7 +547,7 @@ function gt({
547
547
  ] }),
548
548
  /* @__PURE__ */ t(R, { orientation: "horizontal" }),
549
549
  /* @__PURE__ */ r("div", { className: "ds:@container/pfoot ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-sm)] ds:sm:flex-row ds:sm:items-center ds:sm:justify-between", children: [
550
- a ? /* @__PURE__ */ t(V, { copyright: a, align: "start" }) : null,
550
+ a ? /* @__PURE__ */ t(S, { copyright: a, align: "start" }) : null,
551
551
  /* @__PURE__ */ r(
552
552
  "div",
553
553
  {
@@ -589,7 +589,7 @@ function gt({
589
589
  "span",
590
590
  {
591
591
  "data-slot": "extra-nav",
592
- className: `ds:inline-flex ds:items-center ${k}`,
592
+ className: `ds:inline-flex ds:items-center ${$}`,
593
593
  children: c
594
594
  }
595
595
  )
@@ -648,4 +648,4 @@ export {
648
648
  nt as a,
649
649
  tt as c
650
650
  };
651
- //# sourceMappingURL=public-footer-3Jy1zHSs.js.map
651
+ //# sourceMappingURL=public-footer-DGjLTtNK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-footer-DGjLTtNK.js","sources":["../../src/components/public-footer/legal-urls.ts","../../src/components/public-footer/socials.ts","../../src/components/public-footer/public-footer.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* PublicFooter — legally-required URL composition. */\n/* */\n/* GDPR + Italian/German commercial law require Privacy, Terms-of-use, */\n/* entity name and VAT to be visible on every public AlfaDocs surface. */\n/* The kit owns the slug table so a privacy-policy URL change is a single */\n/* kit bump rather than three repo edits. */\n/* */\n/* For locales without an explicit canonical slug, we fall back to the */\n/* Italian slugs — alfadocs.com defaults to Italian and unlocalised pages */\n/* render the IT version. Marketing supplies updates over time. */\n/* -------------------------------------------------------------------- */\n\nexport const DEFAULT_MARKETING_BASE_URL = 'https://www.alfadocs.com';\n\nexport type LegalUrlKey = 'privacy' | 'terms' | 'contacts';\n\nexport type LegalSlugMap = Record<LegalUrlKey, string>;\n\n/** Per-locale slug override; missing locales fall back to the kit default. */\nexport type LegalUrlOverride = Record<string, string>;\n\nexport interface LegalUrlOverrides {\n privacy?: LegalUrlOverride;\n terms?: LegalUrlOverride;\n contacts?: LegalUrlOverride;\n}\n\n/* Italian default — also used as the fallback for any locale without an\n * explicit entry below. */\nconst ITALIAN_SLUGS: LegalSlugMap = {\n privacy: '/privacy-prenotazione-online',\n terms: '/it/condizioni-di-utilizzo',\n contacts: '/it/contattaci',\n};\n\n/* Canonical per-locale slug table. Explicit entries come from marketing;\n * everything else inherits ITALIAN_SLUGS via the resolver below. */\nconst SLUGS: Record<string, LegalSlugMap> = {\n it: ITALIAN_SLUGS,\n en: {\n privacy: '/en/privacy',\n terms: '/en/terms-of-use',\n contacts: '/en/contact-us',\n },\n de: {\n privacy: '/de/datenschutz',\n terms: '/de/nutzungsbedingungen',\n contacts: '/de/kontakt',\n },\n fr: {\n privacy: '/fr/confidentialite',\n terms: '/fr/conditions-utilisation',\n contacts: '/fr/contact',\n },\n es: {\n privacy: '/es/privacidad',\n terms: '/es/condiciones-uso',\n contacts: '/es/contacto',\n },\n};\n\nconst HTTPS_PREFIX = 'https://';\n\nfunction normaliseBaseUrl(input: string | undefined): string {\n if (!input) return DEFAULT_MARKETING_BASE_URL;\n if (!input.startsWith(HTTPS_PREFIX)) {\n if (import.meta.env.DEV) {\n // eslint-disable-next-line no-console\n console.warn(\n `[PublicFooter] marketingBaseUrl must start with \"https://\" — falling back to ${DEFAULT_MARKETING_BASE_URL}. Received: \"${input}\"`,\n );\n }\n return DEFAULT_MARKETING_BASE_URL;\n }\n // Strip trailing slash so composed URLs don't double up.\n return input.replace(/\\/+$/, '');\n}\n\nfunction pickSlug(\n locale: string,\n key: LegalUrlKey,\n overrides: LegalUrlOverrides | undefined,\n): string {\n const override = overrides?.[key]?.[locale];\n if (override) return override;\n const localeSlug = SLUGS[locale]?.[key];\n if (localeSlug) return localeSlug;\n return ITALIAN_SLUGS[key];\n}\n\n/** Resolved legal URLs for the active locale + baseUrl + overrides. */\nexport interface ResolvedLegalUrls {\n privacy: string;\n terms: string;\n contacts: string;\n}\n\nexport function composeLegalUrls(\n locale: string,\n marketingBaseUrl: string | undefined,\n overrides?: LegalUrlOverrides,\n): ResolvedLegalUrls {\n const base = normaliseBaseUrl(marketingBaseUrl);\n const lang = (locale || 'it').split('-')[0]; // strip region — 'pt-BR' → 'pt'\n return {\n privacy: `${base}${pickSlug(lang, 'privacy', overrides)}`,\n terms: `${base}${pickSlug(lang, 'terms', overrides)}`,\n contacts: `${base}${pickSlug(lang, 'contacts', overrides)}`,\n };\n}\n","/* -------------------------------------------------------------------- */\n/* PublicFooter — default social-network URLs + brand icon components. */\n/* */\n/* AlfaDocs's four canonical social profiles. Consumers can subset via */\n/* `socials={[...]}` or override individual `href` values. */\n/* */\n/* Icons are shared inline SVG assets (paths from simpleicons.org) */\n/* rendered with `currentColor` so they inherit the footer's */\n/* `--muted-foreground` ink. Lucide-react does not ship brand glyphs, and */\n/* pulling a separate brand-icon package for four logos is not worth the */\n/* bundle cost. */\n/* -------------------------------------------------------------------- */\n\nimport { SOCIAL_LINK_ICONS } from '../_shared/social-brand-icons';\n\nexport const SOCIAL_NETWORKS = [\n 'linkedin',\n 'youtube',\n 'instagram',\n 'facebook',\n] as const;\n\nexport type SocialNetwork = (typeof SOCIAL_NETWORKS)[number];\n\nexport const DEFAULT_SOCIAL_URLS: Record<SocialNetwork, string> = {\n linkedin: 'https://www.linkedin.com/company/alfadocs',\n youtube: 'https://www.youtube.com/@alfadocs',\n instagram: 'https://www.instagram.com/alfadocs',\n facebook: 'https://www.facebook.com/alfadocs',\n};\n\nexport const SOCIAL_ICONS = {\n linkedin: SOCIAL_LINK_ICONS.linkedin,\n youtube: SOCIAL_LINK_ICONS.youtube,\n instagram: SOCIAL_LINK_ICONS.instagram,\n facebook: SOCIAL_LINK_ICONS.facebook,\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Link } from '../link';\nimport { Separator } from '../separator';\nimport { Logo } from '../logo';\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from '../accordion';\nimport {\n composeLegalUrls,\n type LegalUrlOverrides,\n type ResolvedLegalUrls,\n} from './legal-urls';\nimport {\n DEFAULT_SOCIAL_URLS,\n SOCIAL_ICONS,\n SOCIAL_NETWORKS,\n type SocialNetwork,\n} from './socials';\n\n/* ------------------------------------------------------------------ */\n/* Constants */\n/* ------------------------------------------------------------------ */\n\nconst ENTITY_NAME = 'AlfaDocs GmbH';\nconst ENTITY_VAT_ID = 'DE301955405';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rootVariants = cva(\n [\n 'ds:w-full',\n 'ds:text-[color:var(--muted-foreground)]',\n 'ds:text-[length:var(--font-size-sm)]',\n 'ds:bg-[var(--background)]',\n ].join(' '),\n {\n variants: {\n variant: {\n minimal: [\n 'ds:py-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:border-block-start ds:border-[var(--border)]',\n ].join(' '),\n // 0.30.5: compact got a polish pass — bumped vertical padding to\n // `lg` (~24px) so the footer reads as a real landmark, not a\n // one-line afterthought, plus a stronger top border in\n // accessible mode (the default `--border` clears 3:1 in light /\n // dark; accessible bumps to a heavier weight).\n //\n // 0.31.2: forced-colors top-border fallback. Windows High\n // Contrast strips `--border` to whatever the system maps it\n // to — which is often invisible against `Canvas`. Pinning to\n // `CanvasText` keeps the landmark edge visible for users on\n // strict HC themes.\n compact: [\n 'ds:py-[var(--spacing-lg)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:border-block-start ds:border-[var(--border)]',\n // 2px in the accessible themes, none elsewhere (--accessible-on).\n 'ds:[border-block-start-width:calc(var(--border-width-md)*var(--accessible-on,0))]',\n 'ds:forced-colors:[border-block-start-color:CanvasText]',\n ].join(' '),\n full: [\n 'ds:py-[var(--spacing-xl)]',\n 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)]',\n 'ds:bg-[var(--muted)]',\n ].join(' '),\n },\n },\n defaultVariants: { variant: 'compact' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type PublicFooterVariant = NonNullable<\n VariantProps<typeof rootVariants>['variant']\n>;\n\nexport interface PublicFooterLink {\n href: string;\n label: string;\n /** When true, link opens in a new tab with the localised aria-label suffix. */\n external?: boolean;\n}\n\nexport interface PublicFooterLinkGroup {\n /** Stable key — used to look up the column heading via `t('ui.footer.group.<key>')`. */\n key: 'product' | 'resources' | 'company' | 'legal' | (string & {});\n links: PublicFooterLink[];\n}\n\nexport interface PublicFooterLinkSectionLink {\n /** Visible link text. The consumer supplies it, already translated. */\n label: string;\n href: string;\n}\n\nexport interface PublicFooterLinkSection {\n /** Stable key for the group. Also builds the heading `id`. */\n id: string;\n /** Group heading, already translated. */\n title: string;\n links: PublicFooterLinkSectionLink[];\n /** Optional \"see all\" link, shown under the group's links. */\n more?: PublicFooterLinkSectionLink;\n}\n\nexport interface PublicFooterSocial {\n network: SocialNetwork;\n /** Override the kit's default URL. */\n href?: string;\n}\n\nexport interface PublicFooterProps {\n variant: PublicFooterVariant;\n /** Origin for legally-required URLs. Default: 'https://www.alfadocs.com'. */\n marketingBaseUrl?: string;\n /** Override individual legal-link slugs per locale. Rare. */\n legalUrlOverrides?: LegalUrlOverrides;\n /** `full` variant: consumer-supplied link columns. Legal column is always rendered. */\n linkGroups?: PublicFooterLinkGroup[];\n /**\n * A visible block of plain link groups above the footer's own content, in\n * every variant. Each group is a heading and a list of real `<a href>`\n * links (two columns on md and up), with an optional \"more\" link under it;\n * two groups sit side by side from md, stacked on phones. For SEO: it puts\n * the speciality and city pages one hop from every page. The consumer\n * supplies every text, so the kit adds no strings. Without it the footer\n * renders as before.\n */\n linkSections?: PublicFooterLinkSection[];\n /**\n * Accessible name of the `linkSections` navigation landmark, for example\n * \"Explore by speciality and city\". Already translated by the consumer.\n */\n linkSectionsLabel?: string;\n /** `full` variant: subset of social networks. Default: all four. Pass `[]` to hide the row. */\n socials?: PublicFooterSocial[];\n /** `full` variant: custom logo node. Default: kit's wordmark Logo. */\n logoSlot?: ReactNode;\n /**\n * Extra surface-specific links, appended after the standard legal links in\n * every variant. A `<Link>`, an `<a>`, a `<button>` or the kit's\n * `<Button intent=\"link\">` all work: the slot gives anchors the footer link\n * look (muted text, underline on hover, focus ring) in every variant, and in\n * `minimal` bare buttons and `Button intent=\"link\"` too, so a host \"Cookie\n * settings\" button that reopens its consent manager sits in line with\n * Privacy and Terms. In `compact` and `full` host buttons keep their own\n * look. In `minimal` the slot comes after Terms and before\n * the copyright line, so tab order follows reading order, in RTL too. The\n * host owns the label and the click handler. Minimal ignored this slot\n * before 1.91.0.\n */\n extraNavSlot?: ReactNode;\n /** Trust badges (HIPAA, ISO). Rendered at the start of `minimal`'s row, or in the bottom strip of `full`. */\n trustBadgesSlot?: ReactNode;\n /**\n * @default false\n * Render the brand tagline (\"German technology, Italian design\") in\n * the bottom microcopy row of `compact` and `full` variants.\n *\n * 0.32.4: default flipped to `false`. The tagline was loud on\n * booking-website's deployed footer and didn't carry product\n * meaning for end-users; marketing surfaces can opt back in\n * explicitly with `showTagline`. The `footer.tagline` i18n key\n * stays available so the opt-in path still works.\n */\n showTagline?: boolean;\n /**\n * The line with the year, the company name and the VAT number. On by\n * default: a public page must carry it. Turn it off only on a screen\n * that sits inside the app, such as sign-in or registration, where the\n * privacy and terms links are all the footer needs.\n * @default true\n */\n showCopyright?: boolean;\n 'aria-label'?: string;\n id?: string;\n}\n\nexport interface PublicFooterHandle {\n getVariant: () => PublicFooterVariant;\n /** Resolved legal URLs for the current locale + marketingBaseUrl + overrides. */\n getLegalUrls: () => ResolvedLegalUrls;\n}\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\n/** Allowlist consumer-supplied URLs — public marketing surface, defence in depth. */\nconst SAFE_HREF_RE = /^(https?:\\/\\/|mailto:|tel:|\\/(?!\\/))/i;\nfunction safeHref(href: string): string {\n return SAFE_HREF_RE.test(href) ? href : '#';\n}\n\n/**\n * Vertical divider between inline links. Hidden while the footer's own\n * width (container `pfoot`) is under 1024px, where the rows wrap and a\n * divider could end up first or last on a line (HTP-7153). The switch\n * follows the container, not the viewport, so narrow embedded footers\n * are covered too. Purely decorative: `aria-hidden`, never announced.\n */\nfunction FooterDivider() {\n return (\n <Separator\n orientation=\"vertical\"\n decorative\n data-slot=\"footer-divider\"\n className=\"ds:hidden ds:@[1024px]/pfoot:block ds:h-4\"\n />\n );\n}\n\n/**\n * Visible link groups above the footer body (HTP-7240). Plain kit Links in\n * lists under an `h2` per group, so crawlers and screen readers read real\n * anchors with real names. Two groups side by side from md, each group's\n * links in two columns; one column of groups on phones.\n */\nfunction LinkSections({\n sections,\n label,\n footerId,\n}: {\n sections: PublicFooterLinkSection[];\n label?: string;\n footerId?: string;\n}) {\n const base = footerId ? `${footerId}-` : '';\n return (\n <nav\n aria-label={label}\n data-slot=\"link-sections\"\n className=\"ds:mb-[var(--spacing-lg)] ds:pb-[var(--spacing-lg)]\"\n >\n <div className=\"ds:mx-auto ds:grid ds:max-w-[64rem] ds:grid-cols-1 ds:gap-[var(--spacing-lg)] ds:md:grid-cols-2\">\n {sections.map((section) => (\n <div\n key={section.id}\n className=\"ds:flex ds:min-w-0 ds:flex-col ds:gap-[var(--spacing-sm)]\"\n >\n <h2\n id={`${base}link-section-${section.id}`}\n className=\"ds:m-0 ds:text-[length:var(--font-size-sm)] ds:font-semibold ds:text-[color:var(--foreground)]\"\n >\n {section.title}\n </h2>\n <ul className=\"ds:m-0 ds:grid ds:list-none ds:grid-cols-2 ds:gap-x-[var(--spacing-md)] ds:gap-y-[var(--spacing-xs)] ds:p-0\">\n {section.links.map((link) => (\n <li key={`${link.href}|${link.label}`} className=\"ds:min-w-0\">\n <Link href={safeHref(link.href)}>{link.label}</Link>\n </li>\n ))}\n </ul>\n {section.more ? (\n <div>\n <Link href={safeHref(section.more.href)}>\n {section.more.label}\n </Link>\n </div>\n ) : null}\n </div>\n ))}\n </div>\n </nav>\n );\n}\n\nfunction CopyrightLine({\n copyright,\n align = 'center',\n}: {\n copyright: string;\n align?: 'start' | 'center';\n}) {\n return (\n <p\n className={[\n 'ds:m-0 ds:text-[color:var(--muted-foreground)]',\n 'ds:text-[length:var(--font-size-sm)]',\n align === 'center' ? 'ds:text-center' : 'ds:text-start',\n ].join(' ')}\n >\n {copyright}\n </p>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* PublicFooter */\n/* ------------------------------------------------------------------ */\n\nexport const PublicFooter = forwardRef<PublicFooterHandle, PublicFooterProps>(\n function PublicFooter(\n {\n variant,\n marketingBaseUrl,\n legalUrlOverrides,\n linkGroups,\n linkSections,\n linkSectionsLabel,\n socials,\n logoSlot,\n extraNavSlot,\n trustBadgesSlot,\n showTagline = false,\n showCopyright = true,\n id,\n 'aria-label': ariaLabel,\n },\n ref,\n ) {\n const { t, i18n } = useTranslation('ui');\n\n const legalUrls = useMemo(\n () =>\n composeLegalUrls(i18n.language, marketingBaseUrl, legalUrlOverrides),\n [i18n.language, marketingBaseUrl, legalUrlOverrides],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n getVariant: () => variant,\n getLegalUrls: () => legalUrls,\n }),\n [variant, legalUrls],\n );\n\n const year = new Date().getFullYear();\n const copyright = showCopyright\n ? t('footer.copyright', {\n year,\n entity: ENTITY_NAME,\n vat: `${t('footer.vatLabel')} ${ENTITY_VAT_ID}`,\n })\n : undefined;\n const tagline = showTagline ? t('footer.tagline') : undefined;\n const landmarkLabel = ariaLabel ?? t('footer.nav.label');\n\n const labels = {\n privacy: t('footer.nav.privacy'),\n terms: t('footer.nav.terms'),\n contacts: t('footer.nav.contacts'),\n };\n\n const resolvedSocials = useMemo<PublicFooterSocial[]>(() => {\n if (socials !== undefined) return socials;\n return SOCIAL_NETWORKS.map((network) => ({ network }));\n }, [socials]);\n\n return (\n <footer\n id={id}\n role=\"contentinfo\"\n aria-label={landmarkLabel}\n data-component=\"public-footer\"\n data-component-id={id}\n data-variant={variant}\n className={rootVariants({ variant })}\n >\n {linkSections && linkSections.length > 0 ? (\n <LinkSections\n sections={linkSections}\n label={linkSectionsLabel}\n footerId={id}\n />\n ) : null}\n {variant === 'minimal' && (\n <MinimalBody\n legalUrls={legalUrls}\n labels={labels}\n copyright={copyright}\n trustBadgesSlot={trustBadgesSlot}\n extraNavSlot={extraNavSlot}\n />\n )}\n {variant === 'compact' && (\n <CompactBody\n legalUrls={legalUrls}\n labels={labels}\n copyright={copyright}\n tagline={tagline}\n socials={resolvedSocials}\n logoSlot={logoSlot}\n extraNavSlot={extraNavSlot}\n t={t}\n />\n )}\n {variant === 'full' && (\n <FullBody\n legalUrls={legalUrls}\n labels={labels}\n copyright={copyright}\n tagline={tagline}\n linkGroups={linkGroups}\n socials={resolvedSocials}\n logoSlot={logoSlot}\n extraNavSlot={extraNavSlot}\n trustBadgesSlot={trustBadgesSlot}\n t={t}\n />\n )}\n </footer>\n );\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Minimal */\n/* ------------------------------------------------------------------ */\n\n// The minimal row's links are one line of small text, 21px tall: under the\n// 24px WCAG 2.5.8 asks of a target. A transparent `::before` stretches the\n// hit area to 24px (--spacing-lg) in the block direction without moving or\n// resizing anything the eye sees, and to --min-target-size (48px) in the\n// accessible themes, through --accessible-target-floor. Once a link is as\n// tall as that the inset turns positive and the box sits inside the link,\n// which is harmless.\nconst MINIMAL_LINK_HIT_AREA =\n 'ds:relative ds:before:absolute ds:before:inset-x-0 ds:before:inset-y-[calc((var(--accessible-target-floor,var(--spacing-lg))-100%)/-2)] ds:before:content-[\"\"]';\n\n// A host control in `extraNavSlot` looks like the kit's own footer links\n// (`Link intent=\"subtle\"`): muted, no underline until hover, the kit focus\n// ring. These are descendant rules because the host, not the footer, renders\n// the control. Class names are written out in full so Tailwind can see them.\n// On a plain anchor they win over a default `Link`'s own colour.\n\n// Anchors get the look in every variant, but only plain anchors and default\n// or subtle kit Links: anything else the kit renders carries its own\n// `data-intent` (a `Button asChild intent=\"primary\"`, a primary `Link`) and\n// keeps its own colours.\nconst EXTRA_NAV_ANCHORS = [\n 'ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:text-muted-foreground ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:no-underline ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:underline-offset-4',\n 'ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:hover:text-foreground ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:hover:underline ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:active:opacity-80',\n 'ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:focus-visible:outline-[length:var(--focus-ring-width)] ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:focus-visible:outline-solid',\n 'ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:focus-visible:outline-ring ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:[&_a:is(:not([data-intent]),[data-intent=default],[data-intent=subtle]):not([data-component=button])]:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\n// Buttons are reset and restyled in `minimal` only. In `compact` and `full`\n// the slot has always rendered host buttons untouched, so a kit `Button` or a\n// Radix trigger there keeps its own chrome. In `minimal` a bare `<button>` is\n// reset first (no chrome, inherited font) and a kit `<Button intent=\"link\">`\n// is pulled to the same colour and size.\nconst EXTRA_NAV_BUTTONS = [\n 'ds:[&_button]:m-0 ds:[&_button]:inline ds:[&_button]:h-auto ds:[&_button]:min-h-0 ds:[&_button]:p-0',\n 'ds:[&_button]:cursor-pointer ds:[&_button]:appearance-none ds:[&_button]:border-0 ds:[&_button]:bg-transparent',\n 'ds:[&_button]:rounded-[var(--radius-xs)] ds:[&_button]:font-[inherit] ds:[&_button]:font-normal ds:[&_button]:text-[length:inherit]',\n 'ds:[&_button]:text-muted-foreground ds:[&_button]:no-underline ds:[&_button]:underline-offset-4',\n 'ds:[&_button]:hover:text-foreground ds:[&_button]:hover:underline ds:[&_button]:active:opacity-80',\n 'ds:[&_button]:focus-visible:outline-[length:var(--focus-ring-width)] ds:[&_button]:focus-visible:outline-solid',\n 'ds:[&_button]:focus-visible:outline-ring ds:[&_button]:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:[&_button]:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\nconst EXTRA_NAV_MINIMAL = `${EXTRA_NAV_ANCHORS} ${EXTRA_NAV_BUTTONS}`;\n\n// The same 24px (48px accessible) hit area as the legal links, for the\n// anchors and buttons a host puts in the minimal row.\nconst MINIMAL_EXTRA_HIT_AREA =\n 'ds:[&_:is(a,button)]:relative ds:[&_:is(a,button)]:before:absolute ds:[&_:is(a,button)]:before:inset-x-0 ds:[&_:is(a,button)]:before:inset-y-[calc((var(--accessible-target-floor,var(--spacing-lg))-100%)/-2)] ds:[&_:is(a,button)]:before:block ds:[&_:is(a,button)]:before:content-[\"\"]';\n\nfunction MinimalBody({\n legalUrls,\n labels,\n copyright,\n trustBadgesSlot,\n extraNavSlot,\n}: {\n legalUrls: ResolvedLegalUrls;\n labels: { privacy: string; terms: string; contacts: string };\n copyright?: string;\n trustBadgesSlot?: ReactNode;\n extraNavSlot?: ReactNode;\n}) {\n return (\n <div className=\"ds:@container/pfoot ds:w-full\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-center ds:gap-x-[var(--spacing-md)] ds:@[1024px]/pfoot:gap-x-[var(--spacing-sm)] ds:gap-y-[var(--spacing-sm)]\">\n {trustBadgesSlot && (\n <span\n data-slot=\"trust-badges\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)] ds:me-[var(--spacing-sm)]\"\n >\n {trustBadgesSlot}\n </span>\n )}\n <Link\n href={legalUrls.privacy}\n external\n externalIcon={false}\n intent=\"subtle\"\n className={MINIMAL_LINK_HIT_AREA}\n >\n {labels.privacy}\n </Link>\n <FooterDivider />\n <Link\n href={legalUrls.terms}\n external\n externalIcon={false}\n intent=\"subtle\"\n className={MINIMAL_LINK_HIT_AREA}\n >\n {labels.terms}\n </Link>\n {extraNavSlot ? (\n <>\n <FooterDivider />\n <span\n data-slot=\"extra-nav\"\n className={[\n 'ds:inline-flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-sm)]',\n EXTRA_NAV_MINIMAL,\n MINIMAL_EXTRA_HIT_AREA,\n ].join(' ')}\n >\n {extraNavSlot}\n </span>\n </>\n ) : null}\n {copyright ? (\n <>\n <FooterDivider />\n <span className=\"ds:basis-full ds:text-center ds:@[1024px]/pfoot:basis-auto\">\n {copyright}\n </span>\n </>\n ) : null}\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Compact */\n/* ------------------------------------------------------------------ */\n\n// Shared social-icon row — used by Compact and Full. Renders an icon\n// per enabled network; the parent decides where to drop it.\nfunction SocialIconList({\n socials,\n t,\n size,\n}: {\n socials: PublicFooterSocial[];\n t: TFunction;\n size: 'sm' | 'md';\n}) {\n if (socials.length === 0) return null;\n const iconClass = size === 'sm' ? 'ds:size-4' : 'ds:size-5';\n return (\n <ul\n data-slot=\"socials\"\n className=\"ds:list-none ds:m-0 ds:p-0 ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\"\n >\n {socials.map((s) => {\n const Icon = SOCIAL_ICONS[s.network];\n const href = s.href ?? DEFAULT_SOCIAL_URLS[s.network];\n const label = t(`footer.social.aria.${s.network}`);\n return (\n <li key={s.network}>\n <Link\n href={safeHref(href)}\n external\n externalIcon={false}\n intent=\"subtle\"\n aria-label={label}\n className=\"ds:inline-flex ds:items-center ds:justify-center ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]\"\n >\n <Icon\n aria-hidden=\"true\"\n className={iconClass}\n focusable=\"false\"\n />\n </Link>\n </li>\n );\n })}\n </ul>\n );\n}\n\nfunction CompactBody({\n legalUrls,\n labels,\n copyright,\n tagline,\n socials,\n logoSlot,\n extraNavSlot,\n t,\n}: {\n legalUrls: ResolvedLegalUrls;\n labels: { privacy: string; terms: string; contacts: string };\n copyright?: string;\n tagline?: string;\n socials: PublicFooterSocial[];\n logoSlot?: ReactNode;\n extraNavSlot?: ReactNode;\n t: TFunction;\n}) {\n // 0.30.5: compact polish — defaults to a social-icon row + (small,\n // muted) wordmark at the start of the link row. Consumers who want\n // the lean treatment can opt out via `socials={[]}` (kills the row)\n // and `logoSlot={<></>}` (kills the wordmark). The lean fallback is\n // still a useful surface for embedded widgets (the booking aside).\n return (\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-[var(--spacing-md)]\">\n {socials.length > 0 ? (\n <SocialIconList socials={socials} t={t} size=\"sm\" />\n ) : null}\n <div className=\"ds:@container/pfoot ds:w-full\">\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:justify-center ds:gap-x-[var(--spacing-md)] ds:@[1024px]/pfoot:gap-x-[var(--spacing-sm)] ds:gap-y-[var(--spacing-sm)]\">\n {logoSlot !== undefined ? (\n logoSlot !== null && logoSlot !== false && logoSlot !== '' ? (\n <>\n <span\n data-slot=\"compact-logo\"\n className=\"ds:inline-flex ds:items-center ds:opacity-70\"\n >\n {logoSlot}\n </span>\n <FooterDivider />\n </>\n ) : null\n ) : (\n // No consumer override — render the kit's default small\n // wordmark, muted so it reads as marker not headline.\n <>\n <span\n data-slot=\"compact-logo\"\n className=\"ds:inline-flex ds:items-center ds:opacity-70\"\n >\n <Logo variant=\"wordmark\" tone=\"auto\" aria-label=\"Alfadocs\" />\n </span>\n <FooterDivider />\n </>\n )}\n <Link\n href={legalUrls.privacy}\n external\n externalIcon={false}\n intent=\"subtle\"\n >\n {labels.privacy}\n </Link>\n <FooterDivider />\n <Link\n href={legalUrls.terms}\n external\n externalIcon={false}\n intent=\"subtle\"\n >\n {labels.terms}\n </Link>\n <FooterDivider />\n <Link\n href={legalUrls.contacts}\n external\n externalIcon={false}\n intent=\"subtle\"\n >\n {labels.contacts}\n </Link>\n {extraNavSlot && (\n <>\n <FooterDivider />\n <span data-slot=\"extra-nav\" className={EXTRA_NAV_ANCHORS}>\n {extraNavSlot}\n </span>\n </>\n )}\n </div>\n </div>\n {copyright ? <CopyrightLine copyright={copyright} /> : null}\n {tagline ? (\n <p\n data-slot=\"tagline\"\n className=\"ds:m-0 ds:text-center ds:text-[color:var(--muted-foreground)] ds:text-[length:var(--font-size-xs)] ds:italic\"\n >\n {tagline}\n </p>\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Full */\n/* ------------------------------------------------------------------ */\n\ntype TFunction = ReturnType<typeof useTranslation>['t'];\n\nfunction buildLegalColumn(\n legalUrls: ResolvedLegalUrls,\n labels: { privacy: string; terms: string; contacts: string },\n): PublicFooterLinkGroup {\n return {\n key: 'legal',\n links: [\n { href: legalUrls.privacy, label: labels.privacy, external: true },\n { href: legalUrls.terms, label: labels.terms, external: true },\n { href: legalUrls.contacts, label: labels.contacts, external: true },\n ],\n };\n}\n\nfunction FullBody({\n legalUrls,\n labels,\n copyright,\n tagline,\n linkGroups,\n socials,\n logoSlot,\n extraNavSlot,\n trustBadgesSlot,\n t,\n}: {\n legalUrls: ResolvedLegalUrls;\n labels: { privacy: string; terms: string; contacts: string };\n copyright?: string;\n tagline?: string;\n linkGroups?: PublicFooterLinkGroup[];\n socials: PublicFooterSocial[];\n logoSlot?: ReactNode;\n extraNavSlot?: ReactNode;\n trustBadgesSlot?: ReactNode;\n t: TFunction;\n}) {\n // The kit-built Legal column is always appended — Privacy / Terms /\n // Contacts must render in every variant per the legal brief.\n const columns: PublicFooterLinkGroup[] = [\n ...(linkGroups ?? []),\n buildLegalColumn(legalUrls, labels),\n ];\n\n const brand = (\n <div\n data-slot=\"brand\"\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-md)]\"\n >\n <div className=\"ds:inline-flex\">\n {logoSlot ?? (\n <Logo variant=\"wordmark\" tone=\"auto\" aria-label=\"Alfadocs\" />\n )}\n </div>\n <SocialIconList socials={socials} t={t} size=\"md\" />\n </div>\n );\n\n return (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xl)]\">\n {/* Top: brand block on inline-start + link columns to inline-end */}\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xl)] ds:lg:flex-row ds:lg:items-start ds:lg:gap-[var(--spacing-xl)]\">\n <div className=\"ds:lg:w-[15rem] ds:lg:shrink-0\">{brand}</div>\n\n <div className=\"ds:flex-1 ds:min-w-0\">\n {/* md+ — grid of columns */}\n <div\n className=\"ds:hidden ds:md:grid ds:md:grid-cols-2 ds:lg:grid-cols-4 ds:gap-[var(--spacing-lg)]\"\n data-slot=\"link-columns-grid\"\n data-columns={columns.length}\n >\n <FullColumnsGrid columns={columns} t={t} />\n </div>\n\n {/* below md — accordion */}\n <div className=\"ds:md:hidden\" data-slot=\"link-columns-accordion\">\n <Accordion type=\"multiple\">\n {columns.map((group, i) => (\n <AccordionItem\n key={`${i}-${group.key}`}\n value={`${i}-${group.key}`}\n >\n <AccordionTrigger>\n {t(`footer.group.${group.key}`, {\n defaultValue: group.key,\n })}\n </AccordionTrigger>\n <AccordionContent>\n <ul className=\"ds:list-none ds:m-0 ds:p-0 ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {group.links.map((link) => (\n <li key={`${group.key}-${link.href}-${link.label}`}>\n <Link\n href={safeHref(link.href)}\n external={link.external}\n externalIcon={false}\n intent=\"subtle\"\n >\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n </AccordionContent>\n </AccordionItem>\n ))}\n </Accordion>\n </div>\n </div>\n </div>\n\n <Separator orientation=\"horizontal\" />\n\n {/* Bottom strip: copyright inline-start, mini legal links inline-end\n on the same row. Stacks under sm. */}\n <div className=\"ds:@container/pfoot ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-sm)] ds:sm:flex-row ds:sm:items-center ds:sm:justify-between\">\n {copyright ? (\n <CopyrightLine copyright={copyright} align=\"start\" />\n ) : null}\n <div\n data-slot=\"bottom-legal\"\n className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-md)] ds:@[1024px]/pfoot:gap-x-[var(--spacing-sm)] ds:gap-y-[var(--spacing-sm)] ds:sm:justify-end\"\n >\n <Link\n href={legalUrls.privacy}\n external\n externalIcon={false}\n intent=\"subtle\"\n >\n {labels.privacy}\n </Link>\n <FooterDivider />\n <Link\n href={legalUrls.terms}\n external\n externalIcon={false}\n intent=\"subtle\"\n >\n {labels.terms}\n </Link>\n {(trustBadgesSlot || extraNavSlot) && (\n <>\n <FooterDivider />\n {trustBadgesSlot && (\n <span\n data-slot=\"trust-badges\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)]\"\n >\n {trustBadgesSlot}\n </span>\n )}\n {extraNavSlot && (\n <span\n data-slot=\"extra-nav\"\n className={`ds:inline-flex ds:items-center ${EXTRA_NAV_ANCHORS}`}\n >\n {extraNavSlot}\n </span>\n )}\n </>\n )}\n </div>\n </div>\n\n {tagline ? (\n <p\n data-slot=\"tagline\"\n className=\"ds:m-0 ds:text-center ds:text-[color:var(--muted-foreground)] ds:text-[length:var(--font-size-xs)] ds:italic\"\n >\n {tagline}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction FullColumnsGrid({\n columns,\n t,\n}: {\n columns: PublicFooterLinkGroup[];\n t: TFunction;\n}) {\n return (\n <>\n {columns.map((group, i) => (\n <section\n key={`${i}-${group.key}`}\n aria-labelledby={`public-footer-group-${i}-${group.key}`}\n >\n {/* h3 so the footer's column headings don't collide with the host\n page's section h2 outline. */}\n <h3\n id={`public-footer-group-${i}-${group.key}`}\n className=\"ds:m-0 ds:mb-[var(--spacing-sm)] ds:text-[color:var(--foreground)] ds:text-[length:var(--font-size-sm)] ds:font-medium\"\n >\n {t(`footer.group.${group.key}`, { defaultValue: group.key })}\n </h3>\n <ul className=\"ds:list-none ds:m-0 ds:p-0 ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {group.links.map((link) => (\n <li key={`${group.key}-${link.href}-${link.label}`}>\n <Link\n href={safeHref(link.href)}\n external={link.external}\n externalIcon={false}\n intent=\"subtle\"\n >\n {link.label}\n </Link>\n </li>\n ))}\n </ul>\n </section>\n ))}\n </>\n );\n}\n\nPublicFooter.displayName = 'PublicFooter';\n"],"names":["DEFAULT_MARKETING_BASE_URL","ITALIAN_SLUGS","SLUGS","HTTPS_PREFIX","normaliseBaseUrl","input","pickSlug","locale","key","overrides","override","_a","localeSlug","_b","composeLegalUrls","marketingBaseUrl","base","lang","SOCIAL_NETWORKS","DEFAULT_SOCIAL_URLS","SOCIAL_ICONS","SOCIAL_LINK_ICONS","ENTITY_NAME","ENTITY_VAT_ID","rootVariants","cva","SAFE_HREF_RE","safeHref","href","FooterDivider","jsx","Separator","LinkSections","sections","label","footerId","section","jsxs","link","Link","CopyrightLine","copyright","align","PublicFooter","forwardRef","variant","legalUrlOverrides","linkGroups","linkSections","linkSectionsLabel","socials","logoSlot","extraNavSlot","trustBadgesSlot","showTagline","showCopyright","id","ariaLabel","ref","t","i18n","useTranslation","legalUrls","useMemo","useImperativeHandle","year","tagline","landmarkLabel","labels","resolvedSocials","network","MinimalBody","CompactBody","FullBody","MINIMAL_LINK_HIT_AREA","EXTRA_NAV_ANCHORS","EXTRA_NAV_BUTTONS","EXTRA_NAV_MINIMAL","MINIMAL_EXTRA_HIT_AREA","Fragment","SocialIconList","size","iconClass","Icon","Logo","buildLegalColumn","columns","FullColumnsGrid","Accordion","group","i","AccordionItem","AccordionTrigger","AccordionContent"],"mappings":"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"}