Skip to content

developer-1px/interactive-os

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

738 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🌌 Interactive OS

μ•± κ°œλ°œμžκ°€ μΈν„°λž™μ…˜μ„ μ‹ κ²½ μ•ˆ 써도 λ˜λŠ” 세상을 λ§Œλ“€κ³  μžˆλ‹€.


Why β€” λΈŒλΌμš°μ €λŠ” μš΄μ˜μ²΄μ œκ°€ μ•„λ‹ˆλ‹€

λΈŒλΌμš°μ €λŠ” λ¬Έμ„œ λ·°μ–΄μ—μ„œ μΆœλ°œν–ˆλ‹€. <a>, <form>, <input> β€” μ „λΆ€ λ¬Έμ„œλ₯Ό 읽고 μ œμΆœν•˜λŠ” 도ꡬ닀. 근데 μ§€κΈˆ μš°λ¦¬κ°€ λΈŒλΌμš°μ € μœ„μ—μ„œ λ§Œλ“œλŠ” 건 Figmaκ³ , Notion이고, Linearλ‹€. ν”„λ‘œ 도ꡬλ₯Ό λ¬Έμ„œ λ·°μ–΄ μœ„μ— 올리고 μžˆλ‹€.

κ·Έλž˜μ„œ 맀번 같은 문제λ₯Ό κ²ͺλŠ”λ‹€. ν¬μ»€μŠ€κ°€ μ–΄λ”” μžˆλŠ”μ§€ λΈŒλΌμš°μ €μ— 물어봐야 ν•˜κ³ , ν‚€λ³΄λ“œ λ‚΄λΉ„κ²Œμ΄μ…˜μ„ μ²˜μŒλΆ€ν„° μ§œμ•Ό ν•˜κ³ , λ“œλž˜κ·Έ, ν΄λ¦½λ³΄λ“œ, λ©€ν‹°μ…€λ ‰μ…˜, Undo/Redoλ₯Ό μ•±λ§ˆλ‹€ λ‹€μ‹œ λ§Œλ“ λ‹€. 이 ν”„λ‘œμ νŠΈλŠ” κ·Έ "맀번"을 μ—†μ•€λ‹€.

μ™œ μ§€κΈˆκΉŒμ§€ μ—†μ—ˆλ‚˜

μžˆμ—ˆλ‹€. λ‹€λ§Œ λ°©ν–₯이 λ‹¬λžλ‹€.

React, Vue, Angular β€” 이것듀은 λ Œλ”λ§ 엔진이닀. "화면에 뭘 그릴까"λŠ” ν’€μ—ˆμ§€λ§Œ, "μ‚¬μš©μžμ˜ μ˜λ„λ₯Ό μ–΄λ–»κ²Œ ν•΄μ„ν• κΉŒ"λŠ” μ—¬μ „νžˆ μ•± 개발자 λͺ«μ΄λ‹€.

Radix, Headless UI, Ark UI β€” 더 κ°€κΉŒμš΄ μ‹œλ„λ‹€. ν•˜μ§€λ§Œ 이것듀은 κ°œλ³„ μœ„μ ― λΌμ΄λΈŒλŸ¬λ¦¬λ‹€. Dialog ν•˜λ‚˜, Listbox ν•˜λ‚˜. 각각은 잘 λ™μž‘ν•˜λŠ”λ°, μœ„μ ― 간에 톡신이 μ•ˆ λœλ‹€. Listboxμ—μ„œ μ„ νƒν•œ κ±Έ μ˜† Panelμ—μ„œ μ•Œ 수 μ—†κ³ , ν¬μ»€μŠ€κ°€ Dialogμ—μ„œ λ’€μ˜ Tree둜 λŒμ•„κ°ˆ λ•Œ μ–΄λ””λ‘œ κ°€μ•Ό ν•˜λŠ”μ§€ 아무도 λͺ¨λ₯Έλ‹€. μ•± 전체λ₯Ό ν•˜λ‚˜μ˜ μ‹œμŠ€ν…œμœΌλ‘œ λ³΄λŠ” λ ˆμ΄μ–΄κ°€ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

