293 lines
7.4 KiB
Markdown
293 lines
7.4 KiB
Markdown
# Core Concepts - Understanding uxscii
|
|
|
|
The fundamental concepts you need to understand the uxscii standard.
|
|
|
|
## The Philosophy
|
|
|
|
**uxscii** is an AI-native design markup language that combines:
|
|
- **Human-readable** ASCII art (visual representation)
|
|
- **Machine-parseable** JSON metadata (component definition)
|
|
- **Version-control friendly** text files (meaningful diffs)
|
|
|
|
## The Two-File System
|
|
|
|
Every component consists of exactly TWO files that work together:
|
|
|
|
### File 1: `.uxm` (Component Metadata)
|
|
|
|
JSON file containing:
|
|
- **Identity**: ID, type, version
|
|
- **Metadata**: Name, description, author, timestamps
|
|
- **Properties**: Configurable props with defaults
|
|
- **Behavior**: States, interactions, accessibility
|
|
- **ASCII Reference**: Template file, dimensions, variables
|
|
|
|
**Purpose**: Tells agents WHAT the component is and HOW it behaves.
|
|
|
|
### File 2: `.md` (Visual Template)
|
|
|
|
Markdown file containing:
|
|
- **ASCII Art**: Visual representation of the component
|
|
- **Variables**: `{{variableName}}` placeholders for dynamic content
|
|
- **States**: Visual variants (default, hover, focus, disabled, etc.)
|
|
- **Documentation**: Usage examples and variable descriptions
|
|
|
|
**Purpose**: Shows agents WHAT the component looks like.
|
|
|
|
## How They Connect
|
|
|
|
```
|
|
submit-button.uxm says:
|
|
"ascii": {
|
|
"templateFile": "submit-button.md", ← Points to template
|
|
"variables": [
|
|
{"name": "text", "type": "string"} ← Defines variables
|
|
]
|
|
}
|
|
|
|
submit-button.md contains:
|
|
╭──────────────────╮
|
|
│ {{text}} │ ← Uses the variable
|
|
╰──────────────────╯
|
|
```
|
|
|
|
The `.uxm` **defines** variables, the `.md` **uses** them.
|
|
|
|
## Component Anatomy
|
|
|
|
### Minimal Required Fields (.uxm)
|
|
|
|
```json
|
|
{
|
|
"id": "kebab-case-name", // Required: Unique identifier
|
|
"type": "button|input|card|...", // Required: Component type
|
|
"version": "1.0.0", // Required: Semantic version
|
|
"metadata": {
|
|
"name": "Human Name", // Required: Display name
|
|
"created": "ISO-timestamp", // Required: Creation date
|
|
"modified": "ISO-timestamp" // Required: Last modified
|
|
},
|
|
"props": {}, // Required: Can be empty object
|
|
"ascii": {
|
|
"templateFile": "name.md", // Required: Template filename
|
|
"width": 20, // Required: Character width
|
|
"height": 3 // Required: Character height
|
|
}
|
|
}
|
|
```
|
|
|
|
### Optional But Recommended Fields
|
|
|
|
```json
|
|
{
|
|
"metadata": {
|
|
"description": "What this component does",
|
|
"author": "Your name",
|
|
"tags": ["searchable", "keywords"],
|
|
"category": "input|display|layout|..."
|
|
},
|
|
"behavior": {
|
|
"states": [/* multiple states */],
|
|
"interactions": [/* user interactions */],
|
|
"accessibility": {/* ARIA attributes */}
|
|
},
|
|
"extends": "base-component-id" // Component inheritance
|
|
}
|
|
```
|
|
|
|
## Variable Substitution
|
|
|
|
### In .uxm (Definition)
|
|
```json
|
|
"props": {
|
|
"text": "Click me", // Default value
|
|
"disabled": false
|
|
},
|
|
"ascii": {
|
|
"variables": [
|
|
{
|
|
"name": "text",
|
|
"type": "string",
|
|
"required": true,
|
|
"description": "Button label"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
### In .md (Usage)
|
|
```
|
|
╭──────────────────╮
|
|
│ {{text}} │ ← Replaced with prop value
|
|
╰──────────────────╯
|
|
```
|
|
|
|
### Result
|
|
```
|
|
╭──────────────────╮
|
|
│ Click me │ ← Actual rendered output
|
|
╰──────────────────╯
|
|
```
|
|
|
|
## States and Behaviors
|
|
|
|
Components can have multiple visual states:
|
|
|
|
```json
|
|
"behavior": {
|
|
"states": [
|
|
{
|
|
"name": "default",
|
|
"properties": {"border": "solid"}
|
|
},
|
|
{
|
|
"name": "hover",
|
|
"properties": {"border": "highlighted"},
|
|
"triggers": ["mouseenter"]
|
|
},
|
|
{
|
|
"name": "disabled",
|
|
"properties": {"border": "dashed", "opacity": 0.5}
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
Each state can have a corresponding ASCII representation in the `.md` file.
|
|
|
|
## Two-Phase Component Creation
|
|
|
|
Fluxwing optimizes for fast MVP prototyping with a two-phase approach:
|
|
|
|
### Phase 1: Create with Default State
|
|
|
|
When you create a component, it starts with **only the default state**:
|
|
- Fast creation for quick prototyping
|
|
- MVP-ready for early discussions
|
|
- Minimal file size and complexity
|
|
|
|
```bash
|
|
/fluxwing-create submit-button
|
|
# Creates component with default state only
|
|
```
|
|
|
|
### Phase 2: Expand with Interactive States
|
|
|
|
After MVP validation, add interaction states on demand:
|
|
- Adds hover, focus, disabled states
|
|
- Smart defaults based on component type
|
|
- Preserves all existing data
|
|
|
|
```bash
|
|
/fluxwing-expand-component submit-button
|
|
# Adds hover, active, disabled states
|
|
```
|
|
|
|
### Why Two Phases?
|
|
|
|
**Benefits**:
|
|
- **60-80% faster** component creation
|
|
- Focus on core functionality first
|
|
- Add polish when needed, not upfront
|
|
- Cleaner diffs in version control
|
|
|
|
**Workflow**:
|
|
```
|
|
1. Create → Default state only (fast)
|
|
2. Discuss → Review with stakeholders
|
|
3. Validate → Confirm design works
|
|
4. Expand → Add interactive states (polish)
|
|
```
|
|
|
|
This approach aligns with agile development: ship fast, iterate based on feedback.
|
|
|
|
## Component Types
|
|
|
|
Standard types:
|
|
- **button**: Clickable action triggers
|
|
- **input**: Text entry fields
|
|
- **card**: Content containers
|
|
- **navigation**: Menu and navigation
|
|
- **form**: Multi-field forms
|
|
- **list**: Data displays
|
|
- **modal**: Overlay dialogs
|
|
- **table**: Tabular data
|
|
- **badge**: Small indicators
|
|
- **alert**: Notifications
|
|
- **container**: Layout wrappers
|
|
- **text**: Text displays
|
|
- **image**: Image placeholders
|
|
- **divider**: Visual separators
|
|
- **custom**: Anything else
|
|
|
|
## Naming Conventions
|
|
|
|
### Component IDs (kebab-case)
|
|
- ✓ `submit-button`
|
|
- ✓ `email-input`
|
|
- ✓ `user-profile-card`
|
|
- ✗ `submitButton` (camelCase)
|
|
- ✗ `Submit Button` (spaces)
|
|
|
|
### Variables (camelCase)
|
|
- ✓ `userName`
|
|
- ✓ `isDisabled`
|
|
- ✓ `maxLength`
|
|
- ✗ `user-name` (kebab-case)
|
|
- ✗ `user_name` (snake_case)
|
|
|
|
### Files (kebab-case + extension)
|
|
- ✓ `submit-button.uxm`
|
|
- ✓ `submit-button.md`
|
|
- ✗ `submitButton.uxm`
|
|
|
|
## Accessibility
|
|
|
|
Every interactive component should include accessibility attributes:
|
|
|
|
```json
|
|
"behavior": {
|
|
"accessibility": {
|
|
"role": "button", // ARIA role
|
|
"ariaLabel": "Submit form", // Screen reader label
|
|
"focusable": true, // Can receive focus
|
|
"keyboardSupport": ["Enter", "Space"] // Key bindings
|
|
}
|
|
}
|
|
```
|
|
|
|
## Composition
|
|
|
|
Components can reference other components to create screens:
|
|
|
|
```json
|
|
{
|
|
"id": "login-screen",
|
|
"type": "container",
|
|
"props": {
|
|
"components": [
|
|
"email-input", // References another component
|
|
"password-input",
|
|
"submit-button"
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
## Key Takeaways
|
|
|
|
1. **Two files, one component**: `.uxm` for logic, `.md` for visuals
|
|
2. **Variables bridge them**: Defined in `.uxm`, used in `.md`
|
|
3. **States create interactivity**: Multiple visual representations
|
|
4. **Types organize components**: Standard categories for consistency
|
|
5. **Naming matters**: Conventions ensure compatibility
|
|
6. **Accessibility is essential**: ARIA roles for all interactive elements
|
|
|
|
## Next Steps
|
|
|
|
- **See it in action**: Check `../examples/primary-button.{uxm,md}`
|
|
- **Create your own**: Follow `03-component-creation.md`
|
|
- **Learn patterns**: Browse `06-ascii-patterns.md`
|
|
|
|
You now understand the foundation of uxscii!
|