- Reorder frames in ui-design.pen for better spatial organization - Add docs/DESIGN-SYSTEM-PROPOSAL.md: full design system analysis and roadmap - Identifies 13 duplicated patterns (NoteList/Item x10, Inspector headers x7, etc.) - Proposes atomic structure: atoms → molecules → organisms - 6-phase implementation plan (16-22h total, phases 1-3 = 80% value) - Naming conventions, component inventory, canvas layout strategy
16 KiB
Design System Proposal for Laputa
Current State Assessment
What exists today
- 53 top-level frames scattered across a ~6800x11400px canvas with no spatial logic
- 0 reusable components (every frame is ad-hoc)
- ~40 design variables with light/dark theme support (colors, radii, fonts)
- 2 foundation frames: Color Palette and Typography & Spacing Specs
- 1 full-app layout frame (light mode only)
- 4 sidebar-collapse variations showing different panel states
Recurring patterns that should be components (but aren't)
By analyzing the 53 frames, these patterns are duplicated 3-10x each:
| Pattern | Where it appears | Times duplicated |
|---|---|---|
| Inspector section header (label + action icon) | rbF01-03, reF01-03, pi01 | 7x |
| Note list item (title + snippet + date + dot) | dp01-04, mni01-04, trNL1 | ~10x |
| Tab bar tab (label + close + dot indicator) | dp10, mni10, full layout | 3x |
| Sidebar filter item (icon + label + count) | trSB1, full layout sidebar | 4x |
| Sidebar section group (chevron + icon + label) | full layout, drag frames | 4x |
| Breadcrumb bar (icon + path + badges) | dp20, archBtnNorm/Arc, full layout | 4x |
| Modal shell (header + body + footer) | ghv01-04, iogBH (settings) | 5x |
| Property row (label + value) | urlDefault/Hover/Edit, pi01 | 4x |
| Relationship pill (icon + label + X) | trRI1, reF01-03, rbF01-03 | 6x |
| Status badge (colored dot/pill) | dp01, dp10, dp20, dp30 | 4x |
| Status bar (version + branch + sync) | mni20, full layout | 2x |
| Search bar (dark themed) | 3aG9b, K1O2x, nrIcZ | 3x |
| Warning/info banner | trW30 | 1x (but will recur) |
Every time a new feature is designed, these get rebuilt from scratch.
Proposed Structure
Single file: ui-design.pen
Multiple files creates friction (can't reference components cross-file, harder to maintain). Keep one file, organized into logical sections using large container frames as visual grouping. Each section is a horizontal band across the canvas.
Canvas Layout (top to bottom)
y ≈ 0 ┌─────────────────────────────────────────────┐
│ 0. COVER │
│ App name, version, last updated, TOC │
└─────────────────────────────────────────────┘
y ≈ 200 ┌─────────────────────────────────────────────┐
│ 1. FOUNDATIONS │
│ Color palette, Typography scale, Spacing, │
│ Border radius, Shadows, Iconography │
└─────────────────────────────────────────────┘
y ≈ 1800 ┌─────────────────────────────────────────────┐
│ 2. COMPONENTS (Reusable) │
│ Atoms → Molecules → Organisms │
│ Each component: default + states side by side│
└─────────────────────────────────────────────┘
y ≈ 5000 ┌─────────────────────────────────────────────┐
│ 3. PATTERNS / COMPOSITIONS │
│ Panel Inspector, Panel NoteList, Panel Editor│
│ Modal shell, Popover/dropdown shell │
└─────────────────────────────────────────────┘
y ≈ 7000 ┌─────────────────────────────────────────────┐
│ 4. FULL LAYOUTS │
│ Default state, Sidebar collapsed, Editor │
│ only, etc. (full 1440x900 frames) │
└─────────────────────────────────────────────┘
y ≈ 12000 ┌─────────────────────────────────────────────┐
│ 5. FEATURE SPECS │
│ Grouped by feature area — all current 53 │
│ frames reorganized here │
└─────────────────────────────────────────────┘
Each section starts with a section label frame (large text, description, horizontal rule). Within each section, frames flow left to right, wrapping down, with 100px spacing.
Section 1: Foundations
What to keep
- Color Palette (frame
mOf4J) — already good. Move to top of file. - Typography & Spacing (frame
HZonq) — already good. Place next to color palette.
What to add
- Spacing Scale — explicit 4px grid reference (4, 8, 12, 16, 20, 24, 32, 40, 48, 64) with visual boxes
- Shadow Tokens — overlay shadow, dialog shadow, dropdown shadow (currently only documented in CSS, not in the design file)
- Icon Reference — small grid showing common Lucide + Phosphor icons used in the app, at 14px and 16px sizes
Variables to add
The .pen file already has --radius-sm/md/lg but is missing spacing variables. Add:
| Variable | Value | Usage |
|---|---|---|
--space-xs |
4 | Tight gaps (icon-to-label) |
--space-sm |
8 | Standard gap |
--space-md |
12 | Section padding |
--space-lg |
16 | Panel padding |
--space-xl |
24 | Large section gaps |
--space-2xl |
32 | Page padding |
--space-3xl |
48 | Section dividers |
Section 2: Component Library
Atomic Design Hierarchy
Atoms (smallest building blocks)
| Component | Variants/States | ID Prefix |
|---|---|---|
| Button/Primary | default, hover, active, disabled | c/btn-pri |
| Button/Secondary | default, hover, active, disabled | c/btn-sec |
| Button/Ghost | default, hover, active | c/btn-ghost |
| Button/Destructive | default, hover, disabled | c/btn-dest |
| Button/Icon | default, hover (icon-only button, e.g. close, settings) | c/btn-icon |
| Input/Text | empty, filled, focused, error, disabled | c/input |
| Input/Search | empty, with query, with clear button | c/input-search |
| Badge | default, secondary, outline, destructive, status colors (green/orange/red/blue/purple) | c/badge |
| Status Dot | green (new), orange (modified), none (clean) | c/status-dot |
| Checkbox | unchecked, checked, indeterminate | c/checkbox |
| Toggle | off, on | c/toggle |
| Icon | 14px, 16px, 20px wrapper with Lucide/Phosphor | c/icon |
| Separator | horizontal, vertical | c/sep |
| Avatar/Initial | letter avatar for Person entities | c/avatar |
| Tooltip | top, bottom (container with pointer) | c/tooltip |
Molecules (composed from atoms)
| Component | Composition | States | ID Prefix |
|---|---|---|---|
| Sidebar/FilterItem | icon + label + count badge | default, active, hover | c/sb-filter |
| Sidebar/SectionHeader | chevron + icon + label + add button | collapsed, expanded, hover, dragging | c/sb-section |
| Sidebar/SectionItem | indent + label | default, active, hover | c/sb-item |
| Sidebar/TopicItem | hash + label | default, active, hover | c/sb-topic |
| NoteList/Item | status dot + title + snippet + date + type pill | default, selected, hover, modified, new | c/nl-item |
| NoteList/Header | title + count + sort button | — | c/nl-header |
| Tab | label + close btn + modified dot | default, active, hover, modified | c/tab |
| BreadcrumbBar | path segments + word count + status badge | new, modified, clean | c/breadcrumb |
| Property/Row | label + value | default, hover, editing | c/prop-row |
| Property/URLRow | label + link + copy/edit icons | default, hover, editing | c/prop-url |
| Relationship/Pill | icon + label + (X remove on hover) | default, hover, trashed, archived | c/rel-pill |
| Relationship/AddInput | search input with autocomplete | empty, typing, results | c/rel-add |
| Inspector/SectionHeader | label + action button | default, hover | c/insp-header |
| Git/CommitItem | hash + message + author + date (timeline style) | — | c/git-commit |
| Search/ResultItem | title + path + highlighted snippet | default, selected | c/search-result |
| Sort/DropdownItem | label + direction arrow + checkmark | default, selected | c/sort-item |
| Banner/Warning | icon + message + optional action | info, warning, error | c/banner |
| Wikilink | colored link text (varies by entity type) | 8 type colors | c/wikilink |
Organisms (panel-level compositions)
| Component | Content | ID Prefix |
|---|---|---|
| Panel/Sidebar | title bar + filters + sections + commit area | c/panel-sidebar |
| Panel/NoteList | header + type pills + item list | c/panel-notelist |
| Panel/Editor | tab bar + breadcrumb + content area | c/panel-editor |
| Panel/Inspector | properties section + relations + backlinks + history | c/panel-inspector |
| Modal/Shell | header + tab bar (opt) + body + footer | c/modal |
| Popover/Dropdown | list of items + separator + annotation | c/popover |
| StatusBar | left info + right info | c/statusbar |
| TitleBar | traffic lights (macOS) | c/titlebar |
Section 3: Patterns / Compositions
These are non-reusable reference frames showing how components compose into real UI sections. Think of them as "component playgrounds" — they use component instances to build real UI, but they're documentation, not building blocks.
- Inspector states: Properties expanded, Relations with pills, Referenced By with/without entries, Backlinks, Git history
- NoteList states: All Notes view, filtered by section, empty state, search results
- Sidebar states: All sections expanded, one collapsed, dragging reorder, after reorder
- Editor states: Single tab, multiple tabs, modified tabs, diff view
- Modal patterns: GitHub Vault flow (4 states), Settings, Create Note, Commit Dialog
Section 4: Full Layouts
| Frame | Description |
|---|---|
| Default — All Panels | 1440x900, sidebar + notelist + editor + inspector |
| Sidebar Collapsed | Editor area wider, collapse button visible |
| Editor + NoteList Only | No sidebar or inspector |
| Editor Only | Focused writing mode |
| AI Chat Open | Inspector replaced with AI Chat panel |
| Quick Open Modal | Cmd+P overlay on default layout |
Keep the existing 5 layout frames (qHhaj + SC_all/nosb/edonly/ednl). Add AI Chat and Quick Open.
Section 5: Feature Specs
Reorganize existing 53 frames into feature groups. Each group gets a feature label frame above it:
| Group | Frames to include |
|---|---|
| Note Status & Indicators | dp01, dp10, dp20, dp30, mni01, mni10, mni20 |
| Trash & Archive | trSB1, trNL1, trRI1, trW30, archBtnNorm, archBtnArc |
| Inspector & Properties | pi01, pi50, rbF01-03, reF01-03, urlDefault/Hover/Edit |
| Sidebar | dsg01a-04j, csB01, csA01 |
| GitHub Vault | ghv01-04, ghv03 |
| Git History | ghCL1, ghDO1, vc001, vc100, vc200 |
| Sort & Search | srtDD, srtBN, 3aG9b, K1O2x, nrIcZ |
| Editor & Wikilinks | wlc01 |
| Settings | iogBH |
| Virtual List | vl001 |
Naming Convention
Frames
Section-level: "== FOUNDATIONS =="
"== COMPONENTS =="
"== FULL LAYOUTS =="
Feature groups: "Feature: Trash & Archive"
"Feature: Note Status"
Reusable Components
component/<category>/<name>
Examples:
component/button/primary
component/button/ghost
component/sidebar/filter-item
component/notelist/item
component/inspector/section-header
component/modal/shell
States (within a component frame)
<component-name> — <state>
Examples:
Button/Primary — Default
Button/Primary — Hover
NoteList/Item — Selected
NoteList/Item — Modified
Feature Spec Frames
<Feature> — <Specific View>
Examples:
Trash — Note List View
Trash — 30-Day Warning
Git History — Commit List
Git History — Diff Open
Implementation Priority
Phase 1: Foundation Cleanup (2-3 hours)
- Add spacing variables to the .pen file
- Move Color Palette and Typography frames to top of canvas (y ≈ 200)
- Add section label frames as visual dividers
- Reorganize existing 53 frames into the feature-spec section (y ≈ 12000+)
- Create cover frame at y ≈ 0
Impact: Clean canvas, easy to navigate. Zero component work yet.
Phase 2: Core Atoms (3-4 hours)
- Button — 4 variants x 3 states = ~12 sub-frames, all as
reusable: true - Badge — 6 color variants + 4 style variants
- Status Dot — green, orange, red, none
- Input — text + search variants
- Separator — horizontal + vertical
- Icon Button — close, settings, chevron, etc.
Impact: Building blocks exist. Future features can pull from them.
Phase 3: Core Molecules (4-5 hours)
- Sidebar/FilterItem — most reused sidebar pattern
- Sidebar/SectionHeader — with chevron and add button
- NoteList/Item — the most duplicated pattern in the file
- Tab — with modified indicator states
- Property/Row — default/hover/edit states
- Relationship/Pill — normal/trashed/archived states
- Inspector/SectionHeader — label + collapse/action
Impact: Feature specs can be rebuilt from instances. Consistency guaranteed.
Phase 4: Organisms (3-4 hours)
- Modal/Shell — replace 5 ad-hoc modals with instances of one shell
- Panel/Sidebar — full sidebar composition
- Panel/NoteList — full notelist composition
- StatusBar — standardize
- Popover/Dropdown — for sort, autocomplete, etc.
Impact: Full layouts can be composed from panel organisms.
Phase 5: Rebuild Full Layouts (2-3 hours)
- Rebuild "Laputa App — Full Layout (Light)" using component instances
- Create remaining layout variants (AI Chat, Quick Open)
- Ensure all layouts use the same component instances for consistency
Impact: Single source of truth. Change a button component, all layouts update.
Phase 6: Feature Spec Cleanup (2-3 hours)
- Rebuild key feature specs using component instances where possible
- Remove frames that are now redundant (covered by component states)
- Add any missing feature-specific variations
Impact: Clean, maintainable feature documentation.
Estimated Total Effort
| Phase | Effort | Cumulative |
|---|---|---|
| 1. Foundation Cleanup | 2-3h | 2-3h |
| 2. Core Atoms | 3-4h | 5-7h |
| 3. Core Molecules | 4-5h | 9-12h |
| 4. Organisms | 3-4h | 12-16h |
| 5. Full Layouts | 2-3h | 14-19h |
| 6. Feature Cleanup | 2-3h | 16-22h |
Recommendation: Do phases 1-3 first (9-12h). This covers 80% of the value — clean organization + the most reused components. Phases 4-6 can happen incrementally as features are designed.
What "World Class" Looks Like
After this work, ui-design.pen will:
- Open to a cover page with app identity and section navigation
- Have ~30 reusable components that match the real implementation 1:1
- Use variables everywhere — no hardcoded colors, spacing, or radii
- Show every component state — no guessing what hover/active/disabled looks like
- Compose layouts from instances — change a component, all layouts update
- Group features logically — find any feature spec in seconds
- Grow naturally — new features just add instances of existing components + new feature-specific frames
The key shift: from "collection of screenshots" to "living system of composable parts".