diff --git a/.github/workflows/deploy_maven_central.yml b/.github/workflows/deploy_maven_central.yml index d72658b..be81136 100644 --- a/.github/workflows/deploy_maven_central.yml +++ b/.github/workflows/deploy_maven_central.yml @@ -35,27 +35,28 @@ jobs: gpg_private_key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} passphrase: ${{ secrets.MAVEN_GPG_PASSPHRASE }} - name: Set up Java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - name: Make gradlew executable run: chmod +x ./gradlew - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 - name: Display version info run: | echo "Branch name from GITHUB_REF_NAME: $GITHUB_REF_NAME" echo "Branch name from GITHUB_HEAD_REF: $GITHUB_HEAD_REF" ./gradlew -q printVersion - - name: Publish package + - name: Setup Gradle uses: gradle/gradle-build-action@v2 with: - arguments: | - -PmavenCentralUsername=${{ secrets.MAVEN_USERNAME }} - -PmavenCentralPassword=${{ secrets.MAVEN_PASSWORD }} - -PsigningInMemoryKeyId=${{ secrets.MAVEN_GPG_KEY_ID }} - -PsigningInMemoryPassword=${{ secrets.MAVEN_GPG_PASSPHRASE }} + cache-read-only: false + - name: Publish package + run: | + ./gradlew \ + -PmavenCentralUsername=${{ secrets.MAVEN_USERNAME }} \ + -PmavenCentralPassword=${{ secrets.MAVEN_PASSWORD }} \ + -PsigningInMemoryKeyId=${{ secrets.MAVEN_GPG_KEY_ID }} \ + -PsigningInMemoryPassword=${{ secrets.MAVEN_GPG_PASSPHRASE }} \ allTests publishAndReleaseToMavenCentral env: MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 45af3b1..4777cd0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,16 +10,16 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up Java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - name: Make gradlew executable run: chmod +x ./gradlew - - name: Validate Gradle wrapper - uses: gradle/wrapper-validation-action@v1 - - name: run test + - name: Setup Gradle uses: gradle/gradle-build-action@v2 with: - arguments: allTests + cache-read-only: false + - name: Run tests + run: ./gradlew allTests #### diff --git a/CLAUDE.md b/CLAUDE.md index a586724..9cbba3b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,20 +1,24 @@ # CLAUDE.md +日本語で会話する This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## プロジェクト概要 -RenlinはHTML UIを型安全なDSLアプローチで構築するためのKotlinマルチプラットフォームライブラリです。主にJavaScript/ブラウザターゲット向けのWeb開発用に設計されていますが、JVMもサポートしています。HakateステートマネジメントシステムとCSS-in-JS機能を統合しています。 +RenlinはHTML +UIを型安全なDSLアプローチで構築するためのKotlinマルチプラットフォームライブラリです。主にJavaScript/ブラウザターゲット向けのWeb開発用に設計されていますが、JVMもサポートしています。HakateステートマネジメントシステムとCSS-in-JS機能を統合しています。 ## 主要アーキテクチャ ### モジュール構造 + - **renlin/**: マルチプラットフォームソースセット(commonMain、jsMain、jvmMain)を持つメインライブラリモジュール - **sample/**: ライブラリの使用パターンを示すサンプル実装 - **generate/**: HTML タグDSL作成用のコード生成ツール - **convention-plugins/**: 一貫したビルド設定のためのGradle規約プラグイン ### 主要概念 + - **コンポーネントシステム**: レンダー関数を持つ`Component`インターフェースを使用した型安全なコンポーネント - **DSLアーキテクチャ**: `@Html`マーカーアノテーションと型安全なコンテンツカテゴリを使用したHTML DSL構築 - **ステート管理**: `StateDispatcher`を介したリアクティブステートハンドリングのためのHakateライブラリとの統合 @@ -23,12 +27,14 @@ RenlinはHTML UIを型安全なDSLアプローチで構築するためのKotlin - **属性システム**: `DslStateData`を通じた型安全な HTML 属性管理(href、onClick など) ### プラットフォームターゲット + - **JavaScript**: DOM操作によるブラウザベースレンダリング(`DomTagElement` 経由) - **JVM**: サーバーサイドHTML生成機能 ## 開発コマンド ### ビルド + ```bash ./gradlew build # 全モジュールをビルド ./gradlew :renlin:build # メインライブラリのみをビルド @@ -36,6 +42,7 @@ RenlinはHTML UIを型安全なDSLアプローチで構築するためのKotlin ``` ### テスト + ```bash ./gradlew test # 全テストを実行 ./gradlew :renlin:test # メインライブラリをテスト @@ -44,17 +51,20 @@ RenlinはHTML UIを型安全なDSLアプローチで構築するためのKotlin ``` ### サンプル開発 + ```bash ./gradlew :sample:jsBrowserRun # ブラウザでサンプルを実行(開発用) ./gradlew :sample:jsBrowserDevelopmentExecutableDistribution # サンプル配布版をビルド ``` ### コード生成 + ```bash ./gradlew :generate:run # HTML タグDSLコードを生成 ``` ### パブリッシング + ```bash ./gradlew publishToMavenLocal # ローカルMavenリポジトリに公開 ./gradlew publish # 設定されたリポジトリに公開 @@ -63,18 +73,24 @@ RenlinはHTML UIを型安全なDSLアプローチで構築するためのKotlin ## 主要実装パターン ### コンポーネント作成 -コンポーネントは`Component`を継承し、`.component {}`DSLビルダーパターンを使用します。ステート統合は`StateDispatcher`を通じて行われ、`useValue()`によるリアクティブレンダリングが可能です。 + +コンポーネントは`Component`を継承し、`.component {}`DSLビルダーパターンを使用します。ステート統合は`StateDispatcher` +を通じて行われ、`useValue()`によるリアクティブレンダリングが可能です。 ### エントリーポイントパターン + JSアプリケーションは`Entrypoint(domElement).render(component, dispatcher)`を使用してコンポーネントをDOM要素にマウントします。 ### CSS統合 + 自動クラス生成のために`cssManager`プロパティを使用してスタイリングを行います。CSSプロパティは型安全で疑似クラスをサポートしています。 ### コンテンツ型安全性 + DSLはW3Cコンテンツカテゴリをコンパイル時に強制します - FlowContentはPhrasingContentを含むことができますが、その逆はできません。 ### 属性とイベント管理 + - **DslStateData パターン**: 属性(href など)とイベントハンドラー(onClick など)は`DslStateData`を通じて管理されます - **型安全な属性**: `Href`クラスなどのvalue objectsを使用して属性値を型安全に扱います - **自動DOM同期**: `TagNodeCommon.setDslStateData`が属性とイベントの DOM への同期を自動的に行います @@ -82,12 +98,14 @@ DSLはW3Cコンテンツカテゴリをコンパイル時に強制します - Fl ## アーキテクチャの理解 ### レイヤー構造 + 1. **Component レイヤー**: `Component` - 最上位のコンポーネント抽象化 2. **DSL レイヤー**: `DslBase` - HTML構造構築とライフサイクル管理 3. **State レイヤー**: `DslState` / `DslStateData` - 状態管理と属性/イベント管理 4. **Platform レイヤー**: `TagNode` implementations - プラットフォーム固有のレンダリング ### W3C カテゴリシステム + - `w3c/category/native/` - W3C HTML仕様に基づくコンテンツカテゴリ型定義 - `w3c/category/dsl/` - 各カテゴリ用のDSLインターフェース - `w3c/category/integration/` - カテゴリ間の統合型定義 @@ -105,16 +123,19 @@ DSLはW3Cコンテンツカテゴリをコンパイル時に強制します - Fl ## ステート管理統合 -ライブラリはステート管理にHakateが必要です。コンポーネントは`MutableState`を通じてリアクティブステートにアクセスし、`useValue()`を介して再レンダリングをトリガーします。ステートの変更は自動的にコンポーネントツリー全体に伝播されます。 +ライブラリはステート管理にHakateが必要です。コンポーネントは`MutableState`を通じてリアクティブステートにアクセスし、 +`useValue()`を介して再レンダリングをトリガーします。ステートの変更は自動的にコンポーネントツリー全体に伝播されます。 ## 拡張とカスタマイズ ### 新しい属性の追加 + 1. `DslStateData`にプロパティを追加 2. `TagNodeCommon.setDslStateData`で属性をDOMに適用するロジックを追加 3. 対象DSLクラス用の拡張プロパティを`w3c/attribute/`に作成 ### 新しいHTMLタグの追加 + 1. `generate/`モジュールのコード生成を使用するか、手動でタグクラスを作成 2. 適切なW3Cコンテンツカテゴリに従ってDSLクラスを実装 3. プラットフォーム固有の実装が必要な場合は、各プラットフォームモジュールで対応 \ No newline at end of file diff --git a/convention-plugins/build.gradle.kts b/convention-plugins/build.gradle.kts index ab7ff88..ea7cf25 100644 --- a/convention-plugins/build.gradle.kts +++ b/convention-plugins/build.gradle.kts @@ -1,10 +1,13 @@ plugins { `kotlin-dsl` + kotlin("jvm") version "2.1.0" } fun pluginId(pluginName: String, version: String) = "$pluginName:$pluginName.gradle.plugin:$version" dependencies { implementation(libs.nexus.publish) implementation(pluginId("org.jetbrains.kotlin.multiplatform", "2.1.0")) - implementation(pluginId("net.kigawa.renlin-compiler", "1.3.8")) + // Temporarily disabled due to Kotlin version compatibility with kotlin-dsl plugin + implementation(pluginId("net.kigawa.renlin-compiler", "1.3.11")) + // https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-gradle-plugin } \ No newline at end of file diff --git a/convention-plugins/gradle.properties b/convention-plugins/gradle.properties new file mode 100644 index 0000000..b81a6da --- /dev/null +++ b/convention-plugins/gradle.properties @@ -0,0 +1 @@ +kotlin.daemon.jvm.options=-Xskip-metadata-version-check \ No newline at end of file diff --git a/convention-plugins/src/main/kotlin/renlin.common.gradle.kts b/convention-plugins/src/main/kotlin/renlin.common.gradle.kts index 4d06725..58e1243 100644 --- a/convention-plugins/src/main/kotlin/renlin.common.gradle.kts +++ b/convention-plugins/src/main/kotlin/renlin.common.gradle.kts @@ -24,6 +24,7 @@ kotlin { } sourceSets["commonMain"].dependencies { implementation("net.kigawa:hakate:3.3.2") + implementation("net.kigawa.renlin-compiler:renlin-kotlin-plugin:1.3.11") } sourceSets["commonTest"].dependencies { diff --git a/generate/src/jvmMain/kotlin/tagCategories.kt b/generate/src/jvmMain/kotlin/tagCategories.kt index a5ae984..87f4f6a 100644 --- a/generate/src/jvmMain/kotlin/tagCategories.kt +++ b/generate/src/jvmMain/kotlin/tagCategories.kt @@ -63,12 +63,30 @@ val tagCategories = setOf( ), TagInfo("footer", TagCategories(setOf("FlowContent", "PalpableContent")), AllowedCategories()), TagInfo("header", TagCategories(setOf("FlowContent", "PalpableContent")), AllowedCategories()), - TagInfo("h1", TagCategories(setOf("FlowContent", "HeadingContent", "PalpableContent")), AllowedCategories()), - TagInfo("h2", TagCategories(setOf("FlowContent", "HeadingContent", "PalpableContent")), AllowedCategories()), - TagInfo("h3", TagCategories(setOf("FlowContent", "HeadingContent", "PalpableContent")), AllowedCategories()), - TagInfo("h4", TagCategories(setOf("FlowContent", "HeadingContent", "PalpableContent")), AllowedCategories()), - TagInfo("h5", TagCategories(setOf("FlowContent", "HeadingContent", "PalpableContent")), AllowedCategories()), - TagInfo("h6", TagCategories(setOf("FlowContent", "HeadingContent", "PalpableContent")), AllowedCategories()), + TagInfo( + "h1", TagCategories(setOf("FlowContent", "HeadingContent", "PalpableContent")), + AllowedCategories("PhrasingContent") + ), + TagInfo( + "h2", TagCategories(setOf("FlowContent", "HeadingContent", "PalpableContent")), + AllowedCategories("PhrasingContent") + ), + TagInfo( + "h3", TagCategories(setOf("FlowContent", "HeadingContent", "PalpableContent")), + AllowedCategories("PhrasingContent") + ), + TagInfo( + "h4", TagCategories(setOf("FlowContent", "HeadingContent", "PalpableContent")), + AllowedCategories("PhrasingContent") + ), + TagInfo( + "h5", TagCategories(setOf("FlowContent", "HeadingContent", "PalpableContent")), + AllowedCategories("PhrasingContent") + ), + TagInfo( + "h6", TagCategories(setOf("FlowContent", "HeadingContent", "PalpableContent")), + AllowedCategories("PhrasingContent") + ), TagInfo("hgroup", TagCategories(setOf("FlowContent", "HeadingContent")), AllowedCategories()), TagInfo("main", TagCategories(setOf("FlowContent", "PalpableContent")), AllowedCategories()), TagInfo( diff --git a/gradle.properties b/gradle.properties index 211078c..0915536 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,10 @@ kotlin.daemon.jvmargs=-Xmx4096M org.gradle.caching=true # https://github.com/gradle/gradle/issues/22779 le sigh #org.gradle.configuration-cache=true +# org.gradle.java.home=/usr/lib/jvm/java-17-openjdk-amd64 # GitHub Actionsでは不要 #Kotlin kotlin.code.style=official -kotlin.js.compiler=ir +kotlin.compiler.execution.strategy=in-process +kotlin.compiler.incremental=true +kotlin.daemon.jvm.options=-Xskip-metadata-version-check diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1f68ca8..9658ce1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,8 @@ [versions] kotlin-version = "2.1.0" -coroutines-version = "1.9.0" coroutines-test-version = "1.10.1" datetime-version = "0.6.1" -hakate-version = "3.3.0" +hakate-version = "3.3.2" nexus-publish = "2.0.0-rc-1" dokka = "1.9.20" vanniktech-maven-publish = "0.29.0" @@ -12,7 +11,7 @@ vanniktech-maven-publish = "0.29.0" kotlin-stdlib-js = { module = "org.jetbrains.kotlin:kotlin-stdlib-js", version.ref = "kotlin-version" } kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin-version" } kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin-version" } -kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines-version" } +kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines-test-version" } kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines-test-version" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "datetime-version" } nexus-publish = { module = "io.github.gradle-nexus.publish-plugin:io.github.gradle-nexus.publish-plugin.gradle.plugin", version.ref = "nexus-publish" } diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index 825bbda..6903b66 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -105,9 +105,9 @@ "@types/node" "*" "@types/estree@^1.0.5": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": version "5.0.6" @@ -397,7 +397,12 @@ acorn-import-attributes@^1.9.5: resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== -acorn@^8.7.1, acorn@^8.8.2: +acorn@^8.7.1: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +acorn@^8.8.2: version "8.14.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== @@ -555,14 +560,14 @@ browser-stdout@^1.3.1: integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserslist@^4.21.10: - version "4.24.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" - integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== + version "4.25.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.3.tgz#9167c9cbb40473f15f75f85189290678b99b16c5" + integrity sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ== dependencies: - caniuse-lite "^1.0.30001688" - electron-to-chromium "^1.5.73" + caniuse-lite "^1.0.30001735" + electron-to-chromium "^1.5.204" node-releases "^2.0.19" - update-browserslist-db "^1.1.1" + update-browserslist-db "^1.1.3" buffer-from@^1.0.0: version "1.1.2" @@ -595,10 +600,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001688: - version "1.0.30001703" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz#977cb4920598c158f491ecf4f4f2cfed9e354718" - integrity sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ== +caniuse-lite@^1.0.30001735: + version "1.0.30001737" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz#8292bb7591932ff09e9a765f12fdf5629a241ccc" + integrity sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw== chalk@^4.1.0: version "4.1.2" @@ -871,10 +876,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.5.73: - version "1.5.114" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.114.tgz#f2bb4fda80a7db4ea273565e75b0ebbe19af0ac3" - integrity sha512-DFptFef3iktoKlFQK/afbo274/XNWD00Am0xa7M8FZUepHlHT8PEuiNBoRfFHbH1okqN58AlhbJ4QTkcnXorjA== +electron-to-chromium@^1.5.204: + version "1.5.209" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.209.tgz#403e7a84933b7206bb2e737d897042b2a6ef8d3e" + integrity sha512-Xoz0uMrim9ZETCQt8UgM5FxQF9+imA7PBpokoGcZloA1uw2LeHzTlip5cb5KOAsXZLjh/moN2vReN3ZjJmjI9A== emoji-regex@^8.0.0: version "8.0.0" @@ -912,9 +917,9 @@ engine.io@~6.6.0: ws "~8.17.1" enhanced-resolve@^5.17.1: - version "5.18.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" - integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== + version "5.18.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz#9b5f4c5c076b8787c78fe540392ce76a88855b44" + integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -2620,7 +2625,7 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.1.1: +update-browserslist-db@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== @@ -2758,9 +2763,9 @@ webpack-merge@^5.7.3: wildcard "^2.0.0" webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + version "3.3.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" + integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== webpack@5.94.0: version "5.94.0" diff --git a/renlin/src/commonMain/kotlin/net/kigawa/renlin/AutoFill.kt b/renlin/src/commonMain/kotlin/net/kigawa/renlin/AutoFill.kt deleted file mode 100644 index ff32e30..0000000 --- a/renlin/src/commonMain/kotlin/net/kigawa/renlin/AutoFill.kt +++ /dev/null @@ -1,9 +0,0 @@ -package net.kigawa.renlin - -/** - * Marks a parameter for automatic value injection when passed as null. - * When applied to a function parameter, the plugin will automatically generate and inject a value if null is passed for this parameter. - */ -@Target(AnnotationTarget.VALUE_PARAMETER) -@Retention(AnnotationRetention.RUNTIME) -annotation class AutoFill \ No newline at end of file diff --git a/renlin/src/commonMain/kotlin/net/kigawa/renlin/state/DslStateData.kt b/renlin/src/commonMain/kotlin/net/kigawa/renlin/state/DslStateData.kt index 9d80863..29155fe 100644 --- a/renlin/src/commonMain/kotlin/net/kigawa/renlin/state/DslStateData.kt +++ b/renlin/src/commonMain/kotlin/net/kigawa/renlin/state/DslStateData.kt @@ -31,7 +31,8 @@ data class DslStateData( * * 各追加データは、特定のコンテキストクラスに関連付けられ、値の型とキーを持ちます。 */ - var additionalData: List> = listOf() + var additionalData: List> = listOf(), + val dslStates: List = listOf(), ) { /** * 指定されたコンテキストクラスに対して型安全に追加データを設定します。 @@ -43,12 +44,13 @@ data class DslStateData( * @param T 追加データの値の型 * @param key 追加データの一意のキー */ - inline fun setAdditionalData(contextClass: KClass<*>, value: T, @AutoFill key: String? = null) { + inline fun setAdditionalData(contextClass: KClass<*>, value: T, @AutoFill key: String? = null) { removeAdditionalData(contextClass) additionalData = additionalData + AdditionalDslStateData( contextClass, typeOf(), key, value ) } + /** * 指定されたコンテキストクラス、型、キーに一致する追加データを削除します。 * @@ -56,11 +58,12 @@ data class DslStateData( * @param T 追加データの値の型 * @param key 追加データの一意のキー */ - inline fun removeAdditionalData(contextClass: KClass<*>, @AutoFill key: String? = null) { + inline fun removeAdditionalData(contextClass: KClass<*>, @AutoFill key: String? = null) { additionalData = additionalData.filter { it.contextClass != contextClass || it.valueType != typeOf() || it.key != key } } + /** * 指定されたコンテキストクラス、型、キーに一致する追加データを取得します。 * @@ -72,13 +75,13 @@ data class DslStateData( * @return 一致するデータが見つかった場合はその値、見つからない場合はnul * */ - inline fun getAdditionalData(contextClass: KClass<*>, @AutoFill key: String? = null): T? { + inline fun getAdditionalData(contextClass: KClass<*>, @AutoFill key: String? = null): T? { @Suppress("UNCHECKED_CAST") return additionalData .firstOrNull { it.contextClass == contextClass && - it.valueType == typeOf() && - it.key == key + it.valueType == typeOf() && + it.key == key }?.value as? T? } } diff --git a/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H1.kt b/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H1.kt index 575ee16..c3de5bd 100644 --- a/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H1.kt +++ b/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H1.kt @@ -1,6 +1,7 @@ package net.kigawa.renlin.tag import net.kigawa.renlin.w3c.category.integration.FlowHeadingPalpable + import net.kigawa.renlin.w3c.category.native.PhrasingContent import net.kigawa.renlin.dsl.DslBase import net.kigawa.renlin.dsl.StatedDsl import net.kigawa.renlin.component.TagComponent1 @@ -8,7 +9,8 @@ import net.kigawa.renlin.component.Component import net.kigawa.renlin.w3c.element.TagNode import net.kigawa.renlin.state.DslState import net.kigawa.renlin.w3c.category.native.H1Category -import net.kigawa.renlin.w3c.category.ContentCategory +import net.kigawa.renlin.w3c.category.dsl.PhrasingContentDsl + /** * HTML

