From 2a1e1196c7bdd95ef88db2028b7e225fa3214457 Mon Sep 17 00:00:00 2001 From: Michael Freno Date: Sun, 21 Dec 2025 10:07:39 -0500 Subject: [PATCH] some styling issues, but it works --- bun.lockb | Bin 360726 -> 407056 bytes package.json | 2 + src/app.css | 254 +++++++++++++++ src/components/blog/MermaidRenderer.tsx | 51 +++ src/components/blog/PostBodyClient.tsx | 2 + src/components/blog/TextEditor.tsx | 372 ++++++++++++++++++++++ src/components/blog/extensions/Mermaid.ts | 63 ++++ 7 files changed, 744 insertions(+) create mode 100644 src/components/blog/MermaidRenderer.tsx create mode 100644 src/components/blog/extensions/Mermaid.ts diff --git a/bun.lockb b/bun.lockb index 27d31fe5d5805954d1e659066f9e03209aa83714..5c0e788dd382e10239e93b4cc442e2425a8c3b95 100755 GIT binary patch delta 88280 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%0AVum>mh0C#x`Tt`B6AC>esjYp2!0@lIGAm;}= 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 EAChM)K>z>% diff --git a/package.json b/package.json index 839d3b5..f088837 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@tiptap/extension-table-row": "^3.14.0", "@tiptap/extension-task-item": "^3.14.0", "@tiptap/extension-task-list": "^3.14.0", + "@tiptap/extension-text-align": "^3.14.0", "@tiptap/extension-text-style": "^3.14.0", "@tiptap/pm": "^3.14.0", "@tiptap/starter-kit": "^3.14.0", @@ -43,6 +44,7 @@ "google-auth-library": "^10.5.0", "highlight.js": "^11.11.1", "jose": "^6.1.3", + "mermaid": "^11.12.2", "motion": "^12.23.26", "solid-js": "^1.9.5", "solid-tiptap": "^0.8.0", diff --git a/src/app.css b/src/app.css index fa91ccd..8fc463b 100644 --- a/src/app.css +++ b/src/app.css @@ -969,3 +969,257 @@ details[open] div[data-type="details-content"] { transform: translateY(0); } } + +/* Mermaid diagram styles */ +.mermaid-diagram, +pre[data-type="mermaid"] { + margin: 2rem 0; + padding: 1rem; + background-color: var(--color-surface0); + border-radius: 0.5rem; + border: 1px solid var(--color-surface2); + overflow: visible; +} + +.mermaid-diagram code, +pre[data-type="mermaid"] code { + display: block; + white-space: pre; + font-family: "JetBrainsMono", monospace; + color: var(--color-text); + background: transparent; +} + +/* Rendered mermaid SVG container */ +.mermaid-rendered { + display: flex; + justify-content: center; + align-items: center; + min-height: 100px; +} + +.mermaid-rendered svg { + max-width: 100%; + height: auto; +} + +/* Mermaid theme adjustments */ +.mermaid .node rect, +.mermaid .node circle, +.mermaid .node polygon, +.mermaid .node ellipse, +.mermaid .node path { + fill: var(--color-surface1) !important; + stroke: var(--color-blue) !important; + stroke-width: 2px; +} + +.mermaid .node .label, +.mermaid .nodeLabel { + color: var(--color-text) !important; + fill: var(--color-text) !important; +} + +.mermaid .edgePath .path, +.mermaid .flowchart-link { + stroke: var(--color-blue) !important; + stroke-width: 2px; +} + +.mermaid .edgeLabel, +.mermaid .edgeLabel rect { + background-color: var(--color-surface0) !important; + fill: var(--color-surface0) !important; +} + +.mermaid .edgeLabel span { + color: var(--color-text) !important; +} + +.mermaid .cluster rect { + fill: var(--color-surface0) !important; + stroke: var(--color-surface2) !important; +} + +.mermaid .cluster-label { + fill: var(--color-text) !important; +} + +/* Class diagram styles */ +.mermaid .classGroup rect, +.mermaid .classGroup line { + stroke: var(--color-blue) !important; + fill: var(--color-surface1) !important; +} + +.mermaid .classLabel { + fill: var(--color-text) !important; +} + +/* State diagram styles */ +.mermaid .statediagram-state rect { + fill: var(--color-surface1) !important; + stroke: var(--color-blue) !important; +} + +.mermaid .statediagram-state text { + fill: var(--color-text) !important; +} + +/* Sequence diagram styles */ +.mermaid .actor { + fill: var(--color-surface1) !important; + stroke: var(--color-blue) !important; +} + +.mermaid .actor text, +.mermaid .messageText { + fill: var(--color-text) !important; + stroke: none !important; +} + +.mermaid .activation0, +.mermaid .activation1, +.mermaid .activation2 { + fill: var(--color-surface2) !important; + stroke: var(--color-blue) !important; +} + +/* ER diagram styles */ +.mermaid .er.entityBox { + fill: var(--color-surface1) !important; + stroke: var(--color-blue) !important; +} + +.mermaid .er.entityLabel { + fill: var(--color-text) !important; +} + +.mermaid .er.relationshipLabel { + fill: var(--color-text) !important; +} + +/* Gantt chart styles */ +.mermaid .grid .tick line { + stroke: var(--color-surface2) !important; +} + +.mermaid .grid .tick text { + fill: var(--color-text) !important; +} + +.mermaid .task { + fill: var(--color-blue) !important; + stroke: var(--color-blue) !important; +} + +.mermaid .taskText { + fill: var(--color-text) !important; +} + +.mermaid .taskTextOutsideRight, +.mermaid .taskTextOutsideLeft { + fill: var(--color-text) !important; +} + +/* Pie chart styles */ +.mermaid .pieCircle { + stroke: var(--color-surface2) !important; +} + +.mermaid .pieTitleText { + fill: var(--color-text) !important; +} + +.mermaid .slice { + stroke-width: 2px; + stroke: var(--color-surface0) !important; +} + +.mermaid .legend rect { + fill: var(--color-blue) !important; + stroke: var(--color-blue) !important; +} + +/* Override all text elements in mermaid SVG for high contrast */ +.mermaid-rendered svg text, +.mermaid svg text, +svg.mermaid text { + fill: #ffffff !important; + color: #ffffff !important; + stroke: #000000 !important; + stroke-width: 0.25px !important; +} + +/* Ensure percentage labels in pie charts are visible */ +.mermaid text.slice, +.mermaid .slice { + fill: #ffffff !important; + font-weight: bold !important; + font-size: 14px !important; + stroke: #000000 !important; + stroke-width: 0.75px !important; + paint-order: stroke fill !important; +} + +/* Text alignment styles */ +.ProseMirror [style*="text-align: left"], +.ProseMirror p[style*="text-align: left"], +.ProseMirror h1[style*="text-align: left"], +.ProseMirror h2[style*="text-align: left"], +.ProseMirror h3[style*="text-align: left"], +.ProseMirror h4[style*="text-align: left"], +.ProseMirror h5[style*="text-align: left"], +.ProseMirror h6[style*="text-align: left"] { + text-align: left; +} + +.ProseMirror [style*="text-align: center"], +.ProseMirror p[style*="text-align: center"], +.ProseMirror h1[style*="text-align: center"], +.ProseMirror h2[style*="text-align: center"], +.ProseMirror h3[style*="text-align: center"], +.ProseMirror h4[style*="text-align: center"], +.ProseMirror h5[style*="text-align: center"], +.ProseMirror h6[style*="text-align: center"] { + text-align: center; +} + +.ProseMirror [style*="text-align: right"], +.ProseMirror p[style*="text-align: right"], +.ProseMirror h1[style*="text-align: right"], +.ProseMirror h2[style*="text-align: right"], +.ProseMirror h3[style*="text-align: right"], +.ProseMirror h4[style*="text-align: right"], +.ProseMirror h5[style*="text-align: right"], +.ProseMirror h6[style*="text-align: right"] { + text-align: right; +} + +.ProseMirror [style*="text-align: justify"], +.ProseMirror p[style*="text-align: justify"], +.ProseMirror h1[style*="text-align: justify"], +.ProseMirror h2[style*="text-align: justify"], +.ProseMirror h3[style*="text-align: justify"], +.ProseMirror h4[style*="text-align: justify"], +.ProseMirror h5[style*="text-align: justify"], +.ProseMirror h6[style*="text-align: justify"] { + text-align: justify; +} + +/* Image alignment */ +.ProseMirror img[style*="text-align: center"] { + display: block; + margin-left: auto; + margin-right: auto; +} + +.ProseMirror img[style*="text-align: right"] { + display: block; + margin-left: auto; +} + +.ProseMirror img[style*="text-align: left"] { + display: block; + margin-right: auto; +} diff --git a/src/components/blog/MermaidRenderer.tsx b/src/components/blog/MermaidRenderer.tsx new file mode 100644 index 0000000..8530abb --- /dev/null +++ b/src/components/blog/MermaidRenderer.tsx @@ -0,0 +1,51 @@ +import { onMount } from "solid-js"; +import mermaid from "mermaid"; + +// Initialize mermaid once +mermaid.initialize({ + startOnLoad: false, + theme: "dark", + securityLevel: "loose", + fontFamily: "monospace", + themeVariables: { + darkMode: true, + primaryColor: "#2c2f40", + primaryTextColor: "#b5c1f1", + primaryBorderColor: "#739df2", + lineColor: "#739df2", + secondaryColor: "#3e4255", + tertiaryColor: "#505469" + } +}); + +export default function MermaidRenderer() { + onMount(() => { + // Find all mermaid diagrams and render them + const mermaidPres = document.querySelectorAll('pre[data-type="mermaid"]'); + + mermaidPres.forEach(async (pre, index) => { + const code = pre.querySelector("code"); + if (!code) return; + + const content = code.textContent || ""; + if (!content.trim()) return; + + try { + const id = `mermaid-${index}-${Math.random().toString(36).substr(2, 9)}`; + const { svg } = await mermaid.render(id, content); + + // Replace the pre/code with rendered SVG + const wrapper = document.createElement("div"); + wrapper.className = "mermaid-rendered"; + wrapper.innerHTML = svg; + pre.replaceWith(wrapper); + } catch (err) { + console.error("Failed to render mermaid diagram:", err); + // Keep the original code block if rendering fails + pre.classList.add("mermaid-error"); + } + }); + }); + + return null; +} diff --git a/src/components/blog/PostBodyClient.tsx b/src/components/blog/PostBodyClient.tsx index 4aab076..5c2933b 100644 --- a/src/components/blog/PostBodyClient.tsx +++ b/src/components/blog/PostBodyClient.tsx @@ -1,6 +1,7 @@ import { createEffect } from "solid-js"; import { createSignal } from "solid-js"; import type { HLJSApi } from "highlight.js"; +import MermaidRenderer from "./MermaidRenderer"; export interface PostBodyClientProps { body: string; @@ -121,6 +122,7 @@ export default function PostBodyClient(props: PostBodyClientProps) { class="text-text prose dark:prose-invert max-w-none" innerHTML={props.body} /> + ); } diff --git a/src/components/blog/TextEditor.tsx b/src/components/blog/TextEditor.tsx index 9aaf1fa..5420862 100644 --- a/src/components/blog/TextEditor.tsx +++ b/src/components/blog/TextEditor.tsx @@ -15,6 +15,8 @@ import DetailsSummary from "@tiptap/extension-details-summary"; import DetailsContent from "@tiptap/extension-details-content"; import { Node } from "@tiptap/core"; import { createLowlight, common } from "lowlight"; +import { Mermaid } from "./extensions/Mermaid"; +import TextAlign from "@tiptap/extension-text-align"; import css from "highlight.js/lib/languages/css"; import js from "highlight.js/lib/languages/javascript"; import ts from "highlight.js/lib/languages/typescript"; @@ -109,6 +111,160 @@ const AVAILABLE_LANGUAGES = [ { value: "yaml", label: "YAML" } ] as const; +// Mermaid diagram templates +const MERMAID_TEMPLATES = [ + { + name: "Flowchart", + code: `graph TD + A[Start] --> B{Decision} + B -->|Yes| C[Option 1] + B -->|No| D[Option 2] + C --> E[End] + D --> E` + }, + { + name: "Sequence Diagram", + code: `sequenceDiagram + participant A as Alice + participant B as Bob + A->>B: Hello Bob! + B->>A: Hello Alice!` + }, + { + name: "State Diagram", + code: `stateDiagram-v2 + [*] --> Idle + Idle --> Processing + Processing --> Done + Done --> [*]` + }, + { + name: "Class Diagram", + code: `classDiagram + class Animal { + +String name + +makeSound() + } + class Dog { + +bark() + } + Animal <|-- Dog` + }, + { + name: "Entity Relationship", + code: `erDiagram + CUSTOMER ||--o{ ORDER : places + ORDER ||--|{ LINE-ITEM : contains + CUSTOMER { + string name + string email + }` + }, + { + name: "Gantt Chart", + code: `gantt + title Project Timeline + dateFormat YYYY-MM-DD + section Phase 1 + Task 1 :a1, 2024-01-01, 30d + Task 2 :after a1, 20d` + }, + { + name: "Pie Chart", + code: `pie title Languages Used + "JavaScript" : 45 + "TypeScript" : 30 + "Python" : 15 + "Go" : 10` + } +]; + +// Keyboard shortcuts data +interface ShortcutCategory { + name: string; + shortcuts: Array<{ + keys: string; + keysAlt?: string; + description: string; + }>; +} + +const KEYBOARD_SHORTCUTS: ShortcutCategory[] = [ + { + name: "Text Formatting", + shortcuts: [ + { keys: "⌘ B", keysAlt: "Ctrl B", description: "Bold" }, + { keys: "⌘ I", keysAlt: "Ctrl I", description: "Italic" }, + { keys: "⌘ ⇧ X", keysAlt: "Ctrl Shift X", description: "Strikethrough" }, + { keys: "⌘ E", keysAlt: "Ctrl E", description: "Inline Code" } + ] + }, + { + name: "Headings", + shortcuts: [ + { keys: "⌘ ⌥ 1", keysAlt: "Ctrl Alt 1", description: "Heading 1" }, + { keys: "⌘ ⌥ 2", keysAlt: "Ctrl Alt 2", description: "Heading 2" }, + { keys: "⌘ ⌥ 3", keysAlt: "Ctrl Alt 3", description: "Heading 3" }, + { keys: "⌘ ⌥ 0", keysAlt: "Ctrl Alt 0", description: "Paragraph" } + ] + }, + { + name: "Lists", + shortcuts: [ + { keys: "⌘ ⇧ 7", keysAlt: "Ctrl Shift 7", description: "Ordered List" }, + { keys: "⌘ ⇧ 8", keysAlt: "Ctrl Shift 8", description: "Bullet List" }, + { keys: "⌘ ⇧ 9", keysAlt: "Ctrl Shift 9", description: "Task List" }, + { keys: "Tab", keysAlt: "Tab", description: "Indent" }, + { keys: "⇧ Tab", keysAlt: "Shift Tab", description: "Outdent" } + ] + }, + { + name: "Text Alignment", + shortcuts: [ + { keys: "⌘ ⇧ L", keysAlt: "Ctrl Shift L", description: "Align Left" }, + { keys: "⌘ ⇧ E", keysAlt: "Ctrl Shift E", description: "Align Center" }, + { keys: "⌘ ⇧ R", keysAlt: "Ctrl Shift R", description: "Align Right" }, + { keys: "⌘ ⇧ J", keysAlt: "Ctrl Shift J", description: "Justify" } + ] + }, + { + name: "Insert", + shortcuts: [ + { keys: "⌘ K", keysAlt: "Ctrl K", description: "Insert/Edit Link" }, + { keys: "⌘ ⇧ C", keysAlt: "Ctrl Shift C", description: "Code Block" }, + { keys: "⌘ Enter", keysAlt: "Ctrl Enter", description: "Hard Break" }, + { keys: "⌘ ⇧ -", keysAlt: "Ctrl Shift -", description: "Horizontal Rule" } + ] + }, + { + name: "Editing", + shortcuts: [ + { keys: "⌘ Z", keysAlt: "Ctrl Z", description: "Undo" }, + { keys: "⌘ ⇧ Z", keysAlt: "Ctrl Shift Z", description: "Redo" }, + { keys: "⌘ Y", keysAlt: "Ctrl Y", description: "Redo (Alt)" }, + { keys: "⌘ A", keysAlt: "Ctrl A", description: "Select All" } + ] + }, + { + name: "Other", + shortcuts: [ + { + keys: "⌘ ⇧ \\", + keysAlt: "Ctrl Shift \\", + description: "Clear Formatting" + }, + { keys: "ESC", keysAlt: "ESC", description: "Exit Fullscreen" } + ] + } +]; + +const isMac = () => { + return ( + typeof window !== "undefined" && + /Mac|iPhone|iPad|iPod/.test(window.navigator.platform) + ); +}; + // IFrame extension interface IframeOptions { allowFullscreen: boolean; @@ -212,6 +368,14 @@ export default function TextEditor(props: TextEditorProps) { left: 0 }); + const [showMermaidTemplates, setShowMermaidTemplates] = createSignal(false); + const [mermaidMenuPosition, setMermaidMenuPosition] = createSignal({ + top: 0, + left: 0 + }); + + const [showKeyboardHelp, setShowKeyboardHelp] = createSignal(false); + const [isFullscreen, setIsFullscreen] = createSignal(false); const editor = createTiptapEditor(() => ({ @@ -262,6 +426,12 @@ export default function TextEditor(props: TextEditorProps) { HTMLAttributes: { class: "tiptap-table-cell" } + }), + Mermaid, + TextAlign.configure({ + types: ["heading", "paragraph"], + alignments: ["left", "center", "right", "justify"], + defaultAlignment: "left" }) ], content: props.preSet || `

