@unterberg/nivel 0.1.14 → 0.2.1

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 (51) hide show
  1. package/README.md +8 -9
  2. package/dist/{SearchModal-YJZFUB53.js → SearchModal-Q2MTOIZU.js} +4 -4
  3. package/dist/SearchModal-Q2MTOIZU.js.map +1 -0
  4. package/dist/{chunk-SH5XWPXW.js → chunk-AQJQDMKW.js} +181 -106
  5. package/dist/chunk-AQJQDMKW.js.map +1 -0
  6. package/dist/{chunk-SOVTSE5J.js → chunk-AT4O3RRN.js} +8 -2
  7. package/dist/chunk-AT4O3RRN.js.map +1 -0
  8. package/dist/{chunk-PKXDOKJY.js → chunk-C724XH47.js} +23 -18
  9. package/dist/chunk-C724XH47.js.map +1 -0
  10. package/dist/{chunk-NGX2C26M.js → chunk-GFZ3P4F4.js} +556 -15
  11. package/dist/chunk-GFZ3P4F4.js.map +1 -0
  12. package/dist/{chunk-R6O4NLHC.js → chunk-I75ALNG2.js} +6 -2
  13. package/dist/chunk-I75ALNG2.js.map +1 -0
  14. package/dist/chunk-WMHFKLPG.js +124 -0
  15. package/dist/chunk-WMHFKLPG.js.map +1 -0
  16. package/dist/cli.js +2 -3
  17. package/dist/cli.js.map +1 -1
  18. package/dist/client.d.ts +2 -1
  19. package/dist/client.js +3 -4
  20. package/dist/icons.d.ts +1 -0
  21. package/dist/icons.js +11638 -0
  22. package/dist/icons.js.map +1 -0
  23. package/dist/index.d.ts +2 -2
  24. package/dist/index.js +2 -9
  25. package/dist/mdx/code-blocks.d.ts +1 -1
  26. package/dist/mdx.js +2 -4
  27. package/dist/mdx.js.map +1 -1
  28. package/dist/runtime/client.d.ts +2 -1
  29. package/dist/runtime/client.js +3 -4
  30. package/dist/runtime/node.d.ts +2 -1
  31. package/dist/runtime/node.js +6 -8
  32. package/dist/{types-IiJ1jLWc.d.ts → types-Duk127zu.d.ts} +20 -2
  33. package/dist/vike.d.ts +2 -1
  34. package/dist/vike.js +7 -9
  35. package/dist/vike.js.map +1 -1
  36. package/package.json +10 -9
  37. package/dist/SearchModal-YJZFUB53.js.map +0 -1
  38. package/dist/chunk-JSZZPQEP.js +0 -9
  39. package/dist/chunk-JSZZPQEP.js.map +0 -1
  40. package/dist/chunk-L6ZVB6XH.js +0 -36
  41. package/dist/chunk-L6ZVB6XH.js.map +0 -1
  42. package/dist/chunk-NGX2C26M.js.map +0 -1
  43. package/dist/chunk-PKXDOKJY.js.map +0 -1
  44. package/dist/chunk-QWIYQPCW.js +0 -404
  45. package/dist/chunk-QWIYQPCW.js.map +0 -1
  46. package/dist/chunk-R6O4NLHC.js.map +0 -1
  47. package/dist/chunk-SH5XWPXW.js.map +0 -1
  48. package/dist/chunk-SOVTSE5J.js.map +0 -1
  49. package/dist/config.d.ts +0 -6
  50. package/dist/config.js +0 -9
  51. package/dist/config.js.map +0 -1
package/README.md CHANGED
@@ -6,7 +6,7 @@ Opinionated docs engine for Vike + Vite + React.
6
6
 
7
7
  ## What It Provides
8
8
 
9
- - typed docs config and docs graph helpers
9
+ - typed docs config and docs graph surfaces
10
10
  - generated Vike docs pages from a single docs graph
