-
Notifications
You must be signed in to change notification settings - Fork 2
Add Markdown component with GFM support and XSS protection #19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
a2f93b7
Initial plan
Copilot 3b31240
Add Markdown component with react-markdown support
Copilot e517621
Add markdown component demo to prototype example
Copilot d9a2987
Add XSS protection with rehype-sanitize
Copilot c31876c
Add JSDoc documentation for markdown component
Copilot ee033e8
Merge main branch into copilot/add-markdown-component
Copilot 4ebe6c1
Trigger push of merge commit
Copilot File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -4,3 +4,4 @@ import './alert'; | |
| import './chart'; | ||
| import './list'; | ||
| import './tree-view'; | ||
| import './markdown'; | ||
49 changes: 49 additions & 0 deletions
49
packages/components/src/renderers/data-display/markdown.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,49 @@ | ||
| import { ComponentRegistry } from '@object-ui/core'; | ||
| import { Markdown } from '@/ui'; | ||
|
|
||
| /** | ||
| * Markdown Renderer Component | ||
| * | ||
| * A schema-driven renderer that displays markdown content in Object UI applications. | ||
| * This component follows the "Schema First" principle, enabling markdown rendering | ||
| * through pure JSON/YAML configuration without writing custom code. | ||
| * | ||
| * @example | ||
| * ```json | ||
| * { | ||
| * "type": "markdown", | ||
| * "content": "# Hello World\n\nThis is **markdown** text." | ||
| * } | ||
| * ``` | ||
| * | ||
| * Features: | ||
| * - GitHub Flavored Markdown support (tables, strikethrough, task lists) | ||
| * - XSS protection via rehype-sanitize | ||
| * - Dark mode support | ||
| * - Tailwind CSS prose styling | ||
| */ | ||
| ComponentRegistry.register('markdown', | ||
| ({ schema, className, ...props }) => ( | ||
| <Markdown | ||
| content={schema.content || ''} | ||
| className={className} | ||
| {...props} | ||
| /> | ||
| ), | ||
| { | ||
| label: 'Markdown', | ||
| inputs: [ | ||
| { | ||
| name: 'content', | ||
| type: 'string', | ||
| label: 'Markdown Content', | ||
| required: true, | ||
| inputType: 'textarea' | ||
| }, | ||
| { name: 'className', type: 'string', label: 'CSS Class' } | ||
| ], | ||
| defaultProps: { | ||
| content: '# Hello World\n\nThis is a **markdown** component with *formatting* support.\n\n- Item 1\n- Item 2\n- Item 3', | ||
| } | ||
| } | ||
| ); | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,64 @@ | ||
| import * as React from "react" | ||
| import ReactMarkdown from "react-markdown" | ||
| import remarkGfm from "remark-gfm" | ||
| import rehypeSanitize from "rehype-sanitize" | ||
| import { cn } from "@/lib/utils" | ||
|
|
||
| /** | ||
| * Props for the Markdown component. | ||
| * | ||
| * This component renders markdown content using react-markdown with GitHub Flavored Markdown support. | ||
| * All content is sanitized to prevent XSS attacks. | ||
| */ | ||
| export interface MarkdownProps { | ||
| /** | ||
| * The markdown content to render. Supports GitHub Flavored Markdown including: | ||
| * - Headers (H1-H6) | ||
| * - Bold, italic, and inline code | ||
| * - Links and images | ||
| * - Lists (ordered, unordered, and nested) | ||
| * - Tables | ||
| * - Blockquotes | ||
| * - Code blocks | ||
| */ | ||
| content: string | ||
|
|
||
| /** | ||
| * Optional CSS class name to apply custom styling to the markdown container. | ||
| * The component uses Tailwind CSS prose classes for typography by default. | ||
| */ | ||
| className?: string | ||
| } | ||
|
|
||
| function Markdown({ content, className }: MarkdownProps) { | ||
| return ( | ||
| <div | ||
| data-slot="markdown" | ||
| className={cn( | ||
| "prose prose-sm dark:prose-invert max-w-none", | ||
| "prose-headings:font-semibold prose-headings:tracking-tight", | ||
| "prose-h1:text-3xl prose-h2:text-2xl prose-h3:text-xl", | ||
| "prose-p:leading-relaxed prose-p:text-foreground", | ||
| "prose-a:text-primary prose-a:no-underline hover:prose-a:underline", | ||
| "prose-code:text-foreground prose-code:bg-muted prose-code:px-1 prose-code:py-0.5 prose-code:rounded prose-code:before:content-none prose-code:after:content-none", | ||
| "prose-pre:bg-muted prose-pre:text-foreground prose-pre:border", | ||
| "prose-blockquote:border-l-primary prose-blockquote:text-muted-foreground", | ||
| "prose-strong:text-foreground prose-strong:font-semibold", | ||
| "prose-ul:list-disc prose-ol:list-decimal", | ||
| "prose-li:text-foreground prose-li:marker:text-muted-foreground", | ||
| "prose-table:border prose-th:border prose-th:bg-muted prose-td:border", | ||
| "prose-img:rounded-md prose-img:border", | ||
| className | ||
| )} | ||
| > | ||
| <ReactMarkdown | ||
| remarkPlugins={[remarkGfm]} | ||
| rehypePlugins={[rehypeSanitize]} | ||
| > | ||
| {content} | ||
| </ReactMarkdown> | ||
| </div> | ||
| ) | ||
| } | ||
|
|
||
| export { Markdown } |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The renderer component function lacks JSDoc documentation. Add a JSDoc comment explaining that this is a Schema-driven renderer for markdown content, following the 'Schema First' principle outlined in Rule #3.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added detailed JSDoc documentation to the markdown renderer component explaining its schema-driven architecture and usage. Includes example JSON configuration and lists all supported features. (commit c31876c)