Hello! World

`, @@ -638,6 +808,44 @@ export default function TextEditor(props: TextEditorProps) { } }); + // Close mermaid menu on outside click + createEffect(() => { + if (showMermaidTemplates()) { + const handleClickOutside = (e: MouseEvent) => { + const target = e.target as HTMLElement; + if ( + !target.closest(".mermaid-menu") && + !target.closest("[data-mermaid-trigger]") + ) { + setShowMermaidTemplates(false); + } + }; + + setTimeout(() => { + document.addEventListener("click", handleClickOutside); + }, 0); + + return () => document.removeEventListener("click", handleClickOutside); + } + }); + + const showMermaidSelector = (e: MouseEvent) => { + const buttonRect = (e.currentTarget as HTMLElement).getBoundingClientRect(); + setMermaidMenuPosition({ + top: buttonRect.bottom + 5, + left: buttonRect.left + }); + setShowMermaidTemplates(!showMermaidTemplates()); + }; + + const insertMermaidDiagram = (template: (typeof MERMAID_TEMPLATES)[0]) => { + const instance = editor(); + if (!instance) return; + + instance.chain().focus().setMermaid(template.code).run(); + setShowMermaidTemplates(false); + }; + // Toggle fullscreen mode const toggleFullscreen = () => { setIsFullscreen(!isFullscreen()); @@ -1005,6 +1213,34 @@ export default function TextEditor(props: TextEditorProps) { + {/* Mermaid Template Selector */} + +
+
+
+ Select Diagram Type +
+
+ + {(template) => ( + + )} + +
+
+
+ + + +
+
+ {/* Table controls - shown when cursor is in a table */} @@ -1351,6 +1663,66 @@ export default function TextEditor(props: TextEditorProps) { "h-[calc(100dvh-8rem)]": isFullscreen() }} /> + + {/* Keyboard Help Modal */} + +
setShowKeyboardHelp(false)} + > +
e.stopPropagation()} + > + {/* Header */} +
+

Keyboard Shortcuts

+ +
+ + {/* Shortcuts Grid */} +
+ + {(category) => ( +
+

+ {category.name} +

+
+ + {(shortcut) => ( +
+ + {shortcut.description} + + + {isMac() + ? shortcut.keys + : shortcut.keysAlt || shortcut.keys} + +
+ )} +
+
+
+ )} +
+
+ + {/* Footer */} +
+ Press ⌨ Help button + to toggle this help +
+
+
+
); } diff --git a/src/components/blog/extensions/Mermaid.ts b/src/components/blog/extensions/Mermaid.ts new file mode 100644 index 0000000..0334b08 --- /dev/null +++ b/src/components/blog/extensions/Mermaid.ts @@ -0,0 +1,63 @@ +import { Node, mergeAttributes } from "@tiptap/core"; + +export const Mermaid = Node.create({ + name: "mermaid", + group: "block", + content: "text*", + marks: "", + code: true, + + addAttributes() { + return { + language: { + default: "mermaid", + parseHTML: (element) => element.getAttribute("data-language"), + renderHTML: (attributes) => { + return { + "data-language": attributes.language + }; + } + } + }; + }, + + parseHTML() { + return [ + { + tag: 'pre[data-type="mermaid"]' + } + ]; + }, + + renderHTML({ HTMLAttributes }) { + return [ + "pre", + mergeAttributes(HTMLAttributes, { + "data-type": "mermaid", + class: "mermaid-diagram" + }), + ["code", 0] + ]; + }, + + addCommands() { + return { + setMermaid: + (content: string) => + ({ commands }) => { + return commands.insertContent({ + type: this.name, + content: [{ type: "text", text: content }] + }); + } + }; + } +}); + +declare module "@tiptap/core" { + interface Commands { + mermaid: { + setMermaid: (content: string) => ReturnType; + }; + } +}