Skip to content

Releases: Neojs-framework/Neo-app

feat: state와 actionsλ₯Ό Store ν•˜λ‚˜λ‘œ 톡합 (v3.0.0)

03 Apr 12:33
cf7b250

Choose a tag to compare

v3.0.0

ꡬ쑰 λ³€κ²½ (Refactor)

  • Store 톡합: state와 actionsλ₯Ό 단일 객체둜 ν†΅ν•©ν•˜μ—¬ μ•„ν‚€ν…μ²˜ λ‹¨μˆœν™”.

λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ κ°€μ΄λ“œ

  • v2 μ‚¬μš©μžλ“€μ€ κΈ°μ‘΄ state.js의 객체와 actions.js의 ν•¨μˆ˜λ“€μ„ ν•˜λ‚˜μ˜ Store 객체둜 합쳐야 ν•©λ‹ˆλ‹€.
  • Store 객체 λ‚΄λΆ€μ—μ„œ 데이터λ₯Ό μ°Έμ‘°ν•  λ•Œ Store.prop λŒ€μ‹  this.prop을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

feat: ::for 반볡 λ Œλ”λ§ 및 μ‹€μ‹œκ°„ 데이터 바인딩 κ΅¬ν˜„

21 Feb 10:41
5d48de4

Choose a tag to compare

πŸš€ Release Notes: Neo Framework v2.6.0

이번 v2.6.0 μ—…λ°μ΄νŠΈλŠ” Neo ν”„λ ˆμž„μ›Œν¬κ°€ λ‹¨μˆœν•œ 정적 λ Œλ”λŸ¬λ₯Ό λ„˜μ–΄, 'λ°˜μ‘ν˜• 데이터 바인딩' μ‹œμŠ€ν…œμ„ κ°–μΆ˜ μ§„μ •ν•œ ν”„λ ˆμž„μ›Œν¬λ‘œ μ§„ν™”ν•œ λ²„μ „μž…λ‹ˆλ‹€. "μ΅œμ†Œν•œμ˜ λ…Έλ ₯으둜 μ΅œλŒ€μ˜ κ²°κ³Ό"λΌλŠ” μ² ν•™ μ•„λž˜, λ³΅μž‘ν•œ 리슀트 μ²˜λ¦¬μ™€ μƒνƒœ 관리λ₯Ό λ‹¨μˆ¨μ— ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

🌟 μ£Όμš” μ—…λ°μ΄νŠΈ (New Features)

  • ::for 반볡문 κ΅¬ν˜„: Store에 μ €μž₯된 λ°°μ—΄ 데이터λ₯Ό μˆœνšŒν•˜λ©° λ™μ μœΌλ‘œ UIλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • μ§€λŠ₯ν˜• μŠ€μ½”ν”„(loopContext): 반볡문 λ‚΄λΆ€μ—μ„œ $todo, index λ“± ν˜„μž¬ 데이터에 μ¦‰μ‹œ μ ‘κ·Όν•  수 μžˆλŠ” 둜컬 μ»¨ν…μŠ€νŠΈλ₯Ό μ§€μ›ν•©λ‹ˆλ‹€.
  • μ‹€μ‹œκ°„ 데이터 동기화: UIμ—μ„œ λ°œμƒν•œ μ΄λ²€νŠΈκ°€ Store의 원본 데이터λ₯Ό 직접 μˆ˜μ •ν•˜κ³ , λ³€κ²½ 사항을 화면에 μ¦‰μ‹œ λ¦¬λ Œλ”λ§ν•©λ‹ˆλ‹€.

