@otl-core/next-footer 1.1.50 → 1.1.52
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.
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
|
-
import
|
|
2
|
+
import { parseMarkdownToHTML } from "../../lib/navigation.utils";
|
|
3
3
|
const BlockRenderer = ({ block }) => {
|
|
4
4
|
const { type, config } = block;
|
|
5
5
|
if (type === "markdown") {
|
|
6
6
|
const content = config.content || "";
|
|
7
|
-
return /* @__PURE__ */ jsx(
|
|
7
|
+
return /* @__PURE__ */ jsx(
|
|
8
|
+
"div",
|
|
9
|
+
{
|
|
10
|
+
className: "footer-block footer-markdown",
|
|
11
|
+
dangerouslySetInnerHTML: { __html: parseMarkdownToHTML(content) }
|
|
12
|
+
}
|
|
13
|
+
);
|
|
8
14
|
}
|
|
9
15
|
if (type === "link") {
|
|
10
16
|
const linkConfig = config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/blocks/block-renderer.tsx"],"sourcesContent":["/**\n * Block Renderer for Footer Components\n * Renders blocks within the footer context\n * This is a minimal implementation that supports the blocks commonly used in footers\n */\n\nimport { BlockInstance } from \"@otl-core/cms-types\";\nimport React from \"react\";\nimport
|
|
1
|
+
{"version":3,"sources":["../../../src/components/blocks/block-renderer.tsx"],"sourcesContent":["/**\n * Block Renderer for Footer Components\n * Renders blocks within the footer context\n * This is a minimal implementation that supports the blocks commonly used in footers\n */\n\nimport { BlockInstance } from \"@otl-core/cms-types\";\nimport React from \"react\";\nimport { parseMarkdownToHTML } from \"../../lib/navigation.utils\";\n\ninterface BlockRendererProps {\n block: BlockInstance;\n}\n\nexport const BlockRenderer: React.FC<BlockRendererProps> = ({ block }) => {\n const { type, config } = block;\n\n // Markdown block\n if (type === \"markdown\") {\n const content = (config as { content?: string }).content || \"\";\n return (\n <div\n className=\"footer-block footer-markdown\"\n dangerouslySetInnerHTML={{ __html: parseMarkdownToHTML(content) }}\n />\n );\n }\n\n // Link block\n if (type === \"link\") {\n const linkConfig = config as {\n text?: string;\n href?: string;\n external?: boolean;\n variant?: string;\n ariaLabel?: string;\n };\n\n const target = linkConfig.external ? \"_blank\" : undefined;\n const rel = linkConfig.external ? \"noopener noreferrer\" : undefined;\n\n const variantClasses = {\n default: \"footer-link hover:underline transition-colors\",\n underline: \"footer-link underline\",\n \"no-underline\": \"footer-link no-underline\",\n \"button-primary\":\n \"footer-link inline-flex items-center justify-center px-4 py-2 rounded-md font-medium transition-colors bg-primary text-primary-foreground hover:bg-primary/90\",\n \"button-secondary\":\n \"footer-link inline-flex items-center justify-center px-4 py-2 rounded-md font-medium transition-colors bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n \"button-outline\":\n \"footer-link inline-flex items-center justify-center px-4 py-2 rounded-md font-medium transition-colors border border-gray-200 text-surface-foreground hover:bg-accent hover:text-accent-foreground\",\n };\n\n const className =\n variantClasses[\n (linkConfig.variant as keyof typeof variantClasses) || \"default\"\n ];\n\n return (\n <a\n href={linkConfig.href}\n target={target}\n rel={rel}\n className={className}\n aria-label={linkConfig.ariaLabel || linkConfig.text}\n >\n {linkConfig.text}\n </a>\n );\n }\n\n // Button block (existing button rendering logic)\n if (type === \"button\") {\n const buttonConfig = config as {\n text?: string;\n url?: string;\n variant?: string;\n size?: string;\n newTab?: boolean;\n };\n\n const target = buttonConfig.newTab ? \"_blank\" : undefined;\n const rel = buttonConfig.newTab ? \"noopener noreferrer\" : undefined;\n\n return (\n <a\n href={buttonConfig.url}\n target={target}\n rel={rel}\n className=\"footer-block footer-button inline-flex items-center justify-center px-4 py-2 rounded-md transition-colors\"\n >\n {buttonConfig.text}\n </a>\n );\n }\n\n // Image block\n if (type === \"image\") {\n const imageConfig = config as {\n src?: string;\n alt?: string;\n width?: number;\n height?: number;\n };\n\n return (\n <div className=\"footer-block footer-image\">\n <img\n src={imageConfig.src}\n alt={imageConfig.alt || \"\"}\n width={imageConfig.width}\n height={imageConfig.height}\n />\n </div>\n );\n }\n\n // Divider block\n if (type === \"divider\") {\n return <hr className=\"footer-block footer-divider\" />;\n }\n\n // Fallback for unknown block types\n return null;\n};\n"],"mappings":"AAqBM;AAbN,SAAS,2BAA2B;AAM7B,MAAM,gBAA8C,CAAC,EAAE,MAAM,MAAM;AACxE,QAAM,EAAE,MAAM,OAAO,IAAI;AAGzB,MAAI,SAAS,YAAY;AACvB,UAAM,UAAW,OAAgC,WAAW;AAC5D,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,yBAAyB,EAAE,QAAQ,oBAAoB,OAAO,EAAE;AAAA;AAAA,IAClE;AAAA,EAEJ;AAGA,MAAI,SAAS,QAAQ;AACnB,UAAM,aAAa;AAQnB,UAAM,SAAS,WAAW,WAAW,WAAW;AAChD,UAAM,MAAM,WAAW,WAAW,wBAAwB;AAE1D,UAAM,iBAAiB;AAAA,MACrB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,kBACE;AAAA,MACF,oBACE;AAAA,MACF,kBACE;AAAA,IACJ;AAEA,UAAM,YACJ,eACG,WAAW,WAA2C,SACzD;AAEF,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,WAAW;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAY,WAAW,aAAa,WAAW;AAAA,QAE9C,qBAAW;AAAA;AAAA,IACd;AAAA,EAEJ;AAGA,MAAI,SAAS,UAAU;AACrB,UAAM,eAAe;AAQrB,UAAM,SAAS,aAAa,SAAS,WAAW;AAChD,UAAM,MAAM,aAAa,SAAS,wBAAwB;AAE1D,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,aAAa;AAAA,QACnB;AAAA,QACA;AAAA,QACA,WAAU;AAAA,QAET,uBAAa;AAAA;AAAA,IAChB;AAAA,EAEJ;AAGA,MAAI,SAAS,SAAS;AACpB,UAAM,cAAc;AAOpB,WACE,oBAAC,SAAI,WAAU,6BACb;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,YAAY;AAAA,QACjB,KAAK,YAAY,OAAO;AAAA,QACxB,OAAO,YAAY;AAAA,QACnB,QAAQ,YAAY;AAAA;AAAA,IACtB,GACF;AAAA,EAEJ;AAGA,MAAI,SAAS,WAAW;AACtB,WAAO,oBAAC,QAAG,WAAU,+BAA8B;AAAA,EACrD;AAGA,SAAO;AACT;","names":[]}
|
|
@@ -222,8 +222,22 @@ function getLocalizedString(value, site) {
|
|
|
222
222
|
}
|
|
223
223
|
return "";
|
|
224
224
|
}
|
|
225
|
+
function preprocessEmphasis(text) {
|
|
226
|
+
const codes = [];
|
|
227
|
+
let s = text.replace(/`[^`]+`/g, (m) => {
|
|
228
|
+
codes.push(m);
|
|
229
|
+
return `\0C${codes.length - 1}\0`;
|
|
230
|
+
});
|
|
231
|
+
s = s.replace(/\*\*\*(.+?)\*\*\*/g, "<strong><em>$1</em></strong>");
|
|
232
|
+
s = s.replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>");
|
|
233
|
+
s = s.replace(/(?<![\\*])\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g, "<em>$1</em>");
|
|
234
|
+
s = s.replace(/\x00C(\d+)\x00/g, (_, i) => codes[parseInt(i)]);
|
|
235
|
+
return s;
|
|
236
|
+
}
|
|
225
237
|
function parseMarkdownToHTML(markdown) {
|
|
226
|
-
const html = marked.parse(markdown, {
|
|
238
|
+
const html = marked.parse(preprocessEmphasis(markdown), {
|
|
239
|
+
async: false
|
|
240
|
+
});
|
|
227
241
|
return html.replace(/<h1>/g, '<div class="h1">').replace(/<\/h1>/g, "</div>").replace(/<h2>/g, '<div class="h2">').replace(/<\/h2>/g, "</div>").replace(/<h3>/g, '<div class="h3">').replace(/<\/h3>/g, "</div>").replace(/<h4>/g, '<div class="h4">').replace(/<\/h4>/g, "</div>").replace(/<h5>/g, '<div class="h5">').replace(/<\/h5>/g, "</div>").replace(/<h6>/g, '<div class="h6">').replace(/<\/h6>/g, "</div>");
|
|
228
242
|
}
|
|
229
243
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/navigation.utils.ts"],"sourcesContent":["import {\n Site,\n HeaderConfig,\n HeaderDropdownButtonConfig,\n HeaderDropdownContent,\n HeaderDropdownNavigationItemConfig,\n HeaderNavigationItem,\n HeaderNavigationItemButtonConfig,\n HeaderNavigationItemDropdownConfig,\n HeaderNavigationItemLinkConfig,\n HeaderSection,\n LocalizedString,\n ShadowConfig,\n} from \"@otl-core/cms-types\";\nimport { marked } from \"marked\";\nimport {\n generateDesktopDropdownAnimations,\n generateMobileMenuAnimations,\n generateResponsiveSpacingCSS,\n generateScrollbarStyles,\n generateToggleIconAnimations,\n minifyCSS,\n} from \"@otl-core/style-utils\";\n\n/**\n * Convert ShadowConfig to CSS box-shadow string\n */\nexport function shadowConfigToCSS(shadow: ShadowConfig): string {\n const { offsetX, offsetY, blurRadius, spreadRadius, color, inset } = shadow;\n const parts = [offsetX, offsetY, blurRadius, spreadRadius, color];\n if (inset) {\n return `inset ${parts.join(\" \")}`;\n }\n return parts.join(\" \");\n}\n\nexport function calculateNavigationWidth(\n sections: HeaderSection[],\n site?: Site,\n): number {\n let totalWidth = 150;\n\n for (const section of sections) {\n for (const item of section?.items || []) {\n if (item.type === \"logo\") continue;\n\n const label =\n typeof item.label === \"string\"\n ? item.label\n : getLocalizedString(item.label, site) || \"\";\n const labelLength = label.length;\n\n if (item.type === \"button\") {\n totalWidth += labelLength * 8 + 48;\n } else if (item.type === \"link\" || item.type === \"dropdown\") {\n totalWidth += labelLength * 8 + 24;\n }\n }\n }\n\n return totalWidth;\n}\n\nexport type Breakpoint = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | null;\n\nexport function getBreakpointForWidth(estimatedWidth: number): Breakpoint {\n const MAX_USABLE_WIDTH = 1400;\n\n if (estimatedWidth > MAX_USABLE_WIDTH) return null;\n\n if (estimatedWidth <= 640) return \"sm\";\n if (estimatedWidth <= 768) return \"md\";\n if (estimatedWidth <= 1024) return \"lg\";\n if (estimatedWidth <= 1280) return \"xl\";\n return \"2xl\";\n}\n\nexport function generateNavigationCSS(\n id: string,\n navigation: HeaderConfig,\n resolvedColors: Record<string, string | undefined>,\n dropdownIds: string[] = [],\n): string {\n const cssBlocks: (string | null)[] = [];\n\n if (navigation.style) {\n const headerCSS = generateResponsiveSpacingCSS(`header-${id}`, {\n margin: navigation.style.layout?.margin,\n });\n if (headerCSS) cssBlocks.push(headerCSS);\n }\n\n if (navigation.style) {\n const navbarCSS = generateResponsiveSpacingCSS(`navbar-${id}`, {\n border: navigation.style.border,\n padding: navigation.style.layout?.padding,\n gap: navigation.style.layout?.sectionGap,\n shadow: navigation.style.shadow,\n });\n if (navbarCSS) cssBlocks.push(navbarCSS);\n }\n\n if (navigation.style && dropdownIds.length > 0) {\n dropdownIds.forEach((dropdownId) => {\n const dropdownCSS = generateResponsiveSpacingCSS(\n `navigation-dropdown-${dropdownId}`,\n {\n padding: navigation.style?.dropdown?.padding,\n border: navigation.style?.dropdown?.border,\n },\n );\n if (dropdownCSS) cssBlocks.push(dropdownCSS);\n\n const dropdownContentCSS = generateResponsiveSpacingCSS(\n `dropdown-content-${dropdownId}`,\n {\n gap: navigation.style?.dropdown?.sectionGap,\n },\n );\n if (dropdownContentCSS) cssBlocks.push(dropdownContentCSS);\n });\n }\n\n if (resolvedColors.burgerButtonBackgroundHover) {\n cssBlocks.push(\n `.mobile-menu-toggle-${id}:hover{background-color:${resolvedColors.burgerButtonBackgroundHover}!important}`,\n );\n }\n\n if (\n resolvedColors.dropdownMenuLinkHoverColor ||\n resolvedColors.dropdownMenuLinkHoverBackground\n ) {\n const hoverStyles: string[] = [];\n if (resolvedColors.dropdownMenuLinkHoverBackground) {\n hoverStyles.push(\n `background-color:${resolvedColors.dropdownMenuLinkHoverBackground}!important`,\n );\n }\n if (resolvedColors.dropdownMenuLinkHoverColor) {\n hoverStyles.push(\n `color:${resolvedColors.dropdownMenuLinkHoverColor}!important`,\n );\n }\n cssBlocks.push(\n `#mobile-menu-dropdown-${id} a:hover{${hoverStyles.join(\";\")}}`,\n );\n }\n\n cssBlocks.push(...generateToggleIconAnimations());\n cssBlocks.push(...generateMobileMenuAnimations());\n cssBlocks.push(...generateScrollbarStyles());\n cssBlocks.push(...generateDesktopDropdownAnimations());\n\n return minifyCSS(cssBlocks.filter(Boolean).join(\"\"));\n}\n\nexport function sectionsToDropdownContent(\n sections: HeaderSection[],\n): HeaderDropdownContent[] {\n const result: HeaderDropdownContent[] = [];\n\n sections.forEach((section: HeaderSection) => {\n const items = section?.items?.filter((item: HeaderNavigationItem) => {\n if (item.type === \"logo\") return false;\n const vis =\n item.visibility ||\n ((item as unknown as Record<string, unknown>).collapse === false\n ? \"navbar-only\"\n : undefined);\n if (vis === \"navbar-only\") return false;\n return true;\n });\n\n if (items?.length === 0) return;\n\n items?.forEach((item: HeaderNavigationItem) => {\n if (item.type === \"link\") {\n const config = item.config as HeaderNavigationItemLinkConfig;\n const navConfig: HeaderDropdownNavigationItemConfig = {\n label: item.label || \"\",\n href: config.href,\n icon: config.icon,\n external: config.external,\n };\n result.push({\n id: item.id,\n type: \"navigation-item\",\n config: navConfig,\n });\n } else if (item.type === \"button\") {\n const config = item.config as HeaderNavigationItemButtonConfig;\n const btnConfig: HeaderDropdownButtonConfig = {\n label: item.label || \"\",\n href: config.href,\n icon: config.icon,\n external: config.external,\n variant: config.variant,\n size: config.size,\n };\n result.push({\n id: item.id,\n type: \"button\",\n config: btnConfig,\n });\n } else if (item.type === \"dropdown\") {\n const config = item.config as HeaderNavigationItemDropdownConfig;\n result.push({\n id: item.id,\n type: \"dropdown\",\n label: item.label || \"\",\n config,\n });\n }\n });\n\n if (sections.indexOf(section) < sections.length - 1) {\n result.push({\n id: `divider-${section.id}`,\n type: \"divider\",\n config: {},\n });\n }\n });\n\n return result;\n}\n\nexport function resolveDropdownColor(\n colorRef: { type: string; value: string } | undefined,\n resolvedColors: Record<string, string | undefined>,\n fallback?: string,\n): string | undefined {\n if (!colorRef) return fallback;\n\n if (colorRef.type === \"custom\") {\n return colorRef.value;\n }\n\n if (colorRef.type === \"theme\") {\n return resolvedColors[colorRef.value] || fallback;\n }\n\n if (colorRef.type === \"variable\") {\n // For variables, construct the CSS variable reference\n return `var(--color-${colorRef.value})`;\n }\n\n return fallback;\n}\n\nfunction getBrowserPreferredLocales(options = {}) {\n const defaultOptions = {\n languageCodeOnly: false,\n };\n const opt = {\n ...defaultOptions,\n ...options,\n };\n const browserLocales =\n navigator.languages === undefined\n ? [navigator.language]\n : navigator.languages;\n if (!browserLocales) {\n return undefined;\n }\n return browserLocales.map((locale) => {\n const trimmedLocale = locale.trim();\n return opt.languageCodeOnly ? trimmedLocale.split(/-|_/)[0] : trimmedLocale;\n });\n}\n\nexport function getLocalizedString(\n value: string | LocalizedString | null | undefined,\n site?: Site,\n): string {\n // Handle null/undefined\n if (value === null || value === undefined) return \"\";\n\n // If it's already a string, return it\n if (typeof value === \"string\") return value;\n\n // Get the preferred locale from options or use default fallback\n const preferredLocale = getBrowserPreferredLocales() || [\n site?.default_locale || \"en\",\n ];\n\n // Try preferred locale\n for (const locale of preferredLocale) {\n if (locale in value && value[locale]) {\n return value[locale];\n }\n }\n\n // Try default locale\n if (\n site?.default_locale &&\n site.default_locale in value &&\n value[site.default_locale]\n ) {\n return value[site.default_locale];\n }\n\n // Try 'en' as fallback\n if (\"en\" in value && value.en) {\n return value.en;\n }\n\n // Try any supported locale\n if (site?.supported_locales) {\n for (const locale of site.supported_locales) {\n if (locale in value && value[locale]) {\n return value[locale];\n }\n }\n }\n\n // Return first available value as last resort\n const keys = Object.keys(value);\n if (keys.length > 0 && value[keys[0]]) {\n return value[keys[0]];\n }\n\n return \"\";\n}\n\nexport function parseMarkdownToHTML(markdown: string): string {\n // Parse markdown to HTML\n const html = marked.parse(markdown, { async: false }) as string;\n\n // Transform h1-h6 elements to divs with corresponding classes\n return html\n .replace(/<h1>/g, '<div class=\"h1\">')\n .replace(/<\\/h1>/g, \"</div>\")\n .replace(/<h2>/g, '<div class=\"h2\">')\n .replace(/<\\/h2>/g, \"</div>\")\n .replace(/<h3>/g, '<div class=\"h3\">')\n .replace(/<\\/h3>/g, \"</div>\")\n .replace(/<h4>/g, '<div class=\"h4\">')\n .replace(/<\\/h4>/g, \"</div>\")\n .replace(/<h5>/g, '<div class=\"h5\">')\n .replace(/<\\/h5>/g, \"</div>\")\n .replace(/<h6>/g, '<div class=\"h6\">')\n .replace(/<\\/h6>/g, \"</div>\");\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/navigation.utils.ts"],"sourcesContent":["import {\n Site,\n HeaderConfig,\n HeaderDropdownButtonConfig,\n HeaderDropdownContent,\n HeaderDropdownNavigationItemConfig,\n HeaderNavigationItem,\n HeaderNavigationItemButtonConfig,\n HeaderNavigationItemDropdownConfig,\n HeaderNavigationItemLinkConfig,\n HeaderSection,\n LocalizedString,\n ShadowConfig,\n} from \"@otl-core/cms-types\";\nimport { marked } from \"marked\";\nimport {\n generateDesktopDropdownAnimations,\n generateMobileMenuAnimations,\n generateResponsiveSpacingCSS,\n generateScrollbarStyles,\n generateToggleIconAnimations,\n minifyCSS,\n} from \"@otl-core/style-utils\";\n\n/**\n * Convert ShadowConfig to CSS box-shadow string\n */\nexport function shadowConfigToCSS(shadow: ShadowConfig): string {\n const { offsetX, offsetY, blurRadius, spreadRadius, color, inset } = shadow;\n const parts = [offsetX, offsetY, blurRadius, spreadRadius, color];\n if (inset) {\n return `inset ${parts.join(\" \")}`;\n }\n return parts.join(\" \");\n}\n\nexport function calculateNavigationWidth(\n sections: HeaderSection[],\n site?: Site,\n): number {\n let totalWidth = 150;\n\n for (const section of sections) {\n for (const item of section?.items || []) {\n if (item.type === \"logo\") continue;\n\n const label =\n typeof item.label === \"string\"\n ? item.label\n : getLocalizedString(item.label, site) || \"\";\n const labelLength = label.length;\n\n if (item.type === \"button\") {\n totalWidth += labelLength * 8 + 48;\n } else if (item.type === \"link\" || item.type === \"dropdown\") {\n totalWidth += labelLength * 8 + 24;\n }\n }\n }\n\n return totalWidth;\n}\n\nexport type Breakpoint = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | null;\n\nexport function getBreakpointForWidth(estimatedWidth: number): Breakpoint {\n const MAX_USABLE_WIDTH = 1400;\n\n if (estimatedWidth > MAX_USABLE_WIDTH) return null;\n\n if (estimatedWidth <= 640) return \"sm\";\n if (estimatedWidth <= 768) return \"md\";\n if (estimatedWidth <= 1024) return \"lg\";\n if (estimatedWidth <= 1280) return \"xl\";\n return \"2xl\";\n}\n\nexport function generateNavigationCSS(\n id: string,\n navigation: HeaderConfig,\n resolvedColors: Record<string, string | undefined>,\n dropdownIds: string[] = [],\n): string {\n const cssBlocks: (string | null)[] = [];\n\n if (navigation.style) {\n const headerCSS = generateResponsiveSpacingCSS(`header-${id}`, {\n margin: navigation.style.layout?.margin,\n });\n if (headerCSS) cssBlocks.push(headerCSS);\n }\n\n if (navigation.style) {\n const navbarCSS = generateResponsiveSpacingCSS(`navbar-${id}`, {\n border: navigation.style.border,\n padding: navigation.style.layout?.padding,\n gap: navigation.style.layout?.sectionGap,\n shadow: navigation.style.shadow,\n });\n if (navbarCSS) cssBlocks.push(navbarCSS);\n }\n\n if (navigation.style && dropdownIds.length > 0) {\n dropdownIds.forEach((dropdownId) => {\n const dropdownCSS = generateResponsiveSpacingCSS(\n `navigation-dropdown-${dropdownId}`,\n {\n padding: navigation.style?.dropdown?.padding,\n border: navigation.style?.dropdown?.border,\n },\n );\n if (dropdownCSS) cssBlocks.push(dropdownCSS);\n\n const dropdownContentCSS = generateResponsiveSpacingCSS(\n `dropdown-content-${dropdownId}`,\n {\n gap: navigation.style?.dropdown?.sectionGap,\n },\n );\n if (dropdownContentCSS) cssBlocks.push(dropdownContentCSS);\n });\n }\n\n if (resolvedColors.burgerButtonBackgroundHover) {\n cssBlocks.push(\n `.mobile-menu-toggle-${id}:hover{background-color:${resolvedColors.burgerButtonBackgroundHover}!important}`,\n );\n }\n\n if (\n resolvedColors.dropdownMenuLinkHoverColor ||\n resolvedColors.dropdownMenuLinkHoverBackground\n ) {\n const hoverStyles: string[] = [];\n if (resolvedColors.dropdownMenuLinkHoverBackground) {\n hoverStyles.push(\n `background-color:${resolvedColors.dropdownMenuLinkHoverBackground}!important`,\n );\n }\n if (resolvedColors.dropdownMenuLinkHoverColor) {\n hoverStyles.push(\n `color:${resolvedColors.dropdownMenuLinkHoverColor}!important`,\n );\n }\n cssBlocks.push(\n `#mobile-menu-dropdown-${id} a:hover{${hoverStyles.join(\";\")}}`,\n );\n }\n\n cssBlocks.push(...generateToggleIconAnimations());\n cssBlocks.push(...generateMobileMenuAnimations());\n cssBlocks.push(...generateScrollbarStyles());\n cssBlocks.push(...generateDesktopDropdownAnimations());\n\n return minifyCSS(cssBlocks.filter(Boolean).join(\"\"));\n}\n\nexport function sectionsToDropdownContent(\n sections: HeaderSection[],\n): HeaderDropdownContent[] {\n const result: HeaderDropdownContent[] = [];\n\n sections.forEach((section: HeaderSection) => {\n const items = section?.items?.filter((item: HeaderNavigationItem) => {\n if (item.type === \"logo\") return false;\n const vis =\n item.visibility ||\n ((item as unknown as Record<string, unknown>).collapse === false\n ? \"navbar-only\"\n : undefined);\n if (vis === \"navbar-only\") return false;\n return true;\n });\n\n if (items?.length === 0) return;\n\n items?.forEach((item: HeaderNavigationItem) => {\n if (item.type === \"link\") {\n const config = item.config as HeaderNavigationItemLinkConfig;\n const navConfig: HeaderDropdownNavigationItemConfig = {\n label: item.label || \"\",\n href: config.href,\n icon: config.icon,\n external: config.external,\n };\n result.push({\n id: item.id,\n type: \"navigation-item\",\n config: navConfig,\n });\n } else if (item.type === \"button\") {\n const config = item.config as HeaderNavigationItemButtonConfig;\n const btnConfig: HeaderDropdownButtonConfig = {\n label: item.label || \"\",\n href: config.href,\n icon: config.icon,\n external: config.external,\n variant: config.variant,\n size: config.size,\n };\n result.push({\n id: item.id,\n type: \"button\",\n config: btnConfig,\n });\n } else if (item.type === \"dropdown\") {\n const config = item.config as HeaderNavigationItemDropdownConfig;\n result.push({\n id: item.id,\n type: \"dropdown\",\n label: item.label || \"\",\n config,\n });\n }\n });\n\n if (sections.indexOf(section) < sections.length - 1) {\n result.push({\n id: `divider-${section.id}`,\n type: \"divider\",\n config: {},\n });\n }\n });\n\n return result;\n}\n\nexport function resolveDropdownColor(\n colorRef: { type: string; value: string } | undefined,\n resolvedColors: Record<string, string | undefined>,\n fallback?: string,\n): string | undefined {\n if (!colorRef) return fallback;\n\n if (colorRef.type === \"custom\") {\n return colorRef.value;\n }\n\n if (colorRef.type === \"theme\") {\n return resolvedColors[colorRef.value] || fallback;\n }\n\n if (colorRef.type === \"variable\") {\n // For variables, construct the CSS variable reference\n return `var(--color-${colorRef.value})`;\n }\n\n return fallback;\n}\n\nfunction getBrowserPreferredLocales(options = {}) {\n const defaultOptions = {\n languageCodeOnly: false,\n };\n const opt = {\n ...defaultOptions,\n ...options,\n };\n const browserLocales =\n navigator.languages === undefined\n ? [navigator.language]\n : navigator.languages;\n if (!browserLocales) {\n return undefined;\n }\n return browserLocales.map((locale) => {\n const trimmedLocale = locale.trim();\n return opt.languageCodeOnly ? trimmedLocale.split(/-|_/)[0] : trimmedLocale;\n });\n}\n\nexport function getLocalizedString(\n value: string | LocalizedString | null | undefined,\n site?: Site,\n): string {\n // Handle null/undefined\n if (value === null || value === undefined) return \"\";\n\n // If it's already a string, return it\n if (typeof value === \"string\") return value;\n\n // Get the preferred locale from options or use default fallback\n const preferredLocale = getBrowserPreferredLocales() || [\n site?.default_locale || \"en\",\n ];\n\n // Try preferred locale\n for (const locale of preferredLocale) {\n if (locale in value && value[locale]) {\n return value[locale];\n }\n }\n\n // Try default locale\n if (\n site?.default_locale &&\n site.default_locale in value &&\n value[site.default_locale]\n ) {\n return value[site.default_locale];\n }\n\n // Try 'en' as fallback\n if (\"en\" in value && value.en) {\n return value.en;\n }\n\n // Try any supported locale\n if (site?.supported_locales) {\n for (const locale of site.supported_locales) {\n if (locale in value && value[locale]) {\n return value[locale];\n }\n }\n }\n\n // Return first available value as last resort\n const keys = Object.keys(value);\n if (keys.length > 0 && value[keys[0]]) {\n return value[keys[0]];\n }\n\n return \"\";\n}\n\n/**\n * Pre-processes emphasis markers into raw HTML tags before the CommonMark\n * parser sees them, bypassing delimiter-run edge cases like\n * `**krippner:**digital`.\n */\nfunction preprocessEmphasis(text: string): string {\n const codes: string[] = [];\n let s = text.replace(/`[^`]+`/g, (m) => {\n codes.push(m);\n return `\\x00C${codes.length - 1}\\x00`;\n });\n s = s.replace(/\\*\\*\\*(.+?)\\*\\*\\*/g, \"<strong><em>$1</em></strong>\");\n s = s.replace(/\\*\\*(.+?)\\*\\*/g, \"<strong>$1</strong>\");\n s = s.replace(/(?<![\\\\*])\\*(?!\\*)(.+?)(?<!\\*)\\*(?!\\*)/g, \"<em>$1</em>\");\n s = s.replace(/\\x00C(\\d+)\\x00/g, (_, i) => codes[parseInt(i)]);\n return s;\n}\n\nexport function parseMarkdownToHTML(markdown: string): string {\n // Pre-process emphasis, then parse markdown to HTML\n const html = marked.parse(preprocessEmphasis(markdown), {\n async: false,\n }) as string;\n\n // Transform h1-h6 elements to divs with corresponding classes\n return html\n .replace(/<h1>/g, '<div class=\"h1\">')\n .replace(/<\\/h1>/g, \"</div>\")\n .replace(/<h2>/g, '<div class=\"h2\">')\n .replace(/<\\/h2>/g, \"</div>\")\n .replace(/<h3>/g, '<div class=\"h3\">')\n .replace(/<\\/h3>/g, \"</div>\")\n .replace(/<h4>/g, '<div class=\"h4\">')\n .replace(/<\\/h4>/g, \"</div>\")\n .replace(/<h5>/g, '<div class=\"h5\">')\n .replace(/<\\/h5>/g, \"</div>\")\n .replace(/<h6>/g, '<div class=\"h6\">')\n .replace(/<\\/h6>/g, \"</div>\");\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@otl-core/next-footer",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.52",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Reusable footer components for OTL CMS",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -44,19 +44,18 @@
|
|
|
44
44
|
"next": ">=14.0.0",
|
|
45
45
|
"react": ">=18.0.0",
|
|
46
46
|
"react-dom": ">=18.0.0",
|
|
47
|
-
"react-markdown": "^10.1.0",
|
|
48
47
|
"react-transition-group": "^4.4.5",
|
|
49
48
|
"tailwind-merge": "^3.3.1"
|
|
50
49
|
},
|
|
51
50
|
"dependencies": {
|
|
52
|
-
"@otl-core/block-registry": "^1.1.
|
|
53
|
-
"@otl-core/cms-utils": "^1.1.
|
|
54
|
-
"@otl-core/style-utils": "^1.1.
|
|
51
|
+
"@otl-core/block-registry": "^1.1.52",
|
|
52
|
+
"@otl-core/cms-utils": "^1.1.52",
|
|
53
|
+
"@otl-core/style-utils": "^1.1.52"
|
|
55
54
|
},
|
|
56
55
|
"devDependencies": {
|
|
57
56
|
"@eslint/eslintrc": "^3.3.1",
|
|
58
|
-
"@otl-core/cms-types": "^1.1.
|
|
59
|
-
"@otl-core/cms-utils": "^1.1.
|
|
57
|
+
"@otl-core/cms-types": "^1.1.52",
|
|
58
|
+
"@otl-core/cms-utils": "^1.1.52",
|
|
60
59
|
"@radix-ui/react-focus-scope": "^1.1.7",
|
|
61
60
|
"@radix-ui/react-slot": "^1.2.3",
|
|
62
61
|
"@testing-library/jest-dom": "^6.9.1",
|
|
@@ -76,7 +75,6 @@
|
|
|
76
75
|
"eslint-plugin-react-hooks": "^6.1.1",
|
|
77
76
|
"jsdom": "^25.0.0",
|
|
78
77
|
"marked": ">=16.4.0",
|
|
79
|
-
"react-markdown": "^10.1.0",
|
|
80
78
|
"react-transition-group": "^4.4.5",
|
|
81
79
|
"tailwind-merge": "^3.3.1",
|
|
82
80
|
"tsup": "^8.0.0",
|