@base-framework/organisms
Version:
This will add default organisms to the base framework.
113 lines (87 loc) • 4.15 kB
Markdown
# Base Framework Organisms - AI Coding Instructions
## Project Architecture
This is a **Base Framework** organisms library that provides reusable UI components following **Atomic Design** principles. Components are built using the Base framework's `Atom`, `Component`, and `Jot` patterns.
### Key Dependencies
- `@base-framework/base` - Core framework (Component, Data, Jot, router)
- `@base-framework/atoms` - Basic HTML atoms (Div, Span, Tbody, etc.)
### Build System
- **Primary**: ESBuild (`node ./esbuild.js`) - bundles to `dist/organisms.js`
- **Types**: TypeScript compiler generates `.d.ts` files from JSDoc comments
- **Format**: ES modules with external dependencies
- Run `npm run build` for both bundling and type generation
## Component Patterns
### 1. Atom Functions (Functional Components)
Use `Atom()` for simple, stateless organisms that compose other atoms:
```javascript
export const DataList = Atom((props) => (
DataContainer(
{ loadMoreItems: props.loadMoreItems, data: props.data },
[new List({ key: props.key, items: props.items || [] })]
)
));
```
### 2. Component Classes (Stateful)
Use `Component` class for complex organisms with lifecycle methods:
```javascript
export class NavLink extends Component {
beforeSetup() { /* setup logic */ }
render() { return { tag: 'a', /* config */ }; }
setupStates() { return { selected: false }; }
}
```
### 3. Jot Components (Reactive)
Use `Jot()` for data-driven components with reactive state:
```javascript
export const List = Jot({
setData() { return new Data({ items, hasItems: null }); },
render() { return Div({ for: ['items', this.row.bind(this)] }); }
});
```
## Critical Conventions
### Data Binding & Reactivity
- Use `Data` objects for reactive state management
- Link parent/child data: `this.data.link(parentData, 'hasItems')`
- Use `On()` for conditional rendering: `On('hasItems', (hasItems) => ...)`
- Use `for` property for array iteration: `for: ['items', rowCallBack]`
### Component Communication
- **Parent-to-child**: Pass data via props and context
- **Data linking**: Components can link to parent data objects
- **State watchers**: Use `watch` property for reactive updates
### File Structure
- Export both named and default: `export const List = ...; export default List;`
- Use relative imports from `src/`: `import { ChildHelper } from 'src/utils/child-helper.js';`
- Group by domain: `lists/`, `tables/`, `router/`, `time/`, `utils/`
### TypeScript Integration
- Use JSDoc comments for type definitions
- Include comprehensive `@param` documentation
- Mark class properties with `@member` tags
- Use `// @ts-ignore` sparingly for Base framework patterns
## Data Management Patterns
### Pagination & Scrolling
- Use `PaginationTracker` for offset/limit tracking
- Implement `loadMoreItems` functions for data fetching
- Use `ScrollableContainer` for infinite scroll behavior
### Caching
- Set `cache` properties on components for DOM caching
- Use meaningful cache keys: `cache: 'listContainer'`
## Component Lifecycle
### Setup Order
1. `declareProps()` - declare component properties
2. `onCreated()` - post-creation setup
3. `before()` - pre-render setup (data linking)
4. `setData()` - initialize reactive data
5. `render()` - return component structure
### Cleanup
- Implement `destroy()` method to reset data states
- Clean up timers and intervals in components
## Testing & Development
- **Build**: `npm run build` (ESBuild + TypeScript)
- **Entry point**: `src/organisms.js` exports all public components
- **External deps**: Base framework components are externalized in build
- **Types**: Generated in `dist/types/` from JSDoc annotations
## Common Anti-Patterns
❌ Don't use direct DOM manipulation - use Base framework atoms
❌ Don't create Components for simple compositions - use Atoms
❌ Don't forget to export both named and default exports
❌ Don't mix Component lifecycle with functional patterns
❌ Don't ignore parent data linking in nested components