πŸ›  버그 μˆ˜μ • 및 κ°œμ„  (Bug Fixes)

  • 이벀트 this 바인딩: on:change λ“± 이벀트 λ°œμƒ μ‹œ thisκ°€ ν•΄λ‹Ή HTML μš”μ†Œλ₯Ό μ •ν™•νžˆ 가리킀지 λͺ»ν•˜λ˜ 문제λ₯Ό .call() λ©”μ„œλ“œλ₯Ό μ΄μš©ν•΄ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.
  • 둜컬 λ³€μˆ˜ 인식 였λ₯˜: renderTemplate이 μ „μ—­ window만 νƒμƒ‰ν•˜λ˜ 문제λ₯Ό μˆ˜μ •ν•˜μ—¬ loopContextλ₯Ό μ΅œμš°μ„ μœΌλ‘œ νƒμƒ‰ν•˜λ„λ‘ κ°œμ„ ν–ˆμŠ΅λ‹ˆλ‹€.
  • Boolean 속성 처리: checked, disabled λ“± λΆˆλ¦¬μ–Έ 값이 λ¬Έμžμ—΄("true")둜 λ°•νžˆλ˜ 문제λ₯Ό μ‹€μ œ λΆˆλ¦¬μ–Έ κ°’μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ μ μš©λ˜λ„λ‘ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ“ μ‚¬μš© 예제 (Usage)

@ListContainer:div {
  ::for(todo in Store.todoList) {
    @Task:div {
      @Checkbox:input {
        ::attrs { type: "checkbox", checked: "$todo.completed" }
        on:change: todo.completed = this.checked
      }
      @Title:span { innerHTML: "$todo.text" }
    }
  }
}

fix(NeoParser): ensure element order by implementing position-based sorting (v2.5.2)

18 Feb 11:15
7301671

Choose a tag to compare

πŸ› Bug Fixes

  • ::if 블둝 λ Œλ”λ§ μˆœμ„œ 였λ₯˜ μˆ˜μ •: κΈ°μ‘΄ λ²„μ „μ—μ„œ ::if 쑰건문 블둝이 일반 νƒœκ·Έ(@)보닀 무쑰건 λΆ€λͺ¨ μš”μ†Œμ˜ μ΅œμƒλ‹¨μ— λ¨Όμ € κ·Έλ €μ§€λ˜ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. 이제 μž‘μ„±ν•˜μ‹  μ½”λ“œ μˆœμ„œ κ·ΈλŒ€λ‘œ 화면에 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

πŸ›  Under the Hood (기술적 κ°œμ„ )

  • μœ„μΉ˜ 기반 μ •λ ¬ (Position-based Sorting) λ„μž…: νŒŒμ„œκ°€ νƒœκ·Έλ‚˜ 메타 블둝(::if, ::attrs)을 μŠ€μΊ”ν•  λ•Œ 원본 λ¬Έμžμ—΄μ˜ μœ„μΉ˜ 인덱슀(_pos)λ₯Ό 'λ²ˆν˜Έν‘œ'처럼 λΆ€μ—¬ν•©λ‹ˆλ‹€.
  • 인덱슀 λ°€λ¦Ό(Index-shifting) λ°©μ§€: νŒŒμ‹±μ΄ μ™„λ£Œλœ 블둝을 λ¬Έμžμ—΄μ—μ„œ λ‹¨μˆœνžˆ μž˜λΌλ‚΄λŠ”(slice) λŒ€μ‹ , κ·Έ 길이만큼 곡백(" ".repeat())으둜 λ³΄μ‘΄ν•˜μ—¬ λ’€λ”°λΌμ˜€λŠ” νƒœκ·Έλ“€μ˜ νŒŒμ‹± μœ„μΉ˜κ°€ 꼬이지 μ•Šλ„λ‘ μ΅œμ ν™”ν–ˆμŠ΅λ‹ˆλ‹€.
  • 결과적으둜 κ°€μž₯ 적은 μ½”λ“œ λ³€κ²½μœΌλ‘œ κ°€μž₯ μ•ˆμ •μ μΈ νŒŒμ‹± μˆœμ„œλ₯Ό 보μž₯ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

πŸ’» Quick Example

이제 μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄, Message 블둝이 Input 블둝 μœ„λ‘œ νŠ€μ–΄ 였λ₯΄μ§€ μ•Šκ³  μ •ν™•νžˆ Input μ•„λž˜μ— λ Œλ”λ§λ©λ‹ˆλ‹€.