11
11
  - docs shell primitives such as navbar, sidebar, table of contents, pagination, search, and meta head wiring
12
12
  - MDX support with built-in docs components and code-block tooling
@@ -77,9 +77,9 @@ Only `pages/(nivel-generated)` is engine-generated and should not be edited by h
77
77
  `docs/docs.graph.ts`
78
78
 
79
79
  ```ts
80
- import { defineDocsGraph } from '@unterberg/nivel/config'
80
+ import type { DocsGraph } from '@unterberg/nivel'
81
81
 
82
- export const docsGraph = defineDocsGraph({
82
+ export const docsGraph = {
83
83
  items: [
84
84
  {
85
85
  kind: 'section',
@@ -97,22 +97,22 @@ export const docsGraph = defineDocsGraph({
97
97
  ],
98
98
  },
99
99
  ],
100
- })
100
+ } satisfies DocsGraph
101
101
  ```
102
102
 
103
103
  `pages/+docs.ts`
104
104
 
105
105
  ```ts
106
- import { defineDocsConfig } from '@unterberg/nivel/config'
106
+ import type { DocsConfig } from '@unterberg/nivel'
107
107
  import { docsGraph } from '../docs/docs.graph'
108
108
 
109
- const docsConfig = defineDocsConfig({
109
+ const docsConfig = {
110
110
  graph: docsGraph,
111
111
  siteTitle: 'My Docs',
112
112
  siteDescription: 'Documentation site powered by @unterberg/nivel.',
113
113
  siteUrl: 'https://docs.example.com',
114
114
  basePath: '/docs',
115
- })
115
+ } satisfies DocsConfig
116
116
 
117
117
  export default docsConfig
118
118
  ```
@@ -209,8 +209,7 @@ nivel --help
209
209
 
210
210
  | Entry | Purpose |
211
211
  | --- | --- |
212
- | `@unterberg/nivel` | main types, docs helpers, MDX components, shared utilities |
213
- | `@unterberg/nivel/config` | lean config-time entry for `defineDocsConfig()` and `defineDocsGraph()` |
212
+ | `@unterberg/nivel` | main types, MDX components, shared utilities |
214
213
  | `@unterberg/nivel/vike` | engine-owned Vike config for the consumer's `pages/+config.ts` |
215
214
  | `@unterberg/nivel/client` | `AppLayout`, `MetaHead`, `UserSettingsSync`, `DocsPage`, and client stores |
216
215
  | `@unterberg/nivel/mdx` | MDX provider entry |
@@ -295,13 +295,13 @@ var SearchSuggestionBox = ({
295
295
  /* @__PURE__ */ jsx("span", { className: "loading loading-dots loading-xs" }),
296
296
  "Searching..."
297
297
  ] }) : normalizedQuery ? null : /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
298
- /* @__PURE__ */ jsx(MessageCircleQuestion, { className: "h-3 w-3 shrink-0" }),
298
+ /* @__PURE__ */ jsx(MessageCircleQuestion, { className: "size-3 shrink-0" }),
299
299
  "Type at least ",
300
300
  MIN_QUERY_LENGTH,
301
301
  " characters."
302
302
  ] }) }),
303
303
  normalizedQuery ? isError ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 rounded-box border border-warning/40 bg-base-100 p-4 text-sm text-base-muted shadow-md shadow-primary-muted-light", children: [
304
- /* @__PURE__ */ jsx(TriangleAlert, { className: "h-4 w-4 shrink-0 text-warning" }),
304
+ /* @__PURE__ */ jsx(TriangleAlert, { className: "size-4 shrink-0 text-warning" }),
305
305
  "Search is temporarily unavailable."
