papyr-react 1.0.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 (64) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -0
  3. package/dist/blocks/WorkspaceBlock/WorkspaceBlock.d.ts +79 -0
  4. package/dist/blocks/index.d.ts +2 -0
  5. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +12 -0
  6. package/dist/components/Breadcrumbs/index.d.ts +2 -0
  7. package/dist/components/DoubleSidebarLayout/DoubleSidebarLayout.d.ts +49 -0
  8. package/dist/components/DoubleSidebarLayout/index.d.ts +2 -0
  9. package/dist/components/EmptyState/EmptyState.d.ts +31 -0
  10. package/dist/components/EmptyState/index.d.ts +2 -0
  11. package/dist/components/FileHierarchy/FileHierarchy.d.ts +19 -0
  12. package/dist/components/FileHierarchy/FileHierarchy.test.d.ts +1 -0
  13. package/dist/components/FileHierarchy/MemoizedFolderTree.d.ts +16 -0
  14. package/dist/components/FileHierarchy/index.d.ts +3 -0
  15. package/dist/components/FileHierarchy/types.d.ts +9 -0
  16. package/dist/components/FileHierarchy/utils.d.ts +5 -0
  17. package/dist/components/FileSearch/FileSearch.d.ts +27 -0
  18. package/dist/components/FileSearch/index.d.ts +2 -0
  19. package/dist/components/GraphView/GraphView.d.ts +19 -0
  20. package/dist/components/GraphView/index.d.ts +2 -0
  21. package/dist/components/HoverPreview/HoverPreview.d.ts +12 -0
  22. package/dist/components/HoverPreview/index.d.ts +2 -0
  23. package/dist/components/MiniGraph/MiniGraph.d.ts +8 -0
  24. package/dist/components/MiniGraph/MiniGraph.test.d.ts +1 -0
  25. package/dist/components/MiniGraph/index.d.ts +2 -0
  26. package/dist/components/NotePreview/NotePreviewContent.d.ts +14 -0
  27. package/dist/components/NotePreview/index.d.ts +2 -0
  28. package/dist/components/NoteViewer/NoteViewer.d.ts +15 -0
  29. package/dist/components/NoteViewer/NoteViewer.test.d.ts +1 -0
  30. package/dist/components/NoteViewer/index.d.ts +2 -0
  31. package/dist/components/SearchBar/SearchBar.d.ts +9 -0
  32. package/dist/components/SearchBar/index.d.ts +2 -0
  33. package/dist/components/SearchDropdown/SearchDropdown.d.ts +12 -0
  34. package/dist/components/SearchDropdown/index.d.ts +1 -0
  35. package/dist/components/SidebarLayout/SidebarLayout.d.ts +33 -0
  36. package/dist/components/SidebarLayout/index.d.ts +2 -0
  37. package/dist/components/TableOfContents/TableOfContents.d.ts +10 -0
  38. package/dist/components/TableOfContents/TableOfContents.test.d.ts +1 -0
  39. package/dist/components/TableOfContents/index.d.ts +1 -0
  40. package/dist/components/TagFilter/TagFilter.d.ts +9 -0
  41. package/dist/components/TagFilter/index.d.ts +2 -0
  42. package/dist/components/Toast/Toast.d.ts +11 -0
  43. package/dist/components/index.d.ts +16 -0
  44. package/dist/hooks/index.d.ts +3 -0
  45. package/dist/hooks/useActiveNote.d.ts +27 -0
  46. package/dist/hooks/useActiveNote.test.d.ts +1 -0
  47. package/dist/hooks/useNotes.d.ts +3 -0
  48. package/dist/hooks/useRoutableActiveNote.d.ts +16 -0
  49. package/dist/index.d.ts +6 -0
  50. package/dist/index.js +3178 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/providers/PapyrProvider.d.ts +24 -0
  53. package/dist/providers/index.d.ts +2 -0
  54. package/dist/style.css +1548 -0
  55. package/dist/styles/index.d.ts +0 -0
  56. package/dist/types/index.d.ts +1 -0
  57. package/dist/utils/graphUtils.d.ts +18 -0
  58. package/dist/utils/hydration.d.ts +8 -0
  59. package/dist/utils/index.d.ts +3 -0
  60. package/dist/utils/linkUtils.d.ts +10 -0
  61. package/package.json +87 -0
  62. package/src/styles/index.ts +2 -0
  63. package/src/styles/theme.css +184 -0
  64. package/style.css +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/components/GraphView/GraphView.tsx","../src/components/MiniGraph/MiniGraph.tsx","../src/utils/graphUtils.ts","../src/utils/linkUtils.ts","../src/utils/hydration.ts","../src/components/HoverPreview/HoverPreview.tsx","../src/components/NotePreview/NotePreviewContent.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/hooks/useNotes.ts","../src/components/Toast/Toast.tsx","../src/providers/PapyrProvider.tsx","../src/components/NoteViewer/NoteViewer.tsx","../src/components/SearchBar/SearchBar.tsx","../src/components/TagFilter/TagFilter.tsx","../src/components/SearchDropdown/SearchDropdown.tsx","../src/components/FileSearch/FileSearch.tsx","../src/components/FileHierarchy/utils.ts","../src/components/FileHierarchy/MemoizedFolderTree.tsx","../src/components/FileHierarchy/FileHierarchy.tsx","../src/components/EmptyState/EmptyState.tsx","../src/components/SidebarLayout/SidebarLayout.tsx","../src/components/DoubleSidebarLayout/DoubleSidebarLayout.tsx","../src/components/TableOfContents/TableOfContents.tsx","../src/hooks/useActiveNote.ts","../src/hooks/useRoutableActiveNote.ts","../src/blocks/WorkspaceBlock/WorkspaceBlock.tsx"],"sourcesContent":["import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport clsx from 'clsx'\nimport type { GraphNode, NoteGraph, Slug } from 'papyr-core/runtime'\nimport { select } from 'd3-selection'\nimport {\n zoom,\n zoomIdentity,\n type D3ZoomEvent,\n type ZoomBehavior,\n type ZoomTransform\n} from 'd3-zoom'\nimport { drag, type D3DragEvent } from 'd3-drag'\nimport {\n forceCenter,\n forceCollide,\n forceLink,\n forceManyBody,\n forceSimulation,\n type Simulation,\n type SimulationLinkDatum,\n type SimulationNodeDatum\n} from 'd3-force'\nimport styles from './GraphView.module.css'\n\ninterface GraphCanvasProps {\n graph: NoteGraph | null\n className?: string\n filterNode?: (node: GraphNode) => boolean\n focusPredicate?: (node: GraphNode) => boolean\n nodeColor?: (node: GraphNode) => string\n zoomExtent?: [number, number]\n focusNodeId?: string | null\n onNodeSelect?: (node: GraphNode) => void\n}\n\ninterface GraphNodeDatum extends SimulationNodeDatum {\n id: string\n node: GraphNode\n radius: number\n color: string\n weight: number\n textWidth?: number\n textHeight?: number\n x?: number\n y?: number\n}\n\ninterface GraphLinkDatum extends SimulationLinkDatum<GraphNodeDatum> {\n uid: string\n}\n\nconst TEXT_FALLBACK_CHAR_WIDTH = 8.5\nconst TEXT_FALLBACK_HEIGHT = 15\nconst LABEL_MIN_WIDTH = 40\nconst LABEL_GAP_Y = 8\nconst LABEL_EXTRA_PAD_X = 8\nconst LABEL_EXTRA_PAD_Y = 6\nconst TEXT_STROKE_PAD = 2\nconst AUTO_ZOOM_PADDING = 48\nconst DEFAULT_ZOOM_EXTENT: [number, number] = [0.35, 4]\nconst LABEL_FONT_BASE_PX = 11\nconst LABEL_FONT_DISPLAY_SCALE = 1\nconst LABEL_FONT_SCALE_MIN = 0.8\nconst LABEL_FONT_SCALE_MAX = 1.5\nconst NODE_RADIUS_MIN = 5\nconst NODE_RADIUS_MAX = 14\nconst NODE_RADIUS_POWER = 0.5\nconst NODE_RADIUS_SCALE = 1\n// Keep radii scaling in the simulation so fit-to-screen and focus math see the true geometry.\nconst NODE_RADIUS_MIN_SCALED = NODE_RADIUS_MIN * NODE_RADIUS_SCALE\n\ntype PositionedGraphNodeDatum = GraphNodeDatum & Required<Pick<GraphNodeDatum, 'x' | 'y'>>\n\nconst hasNodePosition = (node: GraphNodeDatum): node is PositionedGraphNodeDatum => {\n return (\n typeof node.x === 'number' &&\n Number.isFinite(node.x) &&\n typeof node.y === 'number' &&\n Number.isFinite(node.y)\n )\n}\n\nfunction getNodeLabelSize(d: GraphNodeDatum, labelScale = 1) {\n const text = d.node.label ?? d.node.id\n const width =\n (d.textWidth ?? Math.max(text.length * TEXT_FALLBACK_CHAR_WIDTH, LABEL_MIN_WIDTH)) +\n TEXT_STROKE_PAD\n const height = (d.textHeight ?? TEXT_FALLBACK_HEIGHT) + TEXT_STROKE_PAD\n return { width: width * labelScale, height: height * labelScale }\n}\n\nfunction getNodeVisualExtent(d: GraphNodeDatum, labelScale = 1) {\n const r = d.radius\n const { width, height } = getNodeLabelSize(d, labelScale)\n const halfWidth = Math.max(r, width / 2) + LABEL_EXTRA_PAD_X\n const top = r + LABEL_EXTRA_PAD_Y\n const bottom = r + LABEL_GAP_Y + height + LABEL_EXTRA_PAD_Y\n return { halfWidth, top, bottom }\n}\n\ninterface GraphBounds {\n minX: number\n maxX: number\n minY: number\n maxY: number\n}\n\nconst clamp = (value: number, min: number, max: number) => {\n if (value < min) {\n return min\n }\n if (value > max) {\n return max\n }\n return value\n}\n\nconst computeGraphBounds = (\n nodes: Iterable<GraphNodeDatum>,\n labelScale = 1\n): GraphBounds | null => {\n let minX = Infinity\n let maxX = -Infinity\n let minY = Infinity\n let maxY = -Infinity\n let hasAny = false\n\n for (const node of nodes) {\n if (!hasNodePosition(node)) {\n continue\n }\n const { halfWidth, top, bottom } = getNodeVisualExtent(node, labelScale)\n const nodeMinX = node.x - halfWidth\n const nodeMaxX = node.x + halfWidth\n const nodeMinY = node.y - top\n const nodeMaxY = node.y + bottom\n\n hasAny = true\n if (nodeMinX < minX) minX = nodeMinX\n if (nodeMaxX > maxX) maxX = nodeMaxX\n if (nodeMinY < minY) minY = nodeMinY\n if (nodeMaxY > maxY) maxY = nodeMaxY\n }\n\n if (!hasAny) {\n return null\n }\n\n return { minX, maxX, minY, maxY }\n}\n\n\ninterface NormalizedGraphData {\n nodes: GraphNode[]\n links: Array<{ source: string; target: string }>\n adjacency: Map<string, Set<string>>\n}\n\nconst NODE_COLOR_FALLBACK = 'var(--papyr-graph-node, rgba(255, 255, 255, 0.85))'\nconst NODE_OUTLINE = 'var(--papyr-graph-stroke, rgba(0, 0, 0, 0.25))'\nconst LINK_COLOR = 'var(--papyr-graph-link, rgba(255, 255, 255, 0.25))'\nconst LINK_HIGHLIGHT_COLOR = 'var(--papyr-graph-link-active, rgba(255, 255, 255, 0.6))'\nconst LINK_STROKE_WIDTH = 1\nconst LINK_HIGHLIGHT_STROKE_WIDTH = 1.5\nconst BASE_LINK_OPACITY = 0.7\nconst DIMMED_LINK_OPACITY = 0.08\nconst FOCUS_LINK_OPACITY = 0.7\nconst HIGHLIGHT_LINK_OPACITY = 1\nconst DIMMED_NODE_OPACITY = 0.4\n\nfunction normalizeGraph(graph: NoteGraph | null, filterNode?: (node: GraphNode) => boolean): NormalizedGraphData {\n if (!graph) {\n return {\n nodes: [],\n links: [],\n adjacency: new Map()\n }\n }\n\n const nodes: GraphNode[] = []\n const adjacency = new Map<string, Set<string>>()\n\n for (const [, node] of graph.nodes) {\n if (filterNode && !filterNode(node)) {\n continue\n }\n nodes.push(node)\n adjacency.set(node.id, new Set())\n }\n\n if (nodes.length === 0) {\n return { nodes, links: [], adjacency }\n }\n\n const allowed = new Set(nodes.map(node => node.id))\n const links: NormalizedGraphData['links'] = []\n for (const edge of graph.edges) {\n const { source, target } = edge\n if (!allowed.has(source) || !allowed.has(target) || source === target) {\n continue\n }\n adjacency.get(source)?.add(target)\n adjacency.get(target)?.add(source)\n links.push({ source, target })\n }\n\n return { nodes, links, adjacency }\n}\n\nfunction getNeighborhood(graph: NoteGraph, slug: string): Set<string> {\n const neighbors = new Set<string>([slug])\n graph.edges.forEach(edge => {\n if (edge.source === slug) {\n neighbors.add(edge.target)\n }\n if (edge.target === slug) {\n neighbors.add(edge.source)\n }\n })\n return neighbors\n}\n\nconst resolveLinkEndpointId = (\n value: string | number | GraphNodeDatum\n): string => {\n if (typeof value === 'string') {\n return value\n }\n if (typeof value === 'number') {\n return String(value)\n }\n return value.id\n}\n\nconst resolveLinkCoordinate = (\n value: string | number | GraphNodeDatum,\n axis: 'x' | 'y'\n): number => {\n if (typeof value === 'object' && value !== null) {\n return axis === 'x' ? value.x ?? 0 : value.y ?? 0\n }\n return 0\n}\n\nconst GraphCanvas = ({\n graph,\n className,\n filterNode,\n focusPredicate,\n nodeColor,\n zoomExtent,\n focusNodeId = null,\n onNodeSelect\n}: GraphCanvasProps) => {\n const containerRef = useRef<HTMLDivElement | null>(null)\n const svgRef = useRef<SVGSVGElement | null>(null)\n const zoomBehaviorRef = useRef<ZoomBehavior<SVGSVGElement, unknown> | null>(null)\n const transformRef = useRef<ZoomTransform>(zoomIdentity)\n const simulationRef = useRef<Simulation<GraphNodeDatum, GraphLinkDatum> | null>(null)\n const nodeLookupRef = useRef<Map<string, GraphNodeDatum>>(new Map())\n const hoveredNodeRef = useRef<string | null>(null)\n const pendingFocusRef = useRef<string | null>(null)\n const draggingNodeRef = useRef<string | null>(null)\n const labelLayerRef = useRef<SVGGElement | null>(null)\n const autoZoomPendingRef = useRef(false)\n const autoZoomFrameRef = useRef<number | null>(null)\n const autoZoomReadyRef = useRef(false)\n const labelFontScaleRef = useRef(LABEL_FONT_DISPLAY_SCALE)\n const [activeNode, setActiveNode] = useState<string | null>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n\n useLayoutEffect(() => {\n const element = containerRef.current\n if (!element) {\n return\n }\n const observer = new ResizeObserver(entries => {\n const entry = entries[0]\n if (!entry) {\n return\n }\n const { width, height } = entry.contentRect\n setDimensions({\n width: Math.max(200, Math.floor(width)),\n height: Math.max(240, Math.floor(height))\n })\n })\n\n observer.observe(element)\n return () => observer.disconnect()\n }, [])\n\n const normalized = useMemo(() => normalizeGraph(graph, filterNode), [graph, filterNode])\n const hasGraph = normalized.nodes.length > 0\n const resolvedZoomExtent = zoomExtent ?? DEFAULT_ZOOM_EXTENT\n\n useEffect(() => {\n setActiveNode(focusNodeId ?? null)\n }, [focusNodeId])\n\n const focusMatches = useMemo(() => {\n if (!focusPredicate) {\n return null\n }\n const matches = new Set<string>()\n for (const node of normalized.nodes) {\n if (focusPredicate(node)) {\n matches.add(node.id)\n }\n }\n return matches\n }, [focusPredicate, normalized.nodes])\n\n const resolvedNodeColor = useCallback(\n (node: GraphNode): string => {\n if (nodeColor) {\n return nodeColor(node)\n }\n return NODE_COLOR_FALLBACK\n },\n [nodeColor]\n )\n\n const { nodeWeights, maxWeight } = useMemo(() => {\n const weights = new Map<string, number>()\n let currentMax = 0\n for (const node of normalized.nodes) {\n const metadataWeight =\n typeof node.metadata?.weight === 'number' ? node.metadata.weight : null\n const degree = normalized.adjacency.get(node.id)?.size ?? 0\n const weight = metadataWeight ?? degree\n weights.set(node.id, weight)\n if (weight > currentMax) {\n currentMax = weight\n }\n }\n return { nodeWeights: weights, maxWeight: currentMax }\n }, [normalized])\n\n const resolveNodeRadius = useCallback(\n (weight: number) => {\n if (!maxWeight || !Number.isFinite(maxWeight) || maxWeight <= 0) {\n return NODE_RADIUS_MIN_SCALED\n }\n if (!Number.isFinite(weight) || weight <= 0) {\n return NODE_RADIUS_MIN_SCALED\n }\n const normalizedWeight = clamp(weight / maxWeight, 0, 1)\n const eased = Math.pow(normalizedWeight, NODE_RADIUS_POWER)\n const base = NODE_RADIUS_MIN + eased * (NODE_RADIUS_MAX - NODE_RADIUS_MIN)\n return base * NODE_RADIUS_SCALE\n },\n [maxWeight]\n )\n\n const nodeData = useMemo<GraphNodeDatum[]>(() => {\n return normalized.nodes.map(node => {\n const weight = nodeWeights.get(node.id) ?? 0\n return {\n id: node.id,\n node,\n weight,\n radius: resolveNodeRadius(weight),\n color: resolvedNodeColor(node)\n }\n })\n }, [normalized.nodes, nodeWeights, resolveNodeRadius, resolvedNodeColor])\n\n const linkData = useMemo<GraphLinkDatum[]>(() => {\n return normalized.links.map((link, index) => ({\n source: link.source,\n target: link.target,\n uid: `${link.source}::${link.target}::${index}`\n }))\n }, [normalized.links])\n\n const handleDefaultNavigation = useCallback((node: GraphNode) => {\n if (typeof window === 'undefined') {\n return\n }\n const permalink = typeof node.metadata?.permalink === 'string' ? node.metadata.permalink : null\n const fallback = `#/note/${node.id}`\n const target = permalink && permalink.length > 0 ? permalink : fallback\n window.open(target, '_self')\n }, [])\n\n const focusOnNode = useCallback(\n (datum: GraphNodeDatum) => {\n if (!svgRef.current || !zoomBehaviorRef.current) {\n return false\n }\n if (!hasNodePosition(datum)) {\n return false\n }\n if (!dimensions.width || !dimensions.height) {\n return false\n }\n\n const currentScale = transformRef.current?.k ?? 1\n const tx = dimensions.width / 2 - currentScale * datum.x\n const ty = dimensions.height / 2 - currentScale * datum.y\n const nextTransform = zoomIdentity.translate(tx, ty).scale(currentScale)\n\n transformRef.current = nextTransform\n select(svgRef.current).call(zoomBehaviorRef.current.transform, nextTransform)\n return true\n },\n [dimensions.height, dimensions.width]\n )\n\n const cancelAutoZoomFrame = useCallback(() => {\n if (typeof window === 'undefined') {\n return\n }\n if (autoZoomFrameRef.current !== null) {\n window.cancelAnimationFrame(autoZoomFrameRef.current)\n autoZoomFrameRef.current = null\n }\n }, [])\n\n const applyLabelFontSize = useCallback(\n (zoomScale: number) => {\n if (!labelLayerRef.current) {\n return\n }\n const safeScale = clamp(zoomScale, 0.15, 6)\n const labelScale = clamp(\n LABEL_FONT_DISPLAY_SCALE / safeScale,\n LABEL_FONT_SCALE_MIN,\n LABEL_FONT_SCALE_MAX\n )\n labelFontScaleRef.current = labelScale\n const fontSizePx = LABEL_FONT_BASE_PX * labelScale\n select(labelLayerRef.current)\n .selectAll<SVGTextElement, GraphNodeDatum>('text[data-label]')\n .style('font-size', `${fontSizePx}px`)\n },\n []\n )\n\n const applyAutoZoom = useCallback(() => {\n if (!svgRef.current || !zoomBehaviorRef.current) {\n return false\n }\n if (!dimensions.width || !dimensions.height) {\n return false\n }\n\n const bounds = computeGraphBounds(nodeLookupRef.current.values(), labelFontScaleRef.current)\n if (!bounds) {\n return false\n }\n\n const boundsWidth = bounds.maxX - bounds.minX\n const boundsHeight = bounds.maxY - bounds.minY\n if (!Number.isFinite(boundsWidth) || !Number.isFinite(boundsHeight)) {\n return false\n }\n\n const innerWidth = Math.max(1, dimensions.width - AUTO_ZOOM_PADDING * 2)\n const innerHeight = Math.max(1, dimensions.height - AUTO_ZOOM_PADDING * 2)\n const rawScale = Math.min(\n 1,\n innerWidth / Math.max(boundsWidth, 1),\n innerHeight / Math.max(boundsHeight, 1)\n )\n\n if (!Number.isFinite(rawScale) || rawScale <= 0) {\n return false\n }\n\n const [providedMin, providedMax] = resolvedZoomExtent\n const minScale = Math.min(providedMin, rawScale)\n const maxScale = providedMax\n const scale = clamp(rawScale, minScale, maxScale)\n\n let targetX = (bounds.minX + bounds.maxX) / 2\n let targetY = (bounds.minY + bounds.maxY) / 2\n const focusId = pendingFocusRef.current ?? activeNode\n if (focusId) {\n const focusNode = nodeLookupRef.current.get(focusId)\n if (focusNode && hasNodePosition(focusNode)) {\n targetX = focusNode.x\n targetY = focusNode.y\n }\n }\n\n const tx = dimensions.width / 2 - scale * targetX\n const ty = dimensions.height / 2 - scale * targetY\n const nextTransform = zoomIdentity.translate(tx, ty).scale(scale)\n\n transformRef.current = nextTransform\n const behavior = zoomBehaviorRef.current\n behavior.scaleExtent([minScale, maxScale])\n select(svgRef.current).call(behavior.transform, nextTransform)\n return true\n }, [activeNode, dimensions.height, dimensions.width, resolvedZoomExtent])\n\n const scheduleAutoZoom = useCallback(() => {\n if (typeof window === 'undefined') {\n return\n }\n autoZoomPendingRef.current = true\n if (autoZoomFrameRef.current !== null) {\n return\n }\n const tick = () => {\n autoZoomFrameRef.current = null\n if (!autoZoomPendingRef.current) {\n return\n }\n const applied = applyAutoZoom()\n if (applied) {\n autoZoomPendingRef.current = false\n return\n }\n autoZoomFrameRef.current = window.requestAnimationFrame(tick)\n }\n autoZoomFrameRef.current = window.requestAnimationFrame(tick)\n }, [applyAutoZoom])\n\n const flushPendingFocus = useCallback(() => {\n const targetId = pendingFocusRef.current\n if (!targetId) {\n return\n }\n const node = nodeLookupRef.current.get(targetId)\n if (!node) {\n return\n }\n const didFocus = focusOnNode(node)\n if (didFocus) {\n pendingFocusRef.current = null\n }\n }, [focusOnNode])\n\n useEffect(() => {\n return () => {\n autoZoomPendingRef.current = false\n cancelAutoZoomFrame()\n }\n }, [cancelAutoZoomFrame])\n\n useEffect(() => {\n if (!hasGraph) {\n autoZoomPendingRef.current = false\n cancelAutoZoomFrame()\n return\n }\n if (!autoZoomReadyRef.current) {\n return\n }\n scheduleAutoZoom()\n }, [\n hasGraph,\n scheduleAutoZoom,\n cancelAutoZoomFrame,\n dimensions.height,\n dimensions.width,\n resolvedZoomExtent\n ])\n\n const requestFocusNode = useCallback(\n (nodeId: string | null) => {\n pendingFocusRef.current = nodeId\n if (!nodeId) {\n return\n }\n flushPendingFocus()\n },\n [flushPendingFocus]\n )\n\n const handleNodeSelection = useCallback(\n (datum: GraphNodeDatum) => {\n setActiveNode(datum.id)\n const didFocus = focusOnNode(datum)\n pendingFocusRef.current = didFocus ? null : datum.id\n if (onNodeSelect) {\n onNodeSelect(datum.node)\n } else {\n handleDefaultNavigation(datum.node)\n }\n },\n [focusOnNode, handleDefaultNavigation, onNodeSelect]\n )\n\n useEffect(() => {\n requestFocusNode(focusNodeId ?? null)\n if (simulationRef.current && focusNodeId) {\n const sim = simulationRef.current\n if (sim.alpha() < 0.1) {\n sim.alpha(0.3).restart()\n }\n }\n }, [focusNodeId, requestFocusNode])\n\n const applyHighlight = useCallback(\n (hoveredId: string | null) => {\n if (!svgRef.current) {\n return\n }\n\n const svg = select(svgRef.current)\n const nodesSelection = svg.selectAll<SVGCircleElement, GraphNodeDatum>('circle[data-node]')\n const linksSelection = svg.selectAll<SVGLineElement, GraphLinkDatum>('line[data-link]')\n const labelsSelection = svg.selectAll<SVGTextElement, GraphNodeDatum>('text[data-label]')\n\n const highlightId = hoveredId\n const hoveredSet = highlightId\n ? new Set<string>([\n highlightId,\n ...Array.from(normalized.adjacency.get(highlightId) ?? [])\n ])\n : null\n const focusSet = focusMatches && focusMatches.size > 0 ? focusMatches : null\n\n nodesSelection\n .classed(styles.isActive, (d: GraphNodeDatum) => d.id === activeNode)\n .style('opacity', (d: GraphNodeDatum) => {\n if (hoveredSet) {\n return hoveredSet.has(d.id) ? 1 : DIMMED_NODE_OPACITY\n }\n if (focusSet) {\n return focusSet.has(d.id) ? 1 : DIMMED_NODE_OPACITY\n }\n return 1\n })\n\n linksSelection\n .style('opacity', (d: GraphLinkDatum) => {\n const sourceId = resolveLinkEndpointId(d.source)\n const targetId = resolveLinkEndpointId(d.target)\n if (highlightId) {\n return sourceId === highlightId || targetId === highlightId\n ? HIGHLIGHT_LINK_OPACITY\n : DIMMED_LINK_OPACITY\n }\n if (focusSet) {\n return focusSet.has(sourceId) && focusSet.has(targetId)\n ? FOCUS_LINK_OPACITY\n : DIMMED_LINK_OPACITY\n }\n return BASE_LINK_OPACITY\n })\n .attr('stroke-width', hoveredId ? LINK_HIGHLIGHT_STROKE_WIDTH : LINK_STROKE_WIDTH)\n .attr('stroke', (d: GraphLinkDatum) => {\n const sourceId = resolveLinkEndpointId(d.source)\n const targetId = resolveLinkEndpointId(d.target)\n if (highlightId && (sourceId === highlightId || targetId === highlightId)) {\n return LINK_HIGHLIGHT_COLOR\n }\n return LINK_COLOR\n })\n\n labelsSelection.style('opacity', (d: GraphNodeDatum) => {\n if (hoveredSet) {\n return hoveredSet.has(d.id) ? 1 : 0.4\n }\n if (focusSet && focusSet.has(d.id)) {\n return 1\n }\n return 0.7\n })\n },\n [activeNode, focusMatches, normalized.adjacency]\n )\n\n useEffect(() => {\n if (!svgRef.current) {\n return\n }\n\n const svg = select(svgRef.current)\n const viewport = svg.select<SVGGElement>('g[data-viewport]')\n const linkLayer = viewport.select<SVGGElement>('g[data-links]')\n const nodeLayer = viewport.select<SVGGElement>('g[data-nodes]')\n const labelLayer = viewport.select<SVGGElement>('g[data-labels]')\n\n const nodes: GraphNodeDatum[] = nodeData.map(datum => ({ ...datum }))\n const links: GraphLinkDatum[] = linkData.map(link => ({ ...link }))\n\n nodeLookupRef.current = new Map(nodes.map(node => [node.id, node]))\n autoZoomReadyRef.current = false\n autoZoomPendingRef.current = false\n cancelAutoZoomFrame()\n pendingFocusRef.current = focusNodeId ?? null\n if (focusNodeId) {\n const focusNode = nodes.find(n => n.id === focusNodeId)\n if (focusNode) {\n focusNode.fx = 0\n focusNode.fy = 0\n focusNode.x = 0\n focusNode.y = 0\n }\n }\n\n const linkSelection = linkLayer\n .selectAll<SVGLineElement, GraphLinkDatum>('line[data-link]')\n .data(links, (d: GraphLinkDatum) => d.uid)\n linkSelection.exit().remove()\n const linkEnter = linkSelection\n .enter()\n .append('line')\n .attr('data-link', 'true')\n .attr('stroke-width', LINK_STROKE_WIDTH)\n .attr('stroke', LINK_COLOR)\n .attr('stroke-linecap', 'round')\n const mergedLinks = linkEnter.merge(linkSelection)\n\n labelLayerRef.current = labelLayer.node()\n\n const labelSelection = labelLayer\n .selectAll<SVGTextElement, GraphNodeDatum>('text[data-label]')\n .data(nodes, (d: GraphNodeDatum) => d.id)\n labelSelection.exit().remove()\n const labelEnter = labelSelection\n .enter()\n .append('text')\n .attr('data-label', 'true')\n .attr('class', styles.label)\n .attr('text-anchor', 'middle')\n .attr('alignment-baseline', 'hanging')\n .attr('dy', (d: GraphNodeDatum) => `${d.radius + 8}px`)\n .style('opacity', 1)\n .text((d: GraphNodeDatum) => d.node.label ?? d.node.id)\n const mergedLabels = labelEnter.merge(labelSelection)\n mergedLabels.style(\n 'font-size',\n `${LABEL_FONT_BASE_PX * labelFontScaleRef.current}px`\n )\n\n requestAnimationFrame(() => {\n mergedLabels.each(function(d: GraphNodeDatum) {\n const textElement = this as SVGTextElement\n try {\n const currentX = textElement.getAttribute('x')\n const currentY = textElement.getAttribute('y')\n if (!currentX || !currentY || currentX === '0' || currentY === '0') {\n textElement.setAttribute('x', '0')\n textElement.setAttribute('y', '0')\n }\n const bbox = textElement.getBBox()\n const baseScale = labelFontScaleRef.current || 1\n d.textWidth = bbox.width / baseScale\n d.textHeight = bbox.height / baseScale\n } catch {\n const text = d.node.label ?? d.node.id\n d.textWidth = text.length * TEXT_FALLBACK_CHAR_WIDTH\n d.textHeight = TEXT_FALLBACK_HEIGHT\n }\n })\n })\n\n const nodeSelection = nodeLayer\n .selectAll<SVGCircleElement, GraphNodeDatum>('circle[data-node]')\n .data(nodes, (d: GraphNodeDatum) => d.id)\n nodeSelection.exit().remove()\n const nodeEnter = nodeSelection\n .enter()\n .append('circle')\n .attr('data-node', 'true')\n .attr('class', styles.node)\n .attr('fill', (d: GraphNodeDatum) => d.color)\n .attr('stroke', NODE_OUTLINE)\n .attr('stroke-width', 1)\n .attr('r', (d: GraphNodeDatum) => d.radius)\n .on('mouseenter', (_event: PointerEvent, datum: GraphNodeDatum) => {\n hoveredNodeRef.current = datum.id\n applyHighlight(datum.id)\n })\n .on('mouseleave', (_event: PointerEvent, datum: GraphNodeDatum) => {\n if (draggingNodeRef.current === datum.id) {\n return\n }\n hoveredNodeRef.current = null\n applyHighlight(null)\n })\n .on('click', (event: MouseEvent, datum: GraphNodeDatum) => {\n event.stopPropagation()\n handleNodeSelection(datum)\n })\n nodeEnter.append('title').text((d: GraphNodeDatum) => d.node.label ?? d.node.id)\n const mergedNodes = nodeEnter.merge(nodeSelection)\n\n const centerX = focusNodeId ? 0 : dimensions.width / 2\n const centerY = focusNodeId ? 0 : dimensions.height / 2 - 20\n\n const simulation = forceSimulation(nodes)\n .force(\n 'link',\n forceLink<GraphNodeDatum, GraphLinkDatum>(links)\n .id(d => d.id)\n .distance(() => 135)\n .strength(0.18)\n )\n .force('charge', forceManyBody<GraphNodeDatum>().strength(-320))\n .force(\n 'collision',\n forceCollide<GraphNodeDatum>().radius(d => {\n const { halfWidth, top, bottom } = getNodeVisualExtent(d, labelFontScaleRef.current)\n return Math.max(halfWidth, top, bottom)\n })\n )\n .force('center', forceCenter(centerX, centerY))\n .alphaDecay(0.07)\n .alpha(0.9);\n\n let tickCount = 0\n simulation.on('tick', () => {\n tickCount += 1\n\n mergedLinks\n .attr('x1', d => resolveLinkCoordinate(d.source, 'x'))\n .attr('y1', d => resolveLinkCoordinate(d.source, 'y'))\n .attr('x2', d => resolveLinkCoordinate(d.target, 'x'))\n .attr('y2', d => resolveLinkCoordinate(d.target, 'y'))\n\n mergedNodes\n .attr('cx', d => d.x ?? 0)\n .attr('cy', d => d.y ?? 0)\n\n mergedLabels\n .attr('x', d => d.x ?? 0)\n .attr('y', d => {\n const y = d.y ?? 0\n const radius = d.radius\n return y + radius + LABEL_GAP_Y\n })\n .each(function (d: GraphNodeDatum) {\n if (d.textWidth === undefined || d.textHeight === undefined) {\n const textElement = this as SVGTextElement\n try {\n const bbox = textElement.getBBox()\n d.textWidth = bbox.width\n d.textHeight = bbox.height\n } catch {\n const text = d.node.label ?? d.node.id\n d.textWidth = Math.max(\n text.length * TEXT_FALLBACK_CHAR_WIDTH,\n LABEL_MIN_WIDTH\n )\n d.textHeight = TEXT_FALLBACK_HEIGHT\n }\n }\n })\n\n const alpha = simulation.alpha()\n\n if (pendingFocusRef.current && tickCount >= 10 && alpha < 0.3) {\n flushPendingFocus()\n }\n\n if (alpha < 0.02) {\n simulation.stop()\n if (pendingFocusRef.current) {\n flushPendingFocus()\n setTimeout(() => {\n if (pendingFocusRef.current) {\n flushPendingFocus()\n }\n }, 50)\n setTimeout(() => {\n if (pendingFocusRef.current) {\n flushPendingFocus()\n }\n }, 200)\n }\n }\n })\n\n simulationRef.current = simulation\n\n const dragBehavior = drag<SVGCircleElement, GraphNodeDatum>()\n .on('start', (event: D3DragEvent<SVGCircleElement, GraphNodeDatum, GraphNodeDatum>) => {\n if (!event.active) {\n simulation.alphaTarget(0.3).restart()\n }\n draggingNodeRef.current = event.subject.id\n hoveredNodeRef.current = event.subject.id\n applyHighlight(event.subject.id)\n event.subject.fx = event.subject.x\n event.subject.fy = event.subject.y\n })\n .on('drag', (event: D3DragEvent<SVGCircleElement, GraphNodeDatum, GraphNodeDatum>) => {\n event.subject.fx = event.x\n event.subject.fy = event.y\n hoveredNodeRef.current = event.subject.id\n applyHighlight(event.subject.id)\n })\n .on('end', (event: D3DragEvent<SVGCircleElement, GraphNodeDatum, GraphNodeDatum>) => {\n if (!event.active) {\n simulation.alphaTarget(0)\n }\n draggingNodeRef.current = null\n event.subject.fx = null\n event.subject.fy = null\n hoveredNodeRef.current = null\n applyHighlight(null)\n })\n\n mergedNodes.call(dragBehavior)\n applyLabelFontSize(transformRef.current?.k ?? 1)\n applyHighlight(hoveredNodeRef.current)\n flushPendingFocus()\n\n if (nodes.length === 0) {\n autoZoomReadyRef.current = false\n autoZoomPendingRef.current = false\n cancelAutoZoomFrame()\n } else {\n const warmupIterations = Math.min(80, 16 + nodes.length * 2)\n for (let i = 0; i < warmupIterations; i += 1) {\n simulation.tick()\n }\n autoZoomReadyRef.current = true\n scheduleAutoZoom()\n simulation.alpha(0.4).restart()\n }\n\n return () => {\n simulation.stop()\n }\n }, [\n dimensions.height,\n dimensions.width,\n handleNodeSelection,\n linkData,\n nodeData,\n applyHighlight,\n applyLabelFontSize,\n flushPendingFocus,\n focusNodeId,\n cancelAutoZoomFrame,\n scheduleAutoZoom\n ])\n\n useEffect(() => {\n if (!svgRef.current) {\n return\n }\n\n const svg = select(svgRef.current)\n svg.attr('width', dimensions.width || 600)\n svg.attr('height', dimensions.height || 400)\n\n if (simulationRef.current) {\n const centerX = focusNodeId ? 0 : dimensions.width / 2\n const centerY = focusNodeId ? 0 : dimensions.height / 2 - 20\n simulationRef.current.force('center', forceCenter(centerX, centerY))\n simulationRef.current.alpha(0.4).restart()\n }\n }, [dimensions.height, dimensions.width, focusNodeId])\n\n useEffect(() => {\n if (!svgRef.current) {\n return\n }\n\n const svg = select(svgRef.current)\n const viewport = svg.select('g[data-viewport]')\n const behavior = zoom<SVGSVGElement, unknown>()\n .scaleExtent(resolvedZoomExtent)\n .on('zoom', (event: D3ZoomEvent<SVGSVGElement, unknown>) => {\n transformRef.current = event.transform\n viewport.attr('transform', event.transform.toString())\n applyLabelFontSize(event.transform.k)\n })\n\n zoomBehaviorRef.current = behavior\n svg.call(behavior as any)\n\n return () => {\n svg.on('.zoom', null)\n }\n }, [applyLabelFontSize, resolvedZoomExtent])\n\n useEffect(() => {\n applyHighlight(hoveredNodeRef.current)\n }, [applyHighlight])\n\n return (\n <div ref={containerRef} className={clsx(styles.root, className)} data-papyr-component=\"GraphView\">\n <svg ref={svgRef} className={styles.canvas} role=\"img\" aria-label=\"Publish graph\">\n <g data-viewport>\n <g data-links />\n <g data-nodes />\n <g data-labels />\n </g>\n </svg>\n {!hasGraph && (\n <div className={styles.emptyState}>\n No published links to explore yet.\n </div>\n )}\n </div>\n )\n}\n\nconst isBrowser = typeof document !== 'undefined'\n\nexport interface GraphViewProps extends GraphCanvasProps {\n activeSlug?: Slug | null\n showFullscreenToggle?: boolean\n fullscreenTitle?: string\n}\n\nexport const GraphView = ({\n graph,\n className,\n activeSlug = null,\n filterNode,\n focusPredicate,\n nodeColor,\n zoomExtent,\n onNodeSelect,\n showFullscreenToggle = true,\n fullscreenTitle = 'Full site graph'\n}: GraphViewProps) => {\n const [isFullscreen, setIsFullscreen] = useState(false)\n\n useEffect(() => {\n if (!isFullscreen || !isBrowser) {\n return\n }\n const previous = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n document.body.style.overflow = previous\n }\n }, [isFullscreen])\n\n const neighborhood = useMemo(() => {\n if (!graph || !activeSlug) {\n return null\n }\n return getNeighborhood(graph, activeSlug)\n }, [graph, activeSlug])\n\n const derivedFilter = useMemo(() => {\n if (isFullscreen || !activeSlug || !neighborhood) {\n return filterNode\n }\n if (!filterNode) {\n return (node: GraphNode) => neighborhood.has(node.id)\n }\n return (node: GraphNode) => filterNode(node) && neighborhood.has(node.id)\n }, [filterNode, neighborhood, activeSlug, isFullscreen])\n\n const handleCloseFullscreen = useCallback(() => {\n setIsFullscreen(false)\n }, [])\n\n const canToggleFullScreen = showFullscreenToggle && !!graph\n\n const mainGraph = (\n <GraphCanvas\n graph={graph}\n className={className}\n filterNode={derivedFilter}\n focusPredicate={focusPredicate}\n nodeColor={nodeColor}\n zoomExtent={zoomExtent}\n focusNodeId={activeSlug ?? null}\n onNodeSelect={onNodeSelect}\n />\n )\n\n return (\n <>\n <div className={clsx(styles.shell, className)}>\n {canToggleFullScreen && (\n <button\n type=\"button\"\n className={styles.fullscreenButton}\n aria-label=\"Open full graph\"\n onClick={() => setIsFullscreen(true)}\n >\n ⤢\n </button>\n )}\n {mainGraph}\n </div>\n {isFullscreen && isBrowser\n ? createPortal(\n <div className={styles.fullscreenOverlay} role=\"dialog\" aria-modal=\"true\">\n <div className={styles.fullscreenBackdrop} onClick={handleCloseFullscreen} />\n <div className={styles.fullscreenDialog}>\n <header className={styles.fullscreenHeader}>\n <span>{fullscreenTitle}</span>\n <button\n type=\"button\"\n className={styles.fullscreenClose}\n onClick={handleCloseFullscreen}\n >\n Close\n </button>\n </header>\n <div className={styles.fullscreenBody}>\n <GraphCanvas\n graph={graph}\n className={clsx(className, styles.fullscreenGraph)}\n filterNode={filterNode}\n focusPredicate={focusPredicate}\n nodeColor={nodeColor}\n focusNodeId={activeSlug ?? null}\n zoomExtent={zoomExtent}\n onNodeSelect={onNodeSelect}\n />\n </div>\n </div>\n </div>,\n document.body\n )\n : null}\n </>\n )\n}\n","import { type FC, useMemo } from 'react'\nimport clsx from 'clsx'\nimport type { NoteGraph } from 'papyr-core/runtime'\nimport styles from './MiniGraph.module.css'\n\nexport interface MiniGraphProps {\n graph: NoteGraph\n className?: string\n}\n\nexport const MiniGraph: FC<MiniGraphProps> = ({ graph, className }) => {\n const { nodes, edges, totalNodes, totalEdges } = useMemo(() => {\n const MAX_NODES = 24\n const VIEWBOX_SIZE = 200\n const CENTER = VIEWBOX_SIZE / 2\n const graphNodes = Array.from(graph.nodes.values())\n const sortedNodes = graphNodes\n .slice()\n .sort((a, b) => (b.linkCount ?? 0) - (a.linkCount ?? 0))\n .slice(0, MAX_NODES)\n\n const nodeIds = new Set(sortedNodes.map(node => node.id))\n const filteredEdges = graph.edges.filter(\n edge => nodeIds.has(edge.source) && nodeIds.has(edge.target)\n )\n\n const maxLinks = Math.max(\n 1,\n ...sortedNodes.map(node => node.linkCount ?? 0)\n )\n const orbitRadius = sortedNodes.length > 12 ? 70 : 62\n\n const positionedNodes = sortedNodes.map((node, index) => {\n const angle = (Math.PI * 2 * index) / sortedNodes.length - Math.PI / 2\n const radius = 3 + (node.linkCount ?? 0) / maxLinks * 5\n return {\n id: node.id,\n label: node.label ?? node.id,\n x: CENTER + orbitRadius * Math.cos(angle),\n y: CENTER + orbitRadius * Math.sin(angle),\n radius\n }\n })\n\n const nodeLookup = new Map(positionedNodes.map(node => [node.id, node]))\n const positionedEdges = filteredEdges\n .map(edge => ({\n source: nodeLookup.get(edge.source) ?? null,\n target: nodeLookup.get(edge.target) ?? null\n }))\n .filter(edge => edge.source && edge.target)\n .map(edge => ({\n source: edge.source!,\n target: edge.target!\n }))\n\n return {\n nodes: positionedNodes,\n edges: positionedEdges,\n totalNodes: graphNodes.length,\n totalEdges: graph.edges.length\n }\n }, [graph])\n\n return (\n <div className={clsx(styles.frame, className)} data-papyr-component=\"MiniGraph\">\n <div className={styles.header}>\n <div>\n <div className={styles.title}>Mini graph</div>\n <div className={styles.subtitle}>\n {totalNodes} notes • {totalEdges} links\n </div>\n </div>\n <span className={styles.badge}>\n {nodes.length}/{totalNodes}\n </span>\n </div>\n <svg\n className={styles.canvas}\n viewBox=\"0 0 200 200\"\n role=\"img\"\n aria-label={`Mini graph with ${totalNodes} notes and ${totalEdges} links`}\n >\n <defs>\n <radialGradient id=\"papyr-mini-graph-glow\" cx=\"50%\" cy=\"45%\" r=\"60%\">\n <stop offset=\"0%\" stopColor=\"rgba(99, 102, 241, 0.35)\" />\n <stop offset=\"100%\" stopColor=\"rgba(99, 102, 241, 0)\" />\n </radialGradient>\n </defs>\n <circle\n className={styles.glow}\n cx=\"100\"\n cy=\"100\"\n r=\"78\"\n />\n <g className={styles.edges}>\n {edges.map((edge, index) => (\n <line\n key={`${edge.source.id}-${edge.target.id}-${index}`}\n className={styles.edge}\n x1={edge.source.x}\n y1={edge.source.y}\n x2={edge.target.x}\n y2={edge.target.y}\n />\n ))}\n </g>\n <g className={styles.nodes}>\n {nodes.map(node => (\n <circle\n key={node.id}\n className={styles.node}\n cx={node.x}\n cy={node.y}\n r={node.radius}\n >\n <title>{node.label}</title>\n </circle>\n ))}\n </g>\n </svg>\n {!nodes.length && (\n <div className={styles.emptyState}>No connections yet.</div>\n )}\n </div>\n )\n}\n","import type { NoteGraph } from 'papyr-core/runtime'\n\nexport interface ForceGraphNode {\n id: string\n label: string\n group?: string\n value?: number\n}\n\nexport interface ForceGraphLink {\n source: string\n target: string\n value?: number\n}\n\nexport interface ForceGraphData {\n nodes: ForceGraphNode[]\n links: ForceGraphLink[]\n}\n\nexport function toForceGraphData(graph: NoteGraph | null): ForceGraphData {\n if (!graph) {\n return { nodes: [], links: [] }\n }\n\n const nodes: ForceGraphNode[] = []\n const links: ForceGraphLink[] = []\n\n for (const [, node] of graph.nodes) {\n nodes.push({\n id: node.id,\n label: node.label,\n value: node.linkCount\n })\n }\n\n graph.edges.forEach((edge) => {\n links.push({\n source: edge.source,\n target: edge.target,\n value: 1\n })\n })\n\n return { nodes, links }\n}\n","import type { WebReadyNote } from 'papyr-core/runtime'\n\nexport function buildWikiLink(slug: string): string {\n return `[[${slug}]]`\n}\n\nexport function findNoteBySlug(notes: WebReadyNote[], slug: string): WebReadyNote | undefined {\n return notes.find(note => note.slug === slug)\n}\n\nexport interface ParsedHashInfo {\n slug: string | null\n anchor: string | null\n}\n\nexport function parseNoteHash(hash: string): ParsedHashInfo {\n if (!hash || !hash.startsWith('#')) {\n return { slug: null, anchor: null }\n }\n\n const fragment = hash.slice(1)\n if (!fragment) {\n return { slug: null, anchor: null }\n }\n\n if (fragment.startsWith('/note/')) {\n const rest = fragment.slice('/note/'.length)\n const anchorIndex = rest.indexOf('#')\n const slugFragment = anchorIndex === -1 ? rest : rest.slice(0, anchorIndex)\n const anchorFragment = anchorIndex === -1 ? null : rest.slice(anchorIndex + 1)\n\n let slug: string | null = slugFragment || null\n if (slug) {\n try {\n slug = decodeURIComponent(slug)\n } catch {\n // Keep original fragment on decode failure\n }\n }\n\n let anchor: string | null = anchorFragment && anchorFragment.length > 0 ? anchorFragment : null\n if (anchor) {\n try {\n anchor = decodeURIComponent(anchor)\n } catch {\n // Keep original fragment on decode failure\n }\n }\n\n return { slug, anchor }\n }\n\n if (fragment.startsWith('/')) {\n return { slug: null, anchor: null }\n }\n\n let anchor: string | null = fragment\n if (anchor) {\n try {\n anchor = decodeURIComponent(anchor)\n } catch {\n // Keep original fragment on decode failure\n }\n }\n\n return { slug: null, anchor }\n}\n\nexport function updateHashWithAnchor(anchor: string): void {\n if (typeof window === 'undefined' || typeof window.history === 'undefined') {\n return\n }\n\n const trimmed = anchor.trim()\n const currentHash = window.location.hash ?? ''\n const { slug } = parseNoteHash(currentHash)\n\n let nextHash: string\n if (slug) {\n const encodedSlug = encodeURIComponent(slug)\n nextHash = trimmed\n ? `#/note/${encodedSlug}#${encodeURIComponent(trimmed)}`\n : `#/note/${encodedSlug}`\n } else {\n nextHash = trimmed ? `#${encodeURIComponent(trimmed)}` : '#'\n }\n\n window.history.replaceState(null, '', nextHash)\n}\n","import { importSearchIndex } from 'papyr-core/runtime'\nimport type { SearchIndex, SerializedSearchIndex } from 'papyr-core/runtime'\n\nfunction isHydratedSearchIndex(\n value: SearchIndex | SerializedSearchIndex\n): value is SearchIndex {\n const candidate = value as Partial<SearchIndex>\n return Boolean(candidate.index && typeof candidate.index.search === 'function')\n}\n\n/**\n * Ensure a search index is ready for runtime usage.\n * Accepts either the hydrated SearchIndex returned by papyr-core or the\n * serialized JSON emitted during the build, and always returns a usable index.\n */\nexport function hydrateSearchIndex(\n value: SearchIndex | SerializedSearchIndex\n): SearchIndex {\n if (isHydratedSearchIndex(value)) {\n return value\n }\n\n return importSearchIndex(value)\n}\n","import { autoUpdate, flip, offset, shift, useFloating } from '@floating-ui/react'\nimport clsx from 'clsx'\nimport type { FC, ReactNode, KeyboardEvent } from 'react'\nimport { useState, useCallback } from 'react'\nimport styles from './HoverPreview.module.css'\n\nexport interface HoverPreviewProps {\n trigger: ReactNode\n renderPreview: () => ReactNode\n /**\n * When true, applies the default dotted underline styling to visually indicate the trigger is interactive.\n * Set to false when the supplied trigger already communicates interactivity (e.g. buttons, links).\n */\n highlightTrigger?: boolean\n}\n\nexport const HoverPreview: FC<HoverPreviewProps> = ({\n trigger,\n renderPreview,\n highlightTrigger = true\n}) => {\n const [open, setOpen] = useState(false)\n const { refs, floatingStyles } = useFloating({\n placement: 'top',\n middleware: [offset(12), flip(), shift()],\n whileElementsMounted: autoUpdate\n })\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key === 'Escape' && open) {\n setOpen(false)\n }\n }, [open])\n\n return (\n <span\n className={clsx(styles.trigger, highlightTrigger && styles.highlight)}\n ref={refs.setReference}\n onMouseEnter={() => setOpen(true)}\n onFocus={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n onBlur={() => setOpen(false)}\n onKeyDown={handleKeyDown}\n data-papyr-component=\"HoverPreview\"\n role=\"button\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n >\n {trigger}\n {open ? (\n <div\n ref={refs.setFloating}\n style={floatingStyles}\n className={styles.panel}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label=\"Preview\"\n >\n {renderPreview()}\n </div>\n ) : null}\n </span>\n )\n}\n","import type { FC } from 'react'\nimport styles from './NotePreviewContent.module.css'\n\nexport interface NotePreviewData {\n slug: string\n title?: string | null\n excerpt?: string | null\n description?: string | null\n tags?: string[]\n}\n\ninterface NotePreviewContentProps {\n note: NotePreviewData\n}\n\nconst MAX_PREVIEW_LENGTH = 220\n\nconst getPreviewText = (note: NotePreviewData): string => {\n const source = (note.excerpt ?? note.description ?? '').trim()\n if (!source) {\n return ''\n }\n\n if (source.length <= MAX_PREVIEW_LENGTH) {\n return source\n }\n\n return `${source.slice(0, MAX_PREVIEW_LENGTH - 1).trimEnd()}…`\n}\n\nexport const NotePreviewContent: FC<NotePreviewContentProps> = ({ note }) => {\n const previewText = getPreviewText(note)\n\n return (\n <div className={styles.container}>\n <h3 className={styles.title}>{note.title ?? note.slug}</h3>\n {previewText ? (\n <p className={styles.excerpt}>{previewText}</p>\n ) : (\n <p className={styles.empty}>No preview available</p>\n )}\n {note.tags?.length ? (\n <ul className={styles.tags} role=\"list\" aria-label=\"Tags\">\n {note.tags.slice(0, 4).map(tag => (\n <li key={tag} className={styles.tag}>\n #{tag}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n )\n}\n","import type { FC } from 'react'\nimport clsx from 'clsx'\nimport styles from './Breadcrumbs.module.css'\n\nexport interface BreadcrumbItem {\n label: string\n href?: string\n}\n\nexport interface BreadcrumbsProps {\n trail: BreadcrumbItem[]\n className?: string\n separator?: string\n}\n\nexport const Breadcrumbs: FC<BreadcrumbsProps> = ({\n trail,\n className,\n separator = '›'\n}) => {\n if (!trail.length) {\n return null\n }\n\n return (\n <nav aria-label=\"Breadcrumb\" data-papyr-component=\"Breadcrumbs\">\n <ol className={clsx(styles.list, className)}>\n {trail.map((item, index) => {\n const isLast = index === trail.length - 1\n return (\n <li key={item.label} className={styles.item} aria-current={isLast ? 'page' : undefined}>\n {item.href && !isLast ? (\n <a className={styles.link} href={item.href}>\n {item.label}\n </a>\n ) : (\n <span>{item.label}</span>\n )}\n {!isLast && <span className={styles.separator}>{separator}</span>}\n </li>\n )\n })}\n </ol>\n </nav>\n )\n}\n","import { useMemo } from 'react'\nimport type { WebReadyNote } from 'papyr-core/runtime'\n\nexport function useNotes(notes: WebReadyNote[]): WebReadyNote[] {\n return useMemo(() => {\n return [...notes].sort((a, b) => a.title.localeCompare(b.title))\n }, [notes])\n}\n","import type { FC } from 'react'\nimport styles from './Toast.module.css'\n\nexport interface ToastDescriptor {\n id: string\n message: string\n}\n\nexport interface ToastContainerProps {\n toasts: ToastDescriptor[]\n onDismiss: (id: string) => void\n}\n\nexport const ToastContainer: FC<ToastContainerProps> = ({ toasts, onDismiss }) => {\n if (toasts.length === 0) {\n return null\n }\n\n return (\n <div className={styles.viewport} role=\"region\" aria-live=\"polite\" aria-label=\"Notifications\">\n {toasts.map(toast => (\n <div key={toast.id} className={styles.toast} role=\"status\">\n <span className={styles.message}>{toast.message}</span>\n <button\n type=\"button\"\n className={styles.closeButton}\n onClick={() => onDismiss(toast.id)}\n aria-label=\"Dismiss notification\"\n >\n Close\n </button>\n </div>\n ))}\n </div>\n )\n}\n","import {\n searchNotes,\n type NoteGraph,\n type SearchIndex,\n type SearchOptions,\n type SearchResult,\n type WebReadyNote\n} from 'papyr-core/runtime'\nimport type { FC, ReactNode } from 'react'\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\nimport { useNotes } from '../hooks/useNotes'\nimport { ToastContainer, type ToastDescriptor } from '../components/Toast/Toast'\n\nexport interface PapyrProviderProps {\n notes: WebReadyNote[]\n children: ReactNode\n searchIndex: SearchIndex\n graph?: NoteGraph | null\n}\n\nexport interface ShowToastOptions {\n duration?: number\n id?: string\n}\n\nexport interface PapyrContextValue {\n notes: WebReadyNote[]\n graph: NoteGraph | null\n searchIndex: SearchIndex\n search: (query: string, options?: SearchOptions) => SearchResult[]\n showToast: (message: string, options?: ShowToastOptions) => string\n dismissToast: (id: string) => void\n}\n\nconst PapyrContext = createContext<PapyrContextValue | undefined>(undefined)\n\nexport const PapyrProvider: FC<PapyrProviderProps> = ({\n notes,\n children,\n searchIndex,\n graph = null\n}) => {\n const sortedNotes = useNotes(notes)\n const memoizedGraph = useMemo<NoteGraph | null>(() => graph ?? null, [graph])\n const [toasts, setToasts] = useState<ToastDescriptor[]>([])\n const timersRef = useRef<Record<string, number>>({})\n\n const dismissToast = useCallback((id: string) => {\n setToasts(prev => prev.filter(toast => toast.id !== id))\n\n if (typeof window !== 'undefined') {\n const timerId = timersRef.current[id]\n if (typeof timerId === 'number') {\n window.clearTimeout(timerId)\n }\n }\n\n delete timersRef.current[id]\n }, [])\n\n const showToast = useCallback(\n (message: string, options?: ShowToastOptions): string => {\n const id = options?.id ?? `papyr-toast-${Date.now()}-${Math.round(Math.random() * 1e6)}`\n const duration = options?.duration ?? 3000\n\n setToasts(prev => [\n ...prev.filter(toast => toast.id !== id),\n { id, message }\n ])\n\n if (typeof window !== 'undefined' && duration > 0) {\n const existingTimeout = timersRef.current[id]\n if (typeof existingTimeout === 'number') {\n window.clearTimeout(existingTimeout)\n }\n\n const timeoutId = window.setTimeout(() => dismissToast(id), duration)\n timersRef.current[id] = timeoutId\n }\n\n return id\n },\n [dismissToast]\n )\n\n const search = useCallback(\n (query: string, options?: SearchOptions): SearchResult[] => {\n return searchNotes(query, searchIndex, options)\n },\n [searchIndex]\n )\n\n useEffect(() => {\n return () => {\n if (typeof window !== 'undefined') {\n Object.values(timersRef.current).forEach(timerId => {\n if (typeof timerId === 'number') {\n window.clearTimeout(timerId)\n }\n })\n }\n\n timersRef.current = {}\n }\n }, [])\n\n const value = useMemo<PapyrContextValue>(\n () => ({\n notes: sortedNotes,\n graph: memoizedGraph,\n searchIndex,\n search,\n showToast,\n dismissToast\n }),\n [sortedNotes, memoizedGraph, searchIndex, search, showToast, dismissToast]\n )\n\n return (\n <PapyrContext.Provider value={value}>\n {children}\n <ToastContainer toasts={toasts} onDismiss={dismissToast} />\n </PapyrContext.Provider>\n )\n}\n\nexport function usePapyr(): PapyrContextValue {\n const context = useContext(PapyrContext)\n if (!context) {\n throw new Error('usePapyr must be used within a PapyrProvider')\n }\n return context\n}\n\nexport function useOptionalPapyr(): PapyrContextValue | undefined {\n return useContext(PapyrContext)\n}\n","import {\n type FC,\n type ReactNode,\n type MouseEvent as ReactMouseEvent,\n useEffect,\n useLayoutEffect,\n useRef,\n useMemo,\n useCallback\n} from 'react'\nimport { createRoot } from 'react-dom/client'\nimport type { WebReadyNote, Slug } from 'papyr-core/runtime'\nimport styles from './NoteViewer.module.css'\nimport { parseNoteHash, updateHashWithAnchor } from '../../utils'\nimport { HoverPreview } from '../HoverPreview'\nimport { NotePreviewContent, type NotePreviewData } from '../NotePreview'\nimport { Breadcrumbs, type BreadcrumbItem } from '../Breadcrumbs'\nimport { useOptionalPapyr } from '../../providers'\n\nconst NOTE_LINK_PREFIX = '#/note/'\n\nconst buildNoteHash = (slug: string, fragment?: string) => {\n const base = `${NOTE_LINK_PREFIX}${encodeURIComponent(slug)}`\n return fragment && fragment.length > 0 ? `${base}#${fragment}` : base\n}\n\ntype ClonedAttribute = {\n name: string\n value: string\n}\n\nconst cloneElementAttributes = (element: HTMLElement, exclude: string[] = []): ClonedAttribute[] => {\n const excludeSet = new Set(exclude)\n return Array.from(element.attributes)\n .filter(attr => !excludeSet.has(attr.name))\n .map(attr => ({ name: attr.name, value: attr.value }))\n}\n\ninterface InlinePreviewAnchorProps {\n attributes: ClonedAttribute[]\n href: string\n innerHtml: string\n onClick: (event: ReactMouseEvent<HTMLAnchorElement>) => void\n}\n\nconst InlinePreviewAnchor: FC<InlinePreviewAnchorProps> = ({\n attributes,\n href,\n innerHtml,\n onClick\n}) => {\n const anchorRef = useRef<HTMLAnchorElement | null>(null)\n\n useLayoutEffect(() => {\n const element = anchorRef.current\n if (!element) {\n return\n }\n\n attributes.forEach(attr => {\n if (attr.name === 'href') {\n return\n }\n\n element.setAttribute(attr.name, attr.value)\n })\n\n element.setAttribute('href', href)\n }, [attributes, href])\n\n return (\n <a\n ref={anchorRef}\n href={href}\n onClick={onClick}\n dangerouslySetInnerHTML={{ __html: innerHtml }}\n />\n )\n}\n\nconst safeDecode = (value: string): string => {\n try {\n return decodeURIComponent(value)\n } catch {\n return value\n }\n}\n\nexport interface NoteViewerNavigateOptions {\n fragment?: string\n}\n\nexport interface NoteViewerProps {\n note: WebReadyNote | null\n emptyState?: ReactNode\n onNavigateNote?: (slug: Slug, options?: NoteViewerNavigateOptions) => void\n}\n\ntype CopyButtonState = 'idle' | 'copied' | 'error' | 'empty'\n\n/**\n * Rich note renderer with link previews, breadcrumbs, and metadata.\n */\nexport const NoteViewer: FC<NoteViewerProps> = ({ note, emptyState, onNavigateNote }) => {\n const contentRef = useRef<HTMLDivElement | null>(null)\n const inlinePreviewCleanupRef = useRef<Array<() => void>>([])\n const papyr = useOptionalPapyr()\n const providerNotes = papyr?.notes ?? []\n const linkedNotesHeadingId = note ? `papyr-linked-notes-${note.slug}` : 'papyr-linked-notes'\n const metadataRecord = (note?.metadata ?? {}) as Record<string, unknown>\n\n const noteLookup = useMemo<Record<string, WebReadyNote>>(() => {\n if (!providerNotes.length) {\n return {}\n }\n\n return providerNotes.reduce<Record<string, WebReadyNote>>((acc, current) => {\n acc[current.slug] = current\n return acc\n }, {})\n }, [providerNotes])\n\n const resolveLinkedSlug = useCallback(\n (rawTarget: string): string | null => {\n if (!rawTarget) {\n return null\n }\n\n const baseTarget = rawTarget.split('#')[0]\n if (noteLookup[baseTarget]) {\n return baseTarget\n }\n\n return null\n },\n [noteLookup]\n )\n\n const getPreviewData = useCallback((targetNote: WebReadyNote): NotePreviewData => ({\n slug: targetNote.slug,\n title: targetNote.title,\n excerpt: targetNote.excerpt ?? null,\n description: targetNote.description ?? null,\n tags: targetNote.tags ?? []\n }), [])\n\n const linkedNotes = useMemo<NotePreviewData[]>(() => {\n if (!note?.linksTo?.length) {\n return []\n }\n\n const seen = new Set<string>()\n const previews: NotePreviewData[] = []\n\n note.linksTo.forEach(target => {\n const resolvedSlug = resolveLinkedSlug(target)\n if (!resolvedSlug || seen.has(resolvedSlug)) {\n return\n }\n\n const targetNote = noteLookup[resolvedSlug]\n if (!targetNote) {\n return\n }\n\n seen.add(resolvedSlug)\n previews.push(getPreviewData(targetNote))\n })\n\n return previews\n }, [note?.linksTo, noteLookup, resolveLinkedSlug, getPreviewData])\n\n const breadcrumbTrail = useMemo<BreadcrumbItem[]>(() => {\n if (!note) {\n return []\n }\n\n const rawTrail = metadataRecord.breadcrumbs\n if (Array.isArray(rawTrail)) {\n const normalized = rawTrail\n .map(item => {\n if (typeof item === 'string') {\n return { label: item }\n }\n if (item && typeof item === 'object') {\n const label = 'label' in item ? String((item as any).label ?? '') : ''\n if (!label) {\n return null\n }\n const href = typeof (item as any).href === 'string' ? (item as any).href : undefined\n return { label, href }\n }\n return null\n })\n .filter((item): item is BreadcrumbItem => Boolean(item))\n\n if (normalized.length) {\n return normalized\n }\n }\n\n const pathSource =\n typeof metadataRecord.path === 'string'\n ? metadataRecord.path\n : typeof metadataRecord.filePath === 'string'\n ? metadataRecord.filePath\n : typeof metadataRecord.relativePath === 'string'\n ? metadataRecord.relativePath\n : null\n\n if (!pathSource) {\n return []\n }\n\n const normalizedPath = pathSource.replace(/\\\\/g, '/').replace(/^\\.\\//, '')\n const segments = normalizedPath.split('/').filter(Boolean)\n\n if (!segments.length) {\n return []\n }\n\n return segments.map((segment, index) => {\n const isLast = index === segments.length - 1\n const stripped = isLast ? segment.replace(/\\.(md|markdown)$/i, '') : segment\n const label = stripped\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, char => char.toUpperCase())\n return { label }\n })\n }, [metadataRecord, note])\n\n const metaItems = useMemo(() => {\n if (!note) {\n return []\n }\n\n const items: Array<{ label: string; value: string }> = []\n if (note.createdAt) {\n items.push({ label: 'Created', value: note.createdAt })\n }\n if (note.updatedAt) {\n items.push({ label: 'Updated', value: note.updatedAt })\n }\n if (typeof note.wordCount === 'number' && note.wordCount > 0) {\n items.push({ label: 'Words', value: String(note.wordCount) })\n }\n if (typeof note.readingTime === 'number' && note.readingTime > 0) {\n items.push({ label: 'Read', value: `${note.readingTime} min` })\n }\n return items\n }, [note])\n\n const dispatchHashChange = useCallback(() => {\n if (typeof window === 'undefined') {\n return\n }\n\n const event = typeof window.HashChangeEvent === 'function'\n ? new HashChangeEvent('hashchange')\n : new Event('hashchange')\n window.dispatchEvent(event)\n }, [])\n\n const handleNoteLinkNavigation = useCallback(\n (event: ReactMouseEvent<HTMLAnchorElement>, slug: Slug, fragment?: string) => {\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.altKey ||\n event.shiftKey ||\n (event.currentTarget?.target && event.currentTarget.target !== '_self')\n ) {\n return\n }\n\n event.preventDefault()\n if (typeof window === 'undefined') {\n return\n }\n\n if (onNavigateNote) {\n onNavigateNote(slug, fragment ? { fragment } : undefined)\n }\n\n const targetHash = buildNoteHash(slug, fragment)\n if (window.location.hash !== targetHash) {\n window.history.pushState(null, '', targetHash)\n }\n\n dispatchHashChange()\n },\n [dispatchHashChange, onNavigateNote]\n )\n\n useEffect(() => {\n const container = contentRef.current\n if (!container || !note) {\n return\n }\n\n const cleanupFns: Array<() => void> = []\n const codeBlocks = Array.from(container.querySelectorAll('pre')) as HTMLPreElement[]\n\n codeBlocks.forEach(pre => {\n if (pre.dataset.papyrEnhanced === 'true') {\n return\n }\n\n const code = pre.querySelector('code') as HTMLElement | null\n if (!code) {\n return\n }\n\n const wrapper = document.createElement('div')\n wrapper.classList.add(styles.codeBlockWrapper)\n wrapper.setAttribute('data-papyr-code-wrapper', 'true')\n\n const header = document.createElement('div')\n header.classList.add(styles.codeBlockHeader)\n\n const languageClass = Array.from(code.classList).find(cls => cls.startsWith('language-'))\n const detectedLanguage = languageClass\n ? languageClass.replace('language-', '')\n : code.getAttribute('data-language') || undefined\n const language = (detectedLanguage && detectedLanguage.trim()) || 'code'\n\n const label = document.createElement('span')\n label.classList.add(styles.codeBlockLanguage)\n label.textContent = language.toUpperCase()\n header.appendChild(label)\n\n const button = document.createElement('button')\n button.type = 'button'\n button.classList.add(styles.copyButton)\n button.setAttribute('data-papyr-copy-button', 'true')\n button.setAttribute('aria-label', 'Copy code block')\n button.title = 'Copy code'\n\n let resetTimer: number | undefined\n\n const setButtonState = (state: CopyButtonState, autoReset: boolean) => {\n window.clearTimeout(resetTimer)\n button.dataset.state = state\n\n switch (state) {\n case 'idle':\n button.textContent = 'Copy'\n break\n case 'copied':\n button.textContent = 'Copied ✓'\n if (autoReset) {\n resetTimer = window.setTimeout(() => setButtonState('idle', false), 2000)\n }\n break\n case 'empty':\n button.textContent = 'Empty'\n if (autoReset) {\n resetTimer = window.setTimeout(() => setButtonState('idle', false), 1500)\n }\n break\n case 'error':\n button.textContent = 'Copy Failed'\n if (autoReset) {\n resetTimer = window.setTimeout(() => setButtonState('idle', false), 2000)\n }\n break\n }\n }\n\n const fallbackCopy = (text: string) => {\n const textarea = document.createElement('textarea')\n textarea.value = text\n textarea.setAttribute('readonly', '')\n textarea.style.position = 'absolute'\n textarea.style.left = '-9999px'\n textarea.style.top = '0'\n textarea.style.opacity = '0'\n document.body.appendChild(textarea)\n try {\n textarea.focus({ preventScroll: true })\n } catch (focusError) {\n textarea.focus()\n }\n textarea.select()\n try {\n textarea.setSelectionRange(0, textarea.value.length)\n } catch (selectionError) {\n // Some browsers may not support setSelectionRange on textarea in this context\n }\n const successful = document.execCommand('copy')\n document.body.removeChild(textarea)\n if (!successful) {\n throw new Error('execCommand returned false')\n }\n }\n\n const handleCopy = async (event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n const text = (code.innerText ?? code.textContent ?? '').replace(/\\u00a0/g, ' ')\n if (!text.trim()) {\n setButtonState('empty', true)\n return\n }\n\n try {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text)\n } else {\n fallbackCopy(text)\n }\n setButtonState('copied', true)\n } catch (error) {\n console.warn('Failed to copy code block', error)\n try {\n fallbackCopy(text)\n setButtonState('copied', true)\n } catch (fallbackError) {\n console.warn('Fallback copy failed', fallbackError)\n setButtonState('error', true)\n }\n }\n }\n\n setButtonState('idle', false)\n\n button.addEventListener('click', handleCopy)\n\n cleanupFns.push(() => {\n button.removeEventListener('click', handleCopy)\n window.clearTimeout(resetTimer)\n })\n\n header.appendChild(button)\n\n pre.parentElement?.insertBefore(wrapper, pre)\n wrapper.appendChild(header)\n wrapper.appendChild(pre)\n\n pre.classList.add(styles.codeBlockPre)\n code.classList.add(styles.codeBlockCode)\n pre.dataset.papyrEnhanced = 'true'\n })\n\n const anchorLinks = Array.from(container.querySelectorAll('a')) as HTMLAnchorElement[]\n\n const handleAnchorClick = (event: MouseEvent) => {\n const anchor = event.currentTarget as HTMLAnchorElement\n const href = anchor.getAttribute('href') ?? ''\n if (!href.startsWith('#') || href.startsWith('#/')) {\n return\n }\n\n const targetId = href.slice(1)\n if (!targetId) {\n return\n }\n\n event.preventDefault()\n\n const targetElement = document.getElementById(targetId)\n if (targetElement) {\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n\n updateHashWithAnchor(targetId)\n }\n\n anchorLinks.forEach(link => {\n const href = link.getAttribute('href') ?? ''\n if (href.startsWith('#') && !href.startsWith('#/')) {\n link.addEventListener('click', handleAnchorClick)\n cleanupFns.push(() => {\n link.removeEventListener('click', handleAnchorClick)\n })\n }\n })\n\n if (typeof window !== 'undefined') {\n const hash = window.location.hash ?? ''\n const { slug: hashSlug, anchor: hashAnchor } = parseNoteHash(hash)\n\n if (hashAnchor && (!hashSlug || hashSlug === note.slug)) {\n const targetElement = document.getElementById(hashAnchor)\n if (targetElement) {\n window.requestAnimationFrame(() => {\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'start' })\n })\n }\n }\n }\n\n return () => {\n cleanupFns.forEach(fn => fn())\n }\n }, [note?.slug, note?.html])\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return\n }\n\n inlinePreviewCleanupRef.current.forEach(cleanup => cleanup())\n inlinePreviewCleanupRef.current = []\n\n const container = contentRef.current\n if (!container || !note) {\n return\n }\n\n const inlineLinks = Array.from(\n container.querySelectorAll<HTMLAnchorElement>('a[href^=\"#/note/\"]')\n )\n\n inlineLinks.forEach(anchor => {\n const href = anchor.getAttribute('href') ?? ''\n if (!href.startsWith(NOTE_LINK_PREFIX)) {\n return\n }\n\n if (anchor.closest('[data-papyr-inline-preview=\"true\"]')) {\n return\n }\n\n const rawTarget = href.slice(NOTE_LINK_PREFIX.length)\n const [rawSlugPart, ...fragmentParts] = rawTarget.split('#')\n const fragment = fragmentParts.length > 0\n ? fragmentParts.join('#').trim() || undefined\n : undefined\n const decodedTarget = safeDecode(rawSlugPart)\n const resolvedSlug = resolveLinkedSlug(decodedTarget)\n if (!resolvedSlug) {\n return\n }\n\n const targetNote = noteLookup[resolvedSlug]\n if (!targetNote) {\n return\n }\n\n const parent = anchor.parentElement\n if (!parent) {\n return\n }\n\n const wrapper = document.createElement('span')\n wrapper.setAttribute('data-papyr-inline-preview', 'true')\n parent.replaceChild(wrapper, anchor)\n\n const anchorHtml = anchor.innerHTML\n const preservedAttributes = cloneElementAttributes(anchor, ['href'])\n const previewData = getPreviewData(targetNote)\n const noteHref = buildNoteHash(resolvedSlug, fragment)\n\n const root = createRoot(wrapper)\n root.render(\n <HoverPreview\n highlightTrigger={false}\n trigger={\n <InlinePreviewAnchor\n attributes={preservedAttributes}\n href={noteHref}\n innerHtml={anchorHtml}\n onClick={event =>\n handleNoteLinkNavigation(event, resolvedSlug as Slug, fragment)\n }\n />\n }\n renderPreview={() => <NotePreviewContent note={previewData} />}\n />\n )\n\n inlinePreviewCleanupRef.current.push(() => {\n root.unmount()\n wrapper.replaceWith(anchor)\n })\n })\n\n return () => {\n inlinePreviewCleanupRef.current.forEach(cleanup => cleanup())\n inlinePreviewCleanupRef.current = []\n }\n }, [\n note?.slug,\n note?.html,\n resolveLinkedSlug,\n noteLookup,\n handleNoteLinkNavigation,\n getPreviewData\n ])\n\n const hasLinkedNotes = linkedNotes.length > 0\n\n if (!note) {\n return emptyState ? <>{emptyState}</> : null\n }\n\n return (\n <article className={styles.container} data-papyr-component=\"NoteViewer\">\n <header className={styles.header}>\n {breadcrumbTrail.length > 0 && (\n <Breadcrumbs trail={breadcrumbTrail} className={styles.breadcrumbs} />\n )}\n <h1 className={styles.title}>{note.title}</h1>\n {note.description && (\n <p className={styles.summary}>{note.description}</p>\n )}\n <div className={styles.metaRow}>\n <div className={styles.tagList}>\n {note.tags?.length ? (\n note.tags.map(tag => (\n <span key={tag} className={styles.tag}>\n {tag}\n </span>\n ))\n ) : (\n <span className={styles.tagEmpty}>No tags assigned</span>\n )}\n </div>\n {metaItems.length > 0 && (\n <dl className={styles.metaList}>\n {metaItems.map(item => (\n <div key={item.label} className={styles.metaItem}>\n <dt>{item.label}</dt>\n <dd>{item.value}</dd>\n </div>\n ))}\n </dl>\n )}\n </div>\n </header>\n <section\n ref={contentRef}\n className={styles.content}\n dangerouslySetInnerHTML={{ __html: note.html }}\n />\n {hasLinkedNotes ? (\n <section\n className={styles.linkedNotes}\n aria-labelledby={linkedNotesHeadingId}\n data-papyr-component=\"LinkedNotesPreview\"\n >\n <div className={styles.linkedNotesHeader}>\n <h2 id={linkedNotesHeadingId} className={styles.linkedNotesTitle}>\n Linked notes\n </h2>\n <span className={styles.linkedNotesCount}>{linkedNotes.length}</span>\n </div>\n <ul className={styles.linkedNotesList}>\n {linkedNotes.map(related => (\n <li key={related.slug} className={styles.linkedNotesItem}>\n <HoverPreview\n highlightTrigger={false}\n trigger={\n <a\n href={buildNoteHash(related.slug)}\n className={styles.linkedNoteLink}\n onClick={event =>\n handleNoteLinkNavigation(event, related.slug as Slug)\n }\n >\n {related.title ?? related.slug}\n </a>\n }\n renderPreview={() => <NotePreviewContent note={related} />}\n />\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n </article>\n )\n}\n","import type { ChangeEventHandler, FC } from 'react'\nimport clsx from 'clsx'\nimport styles from './SearchBar.module.css'\n\nexport interface SearchBarProps {\n query: string\n onQueryChange: (value: string) => void\n placeholder?: string\n className?: string\n}\n\nexport const SearchBar: FC<SearchBarProps> = ({\n query,\n onQueryChange,\n placeholder = 'Search notes…',\n className\n}) => {\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n onQueryChange(event.target.value)\n }\n\n return (\n <div className={clsx(styles.wrapper, className)} data-papyr-component=\"SearchBar\">\n <input\n className={styles.input}\n value={query}\n onChange={handleChange}\n placeholder={placeholder}\n type=\"search\"\n autoComplete=\"off\"\n aria-label=\"Search notes\"\n />\n </div>\n )\n}\n","import type { FC } from 'react'\nimport clsx from 'clsx'\nimport styles from './TagFilter.module.css'\n\nexport interface TagFilterProps {\n availableTags: string[]\n selectedTags: string[]\n onChange: (tags: string[]) => void\n className?: string\n}\n\nexport const TagFilter: FC<TagFilterProps> = ({\n availableTags,\n selectedTags,\n onChange,\n className\n}) => {\n const toggle = (tag: string) => {\n if (selectedTags.includes(tag)) {\n onChange(selectedTags.filter((existing) => existing !== tag))\n } else {\n onChange([...selectedTags, tag])\n }\n }\n\n if (!availableTags.length) {\n return null\n }\n\n return (\n <div\n className={clsx(styles.container, className)}\n data-papyr-component=\"TagFilter\"\n role=\"group\"\n aria-label=\"Filter by tags\"\n >\n {availableTags.map((tag) => (\n <button\n key={tag}\n type=\"button\"\n className={clsx(styles.tag, selectedTags.includes(tag) && styles.tagActive)}\n onClick={() => toggle(tag)}\n aria-pressed={selectedTags.includes(tag)}\n >\n #{tag}\n </button>\n ))}\n </div>\n )\n}\n","import { useState, useEffect, useRef, type FC, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport type { SearchHit, SearchIndex } from 'papyr-core/runtime'\nimport { searchNotes } from 'papyr-core/runtime'\nimport styles from './SearchDropdown.module.css'\n\nexport interface SearchDropdownProps {\n searchIndex: SearchIndex\n onResultClick: (slug: string) => void\n placeholder?: string\n className?: string\n maxResults?: number\n showCategories?: boolean\n}\n\ninterface CategorizedResults {\n titleMatches: SearchHit[]\n headingMatches: SearchHit[]\n contentMatches: SearchHit[]\n}\n\nexport const SearchDropdown: FC<SearchDropdownProps> = ({\n searchIndex,\n onResultClick,\n placeholder = 'Search...',\n className,\n maxResults = 20,\n showCategories = true\n}) => {\n const [query, setQuery] = useState('')\n const [results, setResults] = useState<SearchHit[]>([])\n const [categorizedResults, setCategorizedResults] = useState<CategorizedResults>({\n titleMatches: [],\n headingMatches: [],\n contentMatches: []\n })\n const [isOpen, setIsOpen] = useState(false)\n const [selectedIndex, setSelectedIndex] = useState(0)\n \n const inputRef = useRef<HTMLInputElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n // Search when query changes\n useEffect(() => {\n if (!query.trim()) {\n setResults([])\n setCategorizedResults({ titleMatches: [], headingMatches: [], contentMatches: [] })\n setIsOpen(false)\n return\n }\n\n const searchResults = searchNotes(query, searchIndex, {\n limit: maxResults,\n highlight: true,\n fuzzy: true,\n boost: { title: 5, headings: 3, content: 1, metadata: 2 } // Boost titles and headings\n })\n\n // Categorize results and maintain a display order that matches keyboard navigation\n const titleMatches = searchResults.filter(result => \n result.matchedFields.includes('title')\n )\n const headingMatches = searchResults.filter(result =>\n !result.matchedFields.includes('title') &&\n result.matchedFields.includes('headings')\n )\n const contentMatches = searchResults.filter(result => \n !result.matchedFields.includes('title') &&\n !result.matchedFields.includes('headings')\n )\n const orderedResults = showCategories\n ? [...titleMatches, ...headingMatches, ...contentMatches]\n : searchResults\n\n setResults(orderedResults)\n setCategorizedResults({ titleMatches, headingMatches, contentMatches })\n setIsOpen(orderedResults.length > 0)\n setSelectedIndex(0)\n }, [query, searchIndex, maxResults, showCategories])\n\n // Handle keyboard navigation\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (!isOpen || results.length === 0) return\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n setSelectedIndex(prev => (prev + 1) % results.length)\n break\n case 'ArrowUp':\n event.preventDefault()\n setSelectedIndex(prev => (prev - 1 + results.length) % results.length)\n break\n case 'Enter':\n event.preventDefault()\n if (results[selectedIndex]) {\n onResultClick(results[selectedIndex].slug)\n setIsOpen(false)\n }\n break\n case 'Escape':\n setIsOpen(false)\n inputRef.current?.blur()\n break\n }\n }\n\n // Handle click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current && \n !dropdownRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n const highlightText = (text: string, query: string): ReactNode => {\n if (!query.trim()) return text\n \n const regex = new RegExp(`(${query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})`, 'gi')\n const parts = text.split(regex)\n \n return parts.map((part, index) => \n regex.test(part) ? (\n <mark key={index} className={styles.highlight}>\n {part}\n </mark>\n ) : part\n )\n }\n\n const renderResult = (result: SearchHit, index: number) => {\n const isSelected = index === selectedIndex\n const isTitleMatch = result.matchedFields.includes('title')\n const isHeadingMatch = !isTitleMatch && result.matchedFields.includes('headings')\n const headingHighlight = result.highlights?.find(highlight => highlight.field === 'headings')\n const excerptText = isHeadingMatch\n ? headingHighlight?.text ?? result.excerpt\n : result.excerpt\n \n return (\n <div\n key={result.slug}\n id={`result-${result.slug}`}\n role=\"option\"\n aria-selected={isSelected}\n className={clsx(\n styles.resultItem,\n isSelected && styles.resultItemSelected,\n isTitleMatch && styles.titleMatch,\n isHeadingMatch && styles.headingMatch\n )}\n onClick={() => {\n onResultClick(result.slug)\n setIsOpen(false)\n }}\n >\n <div className={styles.resultTitle}>\n {highlightText(result.title, query)}\n </div>\n {excerptText && (\n <div className={styles.resultExcerpt}>\n {highlightText(excerptText, query)}\n </div>\n )}\n </div>\n )\n }\n\n return (\n <div className={clsx(styles.container, className)}>\n <input\n ref={inputRef}\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n onFocus={() => query.trim() && setIsOpen(true)}\n placeholder={placeholder}\n className={styles.input}\n autoComplete=\"off\"\n aria-label=\"Search\"\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-controls=\"search-results\"\n aria-activedescendant={isOpen && results[selectedIndex] ? `result-${results[selectedIndex].slug}` : undefined}\n aria-autocomplete=\"list\"\n />\n\n {isOpen && results.length > 0 && (\n <div ref={dropdownRef} className={styles.dropdown} id=\"search-results\" role=\"listbox\">\n {showCategories ? (\n <>\n {categorizedResults.titleMatches.length > 0 && (\n <div className={styles.category}>\n <div className={styles.categoryTitle}>Notes</div>\n {categorizedResults.titleMatches.map((result, index) => \n renderResult(result, index)\n )}\n </div>\n )}\n\n {categorizedResults.headingMatches.length > 0 && (\n <div className={styles.category}>\n <div className={styles.categoryTitle}>Headers</div>\n {categorizedResults.headingMatches.map((result, index) => \n renderResult(result, categorizedResults.titleMatches.length + index)\n )}\n </div>\n )}\n \n {categorizedResults.contentMatches.length > 0 && (\n <div className={styles.category}>\n <div className={styles.categoryTitle}>Content</div>\n {categorizedResults.contentMatches.map((result, index) => \n renderResult(\n result,\n categorizedResults.titleMatches.length +\n categorizedResults.headingMatches.length +\n index\n )\n )}\n </div>\n )}\n </>\n ) : (\n <div className={styles.category}>\n {results.map((result, index) => renderResult(result, index))}\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n","import { type FC, type ChangeEvent } from 'react'\nimport clsx from 'clsx'\nimport styles from './FileSearch.module.css'\n\nexport interface FileSearchProps {\n query: string\n onChange: (query: string) => void\n placeholder?: string\n className?: string\n /** When true, applies compact styling suitable for sidebars */\n compact?: boolean\n}\n\n/**\n * Standalone search input component for filtering files/notes.\n * Can be used independently or embedded in other components like FileHierarchy.\n * \n * @example\n * // Standalone usage\n * <FileSearch query={query} onChange={setQuery} />\n * \n * @example\n * // In sidebar with compact styling\n * <FileSearch query={query} onChange={setQuery} compact />\n * \n * @example\n * // Custom styling\n * <FileSearch query={query} onChange={setQuery} className=\"my-search\" />\n */\nexport const FileSearch: FC<FileSearchProps> = ({\n query,\n onChange,\n placeholder = 'Search files...',\n className,\n compact = false\n}) => {\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value)\n }\n\n return (\n <div \n className={clsx(\n styles.container,\n compact && styles.containerCompact,\n className\n )}\n data-papyr-component=\"FileSearch\"\n >\n <input\n type=\"search\"\n className={clsx(\n styles.input,\n compact && styles.inputCompact\n )}\n placeholder={placeholder}\n value={query}\n onChange={handleChange}\n autoComplete=\"off\"\n aria-label=\"Search files\"\n />\n </div>\n )\n}\n","import type { Slug } from 'papyr-core/runtime'\n\nexport type NoteTitleMap = Record<string, string | undefined>\n\nconst capitalizeFirstLetter = (value: string): string => {\n if (!value) return value\n return value.charAt(0).toUpperCase() + value.slice(1)\n}\n\nexport const formatFolderName = (name: string): string => capitalizeFirstLetter(name)\n\nexport const getNoteDisplayText = (\n slug: Slug,\n noteTitleMap?: NoteTitleMap\n): string => {\n const title = noteTitleMap?.[slug] ?? slug\n return capitalizeFirstLetter(title)\n}\n","import { memo, useState, useMemo, useEffect, type FC } from 'react'\nimport clsx from 'clsx'\nimport type { FolderNode, Slug } from 'papyr-core/runtime'\nimport styles from './FileHierarchy.module.css'\nimport type { NoteLinkRenderer, NoteLinkRenderContext } from './types'\nimport { formatFolderName, getNoteDisplayText, type NoteTitleMap } from './utils'\n\nconst containsSlug = (node: FolderNode, slug?: string): boolean => {\n if (!slug) return false\n if (node.notes.includes(slug as Slug)) return true\n return node.children.some(child => containsSlug(child, slug))\n}\n\nexport interface MemoizedFolderTreeProps {\n node: FolderNode\n onNoteClick?: (slug: Slug) => void\n renderNoteLink?: NoteLinkRenderer\n activeSlug?: string\n noteTitleMap?: NoteTitleMap\n depth?: number\n isSearching?: boolean\n searchQuery?: string\n}\n\n// Memoized component to prevent unnecessary re-renders\nexport const MemoizedFolderTree: FC<MemoizedFolderTreeProps> = memo(({ \n node, \n onNoteClick,\n renderNoteLink,\n activeSlug,\n noteTitleMap,\n depth = 0,\n isSearching = false,\n searchQuery = ''\n}) => {\n const [isExpanded, setIsExpanded] = useState(true)\n \n const hasChildren = node.children.length > 0 || node.notes.length > 0\n const toggleExpanded = () => {\n if (hasChildren) {\n setIsExpanded(!isExpanded)\n }\n }\n\n // Auto-expand when searching or when active note is in this folder\n const hasActiveDescendant = useMemo(() => containsSlug(node, activeSlug), [node, activeSlug])\n\n useEffect(() => {\n if (hasActiveDescendant) {\n setIsExpanded(true)\n }\n }, [hasActiveDescendant])\n\n const isOpen = isExpanded || isSearching\n const normalizedSearchQuery = searchQuery.trim().toLowerCase()\n\n return (\n <li className={styles.treeItem}>\n <div \n className={clsx(\n styles.folderHeader,\n hasChildren && styles.folderHeaderClickable\n )}\n onClick={toggleExpanded}\n role={hasChildren ? 'button' : undefined}\n aria-expanded={hasChildren ? (isOpen ? true : false) : undefined}\n >\n {hasChildren && (\n <span className={clsx(styles.chevron, isOpen && styles.chevronExpanded)}>\n ›\n </span>\n )}\n <span className={styles.folderName}>{formatFolderName(node.name)}</span>\n </div>\n\n {isOpen && hasChildren && (\n <ul className={styles.children}>\n {/* Render child folders first */}\n {node.children.map((child) => (\n <MemoizedFolderTree \n key={child.path} \n node={child} \n onNoteClick={onNoteClick}\n renderNoteLink={renderNoteLink}\n activeSlug={activeSlug}\n noteTitleMap={noteTitleMap}\n depth={depth + 1}\n isSearching={isSearching}\n searchQuery={searchQuery}\n />\n ))}\n \n {/* Then render notes in this folder */}\n {node.notes.map((slug) => {\n const displayText = getNoteDisplayText(slug, noteTitleMap)\n const isSearchMatch = Boolean(normalizedSearchQuery) &&\n displayText.toLowerCase().includes(normalizedSearchQuery)\n const isActive = slug === activeSlug\n const handleClick = () => onNoteClick?.(slug)\n const renderContext = {\n onClick: handleClick,\n isActive,\n isSearchMatch\n } satisfies NoteLinkRenderContext\n \n return (\n <li key={slug} className={styles.noteItem}>\n {renderNoteLink ? (\n renderNoteLink(slug, renderContext)\n ) : (\n <MemoizedNoteButton\n displayText={displayText}\n isActive={isActive}\n isSearchMatch={isSearchMatch}\n onClick={handleClick}\n />\n )}\n </li>\n )\n })}\n </ul>\n )}\n </li>\n )\n})\n\n// Memoized note button component\nconst MemoizedNoteButton = memo<{\n displayText: string\n isActive: boolean\n isSearchMatch: boolean\n onClick: () => void\n}>(({ displayText, isActive, isSearchMatch, onClick }) => {\n return (\n <button \n type=\"button\"\n className={clsx(\n styles.noteButton,\n isActive && styles.noteButtonActive,\n isSearchMatch && styles.noteButtonSearchMatch\n )}\n onClick={onClick}\n >\n <span className={styles.noteLabel}>{displayText}</span>\n </button>\n )\n})\n\n\nMemoizedFolderTree.displayName = 'MemoizedFolderTree'\nMemoizedNoteButton.displayName = 'MemoizedNoteButton'\n","import { useState, useMemo, useEffect, useCallback, type FC } from 'react'\nimport clsx from 'clsx'\nimport type { FolderNode, Slug, SearchIndex } from 'papyr-core/runtime'\nimport { SearchDropdown } from '../SearchDropdown'\nimport { FileSearch } from '../FileSearch'\nimport { MemoizedFolderTree } from './MemoizedFolderTree'\nimport type { NoteLinkRenderer, NoteLinkRenderContext } from './types'\nimport styles from './FileHierarchy.module.css'\nimport { formatFolderName, getNoteDisplayText, type NoteTitleMap } from './utils'\n\nexport interface FileHierarchyProps {\n tree: FolderNode[] | FolderNode\n className?: string\n onNoteClick?: (slug: Slug) => void\n renderNoteLink?: NoteLinkRenderer\n \n // Active state\n activeSlug?: string\n \n // Optional: provide notes for automatic title rendering\n notes?: Array<{ slug: string; title?: string }>\n \n // Search functionality\n searchable?: boolean\n searchIndex?: SearchIndex\n searchPlaceholder?: string\n \n}\n\ninterface NormalizedTree {\n nodes: FolderNode[]\n rootNotes: Slug[]\n}\n\nconst normalizeTree = (tree: FolderNode[] | FolderNode): NormalizedTree => {\n if (Array.isArray(tree)) {\n return { nodes: tree, rootNotes: [] }\n }\n\n return {\n nodes: tree.children,\n rootNotes: [...tree.notes]\n }\n}\n\n// Helper function to filter tree based on search query\nconst filterTreeBySearch = (\n tree: FolderNode[], \n searchQuery: string, \n noteTitleMap?: NoteTitleMap\n): FolderNode[] => {\n if (!searchQuery.trim()) return tree\n\n const query = searchQuery.toLowerCase()\n\n return tree.map(node => {\n // Filter notes in this folder\n const filteredNotes = node.notes.filter(slug => {\n const displayText = getNoteDisplayText(slug, noteTitleMap)\n return displayText.toLowerCase().includes(query)\n })\n\n // Recursively filter children\n const filteredChildren = filterTreeBySearch(node.children, searchQuery, noteTitleMap)\n\n // Include this folder if it has matching notes or children\n const hasMatches = filteredNotes.length > 0 || filteredChildren.length > 0\n\n if (hasMatches) {\n return {\n ...node,\n notes: filteredNotes,\n children: filteredChildren\n }\n }\n\n return null\n }).filter(Boolean) as FolderNode[]\n}\n\nconst FolderTree: FC<{\n node: FolderNode\n onNoteClick?: (slug: Slug) => void\n renderNoteLink?: NoteLinkRenderer\n activeSlug?: string\n noteTitleMap?: NoteTitleMap\n depth?: number\n}> = ({ node, onNoteClick, renderNoteLink, activeSlug, noteTitleMap, depth = 0 }) => {\n const [isExpanded, setIsExpanded] = useState(true)\n \n const hasChildren = node.children.length > 0 || node.notes.length > 0\n const toggleExpanded = () => {\n if (hasChildren) {\n setIsExpanded(!isExpanded)\n }\n }\n\n return (\n <li className={styles.treeItem}>\n <div \n className={clsx(\n styles.folderHeader,\n hasChildren && styles.folderHeaderClickable\n )}\n onClick={toggleExpanded}\n role={hasChildren ? 'button' : undefined}\n aria-expanded={hasChildren ? isExpanded : undefined}\n >\n {hasChildren && (\n <span className={clsx(styles.chevron, isExpanded && styles.chevronExpanded)}>\n ›\n </span>\n )}\n <span className={styles.folderName}>{formatFolderName(node.name)}</span>\n </div>\n\n {isExpanded && hasChildren && (\n <ul className={styles.children}>\n {/* Render child folders first */}\n {node.children.map((child) => (\n <FolderTree \n key={child.path} \n node={child} \n onNoteClick={onNoteClick}\n renderNoteLink={renderNoteLink}\n activeSlug={activeSlug}\n noteTitleMap={noteTitleMap}\n depth={depth + 1}\n />\n ))}\n \n {/* Then render notes in this folder */}\n {node.notes.map((slug) => {\n // Find note title if notes array is provided\n const displayText = getNoteDisplayText(slug, noteTitleMap)\n const isActive = slug === activeSlug\n const handleClick = () => onNoteClick?.(slug)\n const renderContext = {\n onClick: handleClick,\n isActive,\n isSearchMatch: false\n } satisfies NoteLinkRenderContext\n\n return (\n <li key={slug} className={styles.noteItem}>\n {renderNoteLink ? (\n renderNoteLink(slug, renderContext)\n ) : (\n <button \n type=\"button\"\n className={clsx(\n styles.noteButton,\n isActive && styles.noteButtonActive\n )}\n onClick={handleClick}\n >\n <span className={styles.noteLabel}>{displayText}</span>\n </button>\n )}\n </li>\n )\n })}\n </ul>\n )}\n </li>\n )\n}\n\nexport const FileHierarchy: FC<FileHierarchyProps> = ({ \n tree, \n className, \n onNoteClick,\n renderNoteLink,\n activeSlug,\n notes,\n searchable = false,\n searchIndex,\n searchPlaceholder = 'Search files...'\n}) => {\n const [fallbackSearchQuery, setFallbackSearchQuery] = useState('')\n const noteTitleMap = useMemo<NoteTitleMap | undefined>(() => {\n if (!notes) return undefined\n\n return notes.reduce<NoteTitleMap>((acc, note) => {\n acc[note.slug] = note.title\n return acc\n }, {})\n }, [notes])\n\n const isFallbackSearchEnabled = searchable && !searchIndex\n const isFallbackSearching = isFallbackSearchEnabled && Boolean(fallbackSearchQuery.trim())\n\n useEffect(() => {\n if (!isFallbackSearchEnabled) return\n\n // eslint-disable-next-line no-console\n console.warn('[papyr] FileHierarchy rendered with `searchable` but no `searchIndex`. Falling back to tree-based filtering.')\n }, [isFallbackSearchEnabled])\n\n useEffect(() => {\n if (searchIndex) {\n setFallbackSearchQuery('')\n }\n }, [searchIndex])\n\n const handleSearchResultClick = useCallback((slug: string) => {\n onNoteClick?.(slug as Slug)\n }, [onNoteClick])\n\n const normalizedTree = useMemo(() => normalizeTree(tree), [tree])\n\n const filteredHierarchy = useMemo(() => {\n if (!isFallbackSearchEnabled) {\n return normalizedTree\n }\n\n const filteredNodes = filterTreeBySearch(\n normalizedTree.nodes,\n fallbackSearchQuery,\n noteTitleMap\n )\n\n const query = fallbackSearchQuery.trim().toLowerCase()\n const filteredRootNotes = normalizedTree.rootNotes.filter(slug => {\n if (!query) return true\n const displayText = getNoteDisplayText(slug, noteTitleMap)\n return displayText.toLowerCase().includes(query)\n })\n\n return {\n nodes: filteredNodes,\n rootNotes: filteredRootNotes\n }\n }, [normalizedTree, isFallbackSearchEnabled, fallbackSearchQuery, noteTitleMap])\n\n const treeToRender = filteredHierarchy.nodes\n const rootNotesToRender = filteredHierarchy.rootNotes\n const effectiveSearchQuery = isFallbackSearchEnabled ? fallbackSearchQuery : ''\n const isEmptyState = !treeToRender.length && !rootNotesToRender.length\n const emptyStateMessage = isFallbackSearching\n ? 'No results found'\n : 'No files to display yet'\n\n return (\n <aside className={clsx(styles.fileHierarchy, className)} data-papyr-component=\"FileHierarchy\" aria-label=\"File navigation\">\n <div className={styles.header}>\n <span className={styles.sectionTitle}>Files</span>\n </div>\n \n {/* Search dropdown - shows when searchable is true */}\n {searchable && (\n <div className={styles.searchContainer}>\n {searchIndex ? (\n <SearchDropdown\n searchIndex={searchIndex}\n onResultClick={handleSearchResultClick}\n placeholder={searchPlaceholder}\n />\n ) : (\n <FileSearch\n query={fallbackSearchQuery}\n onChange={setFallbackSearchQuery}\n placeholder={searchPlaceholder}\n compact\n />\n )}\n </div>\n )}\n \n {/* Folder tree - always show the full tree */}\n <div className={styles.scrollContainer}>\n {isEmptyState ? (\n <div className={styles.emptyState}>{emptyStateMessage}</div>\n ) : (\n <ul className={styles.tree}>\n {rootNotesToRender.map((slug) => {\n const displayText = getNoteDisplayText(slug, noteTitleMap)\n const isActive = slug === activeSlug\n const isSearchMatch =\n effectiveSearchQuery.trim().length > 0 &&\n displayText.toLowerCase().includes(effectiveSearchQuery.toLowerCase())\n const handleClick = () => onNoteClick?.(slug)\n const renderContext = {\n onClick: handleClick,\n isActive,\n isSearchMatch\n } satisfies NoteLinkRenderContext\n\n return (\n <li key={`root-${slug}`} className={styles.noteItem}>\n {renderNoteLink ? (\n renderNoteLink(slug, renderContext)\n ) : (\n <button\n type=\"button\"\n className={clsx(\n styles.noteButton,\n isActive && styles.noteButtonActive,\n isSearchMatch && styles.noteButtonSearchMatch\n )}\n onClick={handleClick}\n >\n {displayText}\n </button>\n )}\n </li>\n )\n })}\n\n {treeToRender.map((node) => (\n <MemoizedFolderTree \n key={node.path} \n node={node} \n onNoteClick={onNoteClick}\n renderNoteLink={renderNoteLink}\n activeSlug={activeSlug}\n noteTitleMap={noteTitleMap}\n isSearching={isFallbackSearching}\n searchQuery={effectiveSearchQuery}\n />\n ))}\n </ul>\n )}\n </div>\n </aside>\n )\n}\n","import type { FC, ReactNode } from 'react'\nimport clsx from 'clsx'\nimport styles from './EmptyState.module.css'\n\nexport interface EmptyStateProps {\n icon?: ReactNode\n title: string\n description?: string\n children?: ReactNode\n className?: string\n}\n\n/**\n * Generic empty state component for displaying placeholder content\n * when no data is available.\n * \n * @example\n * // Simple usage\n * <EmptyState \n * title=\"No notes found\"\n * description=\"Add some markdown files to get started\"\n * />\n * \n * @example\n * // With icon and custom content\n * <EmptyState \n * icon=\"📝\"\n * title=\"No notes selected\"\n * description=\"Choose a note from the sidebar\"\n * >\n * <button>Create New Note</button>\n * </EmptyState>\n */\nexport const EmptyState: FC<EmptyStateProps> = ({\n icon,\n title,\n description,\n children,\n className\n}) => {\n return (\n <div\n className={clsx(styles.container, className)}\n data-papyr-component=\"EmptyState\"\n role=\"status\"\n aria-label={title}\n >\n {icon && (\n <div className={styles.icon} aria-hidden=\"true\">\n {typeof icon === 'string' ? <span className={styles.emoji}>{icon}</span> : icon}\n </div>\n )}\n \n <h2 className={styles.title}>{title}</h2>\n \n {description && (\n <p className={styles.description}>{description}</p>\n )}\n \n {children && (\n <div className={styles.actions}>\n {children}\n </div>\n )}\n </div>\n )\n}\n\n","import type { FC, ReactNode } from 'react'\nimport clsx from 'clsx'\nimport styles from './SidebarLayout.module.css'\n\nexport interface SidebarLayoutProps {\n sidebar: ReactNode\n main: ReactNode\n className?: string\n sidebarWidth?: string | number\n /**\n * When true (default), the layout fills the viewport height and scrolls the main pane.\n * Set to false to allow the page to control scrolling.\n */\n fullHeight?: boolean\n}\n\n/**\n * Common two-column layout with sidebar and main content area.\n * Provides a responsive, full-height layout pattern.\n * \n * @example\n * // Basic usage\n * <SidebarLayout\n * sidebar={<FileHierarchy tree={tree} />}\n * main={<NoteViewer note={note} />}\n * />\n * \n * @example\n * // Custom sidebar width\n * <SidebarLayout\n * sidebar={<FileHierarchy tree={tree} />}\n * main={<NoteViewer note={note} />}\n * sidebarWidth={320}\n * />\n */\nexport const SidebarLayout: FC<SidebarLayoutProps> = ({\n sidebar,\n main,\n className,\n sidebarWidth = 280,\n fullHeight = true\n}) => {\n const gridTemplateColumns = typeof sidebarWidth === 'number' \n ? `${sidebarWidth}px 1fr` \n : `${sidebarWidth} 1fr`\n const containerClassName = clsx(\n styles.container,\n fullHeight ? styles.containerFullHeight : styles.containerAutoHeight,\n className\n )\n const sidebarScrollClassName = clsx(\n styles.sidebarScrollArea,\n fullHeight ? styles.sidebarScrollAreaFullHeight : styles.sidebarScrollAreaAutoHeight,\n styles.sidebarScrollAreaHiddenScrollbars\n )\n const mainScrollClassName = clsx(\n styles.mainScrollArea,\n fullHeight ? styles.mainScrollAreaFullHeight : styles.mainScrollAreaAutoHeight\n )\n\n return (\n <div \n className={containerClassName}\n style={{ gridTemplateColumns }}\n data-papyr-component=\"SidebarLayout\"\n >\n <a href=\"#main-content\" className={styles.skipLink}>\n Skip to main content\n </a>\n <aside className={styles.sidebar} aria-label=\"Primary navigation\">\n <div className={sidebarScrollClassName}>{sidebar}</div>\n </aside>\n\n <main id=\"main-content\" className={styles.main}>\n <div className={mainScrollClassName}>{main}</div>\n </main>\n </div>\n )\n}\n","import type { CSSProperties, FC, ReactNode } from 'react'\nimport clsx from 'clsx'\nimport styles from './DoubleSidebarLayout.module.css'\n\ntype SidebarWidth = string | number\n\nexport interface DoubleSidebarLayoutProps {\n /**\n * Node rendered in the left sidebar column.\n */\n leftSidebar: ReactNode\n /**\n * Node rendered as the primary content column.\n */\n main: ReactNode\n /**\n * Optional node rendered in the right sidebar column.\n */\n rightSidebar?: ReactNode\n /**\n * Custom width for the left sidebar column.\n * @default 280\n */\n leftWidth?: SidebarWidth\n /**\n * Custom width for the right sidebar column.\n * @default 480\n */\n rightWidth?: SidebarWidth\n /**\n * When true (default) the layout stretches to fill the viewport height and\n * constrains scrolling to the individual panes. Set to false to allow the\n * page to dictate overall height/scrolling.\n */\n fullHeight?: boolean\n /**\n * When true (default) sidebars hide native scrollbars while keeping their\n * content scrollable.\n */\n hideSidebarScrollbars?: boolean\n /**\n * Additional className forwarded to the root container.\n */\n className?: string\n}\n\nconst toCssSize = (value: SidebarWidth): string =>\n typeof value === 'number' ? `${value}px` : value\n\n/**\n * Three column workspace layout with independent scrolling for each pane.\n * Mirrors the behaviour of the Obsidian help site where the main pane owns the\n * visible scrollbar and sidebars scroll without showing native scrollbars.\n */\nexport const DoubleSidebarLayout: FC<DoubleSidebarLayoutProps> = ({\n leftSidebar,\n main,\n rightSidebar = null,\n leftWidth = 280,\n rightWidth = 480,\n fullHeight = true,\n hideSidebarScrollbars = true,\n className\n}) => {\n const containerClassName = clsx(\n styles.container,\n fullHeight ? styles.containerFullHeight : styles.containerAutoHeight,\n className\n )\n\n const sidebarScrollClassName = clsx(\n styles.sidebarScrollArea,\n hideSidebarScrollbars && styles.sidebarScrollAreaHiddenScrollbars\n )\n\n const leftStyle: CSSProperties = { width: toCssSize(leftWidth) }\n const rightStyle: CSSProperties = { width: toCssSize(rightWidth) }\n\n return (\n <div className={containerClassName} data-papyr-component=\"DoubleSidebarLayout\">\n <a href=\"#main-content\" className={styles.skipLink}>\n Skip to main content\n </a>\n <aside className={styles.sidebar} style={leftStyle} aria-label=\"File navigation\">\n <div className={sidebarScrollClassName}>{leftSidebar}</div>\n </aside>\n\n <main id=\"main-content\" className={styles.main}>\n <div className={styles.mainScrollArea}>{main}</div>\n </main>\n\n {rightSidebar ? (\n <aside className={styles.sidebar} style={rightStyle} aria-label=\"Contextual sidebar\">\n <div className={sidebarScrollClassName}>{rightSidebar}</div>\n </aside>\n ) : null}\n </div>\n )\n}\n\n","import { type FC, useCallback, useEffect, useState } from 'react'\nimport type { WebReadyNote, Heading } from 'papyr-core/runtime'\nimport clsx from 'clsx'\nimport styles from './TableOfContents.module.css'\nimport { updateHashWithAnchor } from '../../utils'\n\nexport interface TableOfContentsProps {\n note: WebReadyNote | null\n className?: string\n title?: string\n onNavigate?: (heading: Heading) => void\n}\n\nexport const TableOfContents: FC<TableOfContentsProps> = ({\n note,\n className,\n title = 'On this page',\n onNavigate\n}) => {\n const headings: Heading[] = note?.headings ?? []\n const hasRenderableHeadings = Boolean(note && headings.length > 0)\n\n const [visibleHeadings, setVisibleHeadings] = useState<Set<string>>(() => new Set())\n const clearVisibleHeadings = useCallback(() => {\n setVisibleHeadings((prev) => {\n if (prev.size === 0) {\n return prev\n }\n return new Set()\n })\n }, [])\n const headingSignature = headings.map((heading) => heading.slug).join('|')\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return\n }\n\n if (!hasRenderableHeadings) {\n clearVisibleHeadings()\n return\n }\n\n const targets = headings\n .map((heading) => {\n const element = document.getElementById(heading.slug)\n return element ? { slug: heading.slug, element } : null\n })\n .filter((value): value is { slug: string; element: HTMLElement } => Boolean(value))\n\n if (!targets.length) {\n clearVisibleHeadings()\n return\n }\n\n const getScrollableParent = (element: HTMLElement): HTMLElement | Window => {\n let parent: HTMLElement | null = element.parentElement\n while (parent && parent !== document.body) {\n const style = window.getComputedStyle(parent)\n const overflowY = style.overflowY\n const overflow = style.overflow\n const isScrollable = /(auto|scroll)/.test(`${overflowY}${overflow}`)\n if (isScrollable && parent.scrollHeight > parent.clientHeight + 1) {\n return parent\n }\n parent = parent.parentElement\n }\n return window\n }\n\n const getAbsoluteTop = (element: HTMLElement) =>\n element.getBoundingClientRect().top + window.scrollY\n\n const computeVisibleSections = () => {\n const viewportTop = window.scrollY\n const viewportBottom = viewportTop + window.innerHeight\n const nextVisible = new Set<string>()\n\n targets.forEach((target, index) => {\n const sectionStart = getAbsoluteTop(target.element)\n const nextTarget = targets[index + 1]\n const sectionEnd = nextTarget\n ? getAbsoluteTop(nextTarget.element)\n : Number.POSITIVE_INFINITY\n\n if (sectionStart < viewportBottom && sectionEnd > viewportTop) {\n nextVisible.add(target.slug)\n }\n })\n\n setVisibleHeadings((prev) => {\n if (prev.size === nextVisible.size) {\n let identical = true\n prev.forEach((slug) => {\n if (!nextVisible.has(slug)) {\n identical = false\n }\n })\n\n if (identical) {\n return prev\n }\n }\n\n return nextVisible\n })\n }\n\n let rafId: number | null = null\n const scheduleUpdate = () => {\n if (rafId !== null) {\n return\n }\n rafId = window.requestAnimationFrame(() => {\n rafId = null\n computeVisibleSections()\n })\n }\n\n scheduleUpdate()\n\n const scrollContainers = Array.from(\n new Set<EventTarget>(targets.map(({ element }) => getScrollableParent(element)))\n )\n\n scrollContainers.forEach((container) => {\n container.addEventListener('scroll', scheduleUpdate, { passive: true })\n })\n\n window.addEventListener('resize', scheduleUpdate)\n\n return () => {\n if (rafId !== null) {\n window.cancelAnimationFrame(rafId)\n }\n scrollContainers.forEach((container) => {\n container.removeEventListener('scroll', scheduleUpdate)\n })\n window.removeEventListener('resize', scheduleUpdate)\n }\n }, [clearVisibleHeadings, hasRenderableHeadings, headingSignature, headings])\n\n const handleClick = (heading: Heading, event: React.MouseEvent<HTMLAnchorElement>) => {\n event.preventDefault()\n setVisibleHeadings((prev) => {\n const next = new Set(prev)\n next.add(heading.slug)\n return next\n })\n if (onNavigate) {\n onNavigate(heading)\n } else if (heading.slug && typeof window !== 'undefined') {\n const element = document.getElementById(heading.slug)\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n updateHashWithAnchor(heading.slug)\n }\n }\n\n if (!hasRenderableHeadings || !note) {\n return null\n }\n\n return (\n <nav\n className={clsx(styles.container, className)}\n aria-label={title ?? 'Table of contents'}\n data-papyr-component=\"TableOfContents\"\n >\n <ul className={styles.list}>\n {headings.map((heading) => (\n <li\n key={heading.slug}\n className={clsx(\n styles.item,\n styles[`level${heading.level}` as keyof typeof styles],\n visibleHeadings.has(heading.slug) && styles.itemActive\n )}\n >\n <a\n href={`#${heading.slug}`}\n className={clsx(styles.link, visibleHeadings.has(heading.slug) && styles.linkActive)}\n onClick={(event) => handleClick(heading, event)}\n aria-current={visibleHeadings.has(heading.slug) ? 'location' : undefined}\n >\n {heading.text}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n )\n}\n","import { useState, useMemo, useCallback, useEffect, useRef } from 'react'\nimport type { WebReadyNote, Slug } from 'papyr-core/runtime'\n\nexport interface UseActiveNoteResult {\n activeSlug: Slug | null\n activeNote: WebReadyNote | null\n setActiveSlug: (slug: Slug | null) => void\n setActiveNote: (note: WebReadyNote | null) => void\n}\n\n/**\n * Hook for managing active note state.\n * Useful for tracking which note is currently selected/viewed.\n *\n * @param notes - Array of all notes\n * @param initialSlug - Optional initial active slug\n *\n * @example\n * // Basic usage\n * const { activeSlug, activeNote, setActiveSlug } = useActiveNote(notes)\n *\n * <FileHierarchy activeSlug={activeSlug} onNoteClick={setActiveSlug} />\n * <NoteViewer note={activeNote} />\n *\n * @example\n * // With initial selection\n * const { activeSlug, setActiveNote } = useActiveNote(notes, 'welcome')\n */\nexport function useActiveNote(\n notes: WebReadyNote[],\n initialSlug?: Slug | null\n): UseActiveNoteResult {\n const [activeSlug, setActiveSlugState] = useState<Slug | null>(initialSlug ?? null)\n const hasUserSelection = useRef(false)\n const prevInitialSlugRef = useRef<Slug | null | undefined>(initialSlug)\n const { noteSetSignature, noteSlugSet } = useMemo(() => {\n const slugs = notes.map(note => note.slug)\n const slugSet = new Set(slugs)\n // Sort to ensure the signature is order-insensitive\n const signature = [...slugSet].sort().join('\\u0000')\n return { noteSetSignature: signature, noteSlugSet: slugSet }\n }, [notes])\n const prevSignatureRef = useRef(noteSetSignature)\n\n useEffect(() => {\n const datasetChanged = prevSignatureRef.current !== noteSetSignature\n const activeSlugMissing = activeSlug != null && !noteSlugSet.has(activeSlug)\n\n prevSignatureRef.current = noteSetSignature\n\n if (datasetChanged || activeSlugMissing) {\n hasUserSelection.current = false\n }\n\n if (activeSlugMissing) {\n setActiveSlugState(null)\n }\n }, [noteSetSignature, noteSlugSet, activeSlug])\n\n useEffect(() => {\n const normalizedSlug = initialSlug ?? null\n const prevSlug = prevInitialSlugRef.current ?? null\n const initialSlugChanged = normalizedSlug !== prevSlug\n\n prevInitialSlugRef.current = initialSlug\n\n // Sync with initialSlug when:\n // 1. No user selection yet, OR\n // 2. initialSlug actually changed to a different value (e.g., URL navigation)\n if (!hasUserSelection.current || initialSlugChanged) {\n if (normalizedSlug !== activeSlug) {\n setActiveSlugState(normalizedSlug)\n }\n }\n }, [initialSlug, activeSlug])\n\n // Find active note from slug\n const activeNote = useMemo(() => {\n if (!activeSlug) return null\n return notes.find(note => note.slug === activeSlug) ?? null\n }, [notes, activeSlug])\n\n // Set active note directly (updates slug internally)\n const setActiveNote = useCallback((note: WebReadyNote | null) => {\n hasUserSelection.current = true\n setActiveSlugState(note?.slug ?? null)\n }, [])\n\n // Set active slug (note will be found automatically)\n const setActiveSlug = useCallback((slug: Slug | null) => {\n hasUserSelection.current = true\n setActiveSlugState(slug)\n }, [])\n\n return {\n activeSlug,\n activeNote,\n setActiveSlug,\n setActiveNote\n }\n}\n","import { useCallback, useEffect, useRef } from 'react'\nimport type { WebReadyNote, Slug } from 'papyr-core/runtime'\nimport { useActiveNote, type UseActiveNoteResult } from './useActiveNote'\nimport { useOptionalPapyr } from '../providers/PapyrProvider'\n\nexport interface UseRoutableActiveNoteOptions {\n /**\n * Read the current slug from your router.\n * Ensure the function is stable (wrap with useCallback) to avoid unnecessary syncs.\n */\n getCurrentSlug: () => Slug | null\n /**\n * Called when Papyr needs to push a new slug into the router.\n * For example, call navigate(`/notes/${slug}`).\n */\n onSlugChange?: (slug: Slug | null) => void\n}\n\nexport function useRoutableActiveNote(\n notes: WebReadyNote[],\n options: UseRoutableActiveNoteOptions\n): UseActiveNoteResult {\n const { getCurrentSlug, onSlugChange } = options\n const papyr = useOptionalPapyr()\n const showToast = papyr?.showToast\n\n const currentRouteSlug = getCurrentSlug()\n const currentRouteExists =\n currentRouteSlug !== null && notes.some(note => note.slug === currentRouteSlug)\n const routeSlugRef = useRef<Slug | null>(currentRouteSlug ?? null)\n const onSlugChangeRef = useRef<typeof onSlugChange>(onSlugChange)\n const syncingRef = useRef(false)\n const lastMissingSlugRef = useRef<Slug | null>(null)\n const lastValidSlugRef = useRef<Slug | null>(currentRouteExists ? currentRouteSlug : null)\n\n useEffect(() => {\n onSlugChangeRef.current = onSlugChange\n }, [onSlugChange])\n\n const {\n activeSlug,\n activeNote,\n setActiveSlug: baseSetActiveSlug,\n setActiveNote: baseSetActiveNote\n } = useActiveNote(notes, currentRouteSlug ?? undefined)\n\n const notifyRouter = useCallback(\n (slug: Slug | null) => {\n routeSlugRef.current = slug ?? null\n if (!onSlugChangeRef.current) {\n return\n }\n\n const currentRouteSlug = getCurrentSlug()\n if (slug !== currentRouteSlug) {\n onSlugChangeRef.current(slug)\n }\n },\n [getCurrentSlug]\n )\n\n useEffect(() => {\n const routeSlug = getCurrentSlug()\n routeSlugRef.current = routeSlug ?? null\n\n if (!routeSlug) {\n lastMissingSlugRef.current = null\n lastValidSlugRef.current = null\n if (activeSlug !== null) {\n syncingRef.current = true\n baseSetActiveSlug(null)\n syncingRef.current = false\n }\n return\n }\n\n const hasNotes = notes.length > 0\n const exists = hasNotes && notes.some(note => note.slug === routeSlug)\n\n if (exists) {\n lastMissingSlugRef.current = null\n lastValidSlugRef.current = routeSlug\n if (routeSlug !== activeSlug) {\n syncingRef.current = true\n baseSetActiveSlug(routeSlug)\n syncingRef.current = false\n }\n return\n }\n\n if (!hasNotes) {\n return\n }\n\n if (lastMissingSlugRef.current !== routeSlug) {\n lastMissingSlugRef.current = routeSlug\n showToast?.(`Note \"${routeSlug}\" not found.`, { duration: 3000 })\n }\n\n if (lastValidSlugRef.current === routeSlug) {\n lastValidSlugRef.current = null\n }\n\n const fallbackSlug = lastValidSlugRef.current\n if (fallbackSlug !== routeSlug) {\n notifyRouter(fallbackSlug ?? null)\n }\n\n if (fallbackSlug !== activeSlug) {\n syncingRef.current = true\n baseSetActiveSlug(fallbackSlug ?? null)\n syncingRef.current = false\n }\n // Include currentRouteSlug to ensure effect runs when URL changes\n }, [getCurrentSlug, currentRouteSlug, notes, activeSlug, baseSetActiveSlug, notifyRouter, showToast])\n\n const setActiveSlug = useCallback(\n (slug: Slug | null) => {\n baseSetActiveSlug(slug)\n if (!syncingRef.current) {\n notifyRouter(slug)\n }\n },\n [baseSetActiveSlug, notifyRouter]\n )\n\n const setActiveNote = useCallback(\n (note: WebReadyNote | null) => {\n baseSetActiveNote(note)\n if (!syncingRef.current) {\n notifyRouter(note?.slug ?? null)\n }\n },\n [baseSetActiveNote, notifyRouter]\n )\n\n return {\n activeSlug,\n activeNote,\n setActiveSlug,\n setActiveNote\n }\n}\n","import { useCallback, useEffect, useMemo } from 'react'\nimport type {\n FolderNode,\n NoteGraph,\n SearchIndex,\n Slug,\n WebReadyNote\n} from 'papyr-core/runtime'\nimport type { ReactNode } from 'react'\nimport { DoubleSidebarLayout } from '../../components/DoubleSidebarLayout'\nimport type { DoubleSidebarLayoutProps } from '../../components/DoubleSidebarLayout'\nimport { FileHierarchy, type FileHierarchyProps } from '../../components/FileHierarchy'\nimport { TableOfContents, type TableOfContentsProps } from '../../components/TableOfContents'\nimport { GraphView } from '../../components/GraphView'\nimport { NoteViewer } from '../../components/NoteViewer'\nimport { EmptyState } from '../../components/EmptyState'\nimport { PapyrProvider } from '../../providers/PapyrProvider'\nimport { useActiveNote } from '../../hooks/useActiveNote'\n\nexport interface WorkspaceBlockContext {\n notes: WebReadyNote[]\n searchIndex: SearchIndex\n graph: NoteGraph | null\n activeSlug: Slug | null\n activeNote: WebReadyNote | null\n setActiveSlug: (slug: Slug | null) => void\n setActiveNote: (note: WebReadyNote | null) => void\n}\n\ntype SlotRenderer = ReactNode | ((context: WorkspaceBlockContext) => ReactNode)\n\ntype FileHierarchyOverrides = Omit<\n FileHierarchyProps,\n 'tree' | 'onNoteClick' | 'activeSlug' | 'notes' | 'searchable' | 'searchIndex'\n>\n\ntype TableOfContentsOverrides = Omit<TableOfContentsProps, 'note'>\n\nexport interface WorkspaceBlockProps {\n notes: WebReadyNote[]\n tree: FolderNode[] | FolderNode\n searchIndex: SearchIndex\n graph?: NoteGraph | null\n /**\n * UNCONTROLLED MODE: Initial slug for internal state management.\n * Use this when you don't need to sync with external state (e.g., router).\n */\n initialSlug?: Slug | null\n /**\n * CONTROLLED MODE: Current active slug managed by parent.\n * When provided, WorkspaceBlock delegates state to parent via onActiveSlugChange.\n * Use with useRoutableActiveNote for router integration.\n */\n activeSlug?: Slug | null\n /**\n * CONTROLLED MODE: Callback when active slug should change.\n * Required when using controlled mode (activeSlug prop).\n */\n onActiveSlugChange?: (slug: Slug | null) => void\n className?: string\n /**\n * Customise layout widths. Defaults to 280px for each sidebar.\n */\n leftWidth?: DoubleSidebarLayoutProps['leftWidth']\n rightWidth?: DoubleSidebarLayoutProps['rightWidth']\n /**\n * Render custom content for each pane. Provide either a React node or a\n * function that receives the block context.\n */\n leftSidebar?: SlotRenderer\n main?: SlotRenderer\n rightSidebar?: SlotRenderer\n /**\n * When true, omits the default table of contents from the right sidebar.\n */\n hideTableOfContents?: boolean\n /**\n * Called whenever the active note changes.\n */\n onNoteChange?: (note: WebReadyNote | null) => void\n /**\n * Optional overrides forwarded to the default FileHierarchy implementation.\n */\n fileHierarchyProps?: FileHierarchyOverrides\n /**\n * Optional overrides forwarded to the default TableOfContents implementation.\n */\n tableOfContentsProps?: TableOfContentsOverrides\n /**\n * Custom empty state rendered when no note is selected.\n */\n emptyState?: ReactNode\n /**\n * Toggle native sidebar scrollbars. Default: hidden.\n */\n hideSidebarScrollbars?: boolean\n}\n\nconst resolveSlot = (\n slot: SlotRenderer | undefined,\n context: WorkspaceBlockContext,\n fallback: ReactNode\n): ReactNode => {\n if (typeof slot === 'function') {\n return slot(context)\n }\n\n if (slot !== undefined) {\n return slot\n }\n\n return fallback\n}\n\nexport const WorkspaceBlock = ({\n notes,\n tree,\n searchIndex,\n graph = null,\n initialSlug = null,\n activeSlug: controlledActiveSlug,\n onActiveSlugChange,\n className,\n leftWidth,\n rightWidth,\n leftSidebar,\n main,\n rightSidebar,\n hideTableOfContents = false,\n onNoteChange,\n fileHierarchyProps,\n tableOfContentsProps,\n emptyState,\n hideSidebarScrollbars = true\n}: WorkspaceBlockProps) => {\n // Determine if controlled mode (parent manages state)\n const isControlled = controlledActiveSlug !== undefined\n\n // Internal state for uncontrolled mode\n const internalState = useActiveNote(notes, initialSlug)\n\n // Resolve active slug and note based on mode\n const activeSlug = isControlled ? controlledActiveSlug : internalState.activeSlug\n const activeNote = useMemo(() => {\n if (isControlled) {\n if (!controlledActiveSlug) return null\n return notes.find(n => n.slug === controlledActiveSlug) ?? null\n }\n return internalState.activeNote\n }, [isControlled, controlledActiveSlug, notes, internalState.activeNote])\n\n // Resolve setters based on mode\n const setActiveSlug = useCallback(\n (slug: Slug | null) => {\n if (isControlled) {\n onActiveSlugChange?.(slug)\n } else {\n internalState.setActiveSlug(slug)\n }\n },\n [isControlled, onActiveSlugChange, internalState]\n )\n\n const setActiveNote = useCallback(\n (note: WebReadyNote | null) => {\n if (isControlled) {\n onActiveSlugChange?.(note?.slug ?? null)\n } else {\n internalState.setActiveNote(note)\n }\n },\n [isControlled, onActiveSlugChange, internalState]\n )\n\n useEffect(() => {\n onNoteChange?.(activeNote)\n }, [activeNote, onNoteChange])\n\n const context = useMemo<WorkspaceBlockContext>(\n () => ({\n notes,\n searchIndex,\n graph,\n activeSlug,\n activeNote,\n setActiveSlug,\n setActiveNote\n }),\n [notes, searchIndex, graph, activeSlug, activeNote, setActiveSlug, setActiveNote]\n )\n\n const defaultFileHierarchy = (\n <FileHierarchy\n tree={tree}\n onNoteClick={setActiveSlug}\n activeSlug={activeSlug ?? undefined}\n notes={notes}\n searchable\n searchIndex={searchIndex}\n {...fileHierarchyProps}\n />\n )\n\n const defaultMain = (\n <NoteViewer\n note={activeNote}\n onNavigateNote={setActiveSlug}\n emptyState={\n emptyState ?? (\n <EmptyState\n icon=\"📝\"\n title=\"No note selected\"\n description=\"Choose a note from the file hierarchy to start reading.\"\n />\n )\n }\n />\n )\n\n const defaultRightSidebar = hideTableOfContents ? null : (\n <>\n {graph && activeSlug && (\n <div style={{\n height: '240px',\n flexShrink: 0,\n borderBottom: '1px solid var(--papyr-border, rgba(255, 255, 255, 0.1))'\n }}>\n <GraphView\n graph={graph}\n activeSlug={activeSlug}\n onNodeSelect={(node) => setActiveSlug(node.id as Slug)}\n showFullscreenToggle={false}\n />\n </div>\n )}\n <TableOfContents note={activeNote} {...tableOfContentsProps} />\n </>\n )\n\n const resolvedLeft = resolveSlot(leftSidebar, context, defaultFileHierarchy)\n const resolvedMain = resolveSlot(main, context, defaultMain)\n const resolvedRight = resolveSlot(rightSidebar, context, defaultRightSidebar)\n\n return (\n <PapyrProvider notes={notes} searchIndex={searchIndex} graph={graph}>\n <DoubleSidebarLayout\n className={className}\n leftSidebar={resolvedLeft}\n main={resolvedMain}\n rightSidebar={resolvedRight ?? undefined}\n leftWidth={leftWidth}\n rightWidth={rightWidth}\n hideSidebarScrollbars={hideSidebarScrollbars}\n />\n </PapyrProvider>\n )\n}\n"],"names":["styles","anchor","query","currentRouteSlug"],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { NoteGraph, SearchIndex, SearchOptions, SearchResult, WebReadyNote } from 'papyr-core/runtime';
2
+ import { FC, ReactNode } from 'react';
3
+
4
+ export interface PapyrProviderProps {
5
+ notes: WebReadyNote[];
6
+ children: ReactNode;
7
+ searchIndex: SearchIndex;
8
+ graph?: NoteGraph | null;
9
+ }
10
+ export interface ShowToastOptions {
11
+ duration?: number;
12
+ id?: string;
13
+ }
14
+ export interface PapyrContextValue {
15
+ notes: WebReadyNote[];
16
+ graph: NoteGraph | null;
17
+ searchIndex: SearchIndex;
18
+ search: (query: string, options?: SearchOptions) => SearchResult[];
19
+ showToast: (message: string, options?: ShowToastOptions) => string;
20
+ dismissToast: (id: string) => void;
21
+ }
22
+ export declare const PapyrProvider: FC<PapyrProviderProps>;
23
+ export declare function usePapyr(): PapyrContextValue;
24
+ export declare function useOptionalPapyr(): PapyrContextValue | undefined;
@@ -0,0 +1,2 @@
1
+ export type { PapyrContextValue, PapyrProviderProps, ShowToastOptions } from './PapyrProvider';
2
+ export { PapyrProvider, usePapyr, useOptionalPapyr } from './PapyrProvider';