그리고 더 근본적인 이유 β€” 이걸 λ²”μš©μœΌλ‘œ λ§Œλ“€μ–΄μ„œ ν’€ λΉ„μ¦ˆλ‹ˆμŠ€ μΈμ„Όν‹°λΈŒκ°€ μ—†μ—ˆλ‹€. FigmaλŠ” Figma의 μΈν„°λž™μ…˜λ§Œ 잘 되면 되고, Notion은 Notion κ²ƒλ§Œ 잘 되면 λœλ‹€.

AIκ°€ 이걸 λ°”κΏ¨λ‹€. AIκ°€ μ½”λ“œλ₯Ό μ§œλŠ” μ‹œλŒ€μ—, μΈν„°λž™μ…˜ 둜직이 μ•±λ§ˆλ‹€ λ‹€λ₯΄λ©΄ AIλŠ” 맀번 μƒˆλ‘œ λ°°μ›Œμ•Ό ν•œλ‹€. OS λ ˆμ΄μ–΄κ°€ ν•˜λ‚˜ 있으면, AIλŠ” κ·Έ κ·œμΉ™ ν•˜λ‚˜λ§Œ μ•Œλ©΄ λœλ‹€. μ»€λ§¨λ“œ ν•˜λ‚˜ dispatchν•˜λ©΄ 포컀슀, μ…€λ ‰μ…˜, Undoκ°€ λ‹€ λ”°λΌμ˜¨λ‹€.

κΈ°μ‘΄κ³Ό λ‹€λ₯Έ 점

κ΄€ν• κΆŒμ΄ λ‹€λ₯΄λ‹€. μ»΄ν¬λ„ŒνŠΈ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” **"이 μœ„μ ―μ„ μ–΄λ–»κ²Œ λ Œλ”λ§ν• κΉŒ"**λ₯Ό ν‘Όλ‹€. Interactive OSλŠ” **"μ‚¬μš©μžκ°€ 뭘 ν•˜λ €λŠ” 건지 μ–΄λ–»κ²Œ ν•΄μ„ν• κΉŒ"**λ₯Ό ν‘Όλ‹€.

μ‚¬μš©μžκ°€ Enterλ₯Ό λˆ„λ₯Έλ‹€:

Radix / Headless UI Interactive OS
λˆ„κ°€ 해석? ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈμ˜ onKeyDown OS μ»€λ„μ˜ 5-Phase Pipeline
무슨 일이? μ»΄ν¬λ„ŒνŠΈλ§ˆλ‹€ 닀름 OS_ACTIVATE μ»€λ§¨λ“œ ν•˜λ‚˜
Dialogμ—μ„œλŠ”? Dialog μ»΄ν¬λ„ŒνŠΈκ°€ λ”°λ‘œ 처리 같은 OS_ACTIVATE
Treeμ—μ„œλŠ”? Tree μ»΄ν¬λ„ŒνŠΈκ°€ λ”°λ‘œ 처리 같은 OS_ACTIVATE
Kanbanμ—μ„œλŠ”? 직접 κ΅¬ν˜„ 같은 OS_ACTIVATE

Enter ν•˜λ‚˜μ˜ μ˜λ―Έκ°€ μ‹œμŠ€ν…œ μ „μ²΄μ—μ„œ λ™μΌν•˜λ‹€. μ»¨ν…μŠ€νŠΈμ— 따라 κ²°κ³Όκ°€ λ‹¬λΌμ§ˆ 뿐, 해석 κ²½λ‘œλŠ” ν•˜λ‚˜λ‹€. macOSμ—μ„œ ⌘Sκ°€ μ–΄λ””μ„œλ“  "μ €μž₯"인 κ²ƒμ²˜λŸΌ.

같은 원리가 데이터에도 μ μš©λœλ‹€:

κΈ°μ‘΄:  TodoList β†’ flat CRUD      DocsSidebar β†’ tree CRUD      Kanban β†’ grouped CRUD
       (각자 κ΅¬ν˜„)                (각자 κ΅¬ν˜„)                    (각자 κ΅¬ν˜„)