@App:div [p-4] {
  @Input:input [border, p-2] {
    ::attrs: { placeholder: "μž…λ ₯μ°½" }
  }

  ::if($Store.state) {
    @Message:div [text-blue-500, mt-2] {
      innerHTML: "Update! πŸš€"
    }
  }
}

feat: add ::if conditional rendering support

17 Feb 13:34
9a5abc3

Choose a tag to compare

πŸŽ‰ What's New (μƒˆλ‘œμš΄ κΈ°λŠ₯)

  • ::if 쑰건문 λ Œλ”λ§ 지원: 이제 μƒνƒœκ°’μ— 따라 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ™μ μœΌλ‘œ 껐닀 μΌ€ 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ’» Quick Example (μ‚¬μš© μ˜ˆμ‹œ)

이제 μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ μ•„λž˜μ™€ 같이 μ§κ΄€μ μœΌλ‘œ 쑰건을 μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@App:div [p-4] {
  ::if($Store.loggedIn) {
    @WelcomeText:h1 {
      innerHTML: "ν™˜μ˜ν•©λ‹ˆλ‹€, μœ μ €λ‹˜!"
    }
  }
}

feat: enable $ binding inside ::attrs with proper render order

31 Jan 12:54
7fb0b33

Choose a tag to compare

μΆ”κ°€λœ κΈ°λŠ₯

  1. ::attrsκΈ°λŠ₯에 $바인딩 μΆ”κ°€
@input:input [hello] {
  ::attrs: {
    type: "text",
    placeholder: $Store.count
  }
}

μ˜ˆμ •λœ κΈ°λŠ₯

  • 쑰건 λ Œλ”λ§ ::if
::if ($Store.loggedIn) {
  @Profile:div { ... }
}

feat: fix attrs scope by parsing children before meta blocks

30 Jan 13:13
1950141

Choose a tag to compare

μΆ”κ°€λœ κΈ°λŠ₯

  • attrs블둝
    • attrs {....}λ₯Ό 톡해 html고유 속성을 μ§€μ •ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ • κΈ°λŠ₯

  • 속성 바인딩

    ::attrs {
      value: $Store.text
    }
    
  • 쑰건 λ Œλ”λ§

     ::if ($Store.loggedIn) {
      @Profile:div { ... }
    }
    
  • 반볡 λ Œλ”λ§

    ::for (item in Store.list) {
      @Item:li {
        innerHTML: $item.name
      }
    }
    

feat: add nested children parsing and rendering support

28 Jan 12:18
eabfa74

Choose a tag to compare

μΆ”κ°€λœ κΈ°λŠ₯

  • μžμ‹ νŒŒμ‹±
    • 단일 νƒœκ·Έλ§Œ ν—ˆμš©λ˜μ—ˆμ§€λ§Œ μžμ‹νƒœκ·Έ 지원
  • μžλ™ μž¬λžœλ”
    • λ°”μΈλ”©λœ λ³€μˆ˜ 값이 λ°”λ€”λ•Œλ§ˆλ‹€ 전채가 μžλ™ μž¬λžœλ”

What's next?

  • attrs{....}둜 고유 html속성 관리

Neo v2.1.0 – Runtime-first UI DSL

25 Jan 08:26
96d0812

Choose a tag to compare

Pre-release

πŸš€ Neo Framework v2.1.0 Release Notes

Release Date: 2026-01
Version: v2.1.0
Package: @junnyontop-pixel/neo-app


✨ Overview

Neo v2.1.0은 runtime-first UI DSL을 λͺ©ν‘œλ‘œ ν•œ μ•ˆμ •ν™” λ¦΄λ¦¬μ¦ˆμž…λ‹ˆλ‹€.
이 버전뢀터 NeoλŠ” JavaScript λ‘œμ§μ„ 직접 닀루지 μ•ŠμœΌλ©°,
UI μ„ μ–Έμ—λ§Œ μ§‘μ€‘ν•˜λŠ” μ΄ˆκ²½λŸ‰ ν”„λ ˆμž„μ›Œν¬λ‘œ μž¬μ •μ˜λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

