write-example
作者: tldraw
为tldraw SDK示例应用编写示例。在创建新示例、添加SDK演示或在apps/examples中编写示例代码时使用。
npx skills add https://github.com/tldraw/tldraw --skill write-exampleWriting tldraw examples
The examples project (apps/examples) contains minimal demonstrations of how to use the tldraw SDK. Examples are embedded on the docs site and deployed to examples.tldraw.com.
Standards for examples in apps/examples/src/examples.
Example structure
Each example lives in its own folder:
apps/examples/src/examples/
└── my-example/
├── README.md # Required metadata
├── MyExampleExample.tsx # Main example file
└── my-example.css # Optional styles
Folder name
- Lowercase kebab-case:
custom-canvas,button-demo,magical-wand - Used as the URL path for the example
README.md
Required frontmatter format:
---
title: Example title
component: ./ExampleFile.tsx
category: category-id
priority: 1
keywords: [keyword1, keyword2]
---
One-line summary of what this example demonstrates.
---
Detailed explanation of the example. Include code snippets here if they help explain concepts not obvious from the example code itself.
Frontmatter fields
| Field | Description |
|---|---|
| title | Sentence case, corresponds to folder name |
| component | Relative path to example file |
| category | One of the valid category IDs (see below) |
| priority | Display order within category (lower = higher) |
| keywords | Search terms (avoid obvious terms like "tldraw") |
Valid categories
getting-started, configuration, editor-api, ui, layout, events, shapes/tools, collaboration, data/assets, use-cases
Example file
Naming
- PascalCase ending with "Example":
CustomCanvasExample.tsx,ButtonExample.tsx - Name should correspond to the folder name and title
Structure
import { Tldraw } from 'tldraw'
import 'tldraw/tldraw.css'
export default function MyExampleExample() {
return (
<div className="tldraw__editor">
<Tldraw />
</div>
)
}
Requirements:
- Must have a default export React component
- Use
tldraw__editorclass for full-page examples - Import
tldraw/tldraw.cssfor styles
Layout
- Full page: wrap in
<div className="tldraw__editor"> - Inset: see existing examples for page layout patterns
Styles
- Put CSS in a separate file named after the example:
my-example.css - Import alongside tldraw CSS:
import './my-example.css' - Avoid extensive inline styles via the
styleprop
Control panels
For examples that need buttons or controls, use the TopPanel component slot with TldrawUiButton:
import { Tldraw, TldrawUiButton, useEditor } from 'tldraw'
import 'tldraw/tldraw.css'
import './my-example.css'
function MyControls() {
const editor = useEditor()
return (
<div className="tlui-menu my-controls">
<TldrawUiButton type="normal" onClick={() => editor.zoomIn()}>
Zoom in
</TldrawUiButton>
<TldrawUiButton type="normal" onClick={() => editor.zoomOut()}>
Zoom out
</TldrawUiButton>
</div>
)
}
export default function MyExampleExample() {
return (
<div className="tldraw__editor">
<Tldraw components={{ TopPanel: MyControls }} />
</div>
)
}
CSS for control panels:
.my-controls {
display: flex;
flex-wrap: wrap;
margin: 8px;
}
Comments
Use footnote format with numbered references:
import { Tldraw, type TLComponents } from 'tldraw'
import 'tldraw/tldraw.css'
// [1]
const components: TLComponents = {
PageMenu: null,
}
export default function CustomComponentsExample() {
return (
<div className="tldraw__editor">
{/* [2] */}
<Tldraw components={components} />
</div>
)
}
/*
[1]
Define component overrides outside the React component so they're static.
If defined inside, use useMemo to prevent recreation on every render.
[2]
Pass component overrides via the components prop.
*/
Example types
Tight examples
- Narrow focus on a specific SDK feature
- Minimal styling
- Meant to be read, not used
- Remove any extraneous code
Use-case examples
- Show a recognizable user experience
- Prioritize clarity and completeness
- Category:
use-cases
Additional files
- Split complex code into separate files if it distracts from the example's purpose
- Example: complex input component in
Input.tsx - Keep the main example file focused on demonstrating the concept
Important
- Follow React and TypeScript best practices
- Never use title case for titles - use sentence case
- Keep examples minimal and focused
来自 tldraw 的更多技能
write-issue
tldraw
在tldraw仓库中编写和维护GitHub问题的参考标准。当其他技能或工作流需要处理问题时,可作为辅助指南。
official
write-pr
tldraw
在 tldraw 仓库中编写拉取请求标题和描述的参考标准。当其他技能或工作流需要时,作为辅助指南使用…
official
write-release-notes
tldraw
为 tldraw SDK 版本编写发布说明文章。在创建新的发布文档、从头起草发布说明或审阅发布…时使用。
official
write-tbp
tldraw
撰写关于tldraw功能及实现细节的技术博客文章。适用于创作tldraw如何解决有趣问题的博客内容。
official
write-unit-tests
tldraw
为tldraw SDK编写单元测试和集成测试。在创建新测试、增加测试覆盖率或修复packages/editor或…中的失败测试时使用。
official
clean-copy
tldraw
在当前分支上重新实现一个新分支,并生成清晰、叙事性强的Git提交历史。当被要求创建干净的分支副本、清理提交记录时使用。
official
commit-changes
tldraw
为当前更改创建git提交。当被要求提交更改、进行提交、生成提交信息或提交当前工作树时使用…
official
issue
tldraw
根据用户描述,在tldraw仓库中创建并研究一个GitHub issue。当用户调用issue、要求创建issue、报告bug等时使用。
official