μ§€κΈˆ:  NormalizedCollection  β†’  toFlatList    (List View)
       CRUDλŠ” ν•œ 벌          β†’  toVisibleTree (Tree View)
                             β†’  toGrouped     (Kanban View)

CRUD λ‘œμ§μ„ ν•œ 번 짜면, λ³΄λŠ” λ°©λ²•λ§Œ κ°ˆμ•„λΌμš΄λ‹€.

이걸둜 뭘 ν•  것인가

AIν•œν…Œ "이런 μ•± λ§Œλ“€μ–΄"라고 λ§ν•˜λ©΄ μ§„μ§œ λ§Œλ“€μ–΄μ§€κ²Œ ν•˜λ €κ³ .

μ§€κΈˆ AIν•œν…Œ 앱을 μ‹œν‚€λ©΄ λ²„νŠΌ λˆ„λ₯΄λ©΄ λ™μž‘ν•˜λŠ” μˆ˜μ€€μ΄ λ‚˜μ˜¨λ‹€. Tab ν‚€λ‘œ 이동 μ•ˆ 되고, ν‚€λ³΄λ“œλ§ŒμœΌλ‘œ μ“Έ 수 μ—†κ³ , Undo μ—†κ³ , λ“œλž˜κ·Έ μ•ˆ λœλ‹€. 보이기만 ν•˜λŠ” μ•±. μΈν„°λž™μ…˜μ΄ μ—†μœΌλ‹ˆ μž₯λ‚œκ°μ΄μ§€ 도ꡬ가 μ•„λ‹ˆλ‹€.

AIκ°€ ν•  일                          OSκ°€ 보μž₯ν•˜λŠ” 것
─────────────                       ──────────────
1. 데이터 λͺ¨λΈ μ •μ˜                  ν‚€λ³΄λ“œ λ‚΄λΉ„κ²Œμ΄μ…˜  βœ…
2. defineApp으둜 μ•± μ„ μ–Έ             포컀슀 볡원       βœ…
3. createCollectionZone CRUD μ—°κ²°    λ©€ν‹° μ…€λ ‰μ…˜      βœ…
4. Zone/Item으둜 UI μ„ μ–Έ             ν΄λ¦½λ³΄λ“œ          βœ…
                                    Undo/Redo        βœ…
                                    λ“œλž˜κ·Έ μ•€ λ“œλ‘­    βœ…
                                    μ ‘κ·Όμ„± (ARIA)    βœ…

AIλŠ” "뭘 λ³΄μ—¬μ€„κΉŒ"만 κ²°μ •ν•˜λ©΄, "μ–΄λ–»κ²Œ μ‘°μž‘ν• κΉŒ"λŠ” OSκ°€ 보μž₯ν•œλ‹€. 이게 되면 AIκ°€ λ§Œλ“  앱이 μž₯λ‚œκ°μ΄ μ•„λ‹ˆλΌ μ§„μ§œ ν”„λ‘œ 도ꡬ가 λœλ‹€. 이건 5λ…„ λ’€ 이야기가 μ•„λ‹ˆλΌ μ§€κΈˆ 이 μ½”λ“œλ² μ΄μŠ€μ—μ„œ Todo 앱이 이미 κ·Έλ ‡κ²Œ λ™μž‘ν•˜κ³  μžˆλ‹€. 980개 ν…ŒμŠ€νŠΈκ°€ 증λͺ…ν•œλ‹€.


How β€” μ•„ν‚€ν…μ²˜

5-Phase Interaction Pipeline

1-listeners β†’ 2-contexts β†’ 3-commands β†’ 4-effects β†’ 5-hooks β†’ 6-components

