Suede#
SvelteKit starter template. Entry point for stack, conventions, and process: AGENTS.md.
For self-hosted knots, clone URLs may differ based on your setup.
Adds a Suede-wrapped bits-ui Button as a learning scaffold for the
bits-ui + stylebase + Svelte 5 pattern. Distinguishes functionality
(bits-ui's polymorphic Button.Root via ButtonRootProps) from style
(stylebase utility class + scoped <style> block in the same file).
Story at src/stories/SuedeButton.stories.svelte exercises four
variants: Primary, Disabled, As link, With class override.
TypeScript escape hatch: rest is spread via
`{...rest as Record<string, unknown>}` because bits-ui's
ButtonRootProps is a union (AnchorElement | ButtonElement) that
exceeds TypeScript's type complexity budget when re-spread into
another Svelte component. Cast is local to one line; polymorphic
behavior (button vs anchor via href) still works at runtime.
CSS pruner workaround: `<!-- svelte-ignore css_unused_selector -->`
on the <style> block, because the class name is built from a
template literal in the class attribute and is therefore invisible
to Svelte's static class-extraction pass.
Existing example stories (Button, Accordion, Header, Page) are
left untouched per option C; pre-existing pnpm check errors
(missing /components/ui/Button.svelte and Accordion.svelte
references) are out of scope for this change.
- .deciduous/ : local decision-graph database
- docs/ : generated web viewer export (regenerate via 'deciduous sync')
- CLAUDE.md : explicit Claude-Code instruction file, not part of this project
- .claude/ : explicit Claude-Code config directory, not part of this project
The last two are defensive: if 'deciduous install' re-runs, the Claude
artifacts will be re-created locally but stay untracked.
Cross-agent view of the deciduous decision-graph tool. Source content was
copied from CLAUDE.md's managed block (which we will not commit) and stripped
of tool-specific syntax:
- Removed slash command table (Claude Code only)
- Removed skills table (Claude Code only)
- Removed inline slash-command references
- Replaced the .claude/commands/decision.md git-staging example with
project-relevant paths
A header note at the top of the section explains that this is the
tool-agnostic view; tool-specific commands and skills live in
.opencode/commands/ and .opencode/skills/ (loaded at runtime by OpenCode,
not duplicated here).
First suede release. Bump placeholder 0.0.1 -> 2026.6.4 (chronver, today's date).
Tag 2026.6.4 will be applied to the merge commit on main after this PR merges.
- chronver for apps and templates, semver for packages
- release flow: bump-on-merge, bare chronver tag, --follow-tags
- downstream lineage via suede.from field in project package.json
- pnpm add @taurean/stylebase bits-ui
- src/app.css imports stylebase and provides global focus ring
- +layout.svelte wires app.css
- src/lib/components/ui/Button.svelte and Accordion.svelte are
Svelte 5 + bits-ui wrappers (script-only agent territory)
- Storybook stories for both wrappers
- vitest-browser-svelte smoke tests for both wrappers
- .gitignore: worker-configuration.d.ts (wrangler build artifact)
Wrapper styling is intentionally minimal — human territory per
AGENTS.md. The wrappers render with stylebase defaults; the
hybrid strategy (global data-attribute CSS + per-component
overrides) is the next step.
Refs agent-notes/2026-06-03-02-install-bits-ui-stylebase.md
SvelteKit starter template. Entry point for stack, conventions, and process: AGENTS.md.