Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ JS 写声明式组件、Compose Multiplatform 渲染的 UI 框架,引擎为 Qu
```
docs/ 设计文档、ADR、roadmap
packages/ npm 包:tinyui-core · tinyui-native · tinyui-cli
compose/ KMP 库 wang.harlon:tinyui(Compose Multiplatform 侧)
compose/ KMP 库 app.tinyui:tinyui(Compose Multiplatform 侧)
schema/ 内置组件 schema(TS DSL),两侧契约的唯一真值,`pnpm schema` 生成
sample/ 示例 App(sample/js 是页面源码,Gradle 构建时经 CLI 编成字节码打进资源)
bench/ 响应式模型与引擎 benchmark
Expand All @@ -24,10 +24,10 @@ build-logic/ Gradle convention plugins

## 安装

- Kotlin:`implementation("wang.harlon:tinyui:<version>")`(Maven Central;自带 `wang.harlon:quickjs-kmp`)
- Kotlin:`implementation("app.tinyui:tinyui:<version>")`(Maven Central;自带 `wang.harlon:quickjs-kmp`)
- JS:`pnpm add tinyui-core tinyui-native` 与 `pnpm add -D tinyui-cli`,三包同版本号;`tinyui build` 另需 quickjs-kmp 的宿主工具 `qjsc-kmp`(见下)

版本号与 git tag 一致(`0.1.0`),Maven 与 npm 三包同号同 tag 发:推 tag 触发 `publish.yml`,Maven 走 Sonatype,npm 走 trusted publishing(OIDC,无 token)。
版本号与 git tag 一致,不带 `v` 前缀,Maven 与 npm 三包同号同 tag 发:推 tag 触发 `publish.yml`,Maven 走 Sonatype,npm 走 trusted publishing(OIDC,无 token)。

## 构建

Expand Down
1,026 changes: 513 additions & 513 deletions compose/api/compose.klib.api

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion compose/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ plugins {

kotlin {
android {
namespace = "wang.harlon.tinyui"
namespace = "app.tinyui"
}

sourceSets {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui
package app.tinyui

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
Expand All @@ -8,8 +8,8 @@ import kotlinx.coroutines.withTimeout
import wang.harlon.quickjs.JsEngine
import wang.harlon.quickjs.JsEngineConfig
import wang.harlon.quickjs.JsValue
import wang.harlon.tinyui.components.registerBuiltins
import wang.harlon.tinyui.schema.ComponentRegistry
import app.tinyui.components.registerBuiltins
import app.tinyui.schema.ComponentRegistry
import java.io.File
import kotlin.test.Test
import kotlin.test.assertEquals
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui
package app.tinyui

import android.os.Build

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui.schema
package app.tinyui.schema

import android.content.pm.ApplicationInfo
import androidx.compose.foundation.border
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui
package app.tinyui

import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonArray
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui
package app.tinyui

import kotlin.concurrent.atomics.AtomicReference
import kotlin.concurrent.atomics.ExperimentalAtomicApi
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui
package app.tinyui

/** One line of a JS stack. With a source map the location is the `.tsx` one and [mapped] is true; otherwise it is what the engine printed. */
class StackFrame(val function: String, val file: String, val line: Int, val column: Int?, val mapped: Boolean) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui
package app.tinyui

import androidx.compose.foundation.background
import androidx.compose.foundation.border
Expand Down Expand Up @@ -52,13 +52,13 @@ import wang.harlon.quickjs.JsRef
import wang.harlon.quickjs.JsRuntime
import wang.harlon.quickjs.JsValue
import wang.harlon.quickjs.ObjectTransport
import wang.harlon.tinyui.node.NodeTree
import wang.harlon.tinyui.node.UINode
import app.tinyui.node.NodeTree
import app.tinyui.node.UINode
import androidx.compose.ui.graphics.RectangleShape
import wang.harlon.tinyui.schema.ComponentRegistry
import wang.harlon.tinyui.schema.LocalChildModifier
import wang.harlon.tinyui.schema.NodeScope
import wang.harlon.tinyui.schema.SizeValue
import app.tinyui.schema.ComponentRegistry
import app.tinyui.schema.LocalChildModifier
import app.tinyui.schema.NodeScope
import app.tinyui.schema.SizeValue

/** Bytecode of the runtime modules every page imports, as `tinyui build` writes them under `runtime/`. */
class RuntimeBundle(val core: ByteArray, val native: ByteArray)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui
package app.tinyui

import kotlinx.serialization.json.Json
import kotlinx.serialization.json.jsonArray
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui
package app.tinyui

import wang.harlon.quickjs.QuickJs

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui
package app.tinyui

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
Expand All @@ -14,7 +14,7 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.unit.dp
import wang.harlon.tinyui.schema.ComponentRegistry
import app.tinyui.schema.ComponentRegistry

/**
* Renders one TinyUI page; the host owns navigation and passes the page's bytecode (docs/app-model.md).
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui.components
package app.tinyui.components

import androidx.compose.foundation.horizontalScroll
import androidx.compose.foundation.layout.Arrangement
Expand Down Expand Up @@ -49,12 +49,12 @@ import androidx.compose.ui.unit.dp
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.put
import wang.harlon.tinyui.components.generated.BuiltinSchemas
import wang.harlon.tinyui.node.UINode
import wang.harlon.tinyui.schema.Commands
import wang.harlon.tinyui.schema.ComponentRegistry
import wang.harlon.tinyui.schema.NodeScope
import wang.harlon.tinyui.schema.Theme
import app.tinyui.components.generated.BuiltinSchemas
import app.tinyui.node.UINode
import app.tinyui.schema.Commands
import app.tinyui.schema.ComponentRegistry
import app.tinyui.schema.NodeScope
import app.tinyui.schema.Theme

/** First batch of built-ins (docs/components.md §3); schemas come from schema/ via `tinyui schema`. */
fun ComponentRegistry.registerBuiltins(): ComponentRegistry = apply {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// Generated by `tinyui schema` from schema/; do not edit.
package wang.harlon.tinyui.components.generated
package app.tinyui.components.generated

import wang.harlon.tinyui.schema.ComponentSchema
import wang.harlon.tinyui.schema.FieldSpec
import wang.harlon.tinyui.schema.PropSpec
import app.tinyui.schema.ComponentSchema
import app.tinyui.schema.FieldSpec
import app.tinyui.schema.PropSpec

object BuiltinSchemas {
val Column = ComponentSchema(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui.node
package app.tinyui.node

import androidx.compose.runtime.snapshots.Snapshot
import kotlinx.serialization.json.Json
Expand All @@ -12,7 +12,7 @@ import kotlinx.serialization.json.doubleOrNull
import kotlinx.serialization.json.intOrNull
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonPrimitive
import wang.harlon.tinyui.schema.ComponentRegistry
import app.tinyui.schema.ComponentRegistry

const val ROOT_ID = 0

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui.node
package app.tinyui.node

import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateMapOf
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui.schema
package app.tinyui.schema

import androidx.compose.foundation.layout.Box
import androidx.compose.runtime.Composable
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui.schema
package app.tinyui.schema

import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package wang.harlon.tinyui.schema
package app.tinyui.schema

import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.compositionLocalOf
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import wang.harlon.tinyui.node.Command
import wang.harlon.tinyui.node.UINode
import app.tinyui.node.Command
import app.tinyui.node.UINode

/** What a component sees of its node: typed props, registered events, children (docs/adr-003 §3.3). */
interface NodeScope {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui.schema
package app.tinyui.schema

import androidx.compose.material3.ColorScheme
import androidx.compose.material3.MaterialTheme
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui
package app.tinyui

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.TimeoutCancellationException
Expand All @@ -7,8 +7,8 @@ import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.withContext
import kotlinx.coroutines.withTimeout
import wang.harlon.quickjs.JsBytecode
import wang.harlon.tinyui.components.registerBuiltins
import wang.harlon.tinyui.schema.ComponentRegistry
import app.tinyui.components.registerBuiltins
import app.tinyui.schema.ComponentRegistry
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui
package app.tinyui

import kotlin.test.Test
import kotlin.test.assertTrue
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package wang.harlon.tinyui.node
package app.tinyui.node

import androidx.compose.ui.graphics.Color
import wang.harlon.tinyui.schema.ColorValue
import app.tinyui.schema.ColorValue
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import wang.harlon.tinyui.components.registerBuiltins
import wang.harlon.tinyui.schema.ComponentRegistry
import app.tinyui.components.registerBuiltins
import app.tinyui.schema.ComponentRegistry
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNull
Expand Down Expand Up @@ -103,8 +103,8 @@ class NodeTreeTest {
fun layoutPropsApplyToEveryLayoutComponent() {
tree.apply("""[["c",1,"Spacer"],["p",1,"width","fill"],["p",1,"height",12],["p",1,"padding",4],["i",0,1,0]]""")
val node = tree.node(1)!!
assertEquals(wang.harlon.tinyui.schema.SizeValue.Fill, node.props["width"])
assertEquals(wang.harlon.tinyui.schema.SizeValue.Fixed(12.dp), node.props["height"])
assertEquals(app.tinyui.schema.SizeValue.Fill, node.props["width"])
assertEquals(app.tinyui.schema.SizeValue.Fixed(12.dp), node.props["height"])
assertEquals(4.dp, node.props["padding"])
assertTrue(problems.isEmpty(), problems.toString())
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package wang.harlon.tinyui.schema
package app.tinyui.schema

import androidx.compose.material3.Typography
import androidx.compose.material3.lightColorScheme
import androidx.compose.ui.graphics.Color
import kotlinx.serialization.json.JsonPrimitive
import wang.harlon.tinyui.components.generated.BuiltinSchemas
import app.tinyui.components.generated.BuiltinSchemas
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNotNull
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui
package app.tinyui

import platform.UIKit.UIDevice

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package wang.harlon.tinyui.schema
package app.tinyui.schema

import androidx.compose.foundation.border
import androidx.compose.foundation.layout.padding
Expand Down
5 changes: 3 additions & 2 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,9 @@ JS 桥 Kotlin
| 拼写 | 用在哪 | 理由 |
|---|---|---|
| **TinyUI** | 品牌与行文:文档标题、README 首行、日志前缀、对外提及 | 大小写体现 Tiny + UI 两个词 |
| **tinyui** | 所有机器标识符:GitHub 仓 `tiny-ui/tinyui`、Maven `wang.harlon:tinyui`、Kotlin 包 `wang.harlon.tinyui`、CLI 命令、环境变量前缀 `TINYUI_`、目录名 | 无连字符是唯一在每种标识符里都合法的形态;避开 npm 上他人的 `tiny-ui` React 库 |
| **tinyui** | 所有机器标识符:GitHub 仓 `tiny-ui/tinyui`、Maven `app.tinyui:tinyui`、Kotlin 包 `app.tinyui`、CLI 命令、环境变量前缀 `TINYUI_`、目录名 | 无连字符是唯一在每种标识符里都合法的形态;避开 npm 上他人的 `tiny-ui` React 库 |
| **tiny-ui** | 仅 GitHub 组织名 `github.com/tiny-ui` | 2021 年同名项目建的组织沿用(2026-09-20 仓库转入),组织名不再改;仓名仍是 `tinyui` |
| **app.tinyui** | Maven group 与 Kotlin 根包(2026-09-20 起,此前 `wang.harlon`) | 反转域名 tinyui.app,Central 命名空间按域名验证;先例 `app.cash.*` |
| **tinyui-core / tinyui-native / tinyui-cli** | 仅 npm 包名(也是引擎里的运行时模块名) | 无 scope;`tinyui-` 前缀粘连、功能词用连字符接 |

npm 裸包 `tinyui` 不可用:npm 防仿冒规则判定其与已有的 `tiny-ui` 过于相似(2026-09-15 实测 E403);scope `@tiny-ui` 是他人 2017 年起的用户 scope(`@tiny-ui/components`),`@tinyui` 是他人的空 org,2026-09-18 定为无 scope 的 `tinyui-*`。`tiny-ui` 本身是活跃维护的 React 组件库(2026-03 发 1.0,GitHub 233 star),转让与争议均无望,裸名不再追。同日在 npm 建了免费 org **tinyui-app**(与域名对齐,仅占位防蹭,暂不发包;账号 whlong 为 owner)。域名 **tinyui.app** 已于 2026-09-15 在 Cloudflare Registrar(个人账号)注册,自动续费 $14.20/年,DNS 在 Cloudflare。
Expand All @@ -72,7 +73,7 @@ tinyui/
│ ├── core/ tinyui-core JS 运行时(signal / effect / owner / h / For / Show / ref + cmd)+ 内置组件的 TS 类型(由 schema/ 生成,无运行时代码);作为 ES 模块字节码内置
│ ├── native/ tinyui-native 业务调用的宿主能力 API(http / storage / toast / navigation / i18n …,即 ADR-002 的 J2 / J3)
│ └── cli/ tinyui-cli 构建工具:TSX → h()(ES2025)→ 每页一个 ESM 模块字节码,`tinyui build`
├── compose/ wang.harlon:tinyui KMP 库(Compose Multiplatform 侧):节点表、注册表、桥、内置组件;依赖 quickjs-kmp
├── compose/ app.tinyui:tinyui KMP 库(Compose Multiplatform 侧):节点表、注册表、桥、内置组件;依赖 quickjs-kmp
├── schema/ 内置组件 schema 的唯一真值(TS DSL)→ `pnpm schema` 生成 packages/core 的类型与 compose/ 的注册 schema
├── sample/ 示例 App,M1 Counter / M2 列表页在这里跑
│ ├── js/ 页面源码(pnpm workspace 成员),shared 的 Gradle 任务调 CLI 编成字节码打进 Compose 资源
Expand Down
2 changes: 1 addition & 1 deletion docs/adr-006-hot-updates.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ ADR-005 把热下发划出当期,条件是"内核稳定后另立 ADR"。Trendi

### 2.4 库的边界

库做校验、落盘、选择、回退;不做网络(收宿主的 `fetch(path)`)、不做调度(宿主决定何时 `check()`)、不做 UI(没有"有更新"弹窗)。放独立 artifact `wang.harlon:tinyui-updates`:core 库保持零 I/O、零文件依赖;不需要热下发的宿主直接不依赖它。
库做校验、落盘、选择、回退;不做网络(收宿主的 `fetch(path)`)、不做调度(宿主决定何时 `check()`)、不做 UI(没有"有更新"弹窗)。放独立 artifact `app.tinyui:tinyui-updates`:core 库保持零 I/O、零文件依赖;不需要热下发的宿主直接不依赖它。

### 2.5 服务端形态

Expand Down
2 changes: 1 addition & 1 deletion docs/updates-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ M1 之后 M2 → M3 与 M4 并行;M6 要等 M3 与 M5。

## M3 · `updates/` 模块

仓:tinyui,新 Gradle 模块,artifact `wang.harlon:tinyui-updates`。约 600 行 / 15 文件,PR。
仓:tinyui,新 Gradle 模块,artifact `app.tinyui:tinyui-updates`。约 600 行 / 15 文件,PR。

| 交付 | 要点 |
|---|---|
Expand Down
2 changes: 1 addition & 1 deletion docs/updates.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

- 状态:已定(2026-09-18;2026-09-19 加发布协议、签名、服务端形态;2026-09-19 改为多包模型——App 由 N≥1 个包组成,包名进模块名与 URL,公钥进 manifest,`Updates` 以一组包为单位);实现依据,实现待开
- 来源:[ADR-006](./adr-006-hot-updates.md);[build-chain.md](./build-chain.md) §2(manifest、模块名、`tinyui.config.json`)、§7(buildId 与 source map)
- 四侧:CLI 产出与发布包(`tinyui build` / `bundle` / `publish`);服务端实现投递与发布两组端点(参考实现 `tinyui-updates-server`,托管实例 `updates.tinyui.app`);Kotlin 的 `Bundle`(core 库)与 `Updates`(`wang.harlon:tinyui-updates`)
- 四侧:CLI 产出与发布包(`tinyui build` / `bundle` / `publish`);服务端实现投递与发布两组端点(参考实现 `tinyui-updates-server`,托管实例 `updates.tinyui.app`);Kotlin 的 `Bundle`(core 库)与 `Updates`(`app.tinyui:tinyui-updates`)
- 协议规范只在本文一处;服务端仓的一致性测试以本文为准,不复制。**发布后字段与端点只增不改,未知字段透传**——这是两个仓能各自演进的前提

## 0. 模型
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ kotlin.mpp.enableCInteropCommonization=true
android.useAndroidX=true

# Publishing (vanniktech maven-publish)。正式版本号由 publish.yml 从 tag 注入,本地占位;不发快照。
GROUP=wang.harlon
GROUP=app.tinyui
VERSION_NAME=0.0.0-local
2 changes: 1 addition & 1 deletion gradle/composite-substitutions
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# 消费方 composite build 的契约:发布坐标 → 本仓项目路径(改模块名或路径要同步改这里)。
# artifactId 与 Gradle 项目名对不上时 Gradle 的自动替换会静默退回 Maven 版本,故必须显式声明。
wang.harlon:tinyui = :compose
app.tinyui:tinyui = :compose
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
"build": "pnpm -r build",
"test": "pnpm -r test",
"typecheck": "pnpm -r typecheck",
"schema": "node packages/cli/dist/bin.js schema --entry schema/index.ts --ts packages/core/src/generated/components.ts --kt compose/src/commonMain/kotlin/wang/harlon/tinyui/components/generated/BuiltinSchemas.kt --package wang.harlon.tinyui.components.generated --node-import ../node.ts",
"schema:check": "node packages/cli/dist/bin.js schema --entry schema/index.ts --ts packages/core/src/generated/components.ts --kt compose/src/commonMain/kotlin/wang/harlon/tinyui/components/generated/BuiltinSchemas.kt --package wang.harlon.tinyui.components.generated --node-import ../node.ts --check"
"schema": "node packages/cli/dist/bin.js schema --entry schema/index.ts --ts packages/core/src/generated/components.ts --kt compose/src/commonMain/kotlin/app/tinyui/components/generated/BuiltinSchemas.kt --package app.tinyui.components.generated --node-import ../node.ts",
"schema:check": "node packages/cli/dist/bin.js schema --entry schema/index.ts --ts packages/core/src/generated/components.ts --kt compose/src/commonMain/kotlin/app/tinyui/components/generated/BuiltinSchemas.kt --package app.tinyui.components.generated --node-import ../node.ts --check"
},
"devDependencies": {
"typescript": "7.0.2"
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/src/schema/generate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ export function generateTs(components: ComponentDef[], nodeImport = "tinyui-core
}

export function generateKt(components: ComponentDef[], pkg: string, objectName: string): string {
const out: string[] = [HEADER, `package ${pkg}`, "", "import wang.harlon.tinyui.schema.ComponentSchema", "import wang.harlon.tinyui.schema.FieldSpec", "import wang.harlon.tinyui.schema.PropSpec", "", `object ${objectName} {`];
const out: string[] = [HEADER, `package ${pkg}`, "", "import app.tinyui.schema.ComponentSchema", "import app.tinyui.schema.FieldSpec", "import app.tinyui.schema.PropSpec", "", `object ${objectName} {`];
for (const c of components) {
out.push(` val ${ktIdent(c.name)} = ComponentSchema(`);
out.push(` type = ${JSON.stringify(c.name)},`);
Expand Down
2 changes: 1 addition & 1 deletion packages/core/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# tinyui-core

[TinyUI](https://github.com/tiny-ui/tinyui) 的 JS 运行时:signal / memo / effect / resource / observable、`h` / `For` / `Show`、内置组件的 TSX 类型。页面里 `import { signal, Column, Text } from "tinyui-core"`,经 `tinyui-cli` 编成 QuickJS 模块字节码后由 Compose Multiplatform 侧(Maven `wang.harlon:tinyui`)渲染。
[TinyUI](https://github.com/tiny-ui/tinyui) 的 JS 运行时:signal / memo / effect / resource / observable、`h` / `For` / `Show`、内置组件的 TSX 类型。页面里 `import { signal, Column, Text } from "tinyui-core"`,经 `tinyui-cli` 编成 QuickJS 模块字节码后由 Compose Multiplatform 侧(Maven `app.tinyui:tinyui`)渲染。

API 见仓库 `docs/runtime-api.md`;三包与 Maven 库同版本号。
Loading
Loading