ν‚€λ³΄λ“œ/마우슀 μ΄λ²€νŠΈκ°€ λ¦¬μŠ€λ„ˆμ—μ„œ 캑처되고, μ»¨ν…μŠ€νŠΈλ₯Ό μ£Όμž…λ°›μ•„, μ»€λ§¨λ“œλ‘œ λ³€ν™˜λ˜κ³ , μ΄νŽ™νŠΈλ‘œ μ‹€ν–‰λ˜λ©°, 훅을 톡해 UI에 λ°˜μ˜λœλ‹€. λͺ¨λ“  μƒν˜Έμž‘μš©μ΄ 이 단일 νŒŒμ΄ν”„λΌμΈμ„ ν†΅κ³Όν•œλ‹€.

ZIFT ν”„λ¦¬λ―Έν‹°λΈŒ (Zone-Item-Field-Trigger)

ν”„λ¦¬λ―Έν‹°λΈŒ μ—­ν• 
Zone κ΄€ν• κΆŒ μ •μ˜. ARIA role preset으둜 λ™μž‘μ„ μ„ μ–Έμ μœΌλ‘œ κ²°μ •
Item 포컀슀 κ°€λŠ₯ν•œ 곡간적 λ‹¨μœ„. Virtual Focus + Roving TabIndex
Field νŽΈμ§‘ κ°€λŠ₯ν•œ ν…μŠ€νŠΈ μ˜μ—­. IME μ•ˆμ „ + μ»€λ§¨λ“œ 기반 컀밋/μ·¨μ†Œ
Trigger 클릭/ν‚€λ³΄λ“œλ₯Ό μ»€λ§¨λ“œλ‘œ λ³€ν™˜. asChild νŒ¨ν„΄

μ»€λ§¨λ“œ μ‹œμŠ€ν…œ (13개 도메인)

OS_NAVIGATE (곡간 이동) Β· OS_TAB (μ„ ν˜• 탐색) Β· OS_SELECT (단일/닀쀑/λ²”μœ„ 선택) Β· OS_ACTIVATE Β· OS_CHECK Β· OS_DELETE Β· OS_FIELD_START_EDIT Β· OS_FIELD_COMMIT Β· OS_COPY Β· OS_CUT Β· OS_PASTE Β· OS_ESCAPE Β· OS_EXPAND Β· OS_FOCUS Β· OS_STACK_PUSH/POP

7μΆ• 포컀슀 λͺ¨λΈ

Direction (곡간 이동) Β· Edge (경계 처리) Β· Tab (μ„ ν˜• 탐색) Β· Target (직접 νƒ€κ²ŸνŒ…) Β· Entry (Zone κ°„ μ§„μž…μ ) Β· Restore (포컀슀 λ©”λͺ¨λ¦¬) Β· Recovery (μ‚­μ œ μ‹œ μžλ™ 볡ꡬ)

데이터 μ•„ν‚€ν…μ²˜

// μ•± μ •μ˜
const TodoApp = defineApp<TodoState>("todo", INITIAL, { history: true });
const listZone = TodoApp.createZone("list");
const { Zone, Item, Field } = listZone.bind({ role: "listbox", onCheck: toggleTodo });

// 데이터: NormalizedCollection { entities, order }
// CRUD: fromEntities (flat) / fromNormalized (tree)
// Views: toFlatList Β· toVisibleTree Β· toGrouped

What β€” ν˜„μž¬ λ™μž‘ν•˜λŠ” 것

μ•±

μ•± μ„€λͺ…
Reference Todo SaaS μŠ€νƒ€μΌ 벀치마크. Kanban 2D Nav, λ©€ν‹°μ…€λ ‰μ…˜, Undo/Redo, Clipboard, BDD ν…ŒμŠ€νŠΈ
Web Builder Visual CMS λΉŒλ”. Bento Grid, Block Preset, Seamless Section Navigation
Docs Viewer λ‚΄μž₯ λ¬Έμ„œ λ·°μ–΄. Tree sidebar, λ§ˆν¬λ‹€μš΄ λ Œλ”λ§

ν…ŒμŠ€νŠΈ 인프라

// Headless β€” DOM 없이 μ»€λ§¨λ“œ νŒŒμ΄ν”„λΌμΈ 검증
const page = createOsPage();
page.goto("list", { items: ["a", "b", "c"], role: "listbox" });
page.keyboard.press("ArrowDown");
expect(page.focusedItemId()).toBe("b");

