From 281654081d3fd600e294668d48b5d4fea423f323 Mon Sep 17 00:00:00 2001 From: Michael Freno Date: Mon, 22 Dec 2025 01:18:49 -0500 Subject: [PATCH] references and spinner fixes --- bun.lockb | Bin 407056 -> 407994 bytes package.json | 2 + src/app.css | 23 +-- src/components/LoadingSpinner.tsx | 14 +- src/components/SkeletonLoader.tsx | 42 +---- src/components/Spinner.tsx | 58 ++++++ src/components/TerminalSplash.tsx | 24 +-- src/components/blog/PostBodyClient.tsx | 174 +++++++++++++++++- src/components/blog/TextEditor.tsx | 236 ++++++++++++++++++++++++- 9 files changed, 484 insertions(+), 89 deletions(-) create mode 100644 src/components/Spinner.tsx diff --git a/bun.lockb b/bun.lockb index 5c0e788dd382e10239e93b4cc442e2425a8c3b95..c2e76845c0731cbf6436619d5cb2ea94349151b0 100755 GIT binary patch delta 66012 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 K@?pdI!~O@;acBtu delta 65390 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 span.ml-2 { + font-style: italic; +} diff --git a/src/components/LoadingSpinner.tsx b/src/components/LoadingSpinner.tsx index 011fdbc..5665cc0 100644 --- a/src/components/LoadingSpinner.tsx +++ b/src/components/LoadingSpinner.tsx @@ -1,16 +1,12 @@ +import { Spinner } from "~/components/Spinner"; + export default function LoadingSpinner(props: { height: number; width: number; }) { return ( - - - logo - +
+ +
); } diff --git a/src/components/SkeletonLoader.tsx b/src/components/SkeletonLoader.tsx index f52c37b..747e87c 100644 --- a/src/components/SkeletonLoader.tsx +++ b/src/components/SkeletonLoader.tsx @@ -1,68 +1,42 @@ -import { onMount, onCleanup, createSignal, JSX } from "solid-js"; -import { isServer } from "solid-js/web"; - -const spinnerChars = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]; +import { JSX } from "solid-js"; +import { Spinner } from "~/components/Spinner"; interface SkeletonProps { class?: string; } -function useSpinner() { - const [showing, setShowing] = createSignal(0); - - onMount(() => { - if (isServer) return; - - const interval = setInterval(() => { - setShowing((prev) => (prev + 1) % spinnerChars.length); - }, 50); - - onCleanup(() => { - clearInterval(interval); - }); - }); - - return () => spinnerChars[showing()]; -} - export function SkeletonBox(props: SkeletonProps) { - const spinner = useSpinner(); - return (
- {spinner()} +
); } export function SkeletonText(props: SkeletonProps) { - const spinner = useSpinner(); - return (
- {spinner()} +
); } export function SkeletonCircle(props: SkeletonProps) { - const spinner = useSpinner(); - return (
- {spinner()} +
); } diff --git a/src/components/Spinner.tsx b/src/components/Spinner.tsx new file mode 100644 index 0000000..cee7ce4 --- /dev/null +++ b/src/components/Spinner.tsx @@ -0,0 +1,58 @@ +import { onMount, onCleanup, createSignal, JSX } from "solid-js"; +import { isServer } from "solid-js/web"; + +const spinnerChars = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]; + +export interface SpinnerProps { + size?: "sm" | "md" | "lg" | "xl" | number; + class?: string; + "aria-label"?: string; +} + +const sizeMap = { + sm: "text-base", + md: "text-2xl", + lg: "text-4xl", + xl: "text-6xl" +}; + +export function Spinner(props: SpinnerProps) { + const [showing, setShowing] = createSignal(0); + + onMount(() => { + if (isServer) return; + + const interval = setInterval(() => { + setShowing((prev) => (prev + 1) % spinnerChars.length); + }, 50); + + onCleanup(() => { + clearInterval(interval); + }); + }); + + const sizeClass = () => { + if (typeof props.size === "number") { + return ""; + } + return sizeMap[props.size || "md"]; + }; + + const style = () => { + if (typeof props.size === "number") { + return { "font-size": `${props.size}px`, "line-height": "1" }; + } + return {}; + }; + + return ( + + {spinnerChars[showing()]} + + ); +} diff --git a/src/components/TerminalSplash.tsx b/src/components/TerminalSplash.tsx index 43dab6e..ee3e5b6 100644 --- a/src/components/TerminalSplash.tsx +++ b/src/components/TerminalSplash.tsx @@ -1,29 +1,11 @@ -import { onMount, onCleanup, createSignal } from "solid-js"; -import { isServer } from "solid-js/web"; - -const spinnerChars = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]; +import { Spinner } from "~/components/Spinner"; export function TerminalSplash() { - const [showing, setShowing] = createSignal(0); - - onMount(() => { - // Only run animation on client - if (isServer) return; - - const interval = setInterval(() => { - setShowing((prev) => (prev + 1) % spinnerChars.length); - }, 50); - - onCleanup(() => { - clearInterval(interval); - }); - }); - return (
-
+
- {spinnerChars[showing()]} +
diff --git a/src/components/blog/PostBodyClient.tsx b/src/components/blog/PostBodyClient.tsx index 5c2933b..4da78ad 100644 --- a/src/components/blog/PostBodyClient.tsx +++ b/src/components/blog/PostBodyClient.tsx @@ -1,5 +1,4 @@ -import { createEffect } from "solid-js"; -import { createSignal } from "solid-js"; +import { createEffect, createSignal, onMount } from "solid-js"; import type { HLJSApi } from "highlight.js"; import MermaidRenderer from "./MermaidRenderer"; @@ -98,6 +97,161 @@ export default function PostBodyClient(props: PostBodyClientProps) { let contentRef: HTMLDivElement | undefined; const [hljs, setHljs] = createSignal(null); + // Process superscript references and enhance the References section + const processReferences = () => { + if (!contentRef) return; + + const foundRefs = new Map(); + + // Find all elements with [n] pattern + const supElements = contentRef.querySelectorAll("sup"); + + supElements.forEach((sup) => { + const text = sup.textContent?.trim() || ""; + // Match patterns like [1], [2], [a], [*], etc. + const match = text.match(/^\[(.+?)\]$/); + + if (match) { + const refNumber = match[1]; + const refId = `ref-${refNumber}`; + const refBackId = `ref-${refNumber}-back`; + + // Add ID to the sup element itself for back navigation + sup.id = refBackId; + + // Replace sup content with a clickable link + sup.innerHTML = ""; + const link = document.createElement("a"); + link.href = `#${refId}`; + link.textContent = `[${refNumber}]`; + link.className = + "reference-link text-blue hover:text-sky no-underline cursor-pointer"; + link.style.cssText = + "text-decoration: none; font-size: 0.75em; vertical-align: super;"; + + // Add smooth scroll behavior + link.onclick = (e) => { + e.preventDefault(); + const target = document.getElementById(refId); + if (target) { + target.scrollIntoView({ behavior: "smooth", block: "center" }); + // Highlight the reference briefly + target.style.backgroundColor = "rgba(137, 180, 250, 0.2)"; + setTimeout(() => { + target.style.backgroundColor = ""; + }, 2000); + } + }; + + sup.appendChild(link); + } + }); + + // Find and enhance the References section + const headings = contentRef.querySelectorAll("h2"); + let referencesSection: HTMLElement | null = null; + + headings.forEach((heading) => { + if (heading.textContent?.trim() === "References") { + referencesSection = heading; + } + }); + + if (referencesSection) { + // Style the References heading + referencesSection.className = "text-2xl font-bold mb-4 text-text"; + + // Find the parent container and add styling + const parentDiv = referencesSection.parentElement; + if (parentDiv) { + // Add top border and padding + parentDiv.style.cssText = + "border-top: 1px solid var(--surface2); margin-top: 4rem; padding-top: 2rem;"; + } + + // Find all paragraphs after the References heading that start with [n] + let currentElement = referencesSection.nextElementSibling; + + while (currentElement) { + if (currentElement.tagName === "P") { + const text = currentElement.textContent?.trim() || ""; + const match = text.match(/^\[(.+?)\]\s*/); + + if (match) { + const refNumber = match[1]; + const refId = `ref-${refNumber}`; + + // Set the ID for linking + currentElement.id = refId; + + // Add styling + currentElement.className = + "reference-item transition-colors duration-500 text-sm mb-3"; + currentElement.style.cssText = "scroll-margin-top: 100px;"; + + // Parse and style the content - get everything after [n] + let refText = text.substring(match[0].length); + + // Remove any existing "↑ Back" text (including various Unicode arrow variants) + refText = refText.replace(/[↑⬆️]\s*Back\s*$/i, "").trim(); + + // Create styled content + currentElement.innerHTML = ""; + + // Add bold reference number + const refNumSpan = document.createElement("span"); + refNumSpan.className = "text-blue font-semibold"; + refNumSpan.textContent = `[${refNumber}]`; + currentElement.appendChild(refNumSpan); + + // Add reference text + if (refText) { + const refTextSpan = document.createElement("span"); + refTextSpan.className = "ml-2"; + refTextSpan.textContent = refText; + currentElement.appendChild(refTextSpan); + } else { + const refTextSpan = document.createElement("span"); + refTextSpan.className = "ml-2 text-subtext0 italic"; + refTextSpan.textContent = "Add your reference text here"; + currentElement.appendChild(refTextSpan); + } + + // Add back button + const backLink = document.createElement("a"); + backLink.href = `#ref-${refNumber}-back`; + backLink.className = + "text-mauve hover:text-pink ml-2 text-xs cursor-pointer"; + backLink.textContent = "↑ Back"; + backLink.onclick = (e) => { + e.preventDefault(); + const target = document.getElementById(`ref-${refNumber}-back`); + if (target) { + target.scrollIntoView({ behavior: "smooth", block: "center" }); + // Highlight the reference link briefly + target.style.backgroundColor = "rgba(203, 166, 247, 0.2)"; + setTimeout(() => { + target.style.backgroundColor = ""; + }, 2000); + } + }; + currentElement.appendChild(backLink); + } + } + + // Check if we've reached another heading (end of references) + if ( + currentElement.tagName.match(/^H[1-6]$/) && + currentElement !== referencesSection + ) { + break; + } + + currentElement = currentElement.nextElementSibling; + } + } + }; + // Load highlight.js only when needed createEffect(() => { if (props.hasCodeBlock && !hljs()) { @@ -115,6 +269,22 @@ export default function PostBodyClient(props: PostBodyClientProps) { } }); + // Process references after content is mounted and when body changes + onMount(() => { + setTimeout(() => { + processReferences(); + }, 150); + }); + + createEffect(() => { + // Re-process when body changes + if (props.body && contentRef) { + setTimeout(() => { + processReferences(); + }, 150); + } + }); + return (
Hello! World

`, editorProps: { @@ -474,6 +480,8 @@ export default function TextEditor(props: TextEditorProps) { onUpdate: ({ editor }) => { untrack(() => { props.updateContent(editor.getHTML()); + // Auto-manage references section + setTimeout(() => updateReferencesSection(editor), 100); }); }, onSelectionUpdate: ({ editor }) => { @@ -505,13 +513,179 @@ export default function TextEditor(props: TextEditorProps) { (newContent) => { const instance = editor(); if (instance && newContent && instance.getHTML() !== newContent) { - instance.commands.setContent(newContent, false); // false = don't emit update event + instance.commands.setContent(newContent, { emitUpdate: false }); } }, { defer: true } ) ); + // Auto-manage references section + const updateReferencesSection = (editorInstance: any) => { + if (!editorInstance) return; + + const doc = editorInstance.state.doc; + const foundRefs = new Set(); + + // Scan document for superscript marks containing [n] patterns + doc.descendants((node: any) => { + if (node.isText && node.marks) { + const hasSuperscript = node.marks.some( + (mark: any) => mark.type.name === "superscript" + ); + if (hasSuperscript) { + const text = node.text || ""; + const match = text.match(/^\[(.+?)\]$/); + if (match) { + foundRefs.add(match[1]); + } + } + } + }); + + // If no references found, remove references section if it exists + if (foundRefs.size === 0) { + let hasReferencesSection = false; + let hrPos = -1; + let sectionStartPos = -1; + + doc.descendants((node: any, pos: number) => { + if (node.type.name === "heading" && node.textContent === "References") { + hasReferencesSection = true; + sectionStartPos = pos; + } + }); + + if (hasReferencesSection && sectionStartPos > 0) { + // Find the HR before References heading + doc.nodesBetween( + Math.max(0, sectionStartPos - 50), + sectionStartPos, + (node: any, pos: number) => { + if (node.type.name === "horizontalRule") { + hrPos = pos; + } + } + ); + + // Delete from HR to end of document + if (hrPos >= 0) { + const tr = editorInstance.state.tr; + tr.delete(hrPos, doc.content.size); + editorInstance.view.dispatch(tr); + } + } + return; + } + + // Convert Set to sorted array + const refNumbers = Array.from(foundRefs).sort((a, b) => { + const numA = parseInt(a); + const numB = parseInt(b); + if (!isNaN(numA) && !isNaN(numB)) { + return numA - numB; + } + return a.localeCompare(b); + }); + + // Check if References section already exists + let referencesHeadingPos = -1; + let existingRefs = new Set(); + + doc.descendants((node: any, pos: number) => { + if (node.type.name === "heading" && node.textContent === "References") { + referencesHeadingPos = pos; + } + // Check for existing reference list items + if (referencesHeadingPos >= 0 && node.type.name === "paragraph") { + const match = node.textContent.match(/^\[(.+?)\]/); + if (match) { + existingRefs.add(match[1]); + } + } + }); + + // If references section doesn't exist, create it + if (referencesHeadingPos === -1) { + const content: any[] = [ + { type: "horizontalRule" }, + { + type: "heading", + attrs: { level: 2 }, + content: [{ type: "text", text: "References" }] + } + ]; + + // Add each reference as a paragraph + refNumbers.forEach((refNum) => { + content.push({ + type: "paragraph", + content: [ + { + type: "text", + text: `[${refNum}] `, + marks: [{ type: "bold" }] + } as any, + { + type: "text", + text: "Add your reference text here" + } + ] + }); + }); + + // Insert at the end + const tr = editorInstance.state.tr; + tr.insert( + doc.content.size, + editorInstance.schema.nodeFromJSON({ type: "doc", content }).content + ); + editorInstance.view.dispatch(tr); + } else { + // Update existing references section - add missing refs + const newRefs = refNumbers.filter((ref) => !existingRefs.has(ref)); + + if (newRefs.length > 0) { + // Find position after References heading to insert new refs + let insertPos = referencesHeadingPos; + doc.nodesBetween( + referencesHeadingPos, + doc.content.size, + (node: any, pos: number) => { + if (pos > insertPos) { + insertPos = pos + node.nodeSize; + } + } + ); + + const content: any[] = []; + newRefs.forEach((refNum) => { + content.push({ + type: "paragraph", + content: [ + { + type: "text", + text: `[${refNum}] `, + marks: [{ type: "bold" }] + } as any, + { + type: "text", + text: "Add your reference text here" + } + ] + }); + }); + + const tr = editorInstance.state.tr; + content.forEach((item) => { + tr.insert(insertPos, editorInstance.schema.nodeFromJSON(item)); + insertPos += editorInstance.schema.nodeFromJSON(item).nodeSize; + }); + editorInstance.view.dispatch(tr); + } + } + }; + const setLink = () => { const instance = editor(); if (!instance) return; @@ -1057,6 +1231,34 @@ export default function TextEditor(props: TextEditorProps) { > Code + + + +