v1의 λ³΅μž‘ν•œ ꡬ쑰와 μœ μ§€λ³΄μˆ˜ ν•œκ³„λ₯Ό μ™„μ „νžˆ μ œκ±°ν•˜κ³ ,
λ‹¨μˆœν•˜κ³  예츑 κ°€λŠ₯ν•œ λ Œλ”λ§ λͺ¨λΈμ„ μ±„νƒν–ˆμŠ΅λ‹ˆλ‹€.


πŸ”₯ Major Changes

1️⃣ Runtime-first Architecture

  • λΉŒλ“œ / 컴파일 단계 제거
  • .neo νŒŒμΌμ„ λΈŒλΌμš°μ €μ—μ„œ 직접 λ‘œλ“œ β†’ νŒŒμ‹± β†’ λ Œλ”λ§
  • Vite, Webpack λ“± λΉŒλ“œ 도ꡬ에 λΉ„μ˜μ‘΄μ 

2️⃣ UI / Logic μ™„μ „ 뢄리

  • UI: .neo
  • μƒνƒœ & 둜직: 순수 JavaScript (state.js, actions.js)
  • NeoλŠ” JavaScriptλ₯Ό ν•΄μ„ν•˜κ±°λ‚˜ λ³€ν˜•ν•˜μ§€ μ•ŠμŒ

3️⃣ Global Store Pattern 지원

  • window.Store 기반 μ „μ—­ μƒνƒœ μ ‘κ·Ό

  • ν…œν”Œλ¦Ώ 바인딩 지원:

    innerHTML: "ν˜„μž¬ 숫자: $Store.count"
    
  • μ΄λ²€νŠΈμ—μ„œ Store λ©”μ„œλ“œ 직접 호좜 κ°€λŠ₯:

    on:click: Store.add()
    

4️⃣ λ‹¨μˆœν•˜κ³  λͺ…ν™•ν•œ Render Model

  • μžλ™ λ°˜μ‘ν˜• ❌
  • λͺ…μ‹œμ  전체 μž¬λ Œλ” β­•
  • μƒνƒœ λ³€κ²½ μ‹œ __neoRender() 호좜 방식
Store.count++;
// μžλ™μœΌλ‘œ main.jsμ—μ„œ 호좜

🧠 Design Philosophy

  • NeoλŠ” JavaScript ν”„λ ˆμž„μ›Œν¬κ°€ μ•„λ‹™λ‹ˆλ‹€.
  • NeoλŠ” μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • NeoλŠ” UI μ„ μ–Έλ§Œ λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

JavaScriptλŠ” JavaScriptλ‹΅κ²Œ,
UIλŠ” Neo둜 μ„ μ–Έν•˜μ„Έμš”.


⚠️ Breaking Changes

  • #Script 문법 제거
  • 컴파일러(neoc) μ‚¬μš© 방식 λ³€κ²½
  • Neo λ‚΄λΆ€ JavaScript μ»¨ν…μŠ€νŠΈ/μƒνƒœ 관리 제거
  • v1 ν”„λ‘œμ νŠΈμ™€ ν˜Έν™˜λ˜μ§€ μ•ŠμŒ

πŸ— Recommended Project Structure

project-root/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ App.neo
β”‚   β”œβ”€β”€ state.js
β”‚   └── actions.js
β”œβ”€β”€ index.html
└── vite.config.js (optional)

πŸ“Œ Notes

  • Neo v2.1.0은 μ‹€ν—˜μ  λ¦΄λ¦¬μ¦ˆμž…λ‹ˆλ‹€.
  • λŒ€κ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ³΄λ‹€λŠ” μ†Œκ·œλͺ¨ / μ‹€ν—˜μ  UI ν”„λ‘œμ νŠΈμ— μ ν•©ν•©λ‹ˆλ‹€.
  • ν–₯ν›„ λ²„μ „μ—μ„œ 쀑첩 UI, λΆ€λΆ„ λ Œλ”λ§ 등이 검토될 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“„ License

MIT License