306
306
  ] }) : !canSearch ? /* @__PURE__ */ jsx("div", { className: "text-sm text-base-muted", children: "Keep typing to search." }) : !isLoading && results.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-sm text-base-muted", children: "No results found." }) : /* @__PURE__ */ jsx("div", { className: "-mx-2 max-h-80 overflow-y-auto p-2", children: /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-2", children: results.map((result) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
307
307
  "a",
@@ -313,7 +313,7 @@ var SearchSuggestionBox = ({
313
313
  /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-center justify-start gap-2", children: [
314
314
  /* @__PURE__ */ jsx("div", { className: "font-bold text-base-content", children: result.title }),
315
315
  result.sectionTitle ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-sm text-base-muted-medium", children: [
316
- /* @__PURE__ */ jsx(ArrowRightFromLine, { className: "h-3 w-3" }),
316
+ /* @__PURE__ */ jsx(ArrowRightFromLine, { className: "size-3" }),
317
317
  " ",
318
318
  result.sectionTitle
319
319
  ] }) : null
@@ -332,4 +332,4 @@ var SearchSuggestionBox = ({
332
332
  export {
333
333
  SearchModal
334
334
  };
335
- //# sourceMappingURL=SearchModal-YJZFUB53.js.map
335
+ //# sourceMappingURL=SearchModal-Q2MTOIZU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/client/components/SearchModal.tsx","../src/runtime/client/search.ts"],"sourcesContent":["import { ArrowRightFromLine, MessageCircleQuestion, TriangleAlert } from 'lucide-react'\nimport type { RefObject } from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { usePageContext } from 'vike-react/usePageContext'\nimport { withSiteBaseUrl } from '../../../shared/assets.js'\nimport { useDocsGlobalContext } from '../docsGlobalContext.js'\nimport { searchAlgoliaIndex } from '../search.js'\nimport { useDocsSearchActions, useDocsSearchStore } from '../store/runtime-store.js'\nimport { LayoutComponent } from './LayoutComponent.js'\n\nconst MIN_QUERY_LENGTH = 2\nconst QUERY_DEBOUNCE_MS = 150\n\nconst useDebouncedValue = (value: string, delayMs: number) => {\n const [debouncedValue, setDebouncedValue] = useState(value)\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => {\n setDebouncedValue(value)\n }, delayMs)\n\n return () => {\n window.clearTimeout(timeoutId)\n }\n }, [delayMs, value])\n\n return debouncedValue\n}\n\ntype SearchResults = Awaited<ReturnType<typeof searchAlgoliaIndex>>\n\nconst useSearchResults = (options: { canSearch: boolean; isOpen: boolean; normalizedQuery: string }) => {\n const docs = useDocsGlobalContext()\n const { canSearch, isOpen, normalizedQuery } = options\n const [results, setResults] = useState<SearchResults>([])\n const [isLoading, setIsLoading] = useState(false)\n const [isError, setIsError] = useState(false)\n\n useEffect(() => {\n if (!isOpen || !canSearch) {\n setResults([])\n setIsLoading(false)\n setIsError(false)\n return\n }\n\n const abortController = new AbortController()\n\n setIsLoading(true)\n setIsError(false)\n\n searchAlgoliaIndex({\n config: docs.algolia,\n query: normalizedQuery,\n signal: abortController.signal,\n })\n .then((nextResults) => {\n if (abortController.signal.aborted) {\n return\n }\n\n setResults(nextResults)\n })\n .catch((error: unknown) => {\n if (abortController.signal.aborted) {\n return\n }\n\n const isAbortError = error instanceof DOMException && error.name === 'AbortError'\n\n if (!isAbortError) {\n setResults([])\n setIsError(true)\n }\n })\n .finally(() => {\n if (!abortController.signal.aborted) {\n setIsLoading(false)\n }\n })\n\n return () => {\n abortController.abort()\n }\n }, [canSearch, docs.algolia, isOpen, normalizedQuery])\n\n return {\n results,\n isLoading,\n isError,\n }\n}\n\nexport const SearchModal = () => {\n const docs = useDocsGlobalContext()\n const { urlPathname } = usePageContext()\n const { close, setQuery } = useDocsSearchActions()\n const isOpen = useDocsSearchStore((state) => state.isOpen)\n const query = useDocsSearchStore((state) => state.query)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const suggestionBoxRef = useRef<HTMLDivElement | null>(null)\n const previousPathnameRef = useRef(urlPathname)\n const debouncedQuery = useDebouncedValue(query, QUERY_DEBOUNCE_MS)\n const normalizedQuery = debouncedQuery.trim()\n const canSearch = Boolean(docs.algolia) && normalizedQuery.length >= MIN_QUERY_LENGTH\n const { isError, isLoading, results } = useSearchResults({\n canSearch,\n isOpen,\n normalizedQuery,\n })\n\n useEffect(() => {\n if (previousPathnameRef.current !== urlPathname) {\n close()\n previousPathnameRef.current = urlPathname\n }\n }, [close, urlPathname])\n\n useEffect(() => {\n if (!isOpen) {\n return\n }\n\n const handlePointerDown = (event: PointerEvent) => {\n const target = event.target as Node\n\n if (!containerRef.current?.contains(target) && !suggestionBoxRef.current?.contains(target)) {\n close()\n }\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n close()\n }\n }\n\n document.addEventListener('pointerdown', handlePointerDown)\n document.addEventListener('keydown', handleKeyDown)\n\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown)\n document.removeEventListener('keydown', handleKeyDown)\n }\n }, [close, isOpen])\n\n if (!docs.algolia) {\n return null\n }\n\n return (\n <div ref={containerRef} className=\"relative\">\n <SearchSuggestionBox\n contentRef={suggestionBoxRef}\n isError={isError}\n isLoading={isLoading}\n isOpen={isOpen}\n onClose={close}\n onQueryChange={setQuery}\n query={query}\n results={results}\n />\n </div>\n )\n}\n\ntype SearchSuggestionBoxProps = {\n contentRef: RefObject<HTMLDivElement | null>\n isError: boolean\n isLoading: boolean\n isOpen: boolean\n onClose: () => void\n onQueryChange: (query: string) => void\n query: string\n results: SearchResults\n}\n\nconst SearchSuggestionBox = ({\n contentRef,\n isError,\n isLoading,\n isOpen,\n onClose,\n onQueryChange,\n query,\n results,\n}: SearchSuggestionBoxProps) => {\n const inputRef = useRef<HTMLInputElement | null>(null)\n const normalizedQuery = query.trim()\n const canSearch = normalizedQuery.length >= MIN_QUERY_LENGTH\n\n useEffect(() => {\n if (!isOpen) {\n return\n }\n\n const frameId = window.requestAnimationFrame(() => {\n inputRef.current?.focus()\n inputRef.current?.setSelectionRange(query.length, query.length)\n })\n\n return () => {\n window.cancelAnimationFrame(frameId)\n }\n }, [isOpen, query.length])\n\n if (!isOpen || typeof document === 'undefined') {\n return null\n }\n\n return createPortal(\n <div className=\"fixed inset-0 z-30 h-full w-full bg-base-100/50 backdrop-blur-lg\">\n <div className=\"absolute inset-0 z-1 bg-linear-to-b from-base-100 via-base-100 via-25% to-primary-muted-superlight dark:bg-linear-to-t\" />\n <LayoutComponent\n ref={contentRef}\n $size=\"sm\"\n className=\"mt-5 relative z-2 rounded-box bg-base-100/70 p-6 pt-6 shadow-lg shadow-primary-muted-light\"\n >\n <input\n placeholder=\"Search docs\"\n ref={inputRef}\n type=\"text\"\n className=\"input input-primary input-xl w-full\"\n value={query}\n onChange={(event) => onQueryChange(event.target.value)}\n />\n <div className=\"flex h-7 items-center px-4 text-xs text-base-muted\">\n {isLoading ? (\n <span className=\"flex items-center gap-1\">\n <span className=\"loading loading-dots loading-xs\" />\n Searching...\n </span>\n ) : normalizedQuery ? null : (\n <span className=\"flex items-center gap-1\">\n <MessageCircleQuestion className=\"size-3 shrink-0\" />\n Type at least {MIN_QUERY_LENGTH} characters.\n </span>\n )}\n </div>\n {normalizedQuery ? (\n isError ? (\n <div className=\"flex items-center gap-2 rounded-box border border-warning/40 bg-base-100 p-4 text-sm text-base-muted shadow-md shadow-primary-muted-light\">\n <TriangleAlert className=\"size-4 shrink-0 text-warning\" />\n Search is temporarily unavailable.\n </div>\n ) : !canSearch ? (\n <div className=\"text-sm text-base-muted\">Keep typing to search.</div>\n ) : !isLoading && results.length === 0 ? (\n <div className=\"text-sm text-base-muted\">No results found.</div>\n ) : (\n <div className=\"-mx-2 max-h-80 overflow-y-auto p-2\">\n <ul className=\"flex flex-col gap-2\">\n {results.map((result) => (\n <li key={result.href}>\n <a\n href={withSiteBaseUrl(result.href)}\n className=\"block rounded-box border border-base-muted-medium bg-base-100 p-4 shadow-md hover:border-primary-muted hover:bg-base-200\"\n onClick={onClose}\n >\n <div className=\"mb-2 flex items-center justify-start gap-2\">\n <div className=\"font-bold text-base-content\">{result.title}</div>\n {result.sectionTitle ? (\n <div className=\"flex items-center gap-1 text-sm text-base-muted-medium\">\n <ArrowRightFromLine className=\"size-3\" /> {result.sectionTitle}\n </div>\n ) : null}\n </div>\n {result.excerpt ? <p className=\"text-xs leading-5 text-base-muted\">{result.excerpt}</p> : null}\n </a>\n </li>\n ))}\n </ul>\n </div>\n )\n ) : null}\n </LayoutComponent>\n </div>,\n document.body,\n )\n}\n","import type { ResolvedDocsAlgoliaConfig } from '../../docs/types.js'\n\ntype DocsSearchResult = {\n href: string\n title: string\n excerpt?: string\n sectionTitle?: string\n}\n\ntype SearchAlgoliaResponse = {\n hits?: unknown[]\n}\n\ntype AlgoliaDocSearchHit = {\n url?: unknown\n url_without_anchor?: unknown\n type?: unknown\n category?: unknown\n content?: unknown\n hierarchy?: Record<string, unknown> | null\n _highlightResult?: {\n content?: {\n value?: unknown\n }\n } | null\n _snippetResult?: {\n content?: {\n value?: unknown\n }\n } | null\n}\n\nconst hierarchyLevels = ['lvl0', 'lvl1', 'lvl2', 'lvl3', 'lvl4', 'lvl5', 'lvl6'] as const\n\nconst stripHtml = (value: string) => value.replace(/<[^>]+>/g, '')\n\nconst normalizeString = (value: unknown) => {\n if (typeof value === 'string') {\n const normalized = stripHtml(value).replace(/\\s+/g, ' ').trim()\n return normalized || undefined\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value)\n }\n\n return undefined\n}\n\nconst getValueAtPath = (value: unknown, path: string): unknown => {\n if (!path) {\n return undefined\n }\n\n const segments = path.split('.').filter(Boolean)\n let currentValue = value\n\n for (const segment of segments) {\n if (!currentValue || typeof currentValue !== 'object' || Array.isArray(currentValue)) {\n return undefined\n }\n\n currentValue = (currentValue as Record<string, unknown>)[segment]\n }\n\n return currentValue\n}\n\nconst getMappedString = (value: unknown, path: string): string | undefined => {\n return normalizeString(getValueAtPath(value, path))\n}\n\nconst buildSearchUrl = (appId: string, indexName: string) => {\n return `https://${appId}-dsn.algolia.net/1/indexes/${encodeURIComponent(indexName)}/query`\n}\n\nconst getDocSearchHierarchyValue = (\n hierarchy: AlgoliaDocSearchHit['hierarchy'],\n level: (typeof hierarchyLevels)[number],\n) => {\n if (!hierarchy || typeof hierarchy !== 'object') {\n return undefined\n }\n\n return normalizeString(hierarchy[level])\n}\n\nconst getDocSearchTitleLevel = (hit: AlgoliaDocSearchHit) => {\n const levelFromType =\n typeof hit.type === 'string' && /^lvl[0-6]$/.test(hit.type) ? (hit.type as (typeof hierarchyLevels)[number]) : null\n\n if (levelFromType && getDocSearchHierarchyValue(hit.hierarchy, levelFromType)) {\n return levelFromType\n }\n\n return [...hierarchyLevels]\n .reverse()\n .find((level) => level !== 'lvl0' && getDocSearchHierarchyValue(hit.hierarchy, level))\n}\n\nconst getDocSearchFallbackResult = (hit: unknown): Partial<DocsSearchResult> => {\n const docSearchHit = hit as AlgoliaDocSearchHit\n const titleLevel = getDocSearchTitleLevel(docSearchHit)\n const title = titleLevel ? getDocSearchHierarchyValue(docSearchHit.hierarchy, titleLevel) : undefined\n const titleLevelIndex = titleLevel ? hierarchyLevels.indexOf(titleLevel) : -1\n const sectionTitle =\n hierarchyLevels\n .slice(0, Math.max(titleLevelIndex, 0))\n .reverse()\n .map((level) => getDocSearchHierarchyValue(docSearchHit.hierarchy, level))\n .find(Boolean) ?? normalizeString(docSearchHit.category)\n\n return {\n href: normalizeString(docSearchHit.url) ?? normalizeString(docSearchHit.url_without_anchor),\n title: title ?? normalizeString(docSearchHit.category),\n excerpt:\n normalizeString(docSearchHit._snippetResult?.content?.value) ??\n normalizeString(docSearchHit.content) ??\n normalizeString(docSearchHit._highlightResult?.content?.value),\n sectionTitle,\n }\n}\n\nconst mapHitToSearchResult = (hit: unknown, config: ResolvedDocsAlgoliaConfig): DocsSearchResult | null => {\n const docSearchFallback = getDocSearchFallbackResult(hit)\n const href = getMappedString(hit, config.fields.href) ?? docSearchFallback.href\n const title = getMappedString(hit, config.fields.title) ?? docSearchFallback.title\n\n if (!href || !title) {\n return null\n }\n\n const excerpt = getMappedString(hit, config.fields.excerpt) ?? docSearchFallback.excerpt\n const sectionTitle = getMappedString(hit, config.fields.sectionTitle) ?? docSearchFallback.sectionTitle\n\n return {\n href,\n title,\n excerpt,\n sectionTitle,\n }\n}\n\nexport const searchAlgoliaIndex = async (options: {\n config?: ResolvedDocsAlgoliaConfig | null\n query: string\n signal?: AbortSignal\n}) => {\n const { config, query, signal } = options\n\n if (!config) {\n throw new Error('Algolia search is not configured.')\n }\n\n const response = await fetch(buildSearchUrl(config.appId, config.indexName), {\n method: 'POST',\n signal,\n headers: {\n accept: 'application/json',\n 'content-type': 'application/json',\n 'x-algolia-api-key': config.apiKey,\n 'x-algolia-application-id': config.appId,\n },\n body: JSON.stringify({\n query,\n ...config.searchParams,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Algolia search request failed with status ${response.status}.`)\n }\n\n const data = (await response.json()) as SearchAlgoliaResponse\n\n return (data.hits ?? [])\n .map((hit) => mapHitToSearchResult(hit, config))\n .filter((result): result is DocsSearchResult => result !== null)\n}\n"],"mappings":"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","names":[]}