From 61e016d829160b4229fc6387177dee48e77353e7 Mon Sep 17 00:00:00 2001 From: Gregor Lohaus Date: Tue, 10 Mar 2026 20:35:30 +0100 Subject: [PATCH 1/3] project description --- .gitignore | 1 + .../admin/project/_components/CreateUpdateProjectForm.tsx | 6 +++++- src/server/dbschema/schema.ts | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9cbb774..322884a 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,4 @@ yarn-error.log* .idea # clerk configuration (can include secrets) /.clerk/ +.claudesession diff --git a/src/app/admin/project/_components/CreateUpdateProjectForm.tsx b/src/app/admin/project/_components/CreateUpdateProjectForm.tsx index d5aa2d7..30b84ca 100644 --- a/src/app/admin/project/_components/CreateUpdateProjectForm.tsx +++ b/src/app/admin/project/_components/CreateUpdateProjectForm.tsx @@ -8,19 +8,22 @@ import type { IterableElement } from 'type-fest' import { entitySchemas, makeOnSuccess } from "~/lib/utils"; import { useEffect, useState } from "react"; import type { RouterOutputs } from '~/server/routers/_app'; -import { SelectFormField, TextInputFormField } from '~/app/_components/Form/Fields' +import { SelectFormField, TextInputFormField, MdeFormField } from '~/app/_components/Form/Fields' import { FormScaffold } from '~/app/_components/Form/Components'; import { usePathname, useRouter } from 'next/navigation'; +import { useTheme } from 'next-themes'; import { makeUseRelationShipWithNameIndex } from '~/lib/hooks'; import { FormMutationContextProvider } from '~/app/_components/Form/Components/MutationProvider'; export default function CreateUpdateProjectForm(params: { className?: string, entity?: IterableElement }) { const [id, setId] = useState(params.entity ? params.entity.id : undefined) + const { theme } = useTheme() const schemas = entitySchemas('project') const { data: stacks, id: stackId, name: stackName, success: stacksSuccess, error: stackError } = makeUseRelationShipWithNameIndex('stackItems')(trpc.techStack.select.useQuery({}), id, (items) => { return items ? items.join('-') : "" }) const form = useForm>({ resolver: zodResolver(schemas.insert), defaultValues: { id: id ? id : crypto.randomUUID(), + description: params.entity ? params.entity.description : "", stackId: params.entity ? params.entity.stackId : stacksSuccess ? stacks?.at(0)?.id : "", releaseStatus: params.entity ? params.entity.releaseStatus : "unreleased", releaseLink: params.entity ? params.entity.releaseLink : "", @@ -64,6 +67,7 @@ export default function CreateUpdateProjectForm(params: { className?: string, en } + open closed diff --git a/src/server/dbschema/schema.ts b/src/server/dbschema/schema.ts index bca0a8e..c2cafab 100644 --- a/src/server/dbschema/schema.ts +++ b/src/server/dbschema/schema.ts @@ -62,6 +62,7 @@ export const project = createTable( (d) => ({ id: d.uuid().primaryKey().notNull(), title: d.varchar({length: 50}).notNull(), + description: d.text(), sourceType: sourceTypeEnum(), sourceLink: d.varchar({length: 200}), releaseStatus: releaseStatus(), From bf2085fcce21be7b16b390e15c80ab1edcd1cf5a Mon Sep 17 00:00:00 2001 From: Gregor Lohaus Date: Tue, 10 Mar 2026 20:57:09 +0100 Subject: [PATCH 2/3] project description --- bun.lock | 7 ++++++- package.json | 1 + .../admin/project/_components/CreateUpdateProjectForm.tsx | 1 + src/app/projects/page.tsx | 8 +++++++- src/server/dbschema/schema.ts | 2 +- src/tailwind.config.ts | 3 ++- 6 files changed, 18 insertions(+), 4 deletions(-) diff --git a/bun.lock b/bun.lock index c21a91a..0b42284 100644 --- a/bun.lock +++ b/bun.lock @@ -40,6 +40,7 @@ "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", "@t3-oss/env-nextjs": "^0.13.10", + "@tailwindcss/typography": "^0.5.19", "@tanstack/react-query": "^5.90.21", "@tanstack/react-query-next-experimental": "^5.91.0", "@testing-library/user-event": "^14.6.1", @@ -777,6 +778,8 @@ "@tailwindcss/postcss": ["@tailwindcss/postcss@4.2.1", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "postcss": "^8.5.6", "tailwindcss": "4.2.1" } }, "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw=="], + "@tailwindcss/typography": ["@tailwindcss/typography@0.5.19", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg=="], + "@tanstack/query-core": ["@tanstack/query-core@5.90.20", "", {}, "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg=="], "@tanstack/react-query": ["@tanstack/react-query@5.90.21", "", { "dependencies": { "@tanstack/query-core": "5.90.20" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg=="], @@ -1903,7 +1906,7 @@ "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="], - "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + "postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="], "postgres": ["postgres@3.4.8", "", {}, "sha512-d+JFcLM17njZaOLkv6SCev7uoLaBtfK86vMUXhW1Z4glPWh4jozno9APvW/XKFJ3CCxVoC7OL38BqRydtu5nGg=="], @@ -2571,6 +2574,8 @@ "shadcn/diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="], + "shadcn/postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="], + "shadcn/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], "sharp/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="], diff --git a/package.json b/package.json index ac71e44..4a44864 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "@radix-ui/react-toggle-group": "^1.1.11", "@radix-ui/react-tooltip": "^1.2.8", "@t3-oss/env-nextjs": "^0.13.10", + "@tailwindcss/typography": "^0.5.19", "@tanstack/react-query": "^5.90.21", "@tanstack/react-query-next-experimental": "^5.91.0", "@testing-library/user-event": "^14.6.1", diff --git a/src/app/admin/project/_components/CreateUpdateProjectForm.tsx b/src/app/admin/project/_components/CreateUpdateProjectForm.tsx index 30b84ca..ac15d67 100644 --- a/src/app/admin/project/_components/CreateUpdateProjectForm.tsx +++ b/src/app/admin/project/_components/CreateUpdateProjectForm.tsx @@ -23,6 +23,7 @@ export default function CreateUpdateProjectForm(params: { className?: string, en resolver: zodResolver(schemas.insert), defaultValues: { id: id ? id : crypto.randomUUID(), + title: params.entity ? params.entity.title : "", description: params.entity ? params.entity.description : "", stackId: params.entity ? params.entity.stackId : stacksSuccess ? stacks?.at(0)?.id : "", releaseStatus: params.entity ? params.entity.releaseStatus : "unreleased", diff --git a/src/app/projects/page.tsx b/src/app/projects/page.tsx index e42a7f0..98d304a 100644 --- a/src/app/projects/page.tsx +++ b/src/app/projects/page.tsx @@ -4,6 +4,7 @@ import { trpc } from "~/app/_trpc/Client"; import * as Card from "~/components/ui/card"; import { Badge } from "~/components/ui/badge"; import { StackBadge } from "~/components/StackBadge"; +import Markdown from "react-markdown"; export default function ProjectsPage() { const { data: projects, isLoading } = trpc.projectv2.listWithStack.useQuery(); @@ -45,8 +46,13 @@ export default function ProjectsPage() { - {(project.sourceLink || project.releaseLink || project.techStack?.stackItems?.length) && ( + {(project.description || project.sourceLink || project.releaseLink || project.techStack?.stackItems?.length) && ( + {project.description && ( +
+ {project.description} +
+ )} {(project.sourceLink || project.releaseLink) && (
{project.sourceLink && ( diff --git a/src/server/dbschema/schema.ts b/src/server/dbschema/schema.ts index c2cafab..7d6239c 100644 --- a/src/server/dbschema/schema.ts +++ b/src/server/dbschema/schema.ts @@ -55,7 +55,7 @@ export const cvEntryRelations = relations(cvEntry, ({one}) => ({ export const sourceTypeEnum = pgEnum('source_type',['open','closed']) export const releaseStatus = pgEnum('release_status',['released','unreleased']) -export const stackItemEnum = pgEnum('stack_item',['drizzle','postgres','nextjs','react','servercomponents','php','laravel','reactnative','expo','mysql','nginx','protobuf','grpc','java','graalvm','spring','aws','s3','react-native','linux','debian','htmx']) +export const stackItemEnum = pgEnum('stack_item',['drizzle','postgres','nextjs','react','servercomponents','php','laravel','reactnative','expo','mysql','nginx','protobuf','grpc','java','graalvm','spring','aws','s3','react-native','linux','debian','htmx','neon']) export const project = createTable( "project", diff --git a/src/tailwind.config.ts b/src/tailwind.config.ts index 8b7e4b2..912fd7f 100644 --- a/src/tailwind.config.ts +++ b/src/tailwind.config.ts @@ -1,7 +1,8 @@ import type { Config } from "tailwindcss" const config = { plugins: [ - require("tailwindcss-motion") + require("tailwindcss-motion"), + require("@tailwindcss/typography") ] } satisfies Config From 495bd52c5ba11e403bf7338ddcf4215a5eacdf51 Mon Sep 17 00:00:00 2001 From: Gregor Lohaus Date: Tue, 10 Mar 2026 20:59:46 +0100 Subject: [PATCH 3/3] neon stack item --- src/components/StackBadge.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/components/StackBadge.tsx b/src/components/StackBadge.tsx index c0e143f..3180205 100644 --- a/src/components/StackBadge.tsx +++ b/src/components/StackBadge.tsx @@ -118,6 +118,13 @@ const STACK_META: Record = { }, debian: { label: "Debian" }, htmx: { label: "HTMX" }, + neon: { + label: "Neon", + icon: { + light: "https://svgl.app/library/neon.svg", + dark: "https://svgl.app/library/neon.svg", + }, + }, }; export function StackBadge({ item }: { item: string }) {