`, AppIcon (when icon truthy), headline `
`, subtext `
` (when subtext truthy AND size !== 'sm' — sidebar micro hides subtext via the `hidden` class), ``
Create `frontend/src/components/ui/EmptyState.vue` using the Options API target structure from `10-PATTERNS.md §"EmptyState.vue"`. Import `AppIcon` from `./AppIcon.vue`. Use the exact class mapping table from PATTERNS:
- size='md' container: `'text-center py-10 px-4'`; icon: `'w-8 h-8 mx-auto mb-3 text-gray-300'`; headline: `'text-sm font-medium text-gray-500'`; subtext: `'text-xs text-gray-400 mt-1'`
- size='sm' container: `'flex items-center gap-2 py-1 text-xs text-gray-400'`; icon: `'w-3.5 h-3.5 shrink-0'`; headline: `''`; subtext: `'hidden'`
Template structure:
```
{{ headline }}
{{ subtext }}
```
Do NOT add explanatory comments. Use Options API (CLAUDE.md).
cd frontend && npm run test -- --run EmptyState
Expected: all 7 tests PASS (GREEN).
- File `frontend/src/components/ui/EmptyState.vue` exists
- File imports AppIcon from `./AppIcon.vue`
- File contains `name: 'EmptyState'`
- File contains all 4 computed properties: `containerClass`, `iconClass`, `headlineClass`, `subtextClass`
- File contains ``
- All 7 tests pass: `cd frontend && npm run test -- --run EmptyState` exits 0
- File uses Options API, not `