mirror of
https://github.com/hunvreus/basecoat.git
synced 2026-11-11 20:58:18 +00:00
4.7 KiB
4.7 KiB
Basecoat – Agent Guide
What is Basecoat?
Basecoat is a vanilla JavaScript/HTML/CSS port of shadcn/ui components. It reuses shadcn/ui's design patterns and Tailwind CSS classes while maintaining semantic HTML, native browser elements, and full accessibility (ARIA attributes, proper hierarchies, keyboard navigation). The goal is to provide shadcn-quality components without React dependencies.
Quickstart
- Install deps:
npm i - Dev docs server:
npm run docs:dev - Build CSS/JS:
npm run build - Build static docs:
npm run docs:build
What to edit (and what not)
- Edit sources only:
src/css/basecoat.css– All component CSS classes (Tailwind + custom)src/js/*.js– Individual component JS files (kebab-case, ESM) +basecoat.js(component registry)src/nunjucks/*.njkandsrc/jinja/*.html.jinja– Component template macrosdocs/src/components/*.njk– Component documentation pages with examplesdocs/src/_includes/– Layout templates, partials, and navigation
- Do not edit build outputs:
packages/*/dist– built CSS/JS bundles_site/– generated docs site
Project layout
- Workspaces: root npm workspace with publishable packages in
packages/*. - Packages:
packages/css– built CSS and JS bundles underdist/.packages/cli– CLI; distributed assets live underdist/.
- Docs site:
docs/src(Eleventy); output goes to_site/.
Conventions
- ESM everywhere (
import/export). - Prettier defaults (2 spaces; single quotes per file preference).
- Filenames for assets: kebab-case (e.g.,
dropdown-menu.js,basecoat.cdn.css). - JS naming:
camelCasefor vars/functions;PascalCasefor DOM classes and exported component names when applicable.
Design Principles
- Minimal code: Prefer native HTML elements and browser behavior over JavaScript abstractions
- Accessibility-first: Semantic HTML, proper ARIA attributes, keyboard navigation
- CSS patterns:
- Use
borderfor lines/separators (notbackgroundon<hr>) - Use
:is()and:has()for compact selectors - Use
isolation: isolateto contain z-index stacking contexts - Use
data-*attributes for styling states,aria-*for accessibility semantics
- Use
- Component patterns:
- Dialog variants use wrapper classes (e.g.,
.command-dialogwraps.command) - JavaScript components register with
window.basecoat.register() - Emit custom events for user actions (e.g.,
command:select) - Filter disabled options (
aria-disabled="true") from all interactions
- Dialog variants use wrapper classes (e.g.,
- When NOT to create a component:
- If it's just composition of existing elements (users can do it with standard HTML/Tailwind)
- If behavior is fully native (e.g., fieldset, legend)
Adding new components
Before creating a component, ask:
- Does shadcn/ui have it? → Port it
- Is it pure composition? → Document pattern, no component
- Does it need JS behavior? → Create component
- Is it just CSS? → Add to basecoat.css, document usage
Examples:
- Field/Fieldset: CSS-only patterns (no JS component)
- Empty/Item/Input Group: Pure composition (docs only)
- Command/Select: JS behavior required (full component)
Common tasks
- Update a component's CSS/JS: Edit
src/css/basecoat.cssand/orsrc/js/*.js. - Update a component template: Edit
src/nunjucks/*.njkand/orsrc/jinja/*.html.jinja. - Add a new component: Create JS, CSS, templates, and docs page under
docs/src/components/*.njk. - Update navigation: Edit files in
docs/src/_includes/partials/.
Testing
No automated testing configured. User validates manually via the docs site (npm run docs:dev).
Commits and PRs
- Commits: concise, imperative (≤72 chars), optional scope.
- Example:
select: prevent change event on init.
- Example:
- PRs: include description, linked issues (e.g.,
Closes #123), and before/after screenshots or code snippets for visual/behavioral changes. - Keep PRs focused; update docs examples when components or APIs change.
Environment and tooling
- Node 18+ recommended.
- Eleventy config:
.eleventy.js. - Tailwind via
@tailwindcss/cliv4. - Build uses Tailwind CLI and
terser; both are provided via devDependencies.
Git workflow
.gitattributesconfigures merge strategies for generated filesdocs/src/assets/styles.cssauto-resolves to incoming changes (regenerated by Tailwind)- Always run
npm run buildbefore publishing packages
Publishing packages
- Bump version in root
package.json - Run
npm run buildto generate dist files - Run
npm publish --workspacesto publish both packages
Package references
packages/cssusage and details: seepackages/css/README.md.packages/cliusage and details: seepackages/cli/README.md.