From abbce89f4aff4a6dcd30f45498186669c60a6962 Mon Sep 17 00:00:00 2001 From: Jed Sundwall Date: Fri, 12 Dec 2025 11:42:32 -0800 Subject: [PATCH 1/8] react fix --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 55f2438d..32cf6cea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "lucide-react": "^0.483.0", "md5": "^2.3.0", "mystjs": "^0.0.15", - "next": "15.5.7", + "next": "15.5.9", "next-themes": "^0.4.4", "nextjs-toploader": "^3.8.16", "node-fetch": "^3.3.2", @@ -7209,9 +7209,9 @@ } }, "node_modules/@next/env": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.7.tgz", - "integrity": "sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==", + "version": "15.5.9", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.9.tgz", + "integrity": "sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -20383,12 +20383,12 @@ "license": "MIT" }, "node_modules/next": { - "version": "15.5.7", - "resolved": "https://registry.npmjs.org/next/-/next-15.5.7.tgz", - "integrity": "sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==", + "version": "15.5.9", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.9.tgz", + "integrity": "sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==", "license": "MIT", "dependencies": { - "@next/env": "15.5.7", + "@next/env": "15.5.9", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", diff --git a/package.json b/package.json index cdf01eaf..0217882e 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "lucide-react": "^0.483.0", "md5": "^2.3.0", "mystjs": "^0.0.15", - "next": "15.5.7", + "next": "15.5.9", "next-themes": "^0.4.4", "nextjs-toploader": "^3.8.16", "node-fetch": "^3.3.2", From 40ecb19f955793107e7443e845de92b2d0a72072 Mon Sep 17 00:00:00 2001 From: Jed Sundwall Date: Fri, 13 Feb 2026 13:21:42 -0800 Subject: [PATCH 2/8] feat: add permalink anchors to README headings Add hover-visible link icons to all README headings that allow users to link directly to specific sections. Icon appears on the right of headings on hover and scales with heading size. Closes #166 Co-Authored-By: Claude Sonnet 4.5 --- .../markdown/HeadingWithPermalink.tsx | 27 ++++++++++ .../features/markdown/MarkdownViewer.tsx | 49 ++++++++++++++----- src/styles/MarkdownViewer.css | 26 ++++++++++ 3 files changed, 90 insertions(+), 12 deletions(-) create mode 100644 src/components/features/markdown/HeadingWithPermalink.tsx diff --git a/src/components/features/markdown/HeadingWithPermalink.tsx b/src/components/features/markdown/HeadingWithPermalink.tsx new file mode 100644 index 00000000..c68bcd64 --- /dev/null +++ b/src/components/features/markdown/HeadingWithPermalink.tsx @@ -0,0 +1,27 @@ +import { ReactNode } from "react"; +import { Heading } from "@radix-ui/themes"; +import { Link2Icon } from "@radix-ui/react-icons"; +import type { HeadingProps } from "@radix-ui/themes/dist/cjs/components/heading"; + +interface HeadingWithPermalinkProps { + id: string; + level: HeadingProps["size"]; + children: ReactNode; + mb?: HeadingProps["mb"]; +} + +export function HeadingWithPermalink({ + id, + level, + children, + mb, +}: HeadingWithPermalinkProps) { + return ( + + {children} + + + + + ); +} diff --git a/src/components/features/markdown/MarkdownViewer.tsx b/src/components/features/markdown/MarkdownViewer.tsx index 1a69b3eb..86a3454f 100644 --- a/src/components/features/markdown/MarkdownViewer.tsx +++ b/src/components/features/markdown/MarkdownViewer.tsx @@ -4,6 +4,7 @@ import remarkGfm from "remark-gfm"; import rehypeRaw from "rehype-raw"; import rehypeSanitize, { defaultSchema } from "rehype-sanitize"; import { Code } from "./codeConfig"; +import { HeadingWithPermalink } from "./HeadingWithPermalink"; import "@/styles/MarkdownViewer.css"; interface MarkdownViewerProps { @@ -43,34 +44,58 @@ export function MarkdownViewer({ content }: MarkdownViewerProps) { rehypePlugins={[rehypeRaw, [rehypeSanitize, sanitizeSchema]]} components={{ h1: ({ children }) => ( - + {children} - + ), h2: ({ children }) => ( - + {children} - + ), h3: ({ children }) => ( - + {children} - + ), h4: ({ children }) => ( - + {children} - + ), h5: ({ children }) => ( - + {children} - + ), h6: ({ children }) => ( - + {children} - + ), p: ({ children }) => ( diff --git a/src/styles/MarkdownViewer.css b/src/styles/MarkdownViewer.css index b02e1984..6acd8c2a 100644 --- a/src/styles/MarkdownViewer.css +++ b/src/styles/MarkdownViewer.css @@ -135,3 +135,29 @@ code.inline-code { :root[class~="dark"] .admonition.important { background-color: var(--purple-12); } + +/* Permalink styles */ +.heading-with-permalink { + display: inline-flex; + align-items: center; + gap: 0.5rem; +} + +.permalink-link { + display: none; + color: var(--gray-9); + text-decoration: none; +} + +.heading-with-permalink:hover .permalink-link { + display: inline-flex; +} + +.permalink-link:hover { + color: var(--blue-9); +} + +.permalink-link svg { + width: 0.85em; + height: 0.85em; +} From d98b6d380b547ae246c2488dce015e6206380071 Mon Sep 17 00:00:00 2001 From: Jed Sundwall Date: Fri, 13 Feb 2026 13:28:36 -0800 Subject: [PATCH 3/8] fix: use direct types instead of internal Radix import path --- src/components/features/markdown/HeadingWithPermalink.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/features/markdown/HeadingWithPermalink.tsx b/src/components/features/markdown/HeadingWithPermalink.tsx index c68bcd64..7a46382f 100644 --- a/src/components/features/markdown/HeadingWithPermalink.tsx +++ b/src/components/features/markdown/HeadingWithPermalink.tsx @@ -1,13 +1,12 @@ import { ReactNode } from "react"; import { Heading } from "@radix-ui/themes"; import { Link2Icon } from "@radix-ui/react-icons"; -import type { HeadingProps } from "@radix-ui/themes/dist/cjs/components/heading"; interface HeadingWithPermalinkProps { id: string; - level: HeadingProps["size"]; + level: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"; children: ReactNode; - mb?: HeadingProps["mb"]; + mb?: "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"; } export function HeadingWithPermalink({ From 93f5575a12f8b946d010f2d8462084cff1fd8760 Mon Sep 17 00:00:00 2001 From: Jed Sundwall Date: Fri, 13 Feb 2026 14:02:36 -0800 Subject: [PATCH 4/8] fix: underline links in markdown viewer --- src/styles/MarkdownViewer.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/styles/MarkdownViewer.css b/src/styles/MarkdownViewer.css index 6acd8c2a..a2bbcca7 100644 --- a/src/styles/MarkdownViewer.css +++ b/src/styles/MarkdownViewer.css @@ -77,7 +77,7 @@ code.inline-code { /* Links */ .markdown-viewer a { color: var(--blue-9); - text-decoration: none; + text-decoration: underline; } .markdown-viewer a:hover { From 939353f0f0b204fb3c4fdbf395934279f622f897 Mon Sep 17 00:00:00 2001 From: Jed Sundwall Date: Fri, 13 Feb 2026 14:04:51 -0800 Subject: [PATCH 5/8] fix: add markdown-viewer wrapper for CSS to apply --- .../features/markdown/MarkdownViewer.tsx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/components/features/markdown/MarkdownViewer.tsx b/src/components/features/markdown/MarkdownViewer.tsx index 86a3454f..8b295e24 100644 --- a/src/components/features/markdown/MarkdownViewer.tsx +++ b/src/components/features/markdown/MarkdownViewer.tsx @@ -39,10 +39,11 @@ export function MarkdownViewer({ content }: MarkdownViewerProps) { } return ( - + ( {codeContent}; }, }} - > - {content} - + > + {content} + + ); } From 2af7dcde29d4d3a5c5f596ea02d9d30d65f9dbda Mon Sep 17 00:00:00 2001 From: Jed Sundwall Date: Fri, 13 Feb 2026 15:30:51 -0800 Subject: [PATCH 6/8] fix: use Radix Link underline prop instead of CSS --- src/components/features/markdown/MarkdownViewer.tsx | 4 +++- src/styles/MarkdownViewer.css | 9 --------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/components/features/markdown/MarkdownViewer.tsx b/src/components/features/markdown/MarkdownViewer.tsx index 8b295e24..08a36e8d 100644 --- a/src/components/features/markdown/MarkdownViewer.tsx +++ b/src/components/features/markdown/MarkdownViewer.tsx @@ -104,7 +104,9 @@ export function MarkdownViewer({ content }: MarkdownViewerProps) { ), a: ({ href, children }) => ( - {children} + + {children} + ), table: ({ children }) => ( diff --git a/src/styles/MarkdownViewer.css b/src/styles/MarkdownViewer.css index a2bbcca7..e2d5437f 100644 --- a/src/styles/MarkdownViewer.css +++ b/src/styles/MarkdownViewer.css @@ -74,15 +74,6 @@ code.inline-code { margin: 1em 0; } -/* Links */ -.markdown-viewer a { - color: var(--blue-9); - text-decoration: underline; -} - -.markdown-viewer a:hover { - text-decoration: underline; -} /* Styles for MyST admonitions */ .admonition { From d9b1c7c6579b6706e77cc599b47d70a5257f3b2b Mon Sep 17 00:00:00 2001 From: Jed Sundwall Date: Fri, 13 Feb 2026 15:34:17 -0800 Subject: [PATCH 7/8] chore: add .claude to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 380cac5b..5d549670 100644 --- a/.gitignore +++ b/.gitignore @@ -253,3 +253,4 @@ $RECYCLE.BIN/ # End of https://www.toptal.com/developers/gitignore/api/osx,windows,linux,nextjs,react,node cdk.out +.claude/ From 71e2eed32c01efb7a5d19b411a101467c6e405f9 Mon Sep 17 00:00:00 2001 From: Jed Sundwall Date: Fri, 13 Feb 2026 15:36:19 -0800 Subject: [PATCH 8/8] chore: add dev-clean-start script for local development --- scripts/dev-clean-start.sh | 39 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100755 scripts/dev-clean-start.sh diff --git a/scripts/dev-clean-start.sh b/scripts/dev-clean-start.sh new file mode 100755 index 00000000..8af7c75d --- /dev/null +++ b/scripts/dev-clean-start.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# Colors for output +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color +CHECK="✓" +ARROW="→" + +echo "${YELLOW}=== Clean Start for Source.coop Development ===${NC}" + +# Step 1: Clean up +echo -e "\n${YELLOW}${ARROW} Cleaning up...${NC}" +pkill -f "next dev" > /dev/null 2>&1 +docker-compose down > /dev/null 2>&1 +rm -rf .next +echo -e "${GREEN}${CHECK} Cleaned up old processes and build cache${NC}" + +# Step 2: Start Docker services +echo -e "\n${YELLOW}${ARROW} Starting Docker services (DynamoDB on :8000)...${NC}" +docker-compose up -d +echo -e "${GREEN}${CHECK} Docker services started${NC}" + +# Step 3: Wait for services +echo -e "\n${YELLOW}${ARROW} Waiting for services to initialize...${NC}" +sleep 10 +echo -e "${GREEN}${CHECK} Services ready${NC}" + +# Step 4: Start dev server without AWS profile +echo -e "\n${YELLOW}${ARROW} Starting development server...${NC}" +echo -e "${GREEN}Application will be available at: http://localhost:3000${NC}" +echo -e "${GREEN}DynamoDB Admin UI at: http://localhost:8001${NC}" +echo -e "\n${YELLOW}Press Ctrl+C to stop the development server${NC}\n" + +# Unset AWS profile to use local DynamoDB +unset AWS_PROFILE +unset AWS_DEFAULT_PROFILE +npm run dev +