with one click
tonic-ui-patterns
Coding patterns extracted from tonic-ui repository
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Coding patterns extracted from tonic-ui repository
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Generate PR descriptions and changeset entries. Use when the user mentions "PR", "pull request", "PR description", "changeset", provides a diff or describes code changes, or asks to draft a merge request. Also trigger for conventional commit message generation.
Use this skill when adding JSDoc type definitions to React components in Tonic UI. Triggers include "add type definitions", "add JSDoc types", "document component props", or when creating new components that need type annotations.
Based on SOC occupation classification
| name | tonic-ui-patterns |
| description | Coding patterns extracted from tonic-ui repository |
| version | 1.0.0 |
| source | local-git-analysis |
| analyzed_commits | 200 |
This project uses conventional commits with scope:
| Type | Usage | Frequency |
|---|---|---|
chore | Releases, deps, tooling | ~36% |
feat | New features | ~23% |
docs | Documentation | ~18% |
ci | CI/CD workflows | ~12% |
fix | Bug fixes | ~7% |
test | Test additions | ~2% |
refactor | Code restructuring | ~1% |
Scope format: type(package/component) — e.g., feat(react/menu), fix(react/Checkbox), chore(deps-dev)
Common scopes:
react / react/<component> — Main component packagereact-hooks — Hooks packagereact-icons — Icons packagemcp — MCP server packagedeps / deps-dev — Dependency bumpsrelease — Version releaseschangesets — Changeset configPR references: Commit messages include (#<number>) at the end.
packages/
├── changelog-github/ # Custom changelog generator
├── codemod/ # Code migration tools
├── mcp/ # MCP server (TypeScript)
├── react/ # Main component library (JavaScript)
├── react-base/ # Base primitives (Box)
├── react-docs/ # Next.js documentation site
├── react-hooks/ # Shared hooks
├── react-icons/ # SVG icon components
├── styled-system/ # Styled System utilities
├── theme/ # Design tokens
└── utils/ # Shared utilities
Key: packages/react is the most frequently modified package (~38 commits in last 200).
Each component lives in packages/react/src/<component-name>/:
<component-name>/
├── ComponentName.js # Main component (forwardRef + Box base)
├── index.js # Barrel exports
├── styles.js # Style hooks (useComponentNameStyle)
├── context.js # React context (if compound component)
├── useComponentName.js # Context consumer hook
├── withComponentName.js # HOC for context injection (optional)
├── constants.js # Constants (variants, sizes)
└── __tests__/
├── ComponentName.test.js
└── __snapshots__/
└── ComponentName.test.js.snap
Components use forwardRef with useDefaultProps:
import React, { forwardRef } from 'react';
import { useDefaultProps } from '../default-props';
import { useComponentStyle } from './styles';
const Component = forwardRef((inProps, ref) => {
const {
prop1,
prop2,
...rest
} = useDefaultProps({ props: inProps, name: 'Component' });
const styleProps = useComponentStyle({ prop1 });
return (
<Box ref={ref} {...styleProps} {...rest} />
);
});
Component.displayName = 'Component';
export default Component;
For related component groups (Menu, FormControl, Accordion):
context.js) — createContext()useComponentName.js) — useContext(ComponentContext)withComponentName.js) — injects context props (optional)index.js) — named exports for all sub-componentsStyles use hooks that return style objects using Styled System tokens:
import { useColorStyle } from '../color-style';
const useComponentStyle = ({ variant }) => {
const [colorStyle] = useColorStyle();
return {
color: colorStyle.color.primary,
fontSize: 'sm',
px: '2x',
py: '1x',
};
};
Token formats: '1x', '2x', 'sm', 'md', 'lg' (Styled System spacing/sizing).
Based on recent features (Highlight, Mark, FormControl), the workflow is:
packages/react/src/<component-name>/
├── ComponentName.js
├── index.js
├── styles.js
└── __tests__/
└── ComponentName.test.js
Add to packages/react/src/index.js:
export { ComponentName } from './<component-name>';
Add to packages/react/__tests__/index.test.js to verify the export exists.
Add to packages/react-docs/pages/components/<component-name>/:
index.page.mdx — Main doc page.js) for each usage patternAdd route to packages/react-docs/config/sidebar-routes.js.
Add .changeset/<changeset-name>.md:
---
"@tonic-ui/react": minor
---
feat: Add `ComponentName` component
These files typically change together:
packages/react/src/index.js + packages/react/__tests__/index.test.js (new exports)packages/react-docs/config/sidebar-routes.js + packages/react-docs/pages/components/*/index.page.mdx (new docs)packages/react/package.json + packages/react/CHANGELOG.md + .changeset/*.md (releases)__tests__/ directories co-located with sourceComponentName.test.js__snapshots__/)@tonic-ui/react-base/test-utils/accessibility utilitiesyarn test@changesets/cli for versioningv2@tonic-ui/changelog-github generatorpublic (npm).changeset/ with descriptive names (e.g., tonic-ui-pr-1085.md).d.ts files for type definitionspx, py, color, bg), not CSS classescolorStyle.color.primary, colorStyle.color.secondary, colorStyle.color.errorexport { X } from './X' pattern