element @@ -16,8 +18,9 @@ import net.kigawa.renlin.w3c.category.ContentCategory * model.Categories: FlowContent, HeadingContent, PalpableContent */ class H1Dsl(dslState: DslState): - DslBase(dslState), - StatedDsl { + DslBase(dslState), + StatedDsl, + PhrasingContentDsl { override fun applyElement(element: TagNode): ()->Unit { return {} } diff --git a/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H2.kt b/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H2.kt index c4baf41..105e31c 100644 --- a/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H2.kt +++ b/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H2.kt @@ -1,6 +1,7 @@ package net.kigawa.renlin.tag import net.kigawa.renlin.w3c.category.integration.FlowHeadingPalpable + import net.kigawa.renlin.w3c.category.native.PhrasingContent import net.kigawa.renlin.dsl.DslBase import net.kigawa.renlin.dsl.StatedDsl import net.kigawa.renlin.component.TagComponent1 @@ -8,7 +9,8 @@ import net.kigawa.renlin.component.Component import net.kigawa.renlin.w3c.element.TagNode import net.kigawa.renlin.state.DslState import net.kigawa.renlin.w3c.category.native.H2Category -import net.kigawa.renlin.w3c.category.ContentCategory +import net.kigawa.renlin.w3c.category.dsl.PhrasingContentDsl + /** * HTML

element @@ -16,8 +18,9 @@ import net.kigawa.renlin.w3c.category.ContentCategory * model.Categories: FlowContent, HeadingContent, PalpableContent */ class H2Dsl(dslState: DslState): - DslBase(dslState), - StatedDsl { + DslBase(dslState), + StatedDsl, + PhrasingContentDsl { override fun applyElement(element: TagNode): ()->Unit { return {} } diff --git a/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H3.kt b/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H3.kt index fe3b8d2..c4a405a 100644 --- a/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H3.kt +++ b/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H3.kt @@ -1,6 +1,7 @@ package net.kigawa.renlin.tag import net.kigawa.renlin.w3c.category.integration.FlowHeadingPalpable + import net.kigawa.renlin.w3c.category.native.PhrasingContent import net.kigawa.renlin.dsl.DslBase import net.kigawa.renlin.dsl.StatedDsl import net.kigawa.renlin.component.TagComponent1 @@ -8,7 +9,8 @@ import net.kigawa.renlin.component.Component import net.kigawa.renlin.w3c.element.TagNode import net.kigawa.renlin.state.DslState import net.kigawa.renlin.w3c.category.native.H3Category -import net.kigawa.renlin.w3c.category.ContentCategory +import net.kigawa.renlin.w3c.category.dsl.PhrasingContentDsl + /** * HTML

element @@ -16,8 +18,9 @@ import net.kigawa.renlin.w3c.category.ContentCategory * model.Categories: FlowContent, HeadingContent, PalpableContent */ class H3Dsl(dslState: DslState): - DslBase(dslState), - StatedDsl { + DslBase(dslState), + StatedDsl, + PhrasingContentDsl { override fun applyElement(element: TagNode): ()->Unit { return {} } diff --git a/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H4.kt b/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H4.kt index 0e8b771..abe350e 100644 --- a/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H4.kt +++ b/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H4.kt @@ -1,6 +1,7 @@ package net.kigawa.renlin.tag import net.kigawa.renlin.w3c.category.integration.FlowHeadingPalpable + import net.kigawa.renlin.w3c.category.native.PhrasingContent import net.kigawa.renlin.dsl.DslBase import net.kigawa.renlin.dsl.StatedDsl import net.kigawa.renlin.component.TagComponent1 @@ -8,7 +9,8 @@ import net.kigawa.renlin.component.Component import net.kigawa.renlin.w3c.element.TagNode import net.kigawa.renlin.state.DslState import net.kigawa.renlin.w3c.category.native.H4Category -import net.kigawa.renlin.w3c.category.ContentCategory +import net.kigawa.renlin.w3c.category.dsl.PhrasingContentDsl + /** * HTML

element @@ -16,8 +18,9 @@ import net.kigawa.renlin.w3c.category.ContentCategory * model.Categories: FlowContent, HeadingContent, PalpableContent */ class H4Dsl(dslState: DslState): - DslBase(dslState), - StatedDsl { + DslBase(dslState), + StatedDsl, + PhrasingContentDsl { override fun applyElement(element: TagNode): ()->Unit { return {} } diff --git a/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H5.kt b/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H5.kt index c7ad101..5a5b391 100644 --- a/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H5.kt +++ b/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H5.kt @@ -1,6 +1,7 @@ package net.kigawa.renlin.tag import net.kigawa.renlin.w3c.category.integration.FlowHeadingPalpable + import net.kigawa.renlin.w3c.category.native.PhrasingContent import net.kigawa.renlin.dsl.DslBase import net.kigawa.renlin.dsl.StatedDsl import net.kigawa.renlin.component.TagComponent1 @@ -8,7 +9,8 @@ import net.kigawa.renlin.component.Component import net.kigawa.renlin.w3c.element.TagNode import net.kigawa.renlin.state.DslState import net.kigawa.renlin.w3c.category.native.H5Category -import net.kigawa.renlin.w3c.category.ContentCategory +import net.kigawa.renlin.w3c.category.dsl.PhrasingContentDsl + /** * HTML
element @@ -16,8 +18,9 @@ import net.kigawa.renlin.w3c.category.ContentCategory * model.Categories: FlowContent, HeadingContent, PalpableContent */ class H5Dsl(dslState: DslState): - DslBase(dslState), - StatedDsl { + DslBase(dslState), + StatedDsl, + PhrasingContentDsl { override fun applyElement(element: TagNode): ()->Unit { return {} } diff --git a/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H6.kt b/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H6.kt index 471f8f9..4999a9c 100644 --- a/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H6.kt +++ b/renlin/src/commonMain/kotlin/net/kigawa/renlin/tag/H6.kt @@ -1,6 +1,7 @@ package net.kigawa.renlin.tag import net.kigawa.renlin.w3c.category.integration.FlowHeadingPalpable + import net.kigawa.renlin.w3c.category.native.PhrasingContent import net.kigawa.renlin.dsl.DslBase import net.kigawa.renlin.dsl.StatedDsl import net.kigawa.renlin.component.TagComponent1 @@ -8,7 +9,8 @@ import net.kigawa.renlin.component.Component import net.kigawa.renlin.w3c.element.TagNode import net.kigawa.renlin.state.DslState import net.kigawa.renlin.w3c.category.native.H6Category -import net.kigawa.renlin.w3c.category.ContentCategory +import net.kigawa.renlin.w3c.category.dsl.PhrasingContentDsl + /** * HTML
element @@ -16,8 +18,9 @@ import net.kigawa.renlin.w3c.category.ContentCategory * model.Categories: FlowContent, HeadingContent, PalpableContent */ class H6Dsl(dslState: DslState): - DslBase(dslState), - StatedDsl { + DslBase(dslState), + StatedDsl, + PhrasingContentDsl { override fun applyElement(element: TagNode): ()->Unit { return {} } diff --git a/sample/src/commonMain/kotlin/net/kigawa/renlin/sample/SampleComponent.kt b/sample/src/commonMain/kotlin/net/kigawa/renlin/sample/SampleComponent.kt index 8a375b4..4eda467 100644 --- a/sample/src/commonMain/kotlin/net/kigawa/renlin/sample/SampleComponent.kt +++ b/sample/src/commonMain/kotlin/net/kigawa/renlin/sample/SampleComponent.kt @@ -13,8 +13,8 @@ class SampleComponent( var update: (Int) -> Unit = {} val root = div.component { - sub.navigation("navigation") - sub.display("main-display") { + sub.navigation() + sub.display() { div { t("aaaa") a {