@tenphi/renderer 0.21.2 → 0.22.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.
- package/dist/client/code-copy.js +1 -1
- package/dist/client/heading-links.js +1 -1
- package/dist/client/page-copy.js +1 -1
- package/dist/components/Card.styles.js +6 -3
- package/dist/components/Document.styles.js +4 -3
- package/dist/components/HeaderFrame.styles.js +2 -1
- package/dist/components/Hero.styles.js +3 -2
- package/dist/components/MarkdownContent.styles.js +3 -1
- package/dist/components/MobileTableOfContents.styles.js +3 -2
- package/dist/components/PackageVersion.styles.js +1 -1
- package/dist/components/PageActions.styles.js +1 -1
- package/dist/components/Preview.styles.js +3 -1
- package/dist/components/Sidebar.styles.js +11 -7
- package/dist/components/SidebarList.astro +1 -5
- package/dist/components/SkipLink.styles.js +3 -2
- package/dist/components/TableOfContents.styles.js +2 -1
- package/dist/components/Tabs.styles.js +2 -1
- package/dist/components/ThemeSelect.styles.js +5 -3
- package/dist/components/TopNavigation.styles.js +3 -2
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/localization.d.ts +2 -42
- package/dist/localization.d.ts.map +1 -1
- package/dist/localization.js +9 -89
- package/dist/localization.js.map +1 -1
- package/dist/messages-BqBGDIoP.js +143 -0
- package/dist/messages-BqBGDIoP.js.map +1 -0
- package/dist/messages-ClTf2nFf.d.ts +52 -0
- package/dist/messages-ClTf2nFf.d.ts.map +1 -0
- package/dist/{messages-B_3xUzUb.js → messages-bS8G9Pj8.js} +2 -2
- package/dist/{messages-B_3xUzUb.js.map → messages-bS8G9Pj8.js.map} +1 -1
- package/dist/navigation.d.ts +3 -1
- package/dist/navigation.d.ts.map +1 -1
- package/dist/navigation.js +30 -9
- package/dist/navigation.js.map +1 -1
- package/dist/route-context.d.ts +2 -10
- package/dist/route-context.d.ts.map +1 -1
- package/dist/route-context.js +4 -2
- package/dist/route-context.js.map +1 -1
- package/dist/ui.d.ts +2 -6
- package/dist/ui.js +1 -58
- package/package.json +5 -5
- package/dist/ui.d.ts.map +0 -1
- package/dist/ui.js.map +0 -1
package/dist/navigation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.js","names":[],"sources":["../src/navigation.ts"],"sourcesContent":["import type {\n DocsConfig,\n DocsRoute,\n NavigationItem,\n NavigationTab,\n} from \"@tenphi/docs\";\n\nexport interface ResolvedNavigationTab extends NavigationTab {\n /** Index of the tab's resolved sidebar group. */\n sidebarGroup?: number;\n}\n\nexport interface ResolvedNavigationLayout {\n fallbackSidebarGroup?: number;\n items?: NavigationItem[];\n tabs: ResolvedNavigationTab[];\n sectioned: boolean;\n}\n\nexport type PageSidebarItem =\n | { label: string; link: string; attrs?: Record<string, string> }\n | { label: string; items: PageSidebarItem[] };\n\nexport function resolveNavigationLayout(\n navigation: DocsConfig[\"navigation\"],\n): ResolvedNavigationLayout {\n const items = Array.isArray(navigation) ? navigation : navigation?.items;\n const configuredTabs = Array.isArray(navigation)\n ? []\n : (navigation?.tabs ?? []);\n const fallbackSidebarGroup = items !== undefined ? 0 : undefined;\n let sidebarGroup = fallbackSidebarGroup === undefined ? 0 : 1;\n const tabs = configuredTabs.map((tab) => ({\n ...tab,\n ...(tab.items !== undefined ? { sidebarGroup: sidebarGroup++ } : {}),\n }));\n\n return {\n ...(fallbackSidebarGroup !== undefined ? { fallbackSidebarGroup } : {}),\n ...(items !== undefined ? { items } : {}),\n tabs,\n sectioned: tabs.some((tab) => tab.sidebarGroup !== undefined),\n };\n}\n\nexport function navigationItemsForPath(\n layout: ResolvedNavigationLayout,\n pathname: string,\n): NavigationItem[] | undefined {\n const active = activeNavigationTab(layout.tabs, pathname);\n return active >= 0 && layout.tabs[active]?.items !== undefined\n ? layout.tabs[active].items\n : layout.items;\n}\n\n/** Build a sidebar for graph-backed custom pages. */\nexport function pageSidebar(\n layout: ResolvedNavigationLayout,\n routes: DocsRoute[],\n): PageSidebarItem[] {\n const visibleRoutes = routes\n .filter((route) => route.sidebar !== false && route.discoverable !== false)\n .toSorted((left, right) => {\n const leftOrder =\n typeof left.sidebar === \"object\" ? left.sidebar.order : undefined;\n const rightOrder =\n typeof right.sidebar === \"object\" ? right.sidebar.order : undefined;\n return (\n (leftOrder ?? Number.POSITIVE_INFINITY) -\n (rightOrder ?? Number.POSITIVE_INFINITY) ||\n left.route.localeCompare(right.route)\n );\n });\n const titles = new Map(\n visibleRoutes.map((route) => [\n route.route,\n typeof route.sidebar === \"object\" && route.sidebar.label\n ? route.sidebar.label\n : route.title,\n ]),\n );\n const labelFor = (route: string) =>\n titles.get(normalizeNavigationPath(route)) ??\n normalizeNavigationPath(route).split(\"/\").filter(Boolean).at(-1) ??\n \"Home\";\n const generatedItems = (directory: string) => {\n const root = normalizeNavigationPath(directory);\n return groupedRoutes(\n visibleRoutes.filter(\n (route) =>\n root === \"/\" ||\n route.route === root ||\n route.route.startsWith(`${root}/`),\n ),\n );\n };\n const convert = (item: NavigationItem): PageSidebarItem => {\n if (typeof item === \"string\") {\n return { label: labelFor(item), link: item };\n }\n if (\"items\" in item || \"autogenerate\" in item) {\n let children =\n \"items\" in item\n ? item.items.map(convert)\n : generatedItems(item.autogenerate.directory);\n if (item.link) {\n children = withoutRoute(children, item.link);\n // Keep the parent in route resolution and pagination. The sidebar\n // promotes this marked entry into the group header.\n if (!children.length) return { label: item.label, link: item.link };\n children.unshift({\n label: item.label,\n link: item.link,\n attrs: { \"data-cookbook-group-link\": \"\" },\n });\n }\n return {\n label: item.label,\n items: children,\n };\n }\n return item;\n };\n const fallback = layout.items?.length\n ? layout.items.map(convert)\n : groupedRoutes(visibleRoutes);\n const sidebar = !layout.sectioned\n ? fallback\n : [\n ...(layout.fallbackSidebarGroup !== undefined\n ? [{ label: \"Documentation\", items: fallback }]\n : []),\n ...layout.tabs.flatMap((tab) =>\n tab.items !== undefined\n ? [{ label: tab.label, items: tab.items.map(convert) }]\n : [],\n ),\n ];\n return routes\n .filter((route) => route.discoverable === false)\n .reduce((items, route) => withoutRoute(items, route.route), sidebar);\n}\n\nfunction withoutRoute(\n items: PageSidebarItem[],\n route: string,\n): PageSidebarItem[] {\n const target = normalizeNavigationPath(route);\n return items.flatMap((item): PageSidebarItem[] => {\n if (\"link\" in item) {\n return !/^(?:[a-z][a-z\\d+.-]*:|\\/\\/|[?#])/i.test(item.link) &&\n normalizeNavigationPath(item.link) === target\n ? []\n : [item];\n }\n const children = withoutRoute(item.items, route);\n const first = children[0];\n if (\n children.length === 1 &&\n first &&\n \"link\" in first &&\n first.attrs?.[\"data-cookbook-group-link\"] !== undefined\n ) {\n return [{ label: item.label, link: first.link }];\n }\n return children.length ? [{ ...item, items: children }] : [];\n });\n}\n\nfunction groupedRoutes(routes: DocsRoute[]): PageSidebarItem[] {\n const items: PageSidebarItem[] = [];\n const groups = new Map<string, PageSidebarItem[]>();\n for (const route of routes) {\n const item = {\n label:\n typeof route.sidebar === \"object\" && route.sidebar.label\n ? route.sidebar.label\n : route.title,\n link: route.route,\n };\n const group =\n typeof route.sidebar === \"object\" ? route.sidebar.group : undefined;\n if (!group) {\n items.push(item);\n continue;\n }\n const grouped = groups.get(group) ?? [];\n grouped.push(item);\n groups.set(group, grouped);\n }\n return [\n ...items,\n ...Array.from(groups, ([label, grouped]) => ({ label, items: grouped })),\n ];\n}\n\n/** Pick one tab, preferring its own URL before routes owned by its sidebar. */\nexport function activeNavigationTab(\n tabs: NavigationTab[],\n pathname: string,\n): number {\n const current = normalizeNavigationPath(pathname);\n let winner = -1;\n let winningScore = -1;\n\n for (const [index, tab] of tabs.entries()) {\n const score = Math.max(\n linkMatchScore(tab.link, current, 30_000),\n navigationMatchScore(tab.items ?? [], current),\n );\n if (score > winningScore) {\n winner = index;\n winningScore = score;\n }\n }\n\n return winningScore >= 0 ? winner : -1;\n}\n\nexport function navigationPath(pathname: string, base = \"/\"): string {\n const normalizedBase = normalizeNavigationPath(base);\n const withoutBase =\n normalizedBase !== \"/\" &&\n (pathname === normalizedBase || pathname.startsWith(`${normalizedBase}/`))\n ? pathname.slice(normalizedBase.length) || \"/\"\n : pathname;\n return normalizeNavigationPath(withoutBase);\n}\n\nexport function normalizeNavigationPath(path: string): string {\n const clean = path.split(/[?#]/, 1)[0]?.replace(/\\\\/g, \"/\") ?? \"/\";\n const normalized = `/${clean.replace(/^\\/+|\\/+$/g, \"\")}`;\n return normalized === \"/\" ? normalized : normalized.replace(/\\/$/, \"\");\n}\n\nfunction navigationMatchScore(\n items: NavigationItem[],\n current: string,\n): number {\n let score = -1;\n for (const item of items) {\n if (typeof item === \"string\") {\n if (normalizeNavigationPath(item) === current)\n score = Math.max(score, 20_000);\n continue;\n }\n if (item.link) {\n score = Math.max(score, linkMatchScore(item.link, current, 20_000));\n }\n if (\"items\" in item) {\n score = Math.max(score, navigationMatchScore(item.items, current));\n continue;\n }\n if (\"autogenerate\" in item) {\n score = Math.max(\n score,\n directoryMatchScore(item.autogenerate.directory, current),\n );\n continue;\n }\n }\n return score;\n}\n\nfunction linkMatchScore(link: string, current: string, base: number): number {\n if (!link.startsWith(\"/\")) return -1;\n const target = normalizeNavigationPath(link);\n if (target === current) return base + 1_000 + target.length;\n if (target !== \"/\" && current.startsWith(`${target}/`)) {\n return base + target.length;\n }\n return -1;\n}\n\nfunction directoryMatchScore(directory: string, current: string): number {\n const target = normalizeNavigationPath(directory);\n if (target === \"/\") return 10_000;\n return current === target || current.startsWith(`${target}/`)\n ? 10_000 + target.length\n : -1;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"navigation.js","names":[],"sources":["../src/navigation.ts"],"sourcesContent":["import type {\n DocsConfig,\n DocsRoute,\n NavigationItem,\n NavigationTab,\n} from \"@tenphi/docs\";\n\nexport interface ResolvedNavigationTab extends NavigationTab {\n /** Index of the tab's resolved sidebar group. */\n sidebarGroup?: number;\n}\n\nexport interface ResolvedNavigationLayout {\n fallbackSidebarGroup?: number;\n items?: NavigationItem[];\n tabs: ResolvedNavigationTab[];\n sectioned: boolean;\n}\n\nexport type PageSidebarItem = { badge?: string } & (\n | { label: string; link: string; attrs?: Record<string, string> }\n | { label: string; items: PageSidebarItem[] }\n);\n\nexport function resolveNavigationLayout(\n navigation: DocsConfig[\"navigation\"],\n): ResolvedNavigationLayout {\n const items = Array.isArray(navigation) ? navigation : navigation?.items;\n const configuredTabs = Array.isArray(navigation)\n ? []\n : (navigation?.tabs ?? []);\n const fallbackSidebarGroup = items !== undefined ? 0 : undefined;\n let sidebarGroup = fallbackSidebarGroup === undefined ? 0 : 1;\n const tabs = configuredTabs.map((tab) => ({\n ...tab,\n ...(tab.items !== undefined ? { sidebarGroup: sidebarGroup++ } : {}),\n }));\n\n return {\n ...(fallbackSidebarGroup !== undefined ? { fallbackSidebarGroup } : {}),\n ...(items !== undefined ? { items } : {}),\n tabs,\n sectioned: tabs.some((tab) => tab.sidebarGroup !== undefined),\n };\n}\n\nexport function navigationItemsForPath(\n layout: ResolvedNavigationLayout,\n pathname: string,\n): NavigationItem[] | undefined {\n const active = activeNavigationTab(layout.tabs, pathname);\n return active >= 0 && layout.tabs[active]?.items !== undefined\n ? layout.tabs[active].items\n : layout.items;\n}\n\n/** Build a sidebar for graph-backed custom pages. */\nexport function pageSidebar(\n layout: ResolvedNavigationLayout,\n routes: DocsRoute[],\n): PageSidebarItem[] {\n const visibleRoutes = routes\n .filter((route) => route.sidebar !== false && route.discoverable !== false)\n .toSorted((left, right) => {\n const leftOrder =\n typeof left.sidebar === \"object\" ? left.sidebar.order : undefined;\n const rightOrder =\n typeof right.sidebar === \"object\" ? right.sidebar.order : undefined;\n return (\n (leftOrder ?? Number.POSITIVE_INFINITY) -\n (rightOrder ?? Number.POSITIVE_INFINITY) ||\n left.route.localeCompare(right.route)\n );\n });\n const pages = new Map(visibleRoutes.map((route) => [route.route, route]));\n const badgeFor = (link: string) => {\n const sidebar = pages.get(normalizeNavigationPath(link))?.sidebar;\n return typeof sidebar === \"object\" ? sidebar.badge : undefined;\n };\n const labelFor = (link: string) => {\n const path = normalizeNavigationPath(link);\n const page = pages.get(path);\n return (\n (typeof page?.sidebar === \"object\" && page.sidebar.label\n ? page.sidebar.label\n : page?.title) ??\n path.split(\"/\").filter(Boolean).at(-1) ??\n \"Home\"\n );\n };\n const generatedItems = (directory: string) => {\n const root = normalizeNavigationPath(directory);\n return groupedRoutes(\n visibleRoutes.filter(\n (route) =>\n root === \"/\" ||\n route.route === root ||\n route.route.startsWith(`${root}/`),\n ),\n );\n };\n const convert = (item: NavigationItem): PageSidebarItem => {\n const link = typeof item === \"string\" ? item : item.link;\n const badge = link ? badgeFor(link) : undefined;\n if (typeof item === \"string\") {\n return {\n label: labelFor(item),\n link: item,\n ...(badge !== undefined ? { badge } : {}),\n };\n }\n const resolvedBadge = item.badge ?? badge;\n const presentation =\n resolvedBadge !== undefined ? { badge: resolvedBadge } : {};\n if (\"items\" in item || \"autogenerate\" in item) {\n let children =\n \"items\" in item\n ? item.items.map(convert)\n : generatedItems(item.autogenerate.directory);\n if (item.link) {\n children = withoutRoute(children, item.link);\n // Keep the parent in route resolution and pagination. The sidebar\n // promotes this marked entry into the group header.\n if (!children.length)\n return { label: item.label, link: item.link, ...presentation };\n children.unshift({\n label: item.label,\n link: item.link,\n attrs: { \"data-cookbook-group-link\": \"\" },\n ...presentation,\n });\n }\n return {\n label: item.label,\n items: children,\n ...presentation,\n };\n }\n return { ...item, ...presentation };\n };\n const fallback = layout.items?.length\n ? layout.items.map(convert)\n : groupedRoutes(visibleRoutes);\n const sidebar = !layout.sectioned\n ? fallback\n : [\n ...(layout.fallbackSidebarGroup !== undefined\n ? [{ label: \"Documentation\", items: fallback }]\n : []),\n ...layout.tabs.flatMap((tab) =>\n tab.items !== undefined\n ? [{ label: tab.label, items: tab.items.map(convert) }]\n : [],\n ),\n ];\n return routes\n .filter((route) => route.discoverable === false)\n .reduce((items, route) => withoutRoute(items, route.route), sidebar);\n}\n\nfunction withoutRoute(\n items: PageSidebarItem[],\n route: string,\n): PageSidebarItem[] {\n const target = normalizeNavigationPath(route);\n return items.flatMap((item): PageSidebarItem[] => {\n if (\"link\" in item) {\n return !/^(?:[a-z][a-z\\d+.-]*:|\\/\\/|[?#])/i.test(item.link) &&\n normalizeNavigationPath(item.link) === target\n ? []\n : [item];\n }\n const children = withoutRoute(item.items, route);\n const first = children[0];\n if (\n children.length === 1 &&\n first &&\n \"link\" in first &&\n first.attrs?.[\"data-cookbook-group-link\"] !== undefined\n ) {\n return [\n {\n label: item.label,\n link: first.link,\n ...(item.badge !== undefined ? { badge: item.badge } : {}),\n },\n ];\n }\n return children.length ? [{ ...item, items: children }] : [];\n });\n}\n\nfunction groupedRoutes(routes: DocsRoute[]): PageSidebarItem[] {\n const items: PageSidebarItem[] = [];\n const groups = new Map<string, PageSidebarItem[]>();\n for (const route of routes) {\n const item = {\n label:\n typeof route.sidebar === \"object\" && route.sidebar.label\n ? route.sidebar.label\n : route.title,\n link: route.route,\n ...(typeof route.sidebar === \"object\" && route.sidebar.badge !== undefined\n ? { badge: route.sidebar.badge }\n : {}),\n };\n const group =\n typeof route.sidebar === \"object\" ? route.sidebar.group : undefined;\n if (!group) {\n items.push(item);\n continue;\n }\n const grouped = groups.get(group) ?? [];\n grouped.push(item);\n groups.set(group, grouped);\n }\n return [\n ...items,\n ...Array.from(groups, ([label, grouped]) => ({ label, items: grouped })),\n ];\n}\n\n/** Pick one tab, preferring its own URL before routes owned by its sidebar. */\nexport function activeNavigationTab(\n tabs: NavigationTab[],\n pathname: string,\n): number {\n const current = normalizeNavigationPath(pathname);\n let winner = -1;\n let winningScore = -1;\n\n for (const [index, tab] of tabs.entries()) {\n const score = Math.max(\n linkMatchScore(tab.link, current, 30_000),\n navigationMatchScore(tab.items ?? [], current),\n );\n if (score > winningScore) {\n winner = index;\n winningScore = score;\n }\n }\n\n return winningScore >= 0 ? winner : -1;\n}\n\nexport function navigationPath(pathname: string, base = \"/\"): string {\n const normalizedBase = normalizeNavigationPath(base);\n const withoutBase =\n normalizedBase !== \"/\" &&\n (pathname === normalizedBase || pathname.startsWith(`${normalizedBase}/`))\n ? pathname.slice(normalizedBase.length) || \"/\"\n : pathname;\n return normalizeNavigationPath(withoutBase);\n}\n\nexport function normalizeNavigationPath(path: string): string {\n const clean = path.split(/[?#]/, 1)[0]?.replace(/\\\\/g, \"/\") ?? \"/\";\n const normalized = `/${clean.replace(/^\\/+|\\/+$/g, \"\")}`;\n return normalized === \"/\" ? normalized : normalized.replace(/\\/$/, \"\");\n}\n\nfunction navigationMatchScore(\n items: NavigationItem[],\n current: string,\n): number {\n let score = -1;\n for (const item of items) {\n if (typeof item === \"string\") {\n if (normalizeNavigationPath(item) === current)\n score = Math.max(score, 20_000);\n continue;\n }\n if (item.link) {\n score = Math.max(score, linkMatchScore(item.link, current, 20_000));\n }\n if (\"items\" in item) {\n score = Math.max(score, navigationMatchScore(item.items, current));\n continue;\n }\n if (\"autogenerate\" in item) {\n score = Math.max(\n score,\n directoryMatchScore(item.autogenerate.directory, current),\n );\n continue;\n }\n }\n return score;\n}\n\nfunction linkMatchScore(link: string, current: string, base: number): number {\n if (!link.startsWith(\"/\")) return -1;\n const target = normalizeNavigationPath(link);\n if (target === current) return base + 1_000 + target.length;\n if (target !== \"/\" && current.startsWith(`${target}/`)) {\n return base + target.length;\n }\n return -1;\n}\n\nfunction directoryMatchScore(directory: string, current: string): number {\n const target = normalizeNavigationPath(directory);\n if (target === \"/\") return 10_000;\n return current === target || current.startsWith(`${target}/`)\n ? 10_000 + target.length\n : -1;\n}\n"],"mappings":"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"}
|
package/dist/route-context.d.ts
CHANGED
|
@@ -7,20 +7,12 @@ type SidebarEntry = {
|
|
|
7
7
|
href: string;
|
|
8
8
|
isCurrent: boolean;
|
|
9
9
|
attrs: Record<string, string>;
|
|
10
|
-
badge?:
|
|
11
|
-
text: string;
|
|
12
|
-
variant?: string;
|
|
13
|
-
class?: string;
|
|
14
|
-
};
|
|
10
|
+
badge?: string;
|
|
15
11
|
} | {
|
|
16
12
|
type: "group";
|
|
17
13
|
label: string;
|
|
18
14
|
entries: SidebarEntry[];
|
|
19
|
-
badge?:
|
|
20
|
-
text: string;
|
|
21
|
-
variant?: string;
|
|
22
|
-
class?: string;
|
|
23
|
-
};
|
|
15
|
+
badge?: string;
|
|
24
16
|
};
|
|
25
17
|
interface TocItem {
|
|
26
18
|
slug: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-context.d.ts","names":[],"sources":["../src/route-context.ts"],"mappings":";;;KAoBY;EAEN;EACA;EACA;EACA;EACA,OAAO;EACP;
|
|
1
|
+
{"version":3,"file":"route-context.d.ts","names":[],"sources":["../src/route-context.ts"],"mappings":";;;KAoBY;EAEN;EACA;EACA;EACA;EACA,OAAO;EACP;;EAGA;EACA;EACA,SAAS;EACT;;UAGW;EACf;EACA;EACA,UAAU;;UAGK;EACf;EACA;EACA;EACA;EACA;EACA;EACA;IAAS,MAAM;;EACf;IAAa;IAAc;IAAoB;;EAC/C,SAAS;EACT;IACE;MAAS;MAAc;;IACvB;MAAS;MAAc;;;EAEzB;IAAQ,OAAO;;EACf,MAAM;EACN;EACA,cAAc;;KAGX;EACH,QAAQ;EACR;EACA;IAAQ;IAAgB;;EACxB,UAAU;EACV;EACA,eAAe;EACf,kBAAkB;EAClB,OAAO;;iBAGO,mBAAmB;EACjC;EACA,aAAa;EACb,UAAU;EACV,QAAQ;EACR,SAAS;IACP"}
|
package/dist/route-context.js
CHANGED
|
@@ -59,13 +59,15 @@ function resolveSidebar(items, currentPath, content) {
|
|
|
59
59
|
label: item.label,
|
|
60
60
|
href,
|
|
61
61
|
isCurrent: href.startsWith("/") && !href.startsWith("//") && navigationPath(new URL(href, "https://cookbook.invalid").pathname, content.base) === currentPath,
|
|
62
|
-
attrs: item.attrs ?? {}
|
|
62
|
+
attrs: item.attrs ?? {},
|
|
63
|
+
...item.badge !== void 0 ? { badge: item.badge } : {}
|
|
63
64
|
};
|
|
64
65
|
}
|
|
65
66
|
return {
|
|
66
67
|
type: "group",
|
|
67
68
|
label: item.label,
|
|
68
|
-
entries: resolveSidebar(item.items, currentPath, content)
|
|
69
|
+
entries: resolveSidebar(item.items, currentPath, content),
|
|
70
|
+
...item.badge !== void 0 ? { badge: item.badge } : {}
|
|
69
71
|
};
|
|
70
72
|
});
|
|
71
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-context.js","names":[],"sources":["../src/route-context.ts"],"sourcesContent":["import type {\n DocsConfig,\n DocsHeading,\n DocsRoute,\n HeadConfig,\n} from \"@tenphi/docs\";\nimport {\n localeHref,\n localizedNavigation,\n requestLanguage,\n routeLocale,\n} from \"./localization.js\";\nimport {\n navigationPath,\n normalizeNavigationPath,\n pageSidebar,\n type ResolvedNavigationLayout,\n type PageSidebarItem,\n} from \"./navigation.js\";\n\nexport type SidebarEntry =\n | {\n type: \"link\";\n label: string;\n href: string;\n isCurrent: boolean;\n attrs: Record<string, string>;\n badge?: { text: string; variant?: string; class?: string };\n }\n | {\n type: \"group\";\n label: string;\n entries: SidebarEntry[];\n badge?: { text: string; variant?: string; class?: string };\n };\n\nexport interface TocItem {\n slug: string;\n text: string;\n children: TocItem[];\n}\n\nexport interface CookbookRoute {\n id: string;\n lang: string;\n dir: \"ltr\" | \"rtl\";\n hasSidebar: boolean;\n siteTitle: string;\n siteTitleHref: string;\n entry: { data: Record<string, any> };\n entryMeta: { lang: string; dir: \"ltr\" | \"rtl\"; locale: string };\n sidebar: SidebarEntry[];\n pagination: {\n prev?: { href: string; label: string };\n next?: { href: string; label: string };\n };\n toc?: { items: TocItem[] };\n head: HeadConfig[];\n editUrl?: string;\n lastUpdated?: Date;\n}\n\ntype Content = {\n routes: DocsRoute[];\n base: string;\n site: { title?: string; description?: string };\n locales?: DocsConfig[\"locales\"];\n defaultLocale?: string;\n translations?: DocsConfig[\"translations\"];\n tableOfContents?: DocsConfig[\"tableOfContents\"];\n head?: HeadConfig[];\n};\n\nexport function createRouteContext(input: {\n pathname: string;\n frontmatter: Record<string, any>;\n headings: DocsHeading[];\n layout: ResolvedNavigationLayout;\n content: Content;\n}): CookbookRoute {\n const { pathname, frontmatter, headings, layout, content } = input;\n const currentPath = navigationPath(pathname, content.base);\n const locale = routeLocale(currentPath, content);\n const lang = requestLanguage(pathname, content.base, content);\n const dir = content.locales?.[locale]?.dir ?? \"ltr\";\n const localized = localizedNavigation(\n layout,\n content.routes,\n currentPath,\n content,\n );\n const sidebar = resolveSidebar(\n pageSidebar(localized.layout, localized.routes),\n currentPath,\n content,\n );\n const links = flattenLinks(sidebar);\n const currentIndex = links.findIndex((link) => link.isCurrent);\n const previous = resolvePaginationLink(\n frontmatter.prev,\n currentIndex >= 0 ? links[currentIndex - 1] : undefined,\n content,\n currentPath,\n );\n const next = resolvePaginationLink(\n frontmatter.next,\n currentIndex >= 0 ? links[currentIndex + 1] : undefined,\n content,\n currentPath,\n );\n const pagination = {\n ...(previous ? { prev: previous } : {}),\n ...(next ? { next } : {}),\n };\n const toc = resolveToc(headings, frontmatter, content);\n const head: HeadConfig[] = [\n ...(content.head ?? []),\n ...(frontmatter.head ?? []),\n ...(frontmatter.description || content.site.description\n ? [\n {\n tag: \"meta\",\n attrs: {\n name: \"description\",\n content: frontmatter.description ?? content.site.description,\n },\n },\n ]\n : []),\n ];\n return {\n id: currentPath,\n lang,\n dir,\n hasSidebar: frontmatter.template !== \"splash\",\n siteTitle: content.site.title ?? \"Documentation\",\n siteTitleHref: content.base,\n entry: { data: frontmatter },\n entryMeta: { lang, dir, locale },\n sidebar,\n pagination,\n ...(toc ? { toc } : {}),\n head,\n ...(typeof frontmatter.editUrl === \"string\"\n ? { editUrl: frontmatter.editUrl }\n : {}),\n ...(frontmatter.lastUpdated instanceof Date\n ? { lastUpdated: frontmatter.lastUpdated }\n : {}),\n };\n}\n\nfunction resolveSidebar(\n items: PageSidebarItem[],\n currentPath: string,\n content: Content,\n): SidebarEntry[] {\n return items.map((item): SidebarEntry => {\n if (\"link\" in item) {\n const href = localeHref(\n item.link,\n currentPath,\n content.routes,\n content,\n content.base,\n );\n return {\n type: \"link\",\n label: item.label,\n href,\n isCurrent:\n href.startsWith(\"/\") &&\n !href.startsWith(\"//\") &&\n navigationPath(\n new URL(href, \"https://cookbook.invalid\").pathname,\n content.base,\n ) === currentPath,\n attrs: item.attrs ?? {},\n };\n }\n return {\n type: \"group\",\n label: item.label,\n entries: resolveSidebar(item.items, currentPath, content),\n };\n });\n}\n\nfunction flattenLinks(\n items: SidebarEntry[],\n): Extract<SidebarEntry, { type: \"link\" }>[] {\n return items.flatMap((item) =>\n item.type === \"link\" ? [item] : flattenLinks(item.entries),\n );\n}\n\nfunction resolvePaginationLink(\n configured: unknown,\n automatic: Extract<SidebarEntry, { type: \"link\" }> | undefined,\n content: Content,\n currentPath: string,\n): { href: string; label: string } | undefined {\n if (configured === false) return undefined;\n if (configured === undefined)\n return automatic && { href: automatic.href, label: automatic.label };\n const link =\n typeof configured === \"string\"\n ? configured\n : configured &&\n typeof configured === \"object\" &&\n \"link\" in configured &&\n typeof configured.link === \"string\"\n ? configured.link\n : automatic?.href;\n if (!link) return undefined;\n const label =\n configured &&\n typeof configured === \"object\" &&\n \"label\" in configured &&\n typeof configured.label === \"string\"\n ? configured.label\n : (content.routes.find(\n (route) =>\n normalizeNavigationPath(route.route) ===\n normalizeNavigationPath(link),\n )?.title ??\n automatic?.label ??\n link);\n return {\n href: localeHref(link, currentPath, content.routes, content, content.base),\n label,\n };\n}\n\nfunction resolveToc(\n headings: DocsHeading[],\n frontmatter: Record<string, any>,\n content: Content,\n): { items: TocItem[] } | undefined {\n const option =\n frontmatter.tableOfContents ??\n (frontmatter.template === \"splash\" ? false : content.tableOfContents);\n if (option === false) return undefined;\n const min = typeof option === \"object\" ? (option.minHeadingLevel ?? 2) : 2;\n const max = typeof option === \"object\" ? (option.maxHeadingLevel ?? 3) : 3;\n const roots: TocItem[] = [];\n const stack: Array<{ depth: number; item: TocItem }> = [];\n for (const heading of headings) {\n if (heading.depth < min || heading.depth > max) continue;\n const item: TocItem = {\n slug: heading.slug,\n text: heading.text,\n children: [],\n };\n while (stack.length && stack[stack.length - 1]!.depth >= heading.depth)\n stack.pop();\n if (stack.length) stack[stack.length - 1]!.item.children.push(item);\n else roots.push(item);\n stack.push({ depth: heading.depth, item });\n }\n return roots.length ? { items: roots } : undefined;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"route-context.js","names":[],"sources":["../src/route-context.ts"],"sourcesContent":["import type {\n DocsConfig,\n DocsHeading,\n DocsRoute,\n HeadConfig,\n} from \"@tenphi/docs\";\nimport {\n localeHref,\n localizedNavigation,\n requestLanguage,\n routeLocale,\n} from \"./localization.js\";\nimport {\n navigationPath,\n normalizeNavigationPath,\n pageSidebar,\n type ResolvedNavigationLayout,\n type PageSidebarItem,\n} from \"./navigation.js\";\n\nexport type SidebarEntry =\n | {\n type: \"link\";\n label: string;\n href: string;\n isCurrent: boolean;\n attrs: Record<string, string>;\n badge?: string;\n }\n | {\n type: \"group\";\n label: string;\n entries: SidebarEntry[];\n badge?: string;\n };\n\nexport interface TocItem {\n slug: string;\n text: string;\n children: TocItem[];\n}\n\nexport interface CookbookRoute {\n id: string;\n lang: string;\n dir: \"ltr\" | \"rtl\";\n hasSidebar: boolean;\n siteTitle: string;\n siteTitleHref: string;\n entry: { data: Record<string, any> };\n entryMeta: { lang: string; dir: \"ltr\" | \"rtl\"; locale: string };\n sidebar: SidebarEntry[];\n pagination: {\n prev?: { href: string; label: string };\n next?: { href: string; label: string };\n };\n toc?: { items: TocItem[] };\n head: HeadConfig[];\n editUrl?: string;\n lastUpdated?: Date;\n}\n\ntype Content = {\n routes: DocsRoute[];\n base: string;\n site: { title?: string; description?: string };\n locales?: DocsConfig[\"locales\"];\n defaultLocale?: string;\n translations?: DocsConfig[\"translations\"];\n tableOfContents?: DocsConfig[\"tableOfContents\"];\n head?: HeadConfig[];\n};\n\nexport function createRouteContext(input: {\n pathname: string;\n frontmatter: Record<string, any>;\n headings: DocsHeading[];\n layout: ResolvedNavigationLayout;\n content: Content;\n}): CookbookRoute {\n const { pathname, frontmatter, headings, layout, content } = input;\n const currentPath = navigationPath(pathname, content.base);\n const locale = routeLocale(currentPath, content);\n const lang = requestLanguage(pathname, content.base, content);\n const dir = content.locales?.[locale]?.dir ?? \"ltr\";\n const localized = localizedNavigation(\n layout,\n content.routes,\n currentPath,\n content,\n );\n const sidebar = resolveSidebar(\n pageSidebar(localized.layout, localized.routes),\n currentPath,\n content,\n );\n const links = flattenLinks(sidebar);\n const currentIndex = links.findIndex((link) => link.isCurrent);\n const previous = resolvePaginationLink(\n frontmatter.prev,\n currentIndex >= 0 ? links[currentIndex - 1] : undefined,\n content,\n currentPath,\n );\n const next = resolvePaginationLink(\n frontmatter.next,\n currentIndex >= 0 ? links[currentIndex + 1] : undefined,\n content,\n currentPath,\n );\n const pagination = {\n ...(previous ? { prev: previous } : {}),\n ...(next ? { next } : {}),\n };\n const toc = resolveToc(headings, frontmatter, content);\n const head: HeadConfig[] = [\n ...(content.head ?? []),\n ...(frontmatter.head ?? []),\n ...(frontmatter.description || content.site.description\n ? [\n {\n tag: \"meta\",\n attrs: {\n name: \"description\",\n content: frontmatter.description ?? content.site.description,\n },\n },\n ]\n : []),\n ];\n return {\n id: currentPath,\n lang,\n dir,\n hasSidebar: frontmatter.template !== \"splash\",\n siteTitle: content.site.title ?? \"Documentation\",\n siteTitleHref: content.base,\n entry: { data: frontmatter },\n entryMeta: { lang, dir, locale },\n sidebar,\n pagination,\n ...(toc ? { toc } : {}),\n head,\n ...(typeof frontmatter.editUrl === \"string\"\n ? { editUrl: frontmatter.editUrl }\n : {}),\n ...(frontmatter.lastUpdated instanceof Date\n ? { lastUpdated: frontmatter.lastUpdated }\n : {}),\n };\n}\n\nfunction resolveSidebar(\n items: PageSidebarItem[],\n currentPath: string,\n content: Content,\n): SidebarEntry[] {\n return items.map((item): SidebarEntry => {\n if (\"link\" in item) {\n const href = localeHref(\n item.link,\n currentPath,\n content.routes,\n content,\n content.base,\n );\n return {\n type: \"link\",\n label: item.label,\n href,\n isCurrent:\n href.startsWith(\"/\") &&\n !href.startsWith(\"//\") &&\n navigationPath(\n new URL(href, \"https://cookbook.invalid\").pathname,\n content.base,\n ) === currentPath,\n attrs: item.attrs ?? {},\n ...(item.badge !== undefined ? { badge: item.badge } : {}),\n };\n }\n return {\n type: \"group\",\n label: item.label,\n entries: resolveSidebar(item.items, currentPath, content),\n ...(item.badge !== undefined ? { badge: item.badge } : {}),\n };\n });\n}\n\nfunction flattenLinks(\n items: SidebarEntry[],\n): Extract<SidebarEntry, { type: \"link\" }>[] {\n return items.flatMap((item) =>\n item.type === \"link\" ? [item] : flattenLinks(item.entries),\n );\n}\n\nfunction resolvePaginationLink(\n configured: unknown,\n automatic: Extract<SidebarEntry, { type: \"link\" }> | undefined,\n content: Content,\n currentPath: string,\n): { href: string; label: string } | undefined {\n if (configured === false) return undefined;\n if (configured === undefined)\n return automatic && { href: automatic.href, label: automatic.label };\n const link =\n typeof configured === \"string\"\n ? configured\n : configured &&\n typeof configured === \"object\" &&\n \"link\" in configured &&\n typeof configured.link === \"string\"\n ? configured.link\n : automatic?.href;\n if (!link) return undefined;\n const label =\n configured &&\n typeof configured === \"object\" &&\n \"label\" in configured &&\n typeof configured.label === \"string\"\n ? configured.label\n : (content.routes.find(\n (route) =>\n normalizeNavigationPath(route.route) ===\n normalizeNavigationPath(link),\n )?.title ??\n automatic?.label ??\n link);\n return {\n href: localeHref(link, currentPath, content.routes, content, content.base),\n label,\n };\n}\n\nfunction resolveToc(\n headings: DocsHeading[],\n frontmatter: Record<string, any>,\n content: Content,\n): { items: TocItem[] } | undefined {\n const option =\n frontmatter.tableOfContents ??\n (frontmatter.template === \"splash\" ? false : content.tableOfContents);\n if (option === false) return undefined;\n const min = typeof option === \"object\" ? (option.minHeadingLevel ?? 2) : 2;\n const max = typeof option === \"object\" ? (option.maxHeadingLevel ?? 3) : 3;\n const roots: TocItem[] = [];\n const stack: Array<{ depth: number; item: TocItem }> = [];\n for (const heading of headings) {\n if (heading.depth < min || heading.depth > max) continue;\n const item: TocItem = {\n slug: heading.slug,\n text: heading.text,\n children: [],\n };\n while (stack.length && stack[stack.length - 1]!.depth >= heading.depth)\n stack.pop();\n if (stack.length) stack[stack.length - 1]!.item.children.push(item);\n else roots.push(item);\n stack.push({ depth: heading.depth, item });\n }\n return roots.length ? { items: roots } : undefined;\n}\n"],"mappings":"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"}
|
package/dist/ui.d.ts
CHANGED
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
declare function uiTranslations(lang: string, options: Pick<DocsConfig, "translations">): Record<string, string>;
|
|
4
|
-
//#endregion
|
|
5
|
-
export { uiTranslations };
|
|
6
|
-
//# sourceMappingURL=ui.d.ts.map
|
|
1
|
+
import { i as uiTranslations } from "./messages-ClTf2nFf.js";
|
|
2
|
+
export { uiTranslations };
|
package/dist/ui.js
CHANGED
|
@@ -1,59 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
const english = {
|
|
3
|
-
"sidebarNav.accessibleLabel": "Main navigation",
|
|
4
|
-
"menuButton.accessibleLabel": "Menu",
|
|
5
|
-
"tableOfContents.onThisPage": "On this page",
|
|
6
|
-
"languageSelect.accessibleLabel": "Select language",
|
|
7
|
-
"themeSelect.light": "Light",
|
|
8
|
-
"themeSelect.dark": "Dark",
|
|
9
|
-
"themeSelect.auto": "Auto",
|
|
10
|
-
"search.label": "Search",
|
|
11
|
-
"search.ctrlKey": "Ctrl+",
|
|
12
|
-
"search.cancelLabel": "Cancel",
|
|
13
|
-
"search.devWarning": "Search is available after building the site.",
|
|
14
|
-
"page.nextLink": "Next",
|
|
15
|
-
"page.previousLink": "Previous",
|
|
16
|
-
"page.editLink": "Edit page",
|
|
17
|
-
"page.lastUpdated": "Last updated",
|
|
18
|
-
"page.skipToContent": "Skip to content",
|
|
19
|
-
"pagefind.search": "Search for",
|
|
20
|
-
"pagefind.clear_search": "Clear search",
|
|
21
|
-
"pagefind.zero_results": "No results",
|
|
22
|
-
"pagefind.many_results": "[COUNT] results",
|
|
23
|
-
"pagefind.one_result": "[COUNT] result"
|
|
24
|
-
};
|
|
25
|
-
const french = {
|
|
26
|
-
"sidebarNav.accessibleLabel": "Navigation principale",
|
|
27
|
-
"menuButton.accessibleLabel": "Menu",
|
|
28
|
-
"tableOfContents.onThisPage": "Sur cette page",
|
|
29
|
-
"languageSelect.accessibleLabel": "Choisir la langue",
|
|
30
|
-
"themeSelect.light": "Clair",
|
|
31
|
-
"themeSelect.dark": "Sombre",
|
|
32
|
-
"themeSelect.auto": "Auto",
|
|
33
|
-
"search.label": "Rechercher",
|
|
34
|
-
"search.cancelLabel": "Annuler",
|
|
35
|
-
"search.devWarning": "La recherche est disponible après la génération du site.",
|
|
36
|
-
"pagefind.search": "Rechercher",
|
|
37
|
-
"pagefind.clear_search": "Effacer la recherche",
|
|
38
|
-
"pagefind.zero_results": "Aucun résultat",
|
|
39
|
-
"pagefind.many_results": "[COUNT] résultats",
|
|
40
|
-
"pagefind.one_result": "[COUNT] résultat",
|
|
41
|
-
"page.nextLink": "Suivant",
|
|
42
|
-
"page.previousLink": "Précédent",
|
|
43
|
-
"page.editLink": "Modifier la page",
|
|
44
|
-
"page.lastUpdated": "Dernière mise à jour",
|
|
45
|
-
"page.skipToContent": "Aller au contenu"
|
|
46
|
-
};
|
|
47
|
-
function uiTranslations(lang, options) {
|
|
48
|
-
const language = lang.split("-")[0] ?? "en";
|
|
49
|
-
return {
|
|
50
|
-
...english,
|
|
51
|
-
...language === "fr" ? french : {},
|
|
52
|
-
...options.translations?.[language],
|
|
53
|
-
...options.translations?.[lang]
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
//#endregion
|
|
1
|
+
import { r as uiTranslations } from "./messages-BqBGDIoP.js";
|
|
57
2
|
export { uiTranslations };
|
|
58
|
-
|
|
59
|
-
//# sourceMappingURL=ui.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tenphi/renderer",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "Astro renderer and Tasty theme for Cookbook",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": [
|
|
@@ -61,10 +61,10 @@
|
|
|
61
61
|
"@fontsource-variable/jetbrains-mono": "^5.3.0",
|
|
62
62
|
"@fontsource-variable/onest": "^5.3.0",
|
|
63
63
|
"@pagefind/default-ui": "1.5.2",
|
|
64
|
-
"@tenphi/docs": "0.
|
|
65
|
-
"@tenphi/eslint-plugin-tasty": "1.
|
|
66
|
-
"@tenphi/glaze": "2.0.
|
|
67
|
-
"@tenphi/tasty": "3.9.
|
|
64
|
+
"@tenphi/docs": "0.22.0",
|
|
65
|
+
"@tenphi/eslint-plugin-tasty": "1.6.0",
|
|
66
|
+
"@tenphi/glaze": "2.0.1",
|
|
67
|
+
"@tenphi/tasty": "3.9.9",
|
|
68
68
|
"beautiful-mermaid": "^1.1.3",
|
|
69
69
|
"hast-util-from-html": "^2.0.3",
|
|
70
70
|
"pagefind": "1.5.2",
|
package/dist/ui.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ui.d.ts","names":[],"sources":["../src/ui.ts"],"mappings":";;iBAkDgB,eACd,cACA,SAAS,KAAK,8BACb"}
|
package/dist/ui.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","names":[],"sources":["../src/ui.ts"],"sourcesContent":["import type { DocsConfig } from \"@tenphi/docs\";\n\nconst english: Record<string, string> = {\n \"sidebarNav.accessibleLabel\": \"Main navigation\",\n \"menuButton.accessibleLabel\": \"Menu\",\n \"tableOfContents.onThisPage\": \"On this page\",\n \"languageSelect.accessibleLabel\": \"Select language\",\n \"themeSelect.light\": \"Light\",\n \"themeSelect.dark\": \"Dark\",\n \"themeSelect.auto\": \"Auto\",\n \"search.label\": \"Search\",\n \"search.ctrlKey\": \"Ctrl+\",\n \"search.cancelLabel\": \"Cancel\",\n \"search.devWarning\": \"Search is available after building the site.\",\n \"page.nextLink\": \"Next\",\n \"page.previousLink\": \"Previous\",\n \"page.editLink\": \"Edit page\",\n \"page.lastUpdated\": \"Last updated\",\n \"page.skipToContent\": \"Skip to content\",\n \"pagefind.search\": \"Search for\",\n \"pagefind.clear_search\": \"Clear search\",\n \"pagefind.zero_results\": \"No results\",\n \"pagefind.many_results\": \"[COUNT] results\",\n \"pagefind.one_result\": \"[COUNT] result\",\n};\n\nconst french: Record<string, string> = {\n \"sidebarNav.accessibleLabel\": \"Navigation principale\",\n \"menuButton.accessibleLabel\": \"Menu\",\n \"tableOfContents.onThisPage\": \"Sur cette page\",\n \"languageSelect.accessibleLabel\": \"Choisir la langue\",\n \"themeSelect.light\": \"Clair\",\n \"themeSelect.dark\": \"Sombre\",\n \"themeSelect.auto\": \"Auto\",\n \"search.label\": \"Rechercher\",\n \"search.cancelLabel\": \"Annuler\",\n \"search.devWarning\":\n \"La recherche est disponible après la génération du site.\",\n \"pagefind.search\": \"Rechercher\",\n \"pagefind.clear_search\": \"Effacer la recherche\",\n \"pagefind.zero_results\": \"Aucun résultat\",\n \"pagefind.many_results\": \"[COUNT] résultats\",\n \"pagefind.one_result\": \"[COUNT] résultat\",\n \"page.nextLink\": \"Suivant\",\n \"page.previousLink\": \"Précédent\",\n \"page.editLink\": \"Modifier la page\",\n \"page.lastUpdated\": \"Dernière mise à jour\",\n \"page.skipToContent\": \"Aller au contenu\",\n};\n\nexport function uiTranslations(\n lang: string,\n options: Pick<DocsConfig, \"translations\">,\n): Record<string, string> {\n const language = lang.split(\"-\")[0] ?? \"en\";\n return {\n ...english,\n ...(language === \"fr\" ? french : {}),\n ...options.translations?.[language],\n ...options.translations?.[lang],\n };\n}\n"],"mappings":";AAEA,MAAM,UAAkC;CACtC,8BAA8B;CAC9B,8BAA8B;CAC9B,8BAA8B;CAC9B,kCAAkC;CAClC,qBAAqB;CACrB,oBAAoB;CACpB,oBAAoB;CACpB,gBAAgB;CAChB,kBAAkB;CAClB,sBAAsB;CACtB,qBAAqB;CACrB,iBAAiB;CACjB,qBAAqB;CACrB,iBAAiB;CACjB,oBAAoB;CACpB,sBAAsB;CACtB,mBAAmB;CACnB,yBAAyB;CACzB,yBAAyB;CACzB,yBAAyB;CACzB,uBAAuB;AACzB;AAEA,MAAM,SAAiC;CACrC,8BAA8B;CAC9B,8BAA8B;CAC9B,8BAA8B;CAC9B,kCAAkC;CAClC,qBAAqB;CACrB,oBAAoB;CACpB,oBAAoB;CACpB,gBAAgB;CAChB,sBAAsB;CACtB,qBACE;CACF,mBAAmB;CACnB,yBAAyB;CACzB,yBAAyB;CACzB,yBAAyB;CACzB,uBAAuB;CACvB,iBAAiB;CACjB,qBAAqB;CACrB,iBAAiB;CACjB,oBAAoB;CACpB,sBAAsB;AACxB;AAEA,SAAgB,eACd,MACA,SACwB;CACxB,MAAM,WAAW,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM;CACvC,OAAO;EACL,GAAG;EACH,GAAI,aAAa,OAAO,SAAS,CAAC;EAClC,GAAG,QAAQ,eAAe;EAC1B,GAAG,QAAQ,eAAe;CAC5B;AACF"}
|