// App-level β€” 격리된 컀널 λ‹¨μœ„ ν…ŒμŠ€νŠΈ
const app = TodoApp.create();
app.dispatch(toggleTodo({ id: "task-1" }));
expect(app.state.todos["task-1"].completed).toBe(true);

Vitest (unit + integration) Β· Vitest Browser (component rendering) Β· Playwright (E2E + APG contract)

κ΄€μ°° κ°€λŠ₯μ„±

  • Command Inspector (Cmd+D) β€” μ‹€μ‹œκ°„ 이벀트 νŠΈλ ˆμ΄μ‹±, μƒνƒœ 검사
  • Spatial Laboratory β€” /focus-showcase, /aria-showcaseμ—μ„œ 7μΆ• 탐색 λ²€μΉ˜λ§ˆν‚Ή
  • APG Contract Tests β€” W3C WAI-ARIA Authoring Practices μ€€μˆ˜ 검증

기술 μŠ€νƒ

React 19 Β· TypeScript 5.9 Β· Vite 7 Β· Custom Kernel (μˆœμˆ˜ν•¨μˆ˜ + Transaction Log) Β· Tailwind CSS v4 Β· TanStack Router Β· Vitest + Playwright Β· Lucide React Β· Biome


μ‹œμž‘ν•˜κΈ°

git clone https://github.com/developer-1px/interactive-os.git
npm install
npm run dev           # μ•± + λ¬Έμ„œ λ™μ‹œ μ‹€ν–‰
npm test              # unit + integration (headless)
npm run test:browser  # browser component tests
npm run test:e2e      # playwright e2e
npm run typecheck     # νƒ€μž… 체크

ν”„λ‘œμ νŠΈ ꡬ쑰

src/
β”œβ”€β”€ os/                    # OS 컀널 + νŒŒμ΄ν”„λΌμΈ
β”‚   β”œβ”€β”€ 1-listeners/       # ν‚€λ³΄λ“œ/마우슀/ν΄λ¦½λ³΄λ“œ 이벀트 λ¦¬μŠ€λ„ˆ
β”‚   β”œβ”€β”€ 2-contexts/        # DI μ»¨ν…μŠ€νŠΈ (ZoneRegistry λ“±)
β”‚   β”œβ”€β”€ 3-commands/        # 13개 μ»€λ§¨λ“œ 도메인
β”‚   β”œβ”€β”€ 4-effects/         # Side effects
β”‚   β”œβ”€β”€ 5-hooks/           # React hooks
β”‚   β”œβ”€β”€ 6-components/      # ZIFT ν”„λ¦¬λ―Έν‹°λΈŒ + Dialog/Toast/QuickPick
β”‚   β”œβ”€β”€ collection/        # NormalizedCollection + collectionView + CRUD
β”‚   β”œβ”€β”€ defineApp.ts       # μ•± μ •μ˜ API
β”‚   └── headless.ts        # Headless ν…ŒμŠ€νŠΈ 인프라
β”œβ”€β”€ apps/
β”‚   β”œβ”€β”€ todo/              # Reference Todo μ•±
β”‚   └── builder/           # Web Builder μ•±
β”œβ”€β”€ pages/                 # νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈ + Showcase
└── docs-viewer/           # λ‚΄μž₯ λ¬Έμ„œ λ·°μ–΄

docs/                      # PARA 방법둠 기반 λ¬Έμ„œ
β”œβ”€β”€ 0-inbox/               # μƒˆλ‘œμš΄ μ œμ•ˆ 및 μž‘μ—… μ΄ˆμ•ˆ
β”œβ”€β”€ 1-project/             # ν™œμ„± ν”„λ‘œμ νŠΈ
β”œβ”€β”€ 3-resource/            # 연ꡬ 및 벀치마크
└── archive/               # μ™„λ£Œλœ ν”„λ‘œμ νŠΈ μ•„μΉ΄μ΄λΈŒ

About

interactive-os for saas app

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages