Strongtie Design System
Getting StartedComponents

Command Palette

Search for a command to run...

Getting Started
  • Introduction
  • Setup Guide
  • Package Installation
  • Code Quality Setup
  • Migration Guide
  • Resources
Registry
  • Getting Started
  • Combobox
  • Datepicker
  • MultiSelect
  • Tab Nav
  • Tree
Guides
  • Framework Recommendations
Foundations
  • States
  • Variables
Components
  • Accordion
  • Alert
  • Alert Dialog
  • Avatar
  • Badge
  • Breadcrumb
  • Button
  • Button Group
  • Calendar
  • Card
  • Carousel
  • Chart
  • Checkbox
  • Collapsible
  • Command
  • Combobox
  • Context Menu
  • Date Picker
  • Dialog
  • Drawer
  • Dropdown Menu
  • Empty
  • Field
  • Hover Card
  • Input
  • Input Group
  • Item
  • Kbd
  • Label
  • Menubar
  • Multi Select
  • Navigation Menu
  • Pagination
  • Popover
  • Progress
  • Radio Group
  • Scroll Area
  • Select
  • Separator
  • Sheet
  • Sidebar
  • Skeleton
  • Slider
  • Switch
  • Table
  • Tabs
  • Tab Nav
  • Textarea
  • Toaster
  • Toggle
  • Toggle Group
  • Tooltip
  • Tree
2026 Simpson Strong-Tie
  1. Docs
  2. AI Agent Guide

AI Agent Guide

PreviousNext

LLM-optimized documentation for AI assistants integrating the Strongtie Design System.

Documentation for AI agents helping users integrate the Strongtie Design System. Content is structured for direct consumption by LLMs.

Quick Reference

ResourceURLPurpose
Design Standards/llm/design-standardsCore patterns and rules
Code Examples/llm/design-standards-examplesImplementation templates
Code Quality/llm/getting-started/eslint-setupESLint, Prettier, Stylelint
Framework Guide/llm/framework-recommendationsVite vs Next.js decisions
AGENTS Template/templates/AGENTS_TEMPLATE.mdProject setup template

Framework Selection

Default: Use Vite for all new React projects. Next.js requires management approval and is not recommended for SPAs.

Decision Tree

START: New React project?
├─ YES → Use Vite + React
│        └─ Needs SSR/SSG/ISR?
│            ├─ YES → Request management approval for Next.js
│            └─ NO → Use Vite + React
└─ NO (existing project) → What's the current stack?
         ├─ Blazor → See /framework-recommendations for migration
         ├─ Create React App → Migrate to Vite
         └─ Next.js → Continue with Next.js

Framework Rules

ScenarioFrameworkNotes
New SPAViteDefault choice
New app needing SSRVite + manual SSROr request Next.js approval
Internal toolsViteAlways
Marketing sitesRequest approvalNext.js may be appropriate
Existing Next.jsContinueNo migration needed

See Framework Recommendations for detailed guidance.


Core Technology Stack

LayerTechnologyVersionNotes
BuildVite7+Default for all projects
FrameworkReact19+With React Compiler
RoutingReact Router7+Standard routing
UIshadcn/ui + Tailwind CSS4+Design system
Data FetchingTanStack Query5+Server state
State (Simple)React Context-Session/UI state
State (Complex)Zustand4+Cross-component/computed
Forms (Simple)Native useState-1-3 fields, no validation
Forms (Complex)React Hook Form + Zod7+ / 3+4+ fields or validation
TestingVitest-Jest-compatible API
Linting@strongtie/eslint1.0+Extends Ultracite

Design Constraints (Rules AI Must Follow)

React Compiler

This codebase uses React Compiler (babel-plugin-react-compiler).

DO NOT USE:

  • useMemo() - compiler handles memoization
  • useCallback() - compiler optimizes callbacks
  • React.memo() - rarely needed with compiler

DO USE:

  • React.lazy() for code splitting
  • Standard hooks: useState, useEffect, useRef

State Management Decision Tree

Is this server data (from API)?
├─ YES → TanStack Query
└─ NO → Is this component-local UI state?
         ├─ YES → useState
         └─ NO → Is this session-level shared state (auth, tenant, theme)?
                  ├─ YES → React Context
                  └─ NO → Zustand

Form Implementation

ConditionSolution
1-3 fields AND no validationuseState
4+ fields OR validation rulesReact Hook Form + Zod

Anti-Patterns to Avoid

  • Never store API responses in useState
  • Never duplicate TanStack Query cache in local state
  • Never create Context for single-component state
  • Never use useMemo/useCallback (React Compiler handles this)

Accessibility Requirements

Icon-Only Buttons

// REQUIRED - use aria-label
<Button variant="ghost" size="icon" aria-label="Delete project">
  <Trash2 className="h-4 w-4" />
</Button>
 
// ALTERNATIVE - use sr-only span
<Button variant="ghost" size="icon">
  <Trash2 className="h-4 w-4" />
  <span className="sr-only">Delete project</span>
</Button>
 
// NEVER - no accessible name
<Button variant="ghost" size="icon">
  <Trash2 className="h-4 w-4" />
</Button>

Required for All Components

  • Form inputs must have labels
  • Images must have meaningful alt text (or alt="" for decorative)
  • Interactive elements must be keyboard accessible
  • Focus states must be visible
  • Color cannot be the only indicator of state

File Organization

/src/
  main.tsx              # App entry, providers
  router.tsx            # Route configuration
  globals.css           # Global Tailwind styles

/components/
  /ui/                  # shadcn/ui primitives (DO NOT EDIT)

/hooks/
  query-keys.ts         # Centralized query key factory

/lib/
  /api/                 # API service modules
  error-messages.ts     # Error code mapping

/schemas/               # Zod validation schemas
/stores/                # Zustand stores

Naming Conventions

TypeConventionExample
Fileskebab-case.tsxproject-card.tsx
ComponentsPascalCase (named export)export function ProjectCard()
Hooksuse- prefixuse-projects.ts
Schemas-schema.ts suffixproject-schema.ts
Stores-store.ts suffixproject-store.ts

Import Rules

  • Always use @/ path aliases
  • Never use relative imports (../../)
  • Use import type {} for type-only imports

Component Checklist

Before completing any component:

  • Named export (not default)
  • Props use readonly modifier
  • Loading state handled (Skeleton)
  • Error state handled (with retry)
  • Empty state handled (with CTA)
  • Icon buttons have aria-label
  • Form inputs have labels
  • Uses shadcn/ui components where applicable
  • Uses cn() for conditional classes
  • Uses @/ import aliases

Brand Assets

AssetPathFormatUsage
Primary Logo/SSTLogo.svgSVGHeader, footer
Favicon/favicon.svgSVGBrowser tab
App Icon (192px)/android-chrome-192x192.pngPNGPWA manifest
App Icon (512px)/android-chrome-512x512.pngPNGPWA manifest

Logo Usage

  • Minimum height: 24px
  • Maintain aspect ratio
  • Use SVG for web, PNG for social/OG images
  • Do not modify colors or proportions

Git Workflow

Branch Naming

Pattern: ^(feature|hotfix)\/[a-z0-9\-]+$

TypePatternExample
Feature with ticketfeature/ticket-####-descriptionfeature/ticket-1234-add-auth
Feature without ticketfeature/descriptionfeature/add-dark-mode
Hotfix with tickethotfix/ticket-####-descriptionhotfix/ticket-5678-fix-login
Hotfix without tickethotfix/descriptionhotfix/fix-null-pointer

Commit Messages

Use Conventional Commits:

  • feat: - New feature
  • fix: - Bug fix
  • docs: - Documentation
  • refactor: - Code refactoring
  • test: - Adding tests
  • chore: - Maintenance

Related Documentation

Design Standards

Core patterns and best practices for React applications.

Code Examples

Comprehensive implementation templates.

Code Quality Setup

ESLint, Prettier, and Stylelint configuration.

Framework Guide

Vite vs Next.js decision framework.

AGENTS.md Template

Copy-paste template for project setup.

Getting Started

Installation options and setup guides.

Governance ModelMigration Guide

On This Page

Quick ReferenceFramework SelectionDecision TreeFramework RulesCore Technology StackDesign Constraints (Rules AI Must Follow)React CompilerState Management Decision TreeForm ImplementationAnti-Patterns to AvoidAccessibility RequirementsIcon-Only ButtonsRequired for All ComponentsFile OrganizationNaming ConventionsImport RulesComponent ChecklistBrand AssetsLogo UsageGit WorkflowBranch NamingCommit MessagesRelated Documentation

Contribute

  • Report an issue
  • Request a feature
  • Edit this page