[
  {
    "path": ".github/workflows/build.yml",
    "content": "name: Build\non:\n  # Trigger the workflow on pushes to only the 'main' branch (this avoids duplicate checks being run e.g. for dependabot pull requests)\n  push:\n    branches: [ main ]\n  # Trigger the workflow on any pull request\n  pull_request:\n\njobs:\n  # Run Gradle Wrapper Validation Action to verify the wrapper's checksum\n  gradleValidation:\n    name: Gradle Wrapper\n    runs-on: ubuntu-latest\n    steps:\n\n      # Check out current repository\n      - name: Fetch Sources\n        uses: actions/checkout@v2.3.4\n\n      # Validate wrapper\n      - name: Gradle Wrapper Validation\n        uses: gradle/wrapper-validation-action@v1.0.4\n  build:\n    name: Build\n    runs-on: ubuntu-latest\n    outputs:\n      version: ${{ steps.properties.outputs.version }}\n      changelog: ${{ steps.properties.outputs.changelog }}\n    steps:\n\n      # Check out current repository\n      - name: Fetch Sources\n        uses: actions/checkout@v2\n\n      - name: Download JBR\n        uses: carlosperate/download-file-action@v2\n        with:\n          file-url: 'https://cache-redirector.jetbrains.com/intellij-jbr/jbr-17.0.5-linux-x64-b653.14.tar.gz'\n          file-name: 'jbr-17.0.5.tar.gz'\n\n      - name: Setup Java\n        uses: actions/setup-java@v3\n        with:\n          java-version: 17\n          distribution: jdkfile\n          jdkFile: jbr-17.0.5.tar.gz\n          cache: gradle\n\n      # Set environment variables\n      - name: Export Properties\n        id: properties\n        shell: bash\n        run: |\n          PROPERTIES=\"$(./gradlew properties -q)\"\n          VERSION=\"$(echo \"$PROPERTIES\" | grep \"^version:\" | cut -f2- -d ' ')\"\n          NAME=\"$(echo \"$PROPERTIES\" | grep \"^name:\" | cut -f2- -d ' ')\"\n          CHANGELOG=\"$(./gradlew getChangelog --unreleased --no-header --console=plain -q)\"\n          CHANGELOG=\"${CHANGELOG//'%'/'%25'}\"\n          CHANGELOG=\"${CHANGELOG//$'\\n'/'%0A'}\"\n          CHANGELOG=\"${CHANGELOG//$'\\r'/'%0D'}\"\n          echo \"version=$VERSION\"\n          echo \"name=$NAME\"\n          echo \"changelog=$CHANGELOG\"\n          echo \"version=$VERSION\" >> $GITHUB_OUTPUT\n          echo \"name=$NAME\" >> $GITHUB_OUTPUT\n          echo \"changelog=$CHANGELOG\" >> $GITHUB_OUTPUT\n      # Build artifact using buildPlugin Gradle task\n      - name: Build\n        run: ./gradlew build\n\n      # Store built plugin as an artifact for downloading\n      - name: Upload artifacts\n        uses: actions/upload-artifact@v3\n        with:\n          name: \"${{ steps.properties.outputs.name }} - ${{ steps.properties.outputs.version }}\"\n          path: ./**/build/libs/*\n\n  # Prepare a draft release for GitHub Releases page for the manual verification\n  # If accepted and published, release workflow would be triggered\n  releaseDraft:\n    name: Release Draft\n    if: github.event_name != 'pull_request'\n    needs: build\n    runs-on: ubuntu-latest\n    steps:\n\n      # Check out current repository\n      - name: Fetch Sources\n        uses: actions/checkout@v2.3.4\n\n      # Remove old release drafts by using the curl request for the available releases with draft flag\n      - name: Remove Old Release Drafts\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          gh api repos/{owner}/{repo}/releases \\\n            --jq '.[] | select(.draft == true) | .id' \\\n            | xargs -I '{}' gh api -X DELETE repos/{owner}/{repo}/releases/{}\n      # Create new release draft - which is not publicly visible and requires manual acceptance\n      - name: Create Release Draft\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          gh release create v${{ needs.build.outputs.version }} \\\n            --draft \\\n            --title \"v${{ needs.build.outputs.version }}\" \\\n            --notes \"${{ needs.build.outputs.changelog }}\"\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "# GitHub Actions Workflow created for handling the release process based on the draft release prepared\n# with the Build workflow. Running the publishPlugin task requires the PUBLISH_TOKEN secret provided.\n\nname: Release\non:\n  release:\n    types: [ prereleased, released ]\n\njobs:\n\n  # Prepare and publish the plugin to the Marketplace repository\n  release:\n    name: Publish Plugin\n    runs-on: ubuntu-latest\n    steps:\n\n      # Check out current repository\n      - name: Fetch Sources\n        uses: actions/checkout@v2.3.4\n        with:\n          ref: ${{ github.event.release.tag_name }}\n\n      - name: Download JBR\n        uses: carlosperate/download-file-action@v2\n        with:\n          file-url: 'https://cache-redirector.jetbrains.com/intellij-jbr/jbr-17.0.5-linux-x64-b653.14.tar.gz'\n          file-name: 'jbr-17.0.5.tar.gz'\n\n      - name: Setup Java\n        uses: actions/setup-java@v3\n        with:\n          java-version: 17\n          distribution: jdkfile\n          jdkFile: jbr-17.0.5.tar.gz\n          cache: gradle\n\n      # Update Unreleased section with the current release note\n      - name: Patch Changelog\n        run: |\n          ./gradlew patchChangelog --release-note=\"`cat << EOM\n          ${{ github.event.release.body }}\n          EOM`\"\n\n      - name: Import GPG key\n        uses: crazy-max/ghaction-import-gpg@v3\n        with:\n          gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}\n\n      - uses: ButterCam/setup-sisyphus-build@v1\n        with:\n          dependency-repositories: local,central,portal,google,snapshot\n          snapshot-url: https://s01.oss.sonatype.org/content/repositories/snapshots\n          snapshot-username: ${{ secrets.OSSRH_USERNAME }}\n          snapshot-password: ${{ secrets.OSSRH_PASSWORD }}\n          release-url: https://s01.oss.sonatype.org/service/local/staging/deploy/maven2\n          release-username: ${{ secrets.OSSRH_USERNAME }}\n          release-password: ${{ secrets.OSSRH_PASSWORD }}\n          gradle-portal-key: ${{ secrets.GRADLE_PUBLISH_KEY }}\n          gradle-portal-secret: ${{ secrets.GRADLE_PUBLISH_SECRET }}\n          gpg-key-name: ${{ secrets.GPG_KEY_NAME }}\n\n      # Publish the plugin to the Marketplace\n      - name: Publish\n        env:\n          PUBLISH_TOKEN: ${{ secrets.PUBLISH_TOKEN }}\n        run: ./gradlew publish\n\n      # Upload artifact as a release asset\n      - name: Upload Release Asset\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: gh release upload ${{ github.event.release.tag_name }} ./**/build/libs/*\n\n      # Create pull request\n      - name: Create Pull Request\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n        run: |\n          VERSION=\"${{ github.event.release.tag_name }}\"\n          BRANCH=\"changelog-update-$VERSION\"\n          git config user.email \"action@github.com\"\n          git config user.name \"GitHub Action\"\n          git checkout -b $BRANCH\n          git commit -am \"Changelog update - $VERSION\"\n          git push --set-upstream origin $BRANCH\n          gh pr create \\\n            --title \":bookmark: Changelog update - \\`$VERSION\\`\" \\\n            --body \"Current pull request contains patched \\`CHANGELOG.md\\` file for the \\`$VERSION\\` version.\" \\\n            --base main \\\n            --head $BRANCH"
  },
  {
    "path": ".gitignore",
    "content": ".gradle\n/build/\n!foundation/gradle/wrapper/gradle-wrapper.jar\n\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings\n.springBeans\n\n### IntelliJ IDEA ###\n.idea\n*.iws\n*.iml\n*.ipr\n\n### NetBeans ###\nnbproject/private/\nbuild/\nnbbuild/\ndist/\nnbdist/\n.nb-gradle/\n\nlogs/\nout/\ndata/elasticsearch\n.DS_Store"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n## [Unreleased]\n\n## [2.2.0]\n- Upgrade to compose 1.5.2\n\n## [2.1.0]\n- Provide BasicMainToolBar #18 \n- Disable minimize and maximize button when resizeable is false #19 \n- Fix the custom title bar when MainToolBar Content is empty #20\n- Optimize the implementation of themes. Switching themes will not cause full recompose.\n- Add text styles for theme\n\n## [2.0.0]\n- Exp UI theme support\n\n## [1.1.0]\n- Target to jvm 1.11 #11\n- Replacing SVG Resources with Compose generated Image Vectors #13\n- IntelliJ Dracula colors (Dark Theme) #12\n\nThanks @DevSrSouza\n\n## [1.0.1]\n- Upgrade to compose 1.0.1\n\n## [1.0.0]\n- JetBrains UI Kit for Compose desktop"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 ButterCam\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# We are planning to migrate to [JetBrains/jewel](https://github.com/JetBrains/jewel)!\n\nWe are discussing with JetBrains officials about migrating this project to [JetBrains/jewel](https://github.com/JetBrains/jewel). This will be the focus of our next work.\n\nTrack progress in this issue: JetBrains/jewel#28\n\n# JetBrains UI Kit for Compose Desktop\n\nNew JetBrains style controls and UI kits for [Compose Desktop](https://www.jetbrains.com/lp/compose/).\n\nClassic JetBrains UI kit have been moved to [here](classic).\n\n![screenshot](docs/screenshot-expui.png)\n\n## Quick Start\n\n## Requirements\n\n### JetBrains Runtime\n\nTo get the best presentation across platforms, this library requires the application to run\non [JetBrains Runtime](https://github.com/JetBrains/JetBrainsRuntime) (JBR).\n\n[JetBrains Runtime](https://github.com/JetBrains/JetBrainsRuntime) is a modified version of the JetBrains JDK\ndistribution, which is widely used across the JetBrains' IDEs such as IntelliJ, GoLand and others.\n\nIn this library we use the additional API provided by JetBrains Runtime to customise the title bar in Windows and macOS.\n\nIf the `JBWindow` component is not used, it can also be used without the JetBrains Runtime.\n\nWhen using `JBWindow` in a non-JetBrains Runtime environment, a native title bar may additionally be displayed.\n\nJBR-17 (corresponding to JDK 17) can be downloaded from [the SDK page](https://www.jetbrains.com/help/idea/sdk.html) of\nIntelliJ.\n\nMake sure that the [project SDK](https://www.jetbrains.com/help/idea/project-settings-and-structure.html#project-sdk)\nand [Gradle JVM](https://www.jetbrains.com/help/idea/gradle-jvm-selection.html) are both JBR-17.\n\n#### Project SDK settings\n\n![](docs/project-sdk.png)\n\n#### Gradle JVM settings\n\n![](docs/gradle-jvm.png)\n\n### `jdk.unsupported` module\n\nMost of the JetBrains Runtime APIs are private to JetBrains, and the class `sun.misc.Unsafe` is used to get access to\nthese APIs.\n\nYou need to add the `jdk.unsupported` module to the compose dependency as in the following code to make it work.\n\nYou can also skip this step if you don't need to use the `JBWindow` component.\n\n```kotlin\ncompose.desktop {\n    application {\n        nativeDistributions {\n            modules(\"jdk.unsupported\")\n        }\n    }\n}\n```\n\n## 1. Add dependency\n\n```kotlin\ndependencies {\n    implementation(compose.desktop.currentOs) {\n        exclude(\"org.jetbrains.compose.material\")\n    }\n    implementation(\"com.bybutter.compose:compose-jetbrains-expui-theme:2.0.0\")\n}\n```\n\n## 2. Use JBWindow DSL\n\nThe optimal display of JBWindow requires JetBrains Runtime, refer to the previous [requirements](#Requirements).\n\n```kotlin\nfun main() = application {\n    JBWindow(\n        title = \"JetBrains ExpUI Gallery\",\n        showTitle = true, // If you want to render your own component in the center of the title bar like Intellij do, disable this to hide the title of the MainToolBar (TitleBar).\n        theme = LightTheme, // Change the theme here, LightTheme and DarkTheme are provided.\n        state = rememberWindowState(size = DpSize(900.dp, 700.dp)),\n        onCloseRequest = {\n            exitApplication()\n        },\n        mainToolBar = {\n            // Render your own component in the MainToolBar (TitleBar).\n            Row(\n                Modifier.mainToolBarItem(\n                    Alignment.End,\n                    true\n                )\n            ) { // Use the mainToolBarItem modifier to change alignment of components and enable/disable window drag area on this component.\n            }\n        }) {\n        // Window content\n    }\n}\n```\n\n## 3. Use LightTheme and DarkTheme DSL\n\nSince `JBWindow` requires JetBrains Runtime, if you don't want to use the `JBWindow` component, you can also use a\nnormal `Window` with `LightTheme`/`DarkTheme` DSL.\n\n```kotlin\nfun main() = application {\n    Window({}) {\n        LightTheme {\n            // Your components here\n        }\n    }\n}\n```\n\n\n# Screenshot\n\n## MacOS\n\n<img width=\"1012\" alt=\"截屏2022-11-21 17 11 56\" src=\"https://user-images.githubusercontent.com/9367842/203010912-68f54752-a598-49ad-9e50-9217dba544be.png\">\n<img width=\"1012\" alt=\"截屏2022-11-21 17 12 18\" src=\"https://user-images.githubusercontent.com/9367842/203011027-3a835525-f44a-42e0-83f5-b1e27011b9e4.png\">\n\n## Windows  \n\n![image](https://user-images.githubusercontent.com/9367842/203374673-be0e25ab-de0c-4682-a511-bbadf0949446.png)  \n![image](https://user-images.githubusercontent.com/9367842/203374902-0b384bdd-fff4-4cbc-a8eb-93d6b58229a2.png)\n\n## Linux(Ubuntu with Gnome)\n\n![image](https://user-images.githubusercontent.com/9367842/203574847-6b6a3d4a-0da2-41f8-ac3f-9a8402f26b16.png)\n![image](https://user-images.githubusercontent.com/9367842/203574918-953092bc-b00f-455b-a43a-237c63093095.png)\n"
  },
  {
    "path": "build.gradle.kts",
    "content": "plugins {\n    id(\"com.bybutter.sisyphus.project\") version \"2.1.0\" apply false\n    id(\"com.netflix.nebula.contacts\") version \"7.0.1\"\n    id(\"com.netflix.nebula.info\") version \"12.1.6\" apply false\n    id(\"com.netflix.nebula.maven-publish\") version \"20.3.0\" apply false\n    id(\"com.netflix.nebula.source-jar\") version \"20.3.0\" apply false\n    id(\"org.jetbrains.changelog\") version \"1.3.0\"\n    id(\"org.jetbrains.compose\") version \"1.5.2\" apply false\n    kotlin(\"jvm\") version \"1.9.10\" apply false\n}\n\nallprojects {\n    apply(plugin = \"com.netflix.nebula.contacts\")\n    apply(plugin = \"com.netflix.nebula.info\")\n\n    group = \"com.bybutter.compose\"\n    version = \"2.2.0\"\n\n    contacts {\n        addPerson(\n            \"higan@live.cn\",\n            delegateClosureOf<nebula.plugin.contacts.Contact> {\n                moniker = \"higan\"\n                github = \"devkanro\"\n                roles.add(\"owner\")\n            },\n        )\n    }\n}\n\nsubprojects {\n    apply(plugin = \"org.jetbrains.compose\")\n\n    tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>() {\n        kotlinOptions.jvmTarget = \"17\"\n    }\n\n    repositories {\n        mavenLocal()\n        mavenCentral()\n        google()\n        maven(\"https://maven.pkg.jetbrains.space/public/p/compose/dev\")\n    }\n}\n\nchangelog {\n    version.set(project.version.toString())\n    groups.set(emptyList())\n}\n"
  },
  {
    "path": "classic/README.md",
    "content": "# JetBrains UI Kit for Compose Desktop\n\nJetBrains style controls and UI for [Compose Desktop](https://www.jetbrains.com/lp/compose/).\n\n![screenshot](../docs/screenshot.png)\n\n## Quick Start\n\n## 1. Add dependency\n\n```kotlin\ndependencies {\n    implementation(compose.desktop.currentOs) {\n        exclude(\"org.jetbrains.compose.material\")\n    }\n    implementation(\"com.bybutter.compose:compose-jetbrains-theme:2.0.0\")\n}\n```\n\n## 2. JBTheme DSL\n\n```kotlin\nfun main() = application {\n    Window(\n        onCloseRequest = ::exitApplication,\n        title = \"Compose for Desktop\",\n        state = rememberWindowState(width = 300.dp, height = 300.dp)\n    ) {\n        val count = remember { mutableStateOf(0) }\n\n        JBTheme {\n            JPanel(Modifier.fillMaxSize().jBorder(top = 1.dp, color = JBTheme.panelColors.border)) {\n                Column(Modifier.fillMaxSize(), Arrangement.spacedBy(5.dp)) {\n                    Button(modifier = Modifier.align(Alignment.CenterHorizontally),\n                        onClick = {\n                            count.value++\n                        }) {\n                        Text(if (count.value == 0) \"Hello World\" else \"Clicked ${count.value}!\")\n                    }\n                    Button(modifier = Modifier.align(Alignment.CenterHorizontally),\n                        onClick = {\n                            count.value = 0\n                        }) {\n                        Text(\"Reset\")\n                    }\n                }\n            }\n        }\n    }\n}\n```"
  },
  {
    "path": "classic/build.gradle.kts",
    "content": "plugins {\n    kotlin(\"jvm\")\n    `java-library`\n    id(\"com.netflix.nebula.maven-publish\")\n    id(\"com.netflix.nebula.source-jar\")\n    id(\"com.bybutter.sisyphus.project\")\n    id(\"org.jetbrains.compose\")\n}\n\ndescription = \"JetBrains UI Kit for Compose Desktop\"\n\ndependencies {\n    implementation(kotlin(\"stdlib\"))\n    implementation(compose.desktop.common) {\n        exclude(\"org.jetbrains.compose.material\")\n    }\n}\n\ntasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>() {\n    kotlinOptions.jvmTarget = \"17\"\n    kotlinOptions.freeCompilerArgs += listOf(\n        // \"-P\", \"plugin:androidx.compose.compiler.plugins.kotlin:suppressKotlinVersionCompatibilityCheck=true\"\n    )\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/JBTheme.kt",
    "content": "package io.kanro.compose.jetbrains\n\nimport androidx.compose.foundation.LocalScrollbarStyle\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.ProvidedValue\nimport androidx.compose.runtime.ReadOnlyComposable\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.ui.graphics.Color\nimport io.kanro.compose.jetbrains.color.ButtonColors\nimport io.kanro.compose.jetbrains.color.CheckBoxColors\nimport io.kanro.compose.jetbrains.color.FieldColors\nimport io.kanro.compose.jetbrains.color.FocusColors\nimport io.kanro.compose.jetbrains.color.IconColors\nimport io.kanro.compose.jetbrains.color.LocalButtonColors\nimport io.kanro.compose.jetbrains.color.LocalCheckBoxColors\nimport io.kanro.compose.jetbrains.color.LocalFieldColors\nimport io.kanro.compose.jetbrains.color.LocalFocusColors\nimport io.kanro.compose.jetbrains.color.LocalIconColors\nimport io.kanro.compose.jetbrains.color.LocalPanelColors\nimport io.kanro.compose.jetbrains.color.LocalProgressColors\nimport io.kanro.compose.jetbrains.color.LocalScrollColors\nimport io.kanro.compose.jetbrains.color.LocalSelectionColors\nimport io.kanro.compose.jetbrains.color.LocalTabColors\nimport io.kanro.compose.jetbrains.color.LocalTextColors\nimport io.kanro.compose.jetbrains.color.LocalToolBarColors\nimport io.kanro.compose.jetbrains.color.PanelColors\nimport io.kanro.compose.jetbrains.color.ProgressColors\nimport io.kanro.compose.jetbrains.color.ScrollColors\nimport io.kanro.compose.jetbrains.color.SelectionColors\nimport io.kanro.compose.jetbrains.color.TabColors\nimport io.kanro.compose.jetbrains.color.TextColors\nimport io.kanro.compose.jetbrains.color.ToolBarColors\nimport io.kanro.compose.jetbrains.color.darkButtonColors\nimport io.kanro.compose.jetbrains.color.darkCheckBoxColors\nimport io.kanro.compose.jetbrains.color.darkFieldColors\nimport io.kanro.compose.jetbrains.color.darkFocusColors\nimport io.kanro.compose.jetbrains.color.darkIconColors\nimport io.kanro.compose.jetbrains.color.darkPanelColors\nimport io.kanro.compose.jetbrains.color.darkProgressColors\nimport io.kanro.compose.jetbrains.color.darkScrollColors\nimport io.kanro.compose.jetbrains.color.darkSelectionColors\nimport io.kanro.compose.jetbrains.color.darkTabColors\nimport io.kanro.compose.jetbrains.color.darkTextColors\nimport io.kanro.compose.jetbrains.color.darkToolBarColors\nimport io.kanro.compose.jetbrains.color.lightButtonColors\nimport io.kanro.compose.jetbrains.color.lightCheckBoxColors\nimport io.kanro.compose.jetbrains.color.lightFieldColors\nimport io.kanro.compose.jetbrains.color.lightFocusColors\nimport io.kanro.compose.jetbrains.color.lightIconColors\nimport io.kanro.compose.jetbrains.color.lightPanelColors\nimport io.kanro.compose.jetbrains.color.lightProgressColors\nimport io.kanro.compose.jetbrains.color.lightScrollColors\nimport io.kanro.compose.jetbrains.color.lightSelectionColors\nimport io.kanro.compose.jetbrains.color.lightTabColors\nimport io.kanro.compose.jetbrains.color.lightTextColors\nimport io.kanro.compose.jetbrains.color.lightToolBarColors\nimport io.kanro.compose.jetbrains.control.LocalContentColor\nimport io.kanro.compose.jetbrains.control.ProvideTextStyle\nimport io.kanro.compose.jetbrains.control.darkSelectionScope\nimport io.kanro.compose.jetbrains.control.lightSelectionScope\n\n@Composable\nfun JBTheme(style: JBThemeStyle, content: @Composable () -> Unit) {\n    JBTheme(\n        style = style,\n        buttonColors = if (style == JBThemeStyle.LIGHT) lightButtonColors() else darkButtonColors(),\n        fieldColors = if (style == JBThemeStyle.LIGHT) lightFieldColors() else darkFieldColors(),\n        focusColors = if (style == JBThemeStyle.LIGHT) lightFocusColors() else darkFocusColors(),\n        panelColors = if (style == JBThemeStyle.LIGHT) lightPanelColors() else darkPanelColors(),\n        textColors = if (style == JBThemeStyle.LIGHT) lightTextColors() else darkTextColors(),\n        toolBarColors = if (style == JBThemeStyle.LIGHT) lightToolBarColors() else darkToolBarColors(),\n        progressColors = if (style == JBThemeStyle.LIGHT) lightProgressColors() else darkProgressColors(),\n        scrollColors = if (style == JBThemeStyle.LIGHT) lightScrollColors() else darkScrollColors(),\n        tabColors = if (style == JBThemeStyle.LIGHT) lightTabColors() else darkTabColors(),\n        selectionColors = if (style == JBThemeStyle.LIGHT) lightSelectionColors() else darkSelectionColors(),\n        checkBoxColors = if (style == JBThemeStyle.LIGHT) lightCheckBoxColors() else darkCheckBoxColors(),\n        iconColors = if (style == JBThemeStyle.LIGHT) lightIconColors() else darkIconColors(),\n        typography = JBTypography(),\n        iconTheme = if (style == JBThemeStyle.LIGHT) JBThemeStyle.LIGHT else JBThemeStyle.DARK,\n        selectionScope = if (style == JBThemeStyle.LIGHT) lightSelectionScope else darkSelectionScope,\n        content = content\n    )\n}\n\n@Composable\nfun JBDraculaTheme(content: @Composable () -> Unit) {\n    JBTheme(\n        style = JBThemeStyle.DARK,\n        buttonColors = darkButtonColors(),\n        fieldColors = darkFieldColors(),\n        focusColors = darkFocusColors(),\n        panelColors = darkPanelColors(),\n        textColors = darkTextColors(),\n        toolBarColors = darkToolBarColors(),\n        progressColors = darkProgressColors(),\n        scrollColors = darkScrollColors(),\n        tabColors = darkTabColors(),\n        selectionColors = darkSelectionColors(),\n        checkBoxColors = darkCheckBoxColors(),\n        iconColors = darkIconColors(),\n        typography = JBTypography(),\n        iconTheme = JBThemeStyle.DARK,\n        selectionScope = darkSelectionScope,\n        content = content\n    )\n}\n\n@Composable\nfun JBLightTheme(content: @Composable () -> Unit) {\n    JBTheme(content = content)\n}\n\n@Composable\nfun JBTheme(\n    style: JBThemeStyle = JBThemeStyle.LIGHT,\n    buttonColors: ButtonColors = lightButtonColors(),\n    fieldColors: FieldColors = lightFieldColors(),\n    focusColors: FocusColors = lightFocusColors(),\n    panelColors: PanelColors = lightPanelColors(),\n    textColors: TextColors = lightTextColors(),\n    toolBarColors: ToolBarColors = lightToolBarColors(),\n    progressColors: ProgressColors = lightProgressColors(),\n    scrollColors: ScrollColors = lightScrollColors(),\n    tabColors: TabColors = lightTabColors(),\n    selectionColors: SelectionColors = lightSelectionColors(),\n    checkBoxColors: CheckBoxColors = lightCheckBoxColors(),\n    iconColors: IconColors = lightIconColors(),\n    typography: JBTypography = JBTypography(),\n    iconTheme: JBThemeStyle = JBThemeStyle.LIGHT,\n    selectionScope: @Composable () -> Array<ProvidedValue<out Any>> = lightSelectionScope,\n    content: @Composable () -> Unit,\n) {\n    CompositionLocalProvider(\n        LocalThemeStyle provides style,\n        LocalButtonColors provides buttonColors,\n        LocalFieldColors provides fieldColors,\n        LocalFocusColors provides focusColors,\n        LocalPanelColors provides panelColors,\n        LocalTextColors provides textColors,\n        LocalToolBarColors provides toolBarColors,\n        LocalProgressColors provides progressColors,\n        LocalScrollColors provides scrollColors,\n        LocalTabColors provides tabColors,\n        LocalSelectionColors provides selectionColors,\n        LocalCheckBoxColors provides checkBoxColors,\n        LocalIconColors provides iconColors,\n        LocalTypography provides typography,\n        LocalIconTheme provides iconTheme,\n        LocalContentColor provides Color.Unspecified,\n        LocalSelectionScope provides selectionScope,\n        LocalScrollbarStyle provides scrollColors.style()\n    ) {\n        ProvideTextStyle(value = typography.default, content = content)\n    }\n}\n\nobject JBTheme {\n    val style: JBThemeStyle\n        @Composable @ReadOnlyComposable get() = LocalThemeStyle.current\n\n    val buttonColors: ButtonColors\n        @Composable @ReadOnlyComposable get() = LocalButtonColors.current\n\n    val fieldColors: FieldColors\n        @Composable @ReadOnlyComposable get() = LocalFieldColors.current\n\n    val focusColors: FocusColors\n        @Composable @ReadOnlyComposable get() = LocalFocusColors.current\n\n    val panelColors: PanelColors\n        @Composable @ReadOnlyComposable get() = LocalPanelColors.current\n\n    val textColors: TextColors\n        @Composable @ReadOnlyComposable get() = LocalTextColors.current\n\n    val toolBarColors: ToolBarColors\n        @Composable @ReadOnlyComposable get() = LocalToolBarColors.current\n\n    val progressColors: ProgressColors\n        @Composable @ReadOnlyComposable get() = LocalProgressColors.current\n\n    val scrollColors: ScrollColors\n        @Composable @ReadOnlyComposable get() = LocalScrollColors.current\n\n    val tabColors: TabColors\n        @Composable @ReadOnlyComposable get() = LocalTabColors.current\n\n    val selectionColors: SelectionColors\n        @Composable @ReadOnlyComposable get() = LocalSelectionColors.current\n\n    val checkBoxColors: CheckBoxColors\n        @Composable @ReadOnlyComposable get() = LocalCheckBoxColors.current\n\n    val iconColors: IconColors\n        @Composable @ReadOnlyComposable get() = LocalIconColors.current\n\n    val typography: JBTypography\n        @Composable @ReadOnlyComposable get() = LocalTypography.current\n\n    val iconTheme: JBThemeStyle\n        @Composable @ReadOnlyComposable get() = LocalIconTheme.current\n}\n\nenum class JBThemeStyle {\n    LIGHT, DARK\n}\n\nval LocalThemeStyle = compositionLocalOf { JBThemeStyle.LIGHT }\n\nval LocalIconTheme = compositionLocalOf { JBThemeStyle.LIGHT }\n\nval LocalSelectionScope = compositionLocalOf<@Composable () -> Array<ProvidedValue<out Any>>> {\n    lightSelectionScope\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/JBTypography.kt",
    "content": "package io.kanro.compose.jetbrains\n\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.font.FontFamily\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextDecoration\nimport androidx.compose.ui.unit.sp\n\nclass JBTypography(\n    val h0: TextStyle,\n    val h1: TextStyle,\n    val h2: TextStyle,\n    val h2Bold: TextStyle,\n    val h3: TextStyle,\n    val h3Bold: TextStyle,\n    val default: TextStyle,\n    val defaultBold: TextStyle,\n    val defaultUnderlined: TextStyle,\n    val paragraph: TextStyle,\n    val medium: TextStyle,\n    val mediumBold: TextStyle,\n    val small: TextStyle,\n    val smallUnderlined: TextStyle,\n) {\n    constructor(\n        defaultFontFamily: FontFamily = FontFamily.Default,\n        h0: TextStyle = TextStyle(\n            fontWeight = FontWeight.Medium,\n            fontSize = 25.sp\n        ),\n        h1: TextStyle = TextStyle(\n            fontWeight = FontWeight.Medium,\n            fontSize = 22.sp\n        ),\n        h2: TextStyle = TextStyle(\n            fontWeight = FontWeight.Normal,\n            fontSize = 18.sp,\n        ),\n        h2Bold: TextStyle = h2.copy(fontWeight = FontWeight.Medium),\n        h3: TextStyle = TextStyle(\n            fontWeight = FontWeight.Normal,\n            fontSize = 16.sp,\n            lineHeight = 20.sp\n        ),\n        h3Bold: TextStyle = h3.copy(fontWeight = FontWeight.Medium),\n        default: TextStyle = TextStyle(\n            fontWeight = FontWeight.Normal,\n            fontSize = 12.5.sp,\n            lineHeight = 15.sp\n        ),\n        defaultBold: TextStyle = default.copy(fontWeight = FontWeight.Medium),\n        defaultUnderlined: TextStyle = default.copy(textDecoration = TextDecoration.Underline),\n        paragraph: TextStyle = TextStyle(\n            fontWeight = FontWeight.Normal,\n            fontSize = 13.sp,\n            lineHeight = 19.sp\n        ),\n        medium: TextStyle = TextStyle(\n            fontWeight = FontWeight.Normal,\n            fontSize = 12.sp,\n            lineHeight = 15.sp\n        ),\n        mediumBold: TextStyle = medium.copy(fontWeight = FontWeight.Medium),\n        small: TextStyle = TextStyle(\n            fontWeight = FontWeight.Normal,\n            fontSize = 11.sp,\n            lineHeight = 14.sp\n        ),\n        smallUnderlined: TextStyle = small.copy(textDecoration = TextDecoration.Underline),\n    ) : this(\n        h0.withDefaultFontFamily(defaultFontFamily),\n        h1.withDefaultFontFamily(defaultFontFamily),\n        h2.withDefaultFontFamily(defaultFontFamily),\n        h2Bold.withDefaultFontFamily(defaultFontFamily),\n        h3.withDefaultFontFamily(defaultFontFamily),\n        h3Bold.withDefaultFontFamily(defaultFontFamily),\n        default.withDefaultFontFamily(defaultFontFamily),\n        defaultBold.withDefaultFontFamily(defaultFontFamily),\n        defaultUnderlined.withDefaultFontFamily(defaultFontFamily),\n        paragraph.withDefaultFontFamily(defaultFontFamily),\n        medium.withDefaultFontFamily(defaultFontFamily),\n        mediumBold.withDefaultFontFamily(defaultFontFamily),\n        small.withDefaultFontFamily(defaultFontFamily),\n        smallUnderlined.withDefaultFontFamily(defaultFontFamily)\n    )\n\n    companion object {\n        private fun TextStyle.withDefaultFontFamily(default: FontFamily): TextStyle {\n            return if (fontFamily != null) this else copy(fontFamily = default)\n        }\n    }\n}\n\nval LocalTypography = compositionLocalOf { JBTypography() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/ButtonColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.foundation.interaction.InteractionSource\nimport androidx.compose.foundation.interaction.collectIsFocusedAsState\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.rememberUpdatedState\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Brush\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.SolidColor\nimport io.kanro.compose.jetbrains.JBTheme\n\nclass ButtonColors(\n    bg: Color,\n    border: Color,\n    borderRegularFocused: Color,\n    defaultStart: Color,\n    defaultEnd: Color,\n    borderDefaultStart: Color,\n    borderDefaultEnd: Color,\n    borderDefaultFocused: Color,\n    bgDisabled: Color,\n    borderDisabled: Color,\n) {\n    var bg by mutableStateOf(bg)\n    var border by mutableStateOf(border)\n    var borderRegularFocused by mutableStateOf(borderRegularFocused)\n    var defaultStart by mutableStateOf(defaultStart)\n    var defaultEnd by mutableStateOf(defaultEnd)\n    var borderDefaultStart by mutableStateOf(borderDefaultStart)\n    var borderDefaultEnd by mutableStateOf(borderDefaultEnd)\n    var borderDefaultFocused by mutableStateOf(borderDefaultFocused)\n    var bgDisabled by mutableStateOf(bgDisabled)\n    var borderDisabled by mutableStateOf(borderDisabled)\n\n    fun copy(\n        bg: Color = this.bg,\n        border: Color = this.border,\n        borderRegularFocused: Color = this.borderRegularFocused,\n        defaultStart: Color = this.defaultStart,\n        defaultEnd: Color = this.defaultEnd,\n        borderDefaultStart: Color = this.borderDefaultStart,\n        borderDefaultEnd: Color = this.borderDefaultEnd,\n        borderDefaultFocused: Color = this.borderDefaultFocused,\n        disabled: Color = this.bgDisabled,\n        borderDisabled: Color = this.borderDisabled,\n    ): ButtonColors {\n        return ButtonColors(\n            bg,\n            border,\n            borderRegularFocused,\n            defaultStart,\n            defaultEnd,\n            borderDefaultStart,\n            borderDefaultEnd,\n            borderDefaultFocused,\n            disabled,\n            borderDisabled\n        )\n    }\n\n    @Composable\n    private fun bgStartColor(enable: Boolean, default: Boolean): State<Color> {\n        val targetValue = when {\n            !enable -> bgDisabled\n            default -> defaultStart\n            else -> bg\n        }\n        return rememberUpdatedState(targetValue)\n    }\n\n    @Composable\n    private fun bgEndColor(enable: Boolean, default: Boolean): State<Color> {\n        val targetValue = when {\n            !enable -> bgDisabled\n            default -> defaultStart\n            else -> bg\n        }\n        return rememberUpdatedState(targetValue)\n    }\n\n    @Composable\n    fun bgBrush(enable: Boolean, default: Boolean): State<Brush> {\n        val start by bgStartColor(enable, default)\n        val end by bgEndColor(enable, default)\n        val targetValue = if (start == end) {\n            SolidColor(start)\n        } else {\n            Brush.linearGradient(listOf(start, end))\n        }\n        return rememberUpdatedState(targetValue)\n    }\n\n    @Composable\n    private fun borderStartColor(enable: Boolean, default: Boolean, focused: Boolean): State<Color> {\n        val targetValue = when {\n            !enable -> borderDisabled\n            default && focused -> borderDefaultFocused\n            default -> borderDefaultStart\n            focused -> borderRegularFocused\n            else -> border\n        }\n        return rememberUpdatedState(targetValue)\n    }\n\n    @Composable\n    private fun borderEndColor(enable: Boolean, default: Boolean, focused: Boolean): State<Color> {\n        val targetValue = when {\n            !enable -> borderDisabled\n            default && focused -> borderDefaultFocused\n            default -> borderDefaultEnd\n            focused -> borderRegularFocused\n            else -> border\n        }\n        return rememberUpdatedState(targetValue)\n    }\n\n    @Composable\n    fun borderBrush(enable: Boolean, default: Boolean, interactionSource: InteractionSource): State<Brush> {\n        val focused by interactionSource.collectIsFocusedAsState()\n        val start by borderStartColor(enable, default, focused)\n        val end by borderEndColor(enable, default, focused)\n        val targetValue = if (start == end) {\n            SolidColor(start)\n        } else {\n            Brush.linearGradient(listOf(start, end))\n        }\n        return rememberUpdatedState(targetValue)\n    }\n\n    @Composable\n    fun textColor(enable: Boolean, default: Boolean): State<Color> {\n        val start by bgStartColor(enable, default)\n        val targetValue = if ((start.green + start.blue + start.red) / 3.0 > 0.6) {\n            JBTheme.textColors.default\n        } else {\n            JBTheme.textColors.white\n        }\n        return rememberUpdatedState(targetValue)\n    }\n\n    @Composable\n    fun focusingColor(enable: Boolean, interactionSource: InteractionSource): State<Color> {\n        val focused by interactionSource.collectIsFocusedAsState()\n        val targetValue = when {\n            !enable -> Color.Transparent\n            focused -> JBTheme.focusColors.default\n            else -> Color.Transparent\n        }\n        return rememberUpdatedState(targetValue)\n    }\n}\n\nfun lightButtonColors(): ButtonColors {\n    return ButtonColors(\n        Color.White,\n        Color(0xFFC4C4C4),\n        Color(0xFF87AFDA),\n        Color(0xFF528CC7), Color(0xFF4989CC),\n        Color(0xFF487EB8), Color(0xFF346DAD),\n        Color(0xFFA8CEF6),\n        Color(0xFFF2F2F2),\n        Color(0xFFCFCFCF),\n    )\n}\n\nfun darkButtonColors(): ButtonColors {\n    return ButtonColors(\n        Color(0xFF4C5052),\n        Color(0xFF5E6060),\n        Color(0xFF456A90),\n        Color(0xFF365880), Color(0xFF365880),\n        Color(0xFF4C708C), Color(0xFF4C708C),\n        Color(0xFF537699),\n        Color(0xFF3C3F41),\n        Color(0xFF646464),\n    )\n}\n\nval LocalButtonColors = compositionLocalOf { lightButtonColors() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/CheckBoxColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\n\nclass CheckBoxColors(\n    bg: Color,\n    bgSelected: Color,\n    bgDisabled: Color,\n    border: Color,\n    borderSelected: Color,\n    borderFocused: Color,\n    borderDisabled: Color,\n) {\n    var bg by mutableStateOf(bg)\n    var bgSelected by mutableStateOf(bgSelected)\n    var bgDisabled by mutableStateOf(bgDisabled)\n    var border by mutableStateOf(border)\n    var borderSelected by mutableStateOf(borderSelected)\n    var borderFocused by mutableStateOf(borderFocused)\n    var borderDisabled by mutableStateOf(borderDisabled)\n\n    fun copy(\n        bg: Color = this.bg,\n        bgSelected: Color = this.bgSelected,\n        bgDisabled: Color = this.bgDisabled,\n        border: Color = this.border,\n        borderSelected: Color = this.borderSelected,\n        borderFocused: Color = this.borderFocused,\n        borderDisabled: Color = this.borderDisabled,\n    ): CheckBoxColors {\n        return CheckBoxColors(\n            bg,\n            bgSelected,\n            bgDisabled,\n            border,\n            borderSelected,\n            borderFocused,\n            borderDisabled\n        )\n    }\n}\n\nfun lightCheckBoxColors(): CheckBoxColors {\n    return CheckBoxColors(\n        Color.White,\n        Color(0xFF4F9EE3),\n        Color(0xFFF2F2F2),\n        Color(0xFFB0B0B0),\n        Color(0xFF4B97D9),\n        Color(0xFF7B9FC7),\n        Color(0xFFBDBDBD),\n    )\n}\n\nfun darkCheckBoxColors(): CheckBoxColors {\n    return CheckBoxColors(\n        Color(0xFF43494A),\n        Color(0xFF43494A),\n        Color(0xFF3C3F41),\n        Color(0xFF6B6B6B),\n        Color(0xFF4C708C),\n        Color(0xFF43698E),\n        Color(0xFF545556),\n    )\n}\n\nval LocalCheckBoxColors = compositionLocalOf { lightCheckBoxColors() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/FieldColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.animation.animateColorAsState\nimport androidx.compose.animation.core.tween\nimport androidx.compose.foundation.interaction.InteractionSource\nimport androidx.compose.foundation.interaction.collectIsFocusedAsState\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.rememberUpdatedState\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\nimport io.kanro.compose.jetbrains.JBTheme\n\nclass FieldColors(\n    bg: Color,\n    border: Color,\n    borderFocused: Color,\n    comboboxButton: Color,\n    bgDisabled: Color,\n    borderDisabled: Color,\n    borderError: Color,\n) {\n    var bg by mutableStateOf(bg)\n    var border by mutableStateOf(border)\n    var borderFocused by mutableStateOf(borderFocused)\n    var comboboxButton by mutableStateOf(comboboxButton)\n    var bgDisabled by mutableStateOf(bgDisabled)\n    var borderDisabled by mutableStateOf(borderDisabled)\n    var borderError by mutableStateOf(borderError)\n\n    fun copy(\n        bg: Color = this.bg,\n        border: Color = this.border,\n        borderFocused: Color = this.borderFocused,\n        comboboxButton: Color = this.comboboxButton,\n        bgDisabled: Color = this.bgDisabled,\n        borderDisabled: Color = this.borderDisabled,\n        borderError: Color = this.borderError,\n    ): FieldColors {\n        return FieldColors(bg, border, borderFocused, comboboxButton, bgDisabled, borderDisabled, borderError)\n    }\n\n    @Composable\n    fun bgColor(enable: Boolean): State<Color> {\n        return rememberUpdatedState(if (enable) bg else bgDisabled)\n    }\n\n    @Composable\n    fun borderColor(enable: Boolean, error: Boolean, interactionSource: InteractionSource): State<Color> {\n        val focused by interactionSource.collectIsFocusedAsState()\n        val targetValue = when {\n            !enable -> borderDisabled\n            error -> borderError\n            focused -> borderFocused\n            else -> border\n        }\n        return if (enable) {\n            animateColorAsState(targetValue, tween(durationMillis = AnimationDuration))\n        } else {\n            rememberUpdatedState(targetValue)\n        }\n    }\n\n    @Composable\n    fun focusingColor(enable: Boolean, error: Boolean, interactionSource: InteractionSource): State<Color> {\n        val focused by interactionSource.collectIsFocusedAsState()\n        val targetValue = when {\n            !enable -> Color.Transparent\n            error -> JBTheme.focusColors.error\n            focused -> JBTheme.focusColors.default\n            else -> Color.Transparent\n        }\n        return rememberUpdatedState(targetValue)\n    }\n\n    companion object {\n        internal const val AnimationDuration = 150\n    }\n}\n\nfun lightFieldColors(): FieldColors {\n    return FieldColors(\n        Color.White,\n        Color(0xFFC4C4C4),\n        Color(0xFF87AFDA),\n        Color(0xFFFAFAFA),\n        Color(0xFFF2F2F2),\n        Color(0xFFCFCFCF),\n        Color(0xFFCE3845),\n    )\n}\n\nfun darkFieldColors(): FieldColors {\n    return FieldColors(\n        Color(0xFF4C5052),\n        Color(0xFF5E6060),\n        Color(0xFF456A90),\n        Color(0xFF3C3F41),\n        Color(0xFF3C3F41),\n        Color(0xFF646464),\n        Color(0xFF73454B),\n    )\n}\n\nval LocalFieldColors = compositionLocalOf { lightFieldColors() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/FocusColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\n\nclass FocusColors(\n    default: Color,\n    error: Color,\n    warning: Color,\n    warningInactive: Color,\n) {\n    var default by mutableStateOf(default)\n    var error by mutableStateOf(error)\n    var warning by mutableStateOf(warning)\n    var warningInactive by mutableStateOf(warningInactive)\n\n    fun copy(\n        default: Color = this.default,\n        error: Color = this.error,\n        warning: Color = this.warning,\n        warningInactive: Color = this.warningInactive,\n    ): FocusColors {\n        return FocusColors(default, error, warning, warningInactive)\n    }\n}\n\nfun lightFocusColors(): FocusColors {\n    return FocusColors(\n        Color(0xFF97C3F3),\n        Color(0xFFE53E4D),\n        Color(0xFFE1A336),\n        Color(0xFFEAD2A1),\n    )\n}\n\nfun darkFocusColors(): FocusColors {\n    return FocusColors(\n        Color(0xFF3D6185),\n        Color(0xFF8B3C3C),\n        Color(0xFFAC7920),\n        Color(0xFF6E5324),\n    )\n}\n\nval LocalFocusColors = compositionLocalOf { lightFocusColors() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/IconColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\n\nclass IconColors(\n    selected: Color,\n    disabled: Color,\n) {\n    var selected by mutableStateOf(selected)\n    var disabled by mutableStateOf(disabled)\n\n    fun copy(\n        selected: Color = this.selected,\n        disabled: Color = this.disabled,\n    ): IconColors {\n        return IconColors(\n            selected,\n            disabled,\n        )\n    }\n}\n\nfun lightIconColors(): IconColors {\n    return IconColors(\n        Color.White,\n        Color(0xFFABABAB),\n    )\n}\n\nfun darkIconColors(): IconColors {\n    return IconColors(\n        Color(0xFFFEFEFE),\n        Color(0xFFABABAB),\n    )\n}\n\nval LocalIconColors = compositionLocalOf { lightIconColors() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/PanelColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\n\nclass PanelColors(\n    border: Color,\n    bgContent: Color,\n    bgDialog: Color,\n) {\n    var border by mutableStateOf(border)\n    var bgContent by mutableStateOf(bgContent)\n    var bgDialog by mutableStateOf(bgDialog)\n\n    fun copy(\n        border: Color = this.border,\n        bgContent: Color = this.bgContent,\n        bgDialog: Color = this.bgDialog,\n    ): PanelColors {\n        return PanelColors(border, bgContent, bgDialog)\n    }\n}\n\nfun lightPanelColors(): PanelColors {\n    return PanelColors(\n        Color(0xFFD1D1D1),\n        Color.White,\n        Color(0xFFF2F2F2),\n    )\n}\n\nfun darkPanelColors(): PanelColors {\n    return PanelColors(\n        Color(0xFF323232),\n        Color(0xFF3C3F41),\n        Color(0xFF3C3F41),\n    )\n}\n\nval LocalPanelColors = compositionLocalOf { lightPanelColors() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/ProgressColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\n\nclass ProgressColors(\n    progress: Color,\n    bg: Color,\n) {\n    var progress by mutableStateOf(progress)\n    var bg by mutableStateOf(bg)\n\n    fun copy(\n        progress: Color = this.progress,\n        bg: Color = this.bg,\n    ): ProgressColors {\n        return ProgressColors(progress, bg)\n    }\n}\n\nfun lightProgressColors(): ProgressColors {\n    return ProgressColors(\n        Color(0xFF1E82E6),\n        Color(0xFFD5D5D5),\n    )\n}\n\nfun darkProgressColors(): ProgressColors {\n    return ProgressColors(\n        Color(0xFFA0A0A0),\n        Color(0xFF555555),\n    )\n}\n\nval LocalProgressColors = compositionLocalOf { lightProgressColors() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/ScrollColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.foundation.ScrollbarStyle\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\n\nclass ScrollColors(\n    bg: Color,\n) {\n    var bg by mutableStateOf(bg)\n\n    fun copy(\n        bg: Color = this.bg,\n    ): ScrollColors {\n        return ScrollColors(bg)\n    }\n\n    fun style(): ScrollbarStyle {\n        return ScrollbarStyle(\n            minimalHeight = 30.dp,\n            thickness = 7.dp,\n            shape = CircleShape,\n            hoverDurationMillis = 0,\n            unhoverColor = bg,\n            hoverColor = bg\n        )\n    }\n}\n\nfun lightScrollColors(): ScrollColors {\n    return ScrollColors(\n        Color(0xFFC9C9C9),\n    )\n}\n\nfun darkScrollColors(): ScrollColors {\n    return ScrollColors(\n        Color(0xFF494949)\n    )\n}\n\nval LocalScrollColors = compositionLocalOf { lightScrollColors() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/SelectionColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\n\nclass SelectionColors(\n    active: Color,\n    inactive: Color,\n    hover: Color,\n    lightActive: Color,\n    lightInactive: Color,\n    completionPopup: Color,\n) {\n    var active by mutableStateOf(active)\n    var inactive by mutableStateOf(inactive)\n    var hover by mutableStateOf(hover)\n    var lightActive by mutableStateOf(lightActive)\n    var lightInactive by mutableStateOf(lightInactive)\n    var completionPopup by mutableStateOf(completionPopup)\n\n    fun copy(\n        active: Color = this.active,\n        inactive: Color = this.inactive,\n        hover: Color = this.hover,\n        lightActive: Color = this.lightActive,\n        lightInactive: Color = this.lightInactive,\n        completionPopup: Color = this.completionPopup,\n    ): SelectionColors {\n        return SelectionColors(active, inactive, hover, lightActive, lightInactive, completionPopup)\n    }\n}\n\nfun lightSelectionColors(): SelectionColors {\n    return SelectionColors(\n        Color(0xFF2675BF),\n        Color(0xFFD5D5D5),\n        Color(0xFFEDF5FC),\n        Color(0xFFEDF6FE),\n        Color(0xFFF5F5F5),\n        Color(0xFFC5DFFC),\n    )\n}\n\nfun darkSelectionColors(): SelectionColors {\n    return SelectionColors(\n        Color(0xFF2F65CA),\n        Color(0xFF0D293E),\n        Color(0xFF464A4D),\n        Color(0xFF464A4D),\n        Color(0xFF35383B),\n        Color(0xFF113A5C),\n    )\n}\n\nval LocalSelectionColors = compositionLocalOf { lightSelectionColors() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/TabColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\n\nclass TabColors(\n    selection: Color,\n    focus: Color,\n    selectionInactive: Color,\n    hover: Color,\n    selectionDisabled: Color,\n    bgSelected: Color,\n) {\n    var selection by mutableStateOf(selection)\n    var focus by mutableStateOf(focus)\n    var selectionInactive by mutableStateOf(selectionInactive)\n    var hover by mutableStateOf(hover)\n    var selectionDisabled by mutableStateOf(selectionDisabled)\n    var bgSelected by mutableStateOf(bgSelected)\n\n    fun copy(\n        selection: Color = this.selection,\n        focus: Color = this.focus,\n        selectionInactive: Color = this.selectionInactive,\n        hover: Color = this.hover,\n        selectionDisabled: Color = this.selectionDisabled,\n        bgSelected: Color = this.bgSelected,\n    ): TabColors {\n        return TabColors(selection, focus, selectionInactive, hover, selectionDisabled, bgSelected)\n    }\n}\n\nfun lightTabColors(): TabColors {\n    return TabColors(\n        Color(0xFF4083C9),\n        Color(0xFFDAE4ED),\n        Color(0xFF9CA7B8),\n        Color(0x19000000),\n        Color(0xFFABABAB),\n        Color(0xFFFFFFFF),\n    )\n}\n\nfun darkTabColors(): TabColors {\n    return TabColors(\n        Color(0xFF4A88C7),\n        Color(0xFF3D4B5C),\n        Color(0xFF747A80),\n        Color(0xFF2E3133),\n        Color(0xFF595959),\n        Color(0xFF4E5254),\n    )\n}\n\nval LocalTabColors = compositionLocalOf { lightTabColors() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/TableColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\n\nclass TableColors(\n    bg: Color,\n    headerBorder: Color,\n    outerBorder: Color,\n) {\n    var bg by mutableStateOf(bg)\n    var headerBorder by mutableStateOf(headerBorder)\n    var outerBorder by mutableStateOf(outerBorder)\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/TextColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\n\nclass TextColors(\n    default: Color,\n    disabled: Color,\n    white: Color,\n    link: Color,\n    infoPanel: Color,\n    infoInput: Color,\n    error: Color,\n    success: Color,\n) {\n    var default by mutableStateOf(default)\n    var disabled by mutableStateOf(disabled)\n    var white by mutableStateOf(white)\n    var link by mutableStateOf(link)\n    var infoPanel by mutableStateOf(infoPanel)\n    var infoInput by mutableStateOf(infoInput)\n    var error by mutableStateOf(error)\n    var success by mutableStateOf(success)\n\n    fun copy(\n        default: Color = this.default,\n        disabled: Color = this.disabled,\n        white: Color = this.white,\n        link: Color = this.link,\n        infoPanel: Color = this.infoPanel,\n        infoInput: Color = this.infoInput,\n        error: Color = this.error,\n        success: Color = this.success,\n    ): TextColors {\n        return TextColors(default, disabled, white, link, infoPanel, infoInput, error, success)\n    }\n}\n\nfun lightTextColors(): TextColors {\n    return TextColors(\n        Color.Black,\n        Color(0xFF8C8C8C),\n        Color.White,\n        Color(0xFF2470B3),\n        Color(0xFF808080),\n        Color(0xFF999999),\n        Color(0xFFC7222D),\n        Color(0xFF368746),\n    )\n}\n\nfun darkTextColors(): TextColors {\n    return TextColors(\n        Color(0xFFBBBBBB),\n        Color(0xFF777777),\n        Color(0xFFFEFEFE),\n        Color(0xFF589DF6),\n        Color(0xFF8C8C8C),\n        Color(0xFF787878),\n        Color(0xFFFF5261),\n        Color(0xFF50A661),\n    )\n}\n\nval LocalTextColors = compositionLocalOf { lightTextColors() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/ToggleColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\n\nclass ToggleColors(\n    bg: Color,\n    off: Color,\n    on: Color,\n) {\n    var bg by mutableStateOf(bg)\n    var off by mutableStateOf(off)\n    var on by mutableStateOf(on)\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/color/ToolBarColors.kt",
    "content": "package io.kanro.compose.jetbrains.color\n\nimport androidx.compose.foundation.interaction.InteractionSource\nimport androidx.compose.foundation.interaction.collectIsHoveredAsState\nimport androidx.compose.foundation.interaction.collectIsPressedAsState\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.rememberUpdatedState\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.graphics.Color\n\nclass ToolBarColors(\n    buttonPressed: Color,\n    buttonHover: Color,\n    iconSplitBorder: Color,\n) {\n    var buttonPressed by mutableStateOf(buttonPressed)\n    var buttonHover by mutableStateOf(buttonHover)\n    var iconSplitBorder by mutableStateOf(iconSplitBorder)\n\n    fun copy(\n        buttonPressed: Color = this.buttonPressed,\n        buttonHover: Color = this.buttonHover,\n        iconSplitBorder: Color = this.iconSplitBorder,\n    ): ToolBarColors {\n        return ToolBarColors(buttonPressed, buttonHover, iconSplitBorder)\n    }\n\n    @Composable\n    fun actionIconBgColor(interactionSource: InteractionSource): State<Color> {\n        val pressed by interactionSource.collectIsPressedAsState()\n        val hover by interactionSource.collectIsHoveredAsState()\n        val targetValue = when {\n            pressed -> buttonPressed\n            hover -> buttonHover\n            else -> Color.Transparent\n        }\n        return rememberUpdatedState(targetValue)\n    }\n}\n\nfun lightToolBarColors(): ToolBarColors {\n    return ToolBarColors(\n        Color(0xFFCFCFCF),\n        Color(0xFFDFDFDF),\n        Color(0xFFB3B3B3),\n    )\n}\n\nfun darkToolBarColors(): ToolBarColors {\n    return ToolBarColors(\n        Color(0xFF5C6164),\n        Color(0xFF4C5052),\n        Color(0xFF6B6B6B),\n    )\n}\n\nval LocalToolBarColors = compositionLocalOf { lightToolBarColors() }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/ActionButton.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.BorderStroke\nimport androidx.compose.foundation.Indication\nimport androidx.compose.foundation.IndicationInstance\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.hoverable\nimport androidx.compose.foundation.interaction.InteractionSource\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.interaction.collectIsHoveredAsState\nimport androidx.compose.foundation.interaction.collectIsPressedAsState\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.RowScope\nimport androidx.compose.foundation.layout.defaultMinSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.clip\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.drawOutline\nimport androidx.compose.ui.graphics.drawscope.ContentDrawScope\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.JBTheme\n\nobject ActionButtonIndication : Indication {\n    private class ActionButtonIndicationInstance(\n        private val shape: Shape,\n        private val isHover: State<Boolean>,\n        private val isPressed: State<Boolean>,\n        private val hoverColor: Color,\n        private val pressedColor: Color,\n    ) : IndicationInstance {\n        override fun ContentDrawScope.drawIndication() {\n            when {\n                isPressed.value -> {\n                    val outline = shape.createOutline(size, layoutDirection, this)\n                    drawOutline(outline, pressedColor)\n                }\n\n                isHover.value -> {\n                    val outline = shape.createOutline(size, layoutDirection, this)\n                    drawOutline(outline, hoverColor)\n                }\n            }\n            drawContent()\n        }\n    }\n\n    @Composable\n    override fun rememberUpdatedInstance(interactionSource: InteractionSource): IndicationInstance {\n        val shape = remember { RoundedCornerShape(3.dp) }\n        val isPressed = interactionSource.collectIsPressedAsState()\n        val isHover = interactionSource.collectIsHoveredAsState()\n        val hoverColor = JBTheme.toolBarColors.buttonHover\n        val pressedColor = JBTheme.toolBarColors.buttonPressed\n        return remember(JBTheme.toolBarColors, interactionSource) {\n            ActionButtonIndicationInstance(\n                shape,\n                isHover,\n                isPressed,\n                hoverColor,\n                pressedColor\n            )\n        }\n    }\n}\n\nobject ActionButtonDefaults {\n    private val ButtonHorizontalPadding = 3.dp\n    private val ButtonVerticalPadding = 3.dp\n\n    val MinWidth = 22.dp\n\n    val MinHeight = 22.dp\n\n    val IconSize = 16.dp\n\n    val ContentPadding = PaddingValues(\n        start = ButtonHorizontalPadding,\n        top = ButtonVerticalPadding,\n        end = ButtonHorizontalPadding,\n        bottom = ButtonVerticalPadding\n    )\n}\n\n@Composable\nfun ActionButton(\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    background: Color = Color.Transparent,\n    indication: Indication? = ActionButtonIndication,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    shape: Shape = RoundedCornerShape(3.dp),\n    border: BorderStroke? = null,\n    contentPadding: PaddingValues = ActionButtonDefaults.ContentPadding,\n    content: @Composable RowScope.() -> Unit,\n) {\n    Box(\n        modifier\n            .then(if (border != null) Modifier.border(border, shape) else Modifier)\n            .background(\n                color = background,\n                shape = shape\n            )\n            .clip(shape)\n            .clickable(\n                interactionSource = interactionSource,\n                indication = indication,\n                enabled = enabled,\n                onClick = onClick\n            )\n            .hoverable(interactionSource, enabled),\n        propagateMinConstraints = true\n    ) {\n        CompositionLocalProvider(\n            LocalContentColor provides (if (!enabled) JBTheme.iconColors.disabled else LocalContentColor.current)\n        ) {\n            Row(\n                Modifier\n                    .defaultMinSize(\n                        minWidth = ActionButtonDefaults.MinWidth,\n                        minHeight = ActionButtonDefaults.MinHeight\n                    )\n                    .padding(contentPadding),\n                horizontalArrangement = Arrangement.Center,\n                verticalAlignment = Alignment.CenterVertically,\n                content = content\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/Button.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.focusable\nimport androidx.compose.foundation.interaction.InteractionSource\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.interaction.collectIsFocusedAsState\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.RowScope\nimport androidx.compose.foundation.layout.defaultMinSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberUpdatedState\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.drawBehind\nimport androidx.compose.ui.focus.FocusRequester\nimport androidx.compose.ui.focus.focusRequester\nimport androidx.compose.ui.geometry.CornerRadius\nimport androidx.compose.ui.geometry.RoundRect\nimport androidx.compose.ui.graphics.Brush\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.Path\nimport androidx.compose.ui.graphics.PathFillType\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.addOutline\nimport androidx.compose.ui.input.pointer.PointerEvent\nimport androidx.compose.ui.input.pointer.changedToDownIgnoreConsumed\nimport androidx.compose.ui.input.pointer.pointerInput\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.isSpecified\nimport io.kanro.compose.jetbrains.JBTheme\n\n@Stable\ninterface ButtonStyle {\n    @Composable\n    fun borderBrush(enabled: Boolean): State<Brush>\n\n    @Composable\n    fun backgroundBrush(enabled: Boolean): State<Brush>\n\n    @Composable\n    fun contentColor(enabled: Boolean): State<Color>\n\n    @Composable\n    fun focusingColor(enabled: Boolean, interactionSource: InteractionSource): State<Color>\n}\n\nprivate data class DefaultButtonStyle(\n    private val borderBrush: Brush,\n    private val backgroundBrush: Brush,\n    private val contentColor: Color,\n    private val disableBorderBrush: Brush,\n    private val disableBackgroundBrush: Brush,\n    private val disabledContentColor: Color,\n    private val focusingColor: Color,\n) : ButtonStyle {\n    @Composable\n    override fun borderBrush(enabled: Boolean): State<Brush> {\n        return rememberUpdatedState(if (enabled) borderBrush else disableBorderBrush)\n    }\n\n    @Composable\n    override fun backgroundBrush(enabled: Boolean): State<Brush> {\n        return rememberUpdatedState(if (enabled) backgroundBrush else disableBackgroundBrush)\n    }\n\n    @Composable\n    override fun contentColor(enabled: Boolean): State<Color> {\n        return rememberUpdatedState(if (enabled) contentColor else disabledContentColor)\n    }\n\n    @Composable\n    override fun focusingColor(enabled: Boolean, interactionSource: InteractionSource): State<Color> {\n        val focused by interactionSource.collectIsFocusedAsState()\n        return rememberUpdatedState(if (enabled && focused) focusingColor else Color.Transparent)\n    }\n}\n\nobject ButtonDefaults {\n    private val ButtonHorizontalPadding = 14.dp\n    private val ButtonVerticalPadding = 3.dp\n\n    val ContentPadding = PaddingValues(\n        start = ButtonHorizontalPadding,\n        top = ButtonVerticalPadding,\n        end = ButtonHorizontalPadding,\n        bottom = ButtonVerticalPadding\n    )\n\n    val MinWidth = 72.dp\n\n    val MinHeight = 24.dp\n\n    val IconSize = 16.dp\n\n    val IconSpacing = 8.dp\n\n    @Composable\n    fun buttonStyle(\n        borderBrush: Brush = Brush.verticalGradient(\n            listOf(\n                JBTheme.buttonColors.borderDefaultStart,\n                JBTheme.buttonColors.borderDefaultEnd\n            )\n        ),\n        backgroundBrush: Brush = Brush.verticalGradient(\n            listOf(\n                JBTheme.buttonColors.defaultStart,\n                JBTheme.buttonColors.defaultEnd\n            )\n        ),\n        contentColor: Color = JBTheme.contentColorFor(JBTheme.buttonColors.defaultEnd),\n        disableBorderBrush: Brush = SolidColor(JBTheme.buttonColors.borderDisabled),\n        disableBackgroundBrush: Brush = SolidColor(JBTheme.buttonColors.bgDisabled),\n        disabledContentColor: Color = JBTheme.textColors.disabled,\n        focusingColor: Color = JBTheme.focusColors.default,\n    ): ButtonStyle = DefaultButtonStyle(\n        borderBrush,\n        backgroundBrush,\n        contentColor,\n        disableBorderBrush,\n        disableBackgroundBrush,\n        disabledContentColor,\n        focusingColor\n    )\n\n    @Composable\n    fun outlineButtonStyle(\n        borderBrush: Brush = SolidColor(JBTheme.buttonColors.border),\n        backgroundBrush: Brush = SolidColor(JBTheme.buttonColors.bg),\n        contentColor: Color = JBTheme.contentColorFor(JBTheme.buttonColors.bg),\n        disableBorderBrush: Brush = SolidColor(JBTheme.buttonColors.borderDisabled),\n        disableBackgroundBrush: Brush = SolidColor(JBTheme.buttonColors.bgDisabled),\n        disabledContentColor: Color = JBTheme.textColors.disabled,\n        focusingColor: Color = JBTheme.focusColors.default,\n    ): ButtonStyle = DefaultButtonStyle(\n        borderBrush,\n        backgroundBrush,\n        contentColor,\n        disableBorderBrush,\n        disableBackgroundBrush,\n        disabledContentColor,\n        focusingColor\n    )\n}\n\n@Composable\nfun Button(\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    shape: Shape = RoundedCornerShape(3.dp),\n    borderWidth: Dp = 1.dp,\n    style: ButtonStyle = ButtonDefaults.buttonStyle(),\n    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,\n    content: @Composable RowScope.() -> Unit,\n) {\n    val focusRequester = remember { FocusRequester() }\n\n    Box(\n        modifier\n            .then(\n                if (borderWidth.isSpecified) Modifier.border(\n                    borderWidth,\n                    style.borderBrush(enabled).value,\n                    shape\n                ) else Modifier\n            )\n            .background(\n                brush = style.backgroundBrush(enabled).value,\n                shape = shape\n            )\n            .focusRequester(focusRequester)\n            .focusable(enabled, interactionSource)\n            .clickable(\n                interactionSource = interactionSource,\n                indication = null,\n                enabled = enabled,\n                onClick = onClick\n            )\n            .pointerInput(\"Fo\") {\n                this.awaitPointerEventScope {\n                    var event: PointerEvent\n                    do {\n                        event = awaitPointerEvent()\n                        if (event.changes.any { it.changedToDownIgnoreConsumed() }) {\n                            focusRequester.requestFocus()\n                        }\n                    } while (true)\n                }\n            }\n            .buttonIndicator(style.focusingColor(enabled, interactionSource).value, shape, 2.dp, 5.dp),\n        propagateMinConstraints = true\n    ) {\n        val contentColor by style.contentColor(enabled)\n        CompositionLocalProvider(\n            LocalContentAlpha provides contentColor.alpha,\n            LocalContentColor provides contentColor\n        ) {\n            ProvideTextStyle(JBTheme.typography.defaultBold) {\n                Row(\n                    Modifier\n                        .defaultMinSize(\n                            minWidth = ButtonDefaults.MinWidth,\n                            minHeight = ButtonDefaults.MinHeight\n                        )\n                        .padding(contentPadding),\n                    horizontalArrangement = Arrangement.Center,\n                    verticalAlignment = Alignment.CenterVertically,\n                    content = content\n                )\n            }\n        }\n    }\n}\n\nprivate fun Modifier.buttonIndicator(color: Color, shape: Shape, width: Dp, cornerRadius: Dp): Modifier {\n    if (color.alpha == 0f) return this\n    return drawBehind {\n        val controlOutline = shape.createOutline(size, layoutDirection, this)\n        val highlightOutline = RoundRect(controlOutline.bounds.inflate(width.toPx()), CornerRadius(cornerRadius.toPx()))\n        val highlightPath = Path().apply {\n            this.fillType = PathFillType.EvenOdd\n            addRoundRect(highlightOutline)\n            addOutline(controlOutline)\n            close()\n        }\n\n        drawPath(highlightPath, color)\n    }\n}\n\n@Composable\nfun OutlineButton(\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    shape: Shape = RoundedCornerShape(3.dp),\n    borderWidth: Dp = 1.dp,\n    style: ButtonStyle = ButtonDefaults.outlineButtonStyle(),\n    contentPadding: PaddingValues = ButtonDefaults.ContentPadding,\n    content: @Composable RowScope.() -> Unit,\n) = Button(onClick, modifier, enabled, interactionSource, shape, borderWidth, style, contentPadding, content)\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/CheckBox.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.Canvas\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.requiredSize\nimport androidx.compose.foundation.layout.wrapContentSize\nimport androidx.compose.foundation.selection.triStateToggleable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.geometry.CornerRadius\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.geometry.Size\nimport androidx.compose.ui.graphics.BlendMode\nimport androidx.compose.ui.graphics.ColorFilter\nimport androidx.compose.ui.graphics.vector.rememberVectorPainter\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.state.ToggleableState\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.JBTheme\nimport io.kanro.compose.jetbrains.icons.JBIcons\nimport io.kanro.compose.jetbrains.icons.jbicons.Actions\nimport io.kanro.compose.jetbrains.icons.jbicons.actions.Checkmark\nimport io.kanro.compose.jetbrains.icons.jbicons.actions.CheckmarkIndeterminate\n\n@Composable\nfun CheckBox(\n    checked: Boolean,\n    onCheckedChange: ((Boolean) -> Unit)?,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n) {\n    TriStateCheckbox(\n        state = ToggleableState(checked),\n        onClick = if (onCheckedChange != null) {\n            { onCheckedChange(!checked) }\n        } else null,\n        interactionSource = interactionSource,\n        enabled = enabled,\n        modifier = modifier\n    )\n}\n\n@Composable\nfun TriStateCheckbox(\n    state: ToggleableState,\n    onClick: (() -> Unit)?,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n) {\n    val toggleableModifier =\n        if (onClick != null) {\n            Modifier.triStateToggleable(\n                state = state,\n                onClick = onClick,\n                enabled = enabled,\n                role = Role.Checkbox,\n                interactionSource = interactionSource,\n                indication = null\n            )\n        } else {\n            Modifier\n        }\n\n    CheckboxImpl(\n        enabled = enabled,\n        value = state,\n        modifier = modifier\n            .then(toggleableModifier),\n    )\n}\n\n@Composable\nprivate fun CheckboxImpl(\n    enabled: Boolean,\n    value: ToggleableState,\n    modifier: Modifier,\n) {\n    val icon = when (value) {\n        ToggleableState.On -> rememberVectorPainter(JBIcons.Actions.Checkmark)\n        ToggleableState.Indeterminate -> rememberVectorPainter(JBIcons.Actions.CheckmarkIndeterminate)\n        else -> null\n    }\n    val iconFilter = if (!enabled) {\n        ColorFilter.tint(JBTheme.iconColors.disabled, BlendMode.DstIn)\n    } else null\n\n    val bg = if (enabled) {\n        when (value) {\n            ToggleableState.On, ToggleableState.Indeterminate -> JBTheme.checkBoxColors.bgSelected\n            ToggleableState.Off -> JBTheme.checkBoxColors.bg\n        }\n    } else JBTheme.checkBoxColors.bgDisabled\n\n    val border = if (enabled) {\n        when (value) {\n            ToggleableState.On, ToggleableState.Indeterminate -> JBTheme.checkBoxColors.borderSelected\n            ToggleableState.Off -> JBTheme.checkBoxColors.border\n        }\n    } else JBTheme.checkBoxColors.borderDisabled\n\n    Canvas(modifier.wrapContentSize(Alignment.Center).requiredSize(14.dp)) {\n        drawRoundRect(border, cornerRadius = CornerRadius(2.dp.toPx()))\n        drawRoundRect(\n            bg,\n            size = Size(12.dp.toPx(), 12.dp.toPx()),\n            topLeft = Offset(1.dp.toPx(), 1.dp.toPx()),\n            cornerRadius = CornerRadius(1.dp.toPx())\n        )\n        if (icon != null) {\n            with(icon) {\n                14.dp.toPx()\n                draw(Size(14.dp.toPx(), 14.dp.toPx()), colorFilter = iconFilter)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/ComboBox.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.focusable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.defaultMinSize\nimport androidx.compose.foundation.layout.fillMaxHeight\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.drawBehind\nimport androidx.compose.ui.focus.FocusRequester\nimport androidx.compose.ui.focus.focusRequester\nimport androidx.compose.ui.geometry.RoundRect\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.Path\nimport androidx.compose.ui.graphics.PathFillType\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.addOutline\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.DpOffset\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.JBThemeStyle\nimport io.kanro.compose.jetbrains.LocalIconTheme\nimport io.kanro.compose.jetbrains.icons.JBIcons\nimport io.kanro.compose.jetbrains.icons.jbicons.General\nimport io.kanro.compose.jetbrains.icons.jbicons.general.ButtonDropTriangle\nimport io.kanro.compose.jetbrains.icons.jbicons.general.ButtonDropTriangleDark\n\n@Composable\nfun <T> DropdownList(\n    items: List<T>,\n    value: T,\n    onValueChange: ((T) -> Unit)? = null,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    valueRender: (T) -> String = { it.toString() },\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    style: TextFieldStyle = TextFieldDefaults.textFieldStyle(),\n) {\n    val shape = RoundedCornerShape(3.dp)\n    val focusRequester = remember { FocusRequester() }\n    val expanded = remember { mutableStateOf(false) }\n\n    Box(\n        modifier.border(1.dp, style.borderColor(enabled, false, interactionSource).value, shape).height(24.dp)\n            .background(style.backgroundColor(enabled, interactionSource).value).focusable(enabled, interactionSource)\n            .focusRequester(focusRequester)\n            .clickable(interactionSource = interactionSource, indication = null, enabled = enabled, onClick = {\n                expanded.value = true\n                focusRequester.requestFocus()\n            }).comboBoxIndicator(style.indicatorColor(false, interactionSource).value, shape, 2.dp)\n    ) {\n        Row(verticalAlignment = Alignment.CenterVertically) {\n            Spacer(Modifier.width(6.dp))\n            Text(\n                valueRender(value),\n                Modifier.defaultMinSize(50.dp),\n                color = style.textColor(enabled, false, interactionSource).value\n            )\n            Spacer(Modifier.width(1.dp).fillMaxHeight())\n            Box(Modifier.size(22.dp), contentAlignment = Alignment.Center) {\n                val isDarkTheme = LocalIconTheme.current == JBThemeStyle.DARK\n                Icon(\n                    imageVector = if (isDarkTheme) JBIcons.General.ButtonDropTriangleDark\n                    else JBIcons.General.ButtonDropTriangle\n                )\n            }\n        }\n\n        DropdownMenu(expanded.value, offset = DpOffset(0.dp, 4.dp), onDismissRequest = {\n            expanded.value = false\n        }) {\n            items.forEach {\n                DropdownMenuItem(\n                    modifier = Modifier.defaultMinSize(79.dp, 21.dp), onClick = {\n                        expanded.value = false\n                        onValueChange?.invoke(it)\n                    }, enabled = enabled\n                ) {\n                    Text(valueRender(it), Modifier.padding(horizontal = 6.dp))\n                }\n            }\n        }\n    }\n}\n\nprivate fun Modifier.comboBoxIndicator(color: Color, shape: Shape, width: Dp): Modifier {\n    if (color.alpha == 0f) return this\n    return drawBehind {\n        val controlOutline = shape.createOutline(size, layoutDirection, this)\n        val highlightPath = Path().apply {\n            this.fillType = PathFillType.EvenOdd\n            addOutline(controlOutline)\n            val borderRect = controlOutline.bounds.inflate(width.toPx())\n            addRoundRect(RoundRect(borderRect, 4.dp.toPx(), 4.dp.toPx()))\n            close()\n        }\n        drawPath(highlightPath, color)\n    }\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/ContentAlpha.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.runtime.compositionLocalOf\n\nval LocalContentAlpha = compositionLocalOf { 1f }\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/ContentColor.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.ui.graphics.Color\nimport io.kanro.compose.jetbrains.JBTheme\n\nval LocalContentColor = compositionLocalOf { Color.Unspecified }\n\n@Composable\nfun JBTheme.contentColorFor(backgroundColor: Color): Color {\n    return if ((backgroundColor.green + backgroundColor.blue + backgroundColor.red) / 3.0 > 0.6) {\n        textColors.default\n    } else {\n        textColors.white\n    }\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/ContextMenu.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.ContextMenuData\nimport androidx.compose.foundation.ContextMenuItem\nimport androidx.compose.foundation.ContextMenuRepresentation\nimport androidx.compose.foundation.ContextMenuState\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.gestures.forEachGesture\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.IntrinsicSize\nimport androidx.compose.foundation.layout.defaultMinSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.ProvidableCompositionLocal\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.staticCompositionLocalOf\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.geometry.Rect\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.isUnspecified\nimport androidx.compose.ui.input.key.Key\nimport androidx.compose.ui.input.key.key\nimport androidx.compose.ui.input.pointer.AwaitPointerEventScope\nimport androidx.compose.ui.input.pointer.PointerEvent\nimport androidx.compose.ui.input.pointer.changedToDown\nimport androidx.compose.ui.input.pointer.isSecondaryPressed\nimport androidx.compose.ui.input.pointer.pointerInput\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.window.Popup\nimport androidx.compose.ui.window.rememberCursorPositionProvider\nimport io.kanro.compose.jetbrains.JBTheme\n\nprivate val LocalContextMenuData = staticCompositionLocalOf<ContextMenuData?> {\n    null\n}\n\n@Composable\ninternal fun ContextMenuDataProvider(\n    data: ContextMenuData,\n    content: @Composable () -> Unit,\n) {\n    CompositionLocalProvider(\n        LocalContextMenuData provides data\n    ) {\n        content()\n    }\n}\n\nprivate suspend fun AwaitPointerEventScope.awaitEventFirstDown(): PointerEvent {\n    var event: PointerEvent\n    do {\n        event = awaitPointerEvent()\n    } while (!event.changes.all { it.changedToDown() })\n    return event\n}\n\nprivate fun Modifier.contextMenuDetector(\n    state: ContextMenuState,\n    enabled: Boolean = true,\n): Modifier {\n    return if (enabled && state.status == ContextMenuState.Status.Closed) {\n        this.pointerInput(state) {\n            forEachGesture {\n                awaitPointerEventScope {\n                    val event = awaitEventFirstDown()\n                    if (event.buttons.isSecondaryPressed) {\n                        event.changes.forEach { if (it.pressed != it.previousPressed) it.consume() }\n                        state.status = ContextMenuState.Status.Open(Rect(event.changes[0].position, 0f))\n                    }\n                }\n            }\n        }\n    } else {\n        Modifier\n    }\n}\n\nval LocalContextMenuRepresentation: ProvidableCompositionLocal<ContextMenuRepresentation> = staticCompositionLocalOf {\n    JBContextMenuRepresentation(Color.Unspecified, Color.Unspecified)\n}\n\n@Composable\nfun ContextMenuArea(\n    items: () -> List<ContextMenuItem>,\n    state: ContextMenuState = remember { ContextMenuState() },\n    enabled: Boolean = true,\n    content: @Composable () -> Unit,\n) {\n    val data = ContextMenuData(items, LocalContextMenuData.current)\n\n    ContextMenuDataProvider(data) {\n        Box(Modifier.contextMenuDetector(state, enabled), propagateMinConstraints = true) {\n            content()\n        }\n        LocalContextMenuRepresentation.current.Representation(state, items)\n    }\n}\n\n@OptIn(ExperimentalComposeUiApi::class)\nclass JBContextMenuRepresentation(\n    private val backgroundColor: Color,\n    private val borderColor: Color,\n) : ContextMenuRepresentation {\n\n    @Composable\n    override fun Representation(state: ContextMenuState, items: () -> List<ContextMenuItem>) {\n        val isOpen = state.status is ContextMenuState.Status.Open\n        if (isOpen) {\n            Popup(\n                focusable = true,\n                onDismissRequest = { state.status = ContextMenuState.Status.Closed },\n                popupPositionProvider = rememberCursorPositionProvider(),\n                onKeyEvent = {\n                    if (it.key == Key.Escape) {\n                        state.status = ContextMenuState.Status.Closed\n                        true\n                    } else {\n                        false\n                    }\n                },\n            ) {\n                val backgroundColor = if (backgroundColor.isUnspecified) {\n                    JBTheme.panelColors.bgContent\n                } else backgroundColor\n                val borderColor = if (borderColor.isUnspecified) {\n                    JBTheme.panelColors.border\n                } else borderColor\n                Column(\n                    Modifier.background(backgroundColor).border(1.dp, borderColor).width(IntrinsicSize.Max)\n                ) {\n                    items().forEach {\n                        DropdownMenuItem(\n                            modifier = Modifier.defaultMinSize(79.dp, 21.dp),\n                            onClick = {\n                                it.onClick()\n                                state.status = ContextMenuState.Status.Closed\n                            },\n                        ) {\n                            Text(it.label, Modifier.padding(horizontal = 6.dp))\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/DropdownMenu.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.Indication\nimport androidx.compose.foundation.IndicationInstance\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.hoverable\nimport androidx.compose.foundation.interaction.InteractionSource\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.interaction.collectIsHoveredAsState\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.ColumnScope\nimport androidx.compose.foundation.layout.IntrinsicSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.drawscope.ContentDrawScope\nimport androidx.compose.ui.input.key.Key\nimport androidx.compose.ui.input.key.key\nimport androidx.compose.ui.platform.LocalDensity\nimport androidx.compose.ui.unit.Density\nimport androidx.compose.ui.unit.DpOffset\nimport androidx.compose.ui.unit.IntOffset\nimport androidx.compose.ui.unit.IntRect\nimport androidx.compose.ui.unit.IntSize\nimport androidx.compose.ui.unit.LayoutDirection\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.window.Popup\nimport androidx.compose.ui.window.PopupPositionProvider\nimport io.kanro.compose.jetbrains.JBTheme\nimport io.kanro.compose.jetbrains.color.LocalPanelColors\n\n@OptIn(ExperimentalComposeUiApi::class)\n@Composable\nfun DropdownMenu(\n    expanded: Boolean,\n    onDismissRequest: () -> Unit,\n    focusable: Boolean = true,\n    modifier: Modifier = Modifier,\n    offset: DpOffset = DpOffset(0.dp, 0.dp),\n    content: @Composable ColumnScope.() -> Unit,\n) {\n    if (expanded) {\n        val density = LocalDensity.current\n        val popupPositionProvider = DropdownMenuPositionProvider(\n            offset,\n            density\n        )\n\n        Popup(\n            focusable = focusable,\n            onDismissRequest = onDismissRequest,\n            popupPositionProvider = popupPositionProvider,\n            onKeyEvent = {\n                if (it.key == Key.Escape) {\n                    onDismissRequest()\n                    true\n                } else {\n                    false\n                }\n            },\n        ) {\n            val panelColor = LocalPanelColors.current\n            Column(modifier.background(panelColor.bgContent).border(1.dp, panelColor.border).width(IntrinsicSize.Max)) {\n                content()\n            }\n        }\n    }\n}\n\n@Composable\nfun DropdownMenuItem(\n    modifier: Modifier = Modifier,\n    onClick: () -> Unit,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    content: @Composable () -> Unit,\n) {\n    Box(\n        modifier\n            .clickable(\n                interactionSource = interactionSource,\n                indication = DropdownMenuItemHoverIndication,\n                enabled = enabled,\n                onClick = onClick\n            )\n            .fillMaxWidth()\n            .hoverable(interactionSource, enabled),\n        contentAlignment = Alignment.CenterStart\n    ) {\n        val isHovered = interactionSource.collectIsHoveredAsState()\n        SelectionScope(isHovered.value) {\n            content()\n        }\n    }\n}\n\nobject DropdownMenuItemHoverIndication : Indication {\n    private class HoverIndicationInstance(\n        private val isHover: State<Boolean>,\n        private val hoverColor: Color,\n    ) : IndicationInstance {\n        override fun ContentDrawScope.drawIndication() {\n            when {\n                isHover.value -> {\n                    drawRect(hoverColor, size = size)\n                }\n            }\n            drawContent()\n        }\n    }\n\n    @Composable\n    override fun rememberUpdatedInstance(interactionSource: InteractionSource): IndicationInstance {\n        val isHover = interactionSource.collectIsHoveredAsState()\n        val hoverColor = JBTheme.selectionColors.active\n        return remember(JBTheme.selectionColors, interactionSource) {\n            HoverIndicationInstance(\n                isHover,\n                hoverColor,\n            )\n        }\n    }\n}\n\ndata class DropdownMenuPositionProvider(\n    val contentOffset: DpOffset,\n    val density: Density,\n    val onPositionCalculated: (IntRect, IntRect) -> Unit = { _, _ -> },\n) : PopupPositionProvider {\n    override fun calculatePosition(\n        anchorBounds: IntRect,\n        windowSize: IntSize,\n        layoutDirection: LayoutDirection,\n        popupContentSize: IntSize,\n    ): IntOffset {\n        // The min margin above and below the menu, relative to the screen.\n        val verticalMargin = with(density) { 0 }\n        // The content offset specified using the dropdown offset parameter.\n        val contentOffsetX = with(density) { contentOffset.x.roundToPx() }\n        val contentOffsetY = with(density) { contentOffset.y.roundToPx() }\n\n        // Compute horizontal position.\n        val toRight = anchorBounds.left + contentOffsetX\n        val toLeft = anchorBounds.right - contentOffsetX - popupContentSize.width\n        val toDisplayRight = windowSize.width - popupContentSize.width\n        val toDisplayLeft = 0\n        val x = if (layoutDirection == LayoutDirection.Ltr) {\n            sequenceOf(toRight, toLeft, toDisplayRight)\n        } else {\n            sequenceOf(toLeft, toRight, toDisplayLeft)\n        }.firstOrNull {\n            it >= 0 && it + popupContentSize.width <= windowSize.width\n        } ?: toLeft\n\n        // Compute vertical position.\n        val toBottom = maxOf(anchorBounds.bottom + contentOffsetY, verticalMargin)\n        val toTop = anchorBounds.top - contentOffsetY - popupContentSize.height\n        val toCenter = anchorBounds.top - popupContentSize.height / 2\n        val toDisplayBottom = windowSize.height - popupContentSize.height - verticalMargin\n        var y = sequenceOf(toBottom, toTop, toCenter, toDisplayBottom).firstOrNull {\n            it >= verticalMargin &&\n                    it + popupContentSize.height <= windowSize.height - verticalMargin\n        } ?: toTop\n\n        // Desktop specific vertical position checking\n        val aboveAnchor = anchorBounds.top + contentOffsetY\n        val belowAnchor = windowSize.height - anchorBounds.bottom - contentOffsetY\n\n        if (belowAnchor >= aboveAnchor) {\n            y = anchorBounds.bottom + contentOffsetY\n        }\n\n        if (y + popupContentSize.height > windowSize.height) {\n            y = windowSize.height - popupContentSize.height\n        }\n\n        if (y < 0) {\n            y = 0\n        }\n\n        onPositionCalculated(\n            anchorBounds,\n            IntRect(x, y, x + popupContentSize.width, y + popupContentSize.height)\n        )\n        return IntOffset(x, y)\n    }\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/EmbeddedTextField.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.interaction.InteractionSource\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.interaction.collectIsFocusedAsState\nimport androidx.compose.foundation.text.KeyboardActions\nimport androidx.compose.foundation.text.KeyboardOptions\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberUpdatedState\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.drawBehind\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.Path\nimport androidx.compose.ui.graphics.PathFillType\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.addOutline\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.input.VisualTransformation\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.dp\n\n@Composable\nfun EmbeddedTextField(\n    value: String,\n    onValueChange: (String) -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    readOnly: Boolean = false,\n    textStyle: TextStyle = LocalTextStyle.current,\n    placeholder: @Composable (() -> Unit)? = null,\n    leadingIcon: @Composable (() -> Unit)? = null,\n    trailingIcon: @Composable (() -> Unit)? = null,\n    isError: Boolean = false,\n    visualTransformation: VisualTransformation = VisualTransformation.None,\n    keyboardOptions: KeyboardOptions = KeyboardOptions.Default,\n    keyboardActions: KeyboardActions = KeyboardActions.Default,\n    singleLine: Boolean = true,\n    maxLines: Int = 1,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    shape: Shape = RectangleShape,\n    style: TextFieldStyle = TextFieldDefaults.textFieldStyle(),\n) {\n    TextField(\n        value,\n        onValueChange,\n        modifier.embeddedTextFieldIndicator(style.indicatorColor(isError, interactionSource).value, shape, 2.dp),\n        enabled,\n        readOnly,\n        textStyle,\n        placeholder,\n        leadingIcon,\n        trailingIcon,\n        isError,\n        visualTransformation,\n        keyboardOptions,\n        keyboardActions,\n        singleLine,\n        maxLines,\n        interactionSource,\n        shape,\n        InnerStyle(style)\n    )\n}\n\nprivate class InnerStyle(val style: TextFieldStyle) : TextFieldStyle {\n    @Composable\n    override fun textColor(enabled: Boolean, isError: Boolean, interactionSource: InteractionSource): State<Color> {\n        val focused by interactionSource.collectIsFocusedAsState()\n\n        return if (focused) style.textColor(\n            enabled,\n            isError,\n            interactionSource\n        ) else rememberUpdatedState(Color.Unspecified)\n    }\n\n    @Composable\n    override fun backgroundColor(enabled: Boolean, interactionSource: InteractionSource): State<Color> {\n        val focused by interactionSource.collectIsFocusedAsState()\n\n        return if (focused) style.backgroundColor(\n            enabled,\n            interactionSource\n        ) else rememberUpdatedState(Color.Transparent)\n    }\n\n    @Composable\n    override fun placeholderColor(enabled: Boolean): State<Color> {\n        return style.placeholderColor(enabled)\n    }\n\n    @Composable\n    override fun borderColor(enabled: Boolean, isError: Boolean, interactionSource: InteractionSource): State<Color> {\n        return rememberUpdatedState(Color.Transparent)\n    }\n\n    @Composable\n    override fun indicatorColor(isError: Boolean, interactionSource: InteractionSource): State<Color> {\n        return rememberUpdatedState(Color.Transparent)\n    }\n\n    @Composable\n    override fun cursorColor(isError: Boolean): State<Color> {\n        return style.cursorColor(isError)\n    }\n}\n\nprivate fun Modifier.embeddedTextFieldIndicator(color: Color, shape: Shape, width: Dp): Modifier {\n    if (color.alpha == 0f) return this\n    return drawBehind {\n        val controlOutline = shape.createOutline(size, layoutDirection, this)\n        val highlightPath = Path().apply {\n            this.fillType = PathFillType.EvenOdd\n            addOutline(controlOutline)\n            addRect(controlOutline.bounds.deflate(width.toPx()))\n            close()\n        }\n        drawPath(highlightPath, color)\n    }\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/Icon.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.paint\nimport androidx.compose.ui.geometry.Size\nimport androidx.compose.ui.graphics.ColorFilter\nimport androidx.compose.ui.graphics.ImageBitmap\nimport androidx.compose.ui.graphics.isSpecified\nimport androidx.compose.ui.graphics.painter.BitmapPainter\nimport androidx.compose.ui.graphics.painter.Painter\nimport androidx.compose.ui.graphics.toolingGraphicsLayer\nimport androidx.compose.ui.graphics.vector.ImageVector\nimport androidx.compose.ui.graphics.vector.rememberVectorPainter\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.semantics.contentDescription\nimport androidx.compose.ui.semantics.role\nimport androidx.compose.ui.semantics.semantics\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.JBThemeStyle\nimport io.kanro.compose.jetbrains.LocalIconTheme\n\n@Composable\nfun Icon(\n    resource: String,\n    contentDescription: String? = null,\n    modifier: Modifier = Modifier,\n    colorFilter: ColorFilter? = null,\n) {\n    Icon(\n        themedSvgResource(resource, LocalIconTheme.current), contentDescription, modifier,\n        colorFilter = colorFilter,\n    )\n}\n\n@Composable\nfun Icon(\n    bitmap: ImageBitmap,\n    contentDescription: String? = null,\n    modifier: Modifier = Modifier,\n    colorFilter: ColorFilter? = null,\n) {\n    val painter = remember(bitmap) { BitmapPainter(bitmap) }\n    Icon(\n        painter = painter,\n        contentDescription = contentDescription,\n        modifier = modifier,\n        colorFilter = colorFilter,\n    )\n}\n\n@Composable\nfun Icon(\n    imageVector: ImageVector,\n    contentDescription: String? = null,\n    modifier: Modifier = Modifier,\n    colorFilter: ColorFilter? = null,\n) {\n    Icon(\n        painter = rememberVectorPainter(imageVector),\n        contentDescription = contentDescription,\n        modifier = modifier,\n        colorFilter = colorFilter,\n    )\n}\n\n@Composable\nfun Icon(\n    painter: Painter,\n    contentDescription: String? = null,\n    modifier: Modifier = Modifier,\n    colorFilter: ColorFilter? = null,\n) {\n    val semantics = if (contentDescription != null) {\n        Modifier.semantics {\n            this.contentDescription = contentDescription\n            this.role = Role.Image\n        }\n    } else {\n        Modifier\n    }\n    val filter = colorFilter ?: run {\n        if (LocalContentColor.current.isSpecified) {\n            ColorFilter.tint(LocalContentColor.current.copy(alpha = LocalContentAlpha.current))\n        } else {\n            null\n        }\n    }\n    Box(\n        modifier.toolingGraphicsLayer().defaultSizeFor(painter)\n            .paint(\n                painter,\n                contentScale = ContentScale.None,\n                colorFilter = filter\n            )\n            .then(semantics)\n    )\n}\n\n@Composable\nfun themedSvgResource(resource: String, theme: JBThemeStyle = LocalIconTheme.current): Painter {\n    var realResource = resource\n    if (theme == JBThemeStyle.DARK) {\n        if (!realResource.endsWith(\"_dark.svg\")) {\n            val dark = realResource.replace(\".svg\", \"_dark.svg\")\n            if (Thread.currentThread().contextClassLoader.getResource(dark) != null) {\n                realResource = dark\n            }\n        }\n    } else {\n        if (realResource.endsWith(\"_dark.svg\")) {\n            val light = realResource.replace(\"_dark.svg\", \".svg\")\n            if (Thread.currentThread().contextClassLoader.getResource(light) != null) {\n                realResource = light\n            }\n        }\n    }\n    return painterResource(realResource)\n}\n\nprivate fun Modifier.defaultSizeFor(painter: Painter) =\n    this.then(\n        if (painter.intrinsicSize == Size.Unspecified || painter.intrinsicSize.isInfinite()) {\n            DefaultIconSizeModifier\n        } else {\n            Modifier\n        }\n    )\n\nprivate fun Size.isInfinite() = width.isInfinite() && height.isInfinite()\n\nprivate val DefaultIconSizeModifier = Modifier.size(16.dp)\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/JBToolBar.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.gestures.Orientation\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.JBTheme\n\n@Composable\nfun JBToolBar(\n    orientation: Orientation,\n    arrangement: Arrangement.HorizontalOrVertical = Arrangement.spacedBy(8.dp),\n    modifier: Modifier = Modifier,\n    content: @Composable () -> Unit,\n) {\n    CompositionLocalProvider(\n        LocalToolBarOrientation provides orientation,\n    ) {\n        when (orientation) {\n            Orientation.Vertical -> JBToolBarColumn(\n                modifier.width(28.dp),\n                verticalArrangement = arrangement,\n                content = content\n            )\n\n            Orientation.Horizontal -> JBToolBarRow(\n                modifier.height(28.dp),\n                horizontalArrangement = arrangement,\n                content = content\n            )\n        }\n    }\n}\n\n@Composable\nprivate fun JBToolBarColumn(\n    modifier: Modifier,\n    verticalArrangement: Arrangement.Vertical = Arrangement.spacedBy(8.dp),\n    content: @Composable () -> Unit,\n) {\n    Column(\n        modifier,\n        verticalArrangement,\n        Alignment.CenterHorizontally,\n    ) {\n        content()\n    }\n}\n\n@Composable\nprivate fun JBToolBarRow(\n    modifier: Modifier,\n    horizontalArrangement: Arrangement.Horizontal = Arrangement.spacedBy(8.dp),\n    content: @Composable () -> Unit,\n) {\n    Row(\n        modifier,\n        horizontalArrangement,\n        Alignment.CenterVertically,\n    ) {\n        content()\n    }\n}\n\nval LocalToolBarOrientation = compositionLocalOf { Orientation.Horizontal }\n\n@Composable\nfun ToolBarSeparator(modifier: Modifier = Modifier, color: Color = JBTheme.toolBarColors.iconSplitBorder) {\n    val orientation = LocalToolBarOrientation.current\n    Spacer(\n        modifier = modifier.run {\n            when (orientation) {\n                Orientation.Vertical -> size(20.dp, 1.dp)\n                Orientation.Horizontal -> size(1.dp, 20.dp)\n            }\n        }.background(color)\n    )\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/JBTree.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.ExperimentalFoundationApi\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.combinedClickable\nimport androidx.compose.foundation.hoverable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.ProvidableCompositionLocal\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.graphicsLayer\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.JBTheme\nimport io.kanro.compose.jetbrains.JBThemeStyle\nimport io.kanro.compose.jetbrains.LocalIconTheme\nimport io.kanro.compose.jetbrains.icons.JBIcons\nimport io.kanro.compose.jetbrains.icons.jbicons.Actions\nimport io.kanro.compose.jetbrains.icons.jbicons.actions.ArrowExpand\nimport io.kanro.compose.jetbrains.icons.jbicons.actions.ArrowExpandDark\n\n@Composable\nfun JBTreeItem(\n    modifier: Modifier = Modifier,\n    selected: Boolean,\n    onClick: () -> Unit,\n    content: @Composable () -> Unit,\n) {\n    JBTreeBasicItem(modifier, selected, onClick) {\n        Box(Modifier.padding(start = 16.dp)) {\n            content()\n        }\n    }\n}\n\n@Composable\nfun JBTreeItem(\n    modifier: Modifier = Modifier,\n    selected: Boolean,\n    onClick: () -> Unit,\n    expanded: Boolean,\n    expanding: (Boolean) -> Unit,\n    content: @Composable () -> Unit,\n    children: @Composable () -> Unit,\n) {\n    Column(modifier) {\n        JBTreeBasicItem(\n            modifier, selected, onClick = onClick,\n            onDoubleClick = {\n                expanding(!expanded)\n                onClick()\n            }\n        ) {\n            Row {\n                val isDarkTheme = LocalIconTheme.current == JBThemeStyle.DARK\n                Icon(\n                    imageVector = if (isDarkTheme) JBIcons.Actions.ArrowExpandDark else JBIcons.Actions.ArrowExpand,\n                    modifier = Modifier.size(16.dp).clickable(\n                        interactionSource = remember { MutableInteractionSource() },\n                        indication = null\n                    ) {\n                        expanding(!expanded)\n                        onClick()\n                    }.graphicsLayer(rotationZ = if (expanded) 90f else 0f).align(Alignment.CenterVertically)\n                )\n                Box {\n                    content()\n                }\n            }\n        }\n        if (expanded) {\n            CompositionLocalProvider(\n                LocalTreeLevel provides LocalTreeLevel.current + 1,\n                content = children\n            )\n        }\n    }\n}\n\n@Composable\n@OptIn(ExperimentalFoundationApi::class)\ninternal fun JBTreeBasicItem(\n    modifier: Modifier = Modifier,\n    selected: Boolean = false,\n    onClick: () -> Unit,\n    onDoubleClick: (() -> Unit)? = null,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    content: @Composable () -> Unit,\n) {\n    val padding = 7 + (LocalTreeLevel.current - 1) * 18\n    Box(\n        Modifier.combinedClickable(\n            interactionSource,\n            indication = ListItemHoverIndication,\n            onDoubleClick = onDoubleClick,\n            onClick = onClick\n        ).then(modifier)\n            .height(20.dp)\n            .run {\n                if (selected) {\n                    background(color = JBTheme.selectionColors.active)\n                } else {\n                    this\n                }\n            }.hoverable(interactionSource),\n    ) {\n        SelectionScope(selected) {\n            Box(Modifier.padding(start = padding.dp)) {\n                content()\n            }\n        }\n    }\n}\n\n@Composable\nfun JBTreeList(\n    modifier: Modifier = Modifier,\n    content: @Composable () -> Unit,\n) {\n    Column(modifier) {\n        content()\n    }\n}\n\nval LocalTreeLevel: ProvidableCompositionLocal<Int> = compositionLocalOf {\n    1\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/JPanel.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.BoxScope\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.drawWithCache\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.geometry.Rect\nimport androidx.compose.ui.geometry.Size\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.JBTheme\n\n@Composable\nfun JPanel(\n    modifier: Modifier = Modifier,\n    content: @Composable BoxScope.() -> Unit,\n) {\n    Box(modifier.background(JBTheme.panelColors.bgDialog)) {\n        content()\n    }\n}\n\n@Composable\nfun JPanelBorder(modifier: Modifier = Modifier) {\n    Spacer(modifier.background(JBTheme.panelColors.border))\n}\n\nfun Modifier.jBorder(all: Dp = 0.dp, color: Color): Modifier {\n    return jBorder(all, all, all, all, color)\n}\n\nfun Modifier.jBorder(\n    horizontal: Dp = 0.dp,\n    vertical: Dp = 0.dp,\n    color: Color,\n): Modifier {\n    return jBorder(horizontal, horizontal, vertical, vertical, color)\n}\n\nfun Modifier.jBorder(\n    start: Dp = 0.dp,\n    end: Dp = 0.dp,\n    top: Dp = 0.dp,\n    bottom: Dp = 0.dp,\n    color: Color,\n): Modifier {\n    return drawWithCache {\n        onDrawWithContent {\n            drawContent()\n            var rect = Rect(Offset.Zero, size)\n\n            if (start.roundToPx() > 0) {\n                drawRect(color, rect.topLeft, Size(start.toPx(), rect.height))\n                rect = Rect(rect.left + start.roundToPx(), rect.top, rect.right, rect.bottom)\n            }\n\n            if (end.roundToPx() > 0) {\n                drawRect(color, Offset(rect.right - end.toPx(), rect.top), Size(end.toPx(), rect.height))\n                rect = Rect(rect.left, rect.top, rect.right - end.roundToPx(), rect.bottom)\n            }\n\n            if (top.roundToPx() > 0) {\n                drawRect(color, rect.topLeft, Size(rect.width, top.toPx()))\n                rect = Rect(rect.left, rect.top + top.roundToPx(), rect.right, rect.bottom)\n            }\n\n            if (bottom.roundToPx() > 0) {\n                drawRect(color, Offset(rect.left, rect.bottom - bottom.toPx()), Size(rect.width, bottom.toPx()))\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/ListView.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.Indication\nimport androidx.compose.foundation.IndicationInstance\nimport androidx.compose.foundation.interaction.InteractionSource\nimport androidx.compose.foundation.interaction.collectIsHoveredAsState\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.drawscope.ContentDrawScope\nimport io.kanro.compose.jetbrains.JBTheme\n\nobject ListItemHoverIndication : Indication {\n    private class HoverIndicationInstance(\n        private val isHover: State<Boolean>,\n        private val hoverColor: Color,\n    ) : IndicationInstance {\n        override fun ContentDrawScope.drawIndication() {\n            if (isHover.value) {\n                drawRect(hoverColor, size = size)\n            }\n            drawContent()\n        }\n    }\n\n    @Composable\n    override fun rememberUpdatedInstance(interactionSource: InteractionSource): IndicationInstance {\n        val isHover = interactionSource.collectIsHoveredAsState()\n        val hoverColor = JBTheme.selectionColors.hover\n\n        return remember(JBTheme.selectionColors, interactionSource) {\n            HoverIndicationInstance(\n                isHover, hoverColor\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/ProgressBar.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.animation.core.animateFloat\nimport androidx.compose.animation.core.infiniteRepeatable\nimport androidx.compose.animation.core.keyframes\nimport androidx.compose.animation.core.rememberInfiniteTransition\nimport androidx.compose.foundation.Canvas\nimport androidx.compose.foundation.focusable\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.progressSemantics\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.graphics.Brush\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.StrokeCap\nimport androidx.compose.ui.graphics.TileMode\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.JBTheme\n\n@Composable\nfun ProgressBar(\n    progress: Float,\n    modifier: Modifier = Modifier,\n) {\n    val bgColor = JBTheme.progressColors.bg\n    val progressColor = JBTheme.progressColors.progress\n    Canvas(\n        modifier\n            .progressSemantics(progress)\n            .size(200.dp, 4.dp)\n            .focusable()\n    ) {\n        val strokeWidth = size.height\n        val length = size.width\n\n        drawLine(\n            bgColor,\n            Offset(0f, strokeWidth / 2f),\n            Offset(length, strokeWidth / 2f),\n            strokeWidth,\n            cap = StrokeCap.Round\n        )\n        drawLine(\n            progressColor,\n            Offset(0f, strokeWidth / 2f),\n            Offset(length * progress, strokeWidth / 2f),\n            strokeWidth,\n            cap = StrokeCap.Round\n        )\n    }\n}\n\n@Composable\nfun ProgressBar(\n    modifier: Modifier = Modifier,\n) {\n    val transition = rememberInfiniteTransition()\n    val currentOffset by transition.animateFloat(\n        0f,\n        1f,\n        infiniteRepeatable(\n            animation = keyframes {\n                durationMillis = 1000\n            }\n        )\n    )\n    val progressColor = JBTheme.progressColors.progress\n\n    Canvas(\n        modifier\n            .progressSemantics()\n            .size(200.dp, 4.dp)\n            .focusable()\n    ) {\n        val strokeWidth = size.height\n        val length = size.width\n        val offset = currentOffset * 80f\n        val brush = Brush.linearGradient(\n            listOf(\n                Color(0x00FFFFFF), Color(0x7FFFFFFF), Color(0x00FFFFFF)\n            ),\n            start = Offset(offset, 0f),\n            end = Offset(offset + 80f, 0f),\n            tileMode = TileMode.Repeated\n        )\n        drawLine(\n            progressColor,\n            Offset(0f, strokeWidth / 2f),\n            Offset(length, strokeWidth / 2f),\n            strokeWidth,\n            cap = StrokeCap.Round\n        )\n        drawLine(\n            brush,\n            Offset(0f, strokeWidth / 2f),\n            Offset(length, strokeWidth / 2f),\n            strokeWidth,\n            cap = StrokeCap.Round\n        )\n    }\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/Selection.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.RowScope\nimport androidx.compose.foundation.selection.selectable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.ProvidedValue\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.drawWithContent\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.semantics.Role\nimport io.kanro.compose.jetbrains.JBTheme\nimport io.kanro.compose.jetbrains.JBThemeStyle\nimport io.kanro.compose.jetbrains.LocalIconTheme\nimport io.kanro.compose.jetbrains.LocalSelectionScope\nimport io.kanro.compose.jetbrains.color.LocalTextColors\n\nval emptySelectionScope = emptyArray<ProvidedValue<out Any>>()\n\nval lightSelectionScope: @Composable () -> Array<ProvidedValue<out Any>> = {\n    arrayOf(\n        LocalIconTheme provides JBThemeStyle.DARK,\n        LocalTextColors provides JBTheme.textColors.copy(\n            infoInput = Color.White\n        ),\n        LocalContentColor provides Color.White,\n        LocalContentAlpha provides 1.0f,\n        LocalContextMenuRepresentation provides JBContextMenuRepresentation(\n            JBTheme.panelColors.bgContent, JBTheme.panelColors.border\n        )\n    )\n}\n\nval darkSelectionScope: @Composable () -> Array<ProvidedValue<out Any>> = {\n    arrayOf(\n        LocalIconTheme provides JBThemeStyle.DARK,\n        LocalTextColors provides JBTheme.textColors.copy(\n            infoInput = Color.White\n        ),\n        LocalContentColor provides Color.White,\n        LocalContentAlpha provides 1.0f,\n        LocalContextMenuRepresentation provides JBContextMenuRepresentation(\n            JBTheme.panelColors.bgContent, JBTheme.panelColors.border\n        )\n    )\n}\n\n@Composable\nfun SelectionScope(selected: Boolean, block: @Composable () -> Unit) {\n    CompositionLocalProvider(* if (selected) LocalSelectionScope.current() else emptySelectionScope) {\n        block()\n    }\n}\n\n@Composable\nfun SelectionRow(\n    selected: Boolean,\n    modifier: Modifier = Modifier,\n    horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,\n    verticalAlignment: Alignment.Vertical = Alignment.Top,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    role: Role? = null,\n    onClick: () -> Unit,\n    content: @Composable RowScope.() -> Unit,\n) {\n    SelectionScope(selected) {\n        val selectedColor = JBTheme.selectionColors.active\n        Row(\n            modifier = modifier.background(color = JBTheme.panelColors.bgContent).selectable(\n                selected = selected,\n                interactionSource = interactionSource,\n                indication = ListItemHoverIndication,\n                onClick = onClick,\n                role = role\n            ).drawWithContent {\n                if (selected) {\n                    drawRect(selectedColor, size = size)\n                }\n                drawContent()\n            },\n            horizontalArrangement = horizontalArrangement, verticalAlignment = verticalAlignment, content = content\n        )\n    }\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/Tab.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.Indication\nimport androidx.compose.foundation.IndicationInstance\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.hoverable\nimport androidx.compose.foundation.interaction.InteractionSource\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.interaction.collectIsHoveredAsState\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.BoxScope\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.selection.selectable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.drawWithContent\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.geometry.Size\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.drawscope.ContentDrawScope\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.JBTheme\n\nobject TabIndication : Indication {\n    private class TabIndicationInstance(\n        private val isHover: State<Boolean>,\n        private val hoverColor: Color,\n    ) : IndicationInstance {\n        override fun ContentDrawScope.drawIndication() {\n            if (isHover.value) {\n                drawRect(hoverColor, Offset.Zero, size)\n            }\n            drawContent()\n        }\n    }\n\n    @Composable\n    override fun rememberUpdatedInstance(interactionSource: InteractionSource): IndicationInstance {\n        val isHover = interactionSource.collectIsHoveredAsState()\n        val hoverColor = JBTheme.tabColors.hover\n\n        return remember(JBTheme.tabColors, interactionSource) {\n            TabIndicationInstance(\n                isHover,\n                hoverColor,\n            )\n        }\n    }\n}\n\n@Composable\nfun Tab(\n    selected: Boolean,\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    content: @Composable BoxScope.() -> Unit,\n) {\n    val selectionColor = JBTheme.tabColors.selection\n    Box(\n        modifier\n            .hoverable(interactionSource)\n            .height(28.dp)\n            .run {\n                if (selected) {\n                    background(JBTheme.tabColors.bgSelected)\n                } else {\n                    this\n                }\n            }\n            .drawWithContent {\n                drawContent()\n                if (selected) {\n                    val height = 3.dp.toPx()\n                    drawRect(\n                        selectionColor,\n                        Offset(0f, size.height - height),\n                        Size(size.width, height)\n                    )\n                }\n            }.selectable(\n                selected = selected,\n                onClick = onClick,\n                enabled = enabled,\n                role = Role.Tab,\n                interactionSource = interactionSource,\n                indication = TabIndication\n            ),\n        propagateMinConstraints = true,\n        contentAlignment = Alignment.Center,\n        content = content\n    )\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/Text.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.text.BasicText\nimport androidx.compose.foundation.text.InlineTextContent\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.structuralEqualityPolicy\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.takeOrElse\nimport androidx.compose.ui.text.AnnotatedString\nimport androidx.compose.ui.text.TextLayoutResult\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.font.FontFamily\nimport androidx.compose.ui.text.font.FontStyle\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.text.style.TextDecoration\nimport androidx.compose.ui.text.style.TextOverflow\nimport androidx.compose.ui.unit.TextUnit\nimport io.kanro.compose.jetbrains.color.LocalTextColors\nimport io.kanro.compose.jetbrains.color.TextColors\n\n@Composable\nfun Text(\n    text: String,\n    modifier: Modifier = Modifier,\n    color: Color = Color.Unspecified,\n    fontSize: TextUnit = TextUnit.Unspecified,\n    fontStyle: FontStyle? = null,\n    fontWeight: FontWeight? = null,\n    fontFamily: FontFamily? = null,\n    letterSpacing: TextUnit = TextUnit.Unspecified,\n    textDecoration: TextDecoration? = null,\n    textAlign: TextAlign? = null,\n    lineHeight: TextUnit = TextUnit.Unspecified,\n    overflow: TextOverflow = TextOverflow.Clip,\n    softWrap: Boolean = true,\n    maxLines: Int = Int.MAX_VALUE,\n    onTextLayout: (TextLayoutResult) -> Unit = {},\n    style: TextStyle = LocalTextStyle.current,\n    textColors: TextColors = LocalTextColors.current,\n) {\n    Text(\n        AnnotatedString(text),\n        modifier,\n        color,\n        fontSize,\n        fontStyle,\n        fontWeight,\n        fontFamily,\n        letterSpacing,\n        textDecoration,\n        textAlign,\n        lineHeight,\n        overflow,\n        softWrap,\n        maxLines,\n        emptyMap(),\n        onTextLayout,\n        style,\n        textColors,\n    )\n}\n\n@Composable\nfun Text(\n    text: AnnotatedString,\n    modifier: Modifier = Modifier,\n    color: Color = Color.Unspecified,\n    fontSize: TextUnit = TextUnit.Unspecified,\n    fontStyle: FontStyle? = null,\n    fontWeight: FontWeight? = null,\n    fontFamily: FontFamily? = null,\n    letterSpacing: TextUnit = TextUnit.Unspecified,\n    textDecoration: TextDecoration? = null,\n    textAlign: TextAlign? = null,\n    lineHeight: TextUnit = TextUnit.Unspecified,\n    overflow: TextOverflow = TextOverflow.Clip,\n    softWrap: Boolean = true,\n    maxLines: Int = Int.MAX_VALUE,\n    inlineContent: Map<String, InlineTextContent> = mapOf(),\n    onTextLayout: (TextLayoutResult) -> Unit = {},\n    style: TextStyle = LocalTextStyle.current,\n    textColors: TextColors = LocalTextColors.current,\n) {\n    val textColor = color.takeOrElse {\n        style.color.takeOrElse {\n            LocalContentColor.current.takeOrElse {\n                textColors.default\n            }.copy(alpha = LocalContentAlpha.current)\n        }\n    }\n    val mergedStyle = style.merge(\n        TextStyle(\n            color = textColor,\n            fontSize = fontSize,\n            fontWeight = fontWeight,\n            textAlign = textAlign,\n            lineHeight = lineHeight,\n            fontFamily = fontFamily,\n            textDecoration = textDecoration,\n            fontStyle = fontStyle,\n            letterSpacing = letterSpacing,\n        ),\n    )\n    BasicText(\n        text = text,\n        modifier = modifier,\n        style = mergedStyle,\n        onTextLayout = onTextLayout,\n        overflow = overflow,\n        softWrap = softWrap,\n        maxLines = maxLines,\n        minLines = 1,\n        inlineContent = inlineContent,\n    )\n}\n\nval LocalTextStyle = compositionLocalOf(structuralEqualityPolicy()) { TextStyle.Default }\n\n@Composable\nfun ProvideTextStyle(value: TextStyle, content: @Composable () -> Unit) {\n    val mergedStyle = LocalTextStyle.current.merge(value)\n    CompositionLocalProvider(LocalTextStyle provides mergedStyle, content = content)\n}\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/control/TextField.kt",
    "content": "package io.kanro.compose.jetbrains.control\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.interaction.InteractionSource\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.interaction.collectIsFocusedAsState\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.defaultMinSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.text.BasicTextField\nimport androidx.compose.foundation.text.KeyboardActions\nimport androidx.compose.foundation.text.KeyboardOptions\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberUpdatedState\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.drawBehind\nimport androidx.compose.ui.geometry.CornerRadius\nimport androidx.compose.ui.geometry.RoundRect\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.Path\nimport androidx.compose.ui.graphics.PathFillType\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.addOutline\nimport androidx.compose.ui.graphics.takeOrElse\nimport androidx.compose.ui.layout.Layout\nimport androidx.compose.ui.layout.Placeable\nimport androidx.compose.ui.layout.layoutId\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.input.TextFieldValue\nimport androidx.compose.ui.text.input.VisualTransformation\nimport androidx.compose.ui.unit.Constraints\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.IntOffset\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.offset\nimport io.kanro.compose.jetbrains.JBTheme\nimport kotlin.math.max\nimport kotlin.math.roundToInt\n\n@Stable\ninterface TextFieldStyle {\n    @Composable\n    fun textColor(enabled: Boolean, isError: Boolean, interactionSource: InteractionSource): State<Color>\n\n    @Composable\n    fun backgroundColor(enabled: Boolean, interactionSource: InteractionSource): State<Color>\n\n    @Composable\n    fun placeholderColor(enabled: Boolean): State<Color>\n\n    @Composable\n    fun borderColor(enabled: Boolean, isError: Boolean, interactionSource: InteractionSource): State<Color>\n\n    @Composable\n    fun indicatorColor(isError: Boolean, interactionSource: InteractionSource): State<Color>\n\n    @Composable\n    fun cursorColor(isError: Boolean): State<Color>\n}\n\nprivate data class DefaultTextFieldStyle(\n    private val textColor: Color,\n    private val disabledTextColor: Color,\n    private val errorTextColor: Color,\n    private val backgroundColor: Color,\n    private val disabledBackgroundColor: Color,\n    private val placeholderColor: Color,\n    private val disabledPlaceholderColor: Color,\n    private val borderColor: Color,\n    private val disabledBorderColor: Color,\n    private val errorBorderColor: Color,\n    private val focusedBorderColor: Color,\n    private val indicatorColor: Color,\n    private val errorIndicatorColor: Color,\n    private val cursorColor: Color,\n    private val errorCursorColor: Color,\n) : TextFieldStyle {\n    @Composable\n    override fun textColor(enabled: Boolean, isError: Boolean, interactionSource: InteractionSource): State<Color> {\n        return rememberUpdatedState(\n            when {\n                !enabled -> disabledTextColor\n                isError -> errorTextColor\n                else -> textColor\n            }\n        )\n    }\n\n    @Composable\n    override fun backgroundColor(enabled: Boolean, interactionSource: InteractionSource): State<Color> {\n        return rememberUpdatedState(if (enabled) backgroundColor else disabledBackgroundColor)\n    }\n\n    @Composable\n    override fun placeholderColor(enabled: Boolean): State<Color> {\n        return rememberUpdatedState(if (enabled) placeholderColor else disabledPlaceholderColor)\n    }\n\n    @Composable\n    override fun borderColor(enabled: Boolean, isError: Boolean, interactionSource: InteractionSource): State<Color> {\n        val focused by interactionSource.collectIsFocusedAsState()\n\n        val targetValue = when {\n            !enabled -> disabledBorderColor\n            isError -> errorBorderColor\n            focused -> focusedBorderColor\n            else -> borderColor\n        }\n        return rememberUpdatedState(targetValue)\n    }\n\n    @Composable\n    override fun indicatorColor(\n        isError: Boolean,\n        interactionSource: InteractionSource,\n    ): State<Color> {\n        val focused by interactionSource.collectIsFocusedAsState()\n\n        val targetValue = when {\n            isError -> errorIndicatorColor\n            focused -> indicatorColor\n            else -> Color.Transparent\n        }\n        return rememberUpdatedState(targetValue)\n    }\n\n    @Composable\n    override fun cursorColor(isError: Boolean): State<Color> {\n        return rememberUpdatedState(if (isError) errorCursorColor else cursorColor)\n    }\n}\n\n@Composable\nfun TextField(\n    value: String,\n    onValueChange: (String) -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    readOnly: Boolean = false,\n    textStyle: TextStyle = LocalTextStyle.current,\n    placeholder: @Composable (() -> Unit)? = null,\n    leadingIcon: @Composable (() -> Unit)? = null,\n    trailingIcon: @Composable (() -> Unit)? = null,\n    isError: Boolean = false,\n    visualTransformation: VisualTransformation = VisualTransformation.None,\n    keyboardOptions: KeyboardOptions = KeyboardOptions.Default,\n    keyboardActions: KeyboardActions = KeyboardActions.Default,\n    singleLine: Boolean = true,\n    maxLines: Int = 1,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    shape: Shape = RectangleShape,\n    style: TextFieldStyle = TextFieldDefaults.textFieldStyle(),\n) {\n    var textFieldValueState by remember { mutableStateOf(TextFieldValue(text = value)) }\n    val textFieldValue = textFieldValueState.copy(text = value)\n\n    TextField(\n        enabled = enabled,\n        readOnly = readOnly,\n        value = textFieldValue,\n        onValueChange = {\n            textFieldValueState = it\n            if (value != it.text) {\n                onValueChange(it.text)\n            }\n        },\n        modifier = modifier,\n        singleLine = singleLine,\n        textStyle = textStyle,\n        placeholder = placeholder,\n        leadingIcon = leadingIcon,\n        trailingIcon = trailingIcon,\n        isError = isError,\n        visualTransformation = visualTransformation,\n        keyboardOptions = keyboardOptions,\n        keyboardActions = keyboardActions,\n        maxLines = maxLines,\n        interactionSource = interactionSource,\n        shape = shape,\n        style = style\n    )\n}\n\n@Composable\nfun TextField(\n    value: TextFieldValue,\n    onValueChange: (TextFieldValue) -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    readOnly: Boolean = false,\n    textStyle: TextStyle = LocalTextStyle.current,\n    placeholder: @Composable (() -> Unit)? = null,\n    leadingIcon: @Composable (() -> Unit)? = null,\n    trailingIcon: @Composable (() -> Unit)? = null,\n    isError: Boolean = false,\n    visualTransformation: VisualTransformation = VisualTransformation.None,\n    keyboardOptions: KeyboardOptions = KeyboardOptions.Default,\n    keyboardActions: KeyboardActions = KeyboardActions.Default,\n    singleLine: Boolean = true,\n    maxLines: Int = 1,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    shape: Shape = RectangleShape,\n    style: TextFieldStyle = TextFieldDefaults.textFieldStyle(),\n) {\n    val textColor = textStyle.color.takeOrElse {\n        style.textColor(enabled, isError, interactionSource).value\n    }.takeOrElse {\n        LocalContentColor.current.copy(alpha = LocalContentAlpha.current)\n    }\n    val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))\n\n    val transformedText = remember(value.annotatedString, visualTransformation) {\n        visualTransformation.filter(value.annotatedString)\n    }.text\n\n    val decoratedPlaceholder: @Composable ((Modifier) -> Unit)? =\n        if (placeholder != null && transformedText.isEmpty()) {\n            @Composable { _ ->\n                Box {\n                    Decoration(\n                        contentColor = style.placeholderColor(enabled).value,\n                        content = placeholder,\n                        typography = JBTheme.typography.default\n                    )\n                }\n            }\n        } else null\n\n    TextFieldLayout(\n        modifier = modifier,\n        value = value,\n        onValueChange = onValueChange,\n        enabled = enabled,\n        readOnly = readOnly,\n        keyboardOptions = keyboardOptions,\n        keyboardActions = keyboardActions,\n        textStyle = mergedTextStyle,\n        singleLine = singleLine,\n        maxLines = maxLines,\n        visualTransformation = visualTransformation,\n        interactionSource = interactionSource,\n        decoratedPlaceholder = decoratedPlaceholder,\n        leading = leadingIcon,\n        trailing = trailingIcon,\n        borderWidth = 1.dp,\n        borderColor = style.borderColor(enabled, isError, interactionSource).value,\n        indicatorWidth = 2.dp,\n        indicatorColor = style.indicatorColor(isError, interactionSource).value,\n        shape = shape,\n        backgroundColor = style.backgroundColor(enabled, interactionSource).value,\n        cursorColor = style.cursorColor(isError).value\n    )\n}\n\n@Composable\ninternal fun TextFieldLayout(\n    modifier: Modifier,\n    value: TextFieldValue,\n    onValueChange: (TextFieldValue) -> Unit,\n    enabled: Boolean,\n    readOnly: Boolean,\n    keyboardOptions: KeyboardOptions,\n    keyboardActions: KeyboardActions,\n    textStyle: TextStyle,\n    singleLine: Boolean,\n    maxLines: Int = Int.MAX_VALUE,\n    visualTransformation: VisualTransformation,\n    interactionSource: MutableInteractionSource,\n    decoratedPlaceholder: @Composable ((Modifier) -> Unit)?,\n    leading: @Composable (() -> Unit)?,\n    trailing: @Composable (() -> Unit)?,\n    borderWidth: Dp,\n    borderColor: Color,\n    indicatorWidth: Dp,\n    indicatorColor: Color,\n    cursorColor: Color,\n    backgroundColor: Color,\n    shape: Shape,\n) {\n    BasicTextField(\n        value = value,\n        modifier = Modifier\n            .defaultMinSize(\n                minWidth = TextFieldDefaults.MinWidth,\n                minHeight = TextFieldDefaults.MinHeight\n            )\n            .background(backgroundColor, shape)\n            .then(modifier),\n        onValueChange = onValueChange,\n        enabled = enabled,\n        readOnly = readOnly,\n        textStyle = textStyle,\n        cursorBrush = SolidColor(cursorColor),\n        visualTransformation = visualTransformation,\n        keyboardOptions = keyboardOptions,\n        keyboardActions = keyboardActions,\n        interactionSource = interactionSource,\n        singleLine = singleLine,\n        maxLines = maxLines,\n        decorationBox = @Composable { coreTextField ->\n            // places leading icon, input field, label, placeholder, trailing icon\n            IconsWithTextFieldLayout(\n                textField = coreTextField,\n                leading = leading,\n                trailing = trailing,\n                singleLine = singleLine,\n                placeholder = decoratedPlaceholder,\n                shape = shape,\n                borderWidth = borderWidth,\n                borderColor = borderColor,\n                indicatorWidth = indicatorWidth,\n                indicatorColor = indicatorColor,\n            )\n        }\n    )\n}\n\nprivate fun Modifier.textFieldIndicator(color: Color, shape: Shape, width: Dp, cornerRadius: Dp): Modifier {\n    if (color.alpha == 0f) return this\n    return drawBehind {\n        val controlOutline = shape.createOutline(size, layoutDirection, this)\n        val highlightOutline = RoundRect(controlOutline.bounds.inflate(width.toPx()), CornerRadius(cornerRadius.toPx()))\n        val highlightPath = Path().apply {\n            this.fillType = PathFillType.EvenOdd\n            addRoundRect(highlightOutline)\n            addOutline(controlOutline)\n            close()\n        }\n        drawPath(highlightPath, color)\n    }\n}\n\n@Composable\nprivate fun IconsWithTextFieldLayout(\n    textField: @Composable () -> Unit,\n    placeholder: @Composable ((Modifier) -> Unit)?,\n    leading: @Composable (() -> Unit)?,\n    trailing: @Composable (() -> Unit)?,\n    singleLine: Boolean,\n    shape: Shape,\n    borderWidth: Dp,\n    borderColor: Color,\n    indicatorWidth: Dp,\n    indicatorColor: Color,\n) {\n    Layout(\n        content = {\n            Box(\n                Modifier\n                    .layoutId(\"border\")\n                    .border(\n                        width = borderWidth,\n                        color = borderColor,\n                        shape = shape\n                    )\n                    .textFieldIndicator(\n                        width = indicatorWidth,\n                        color = indicatorColor,\n                        shape = shape,\n                        cornerRadius = 4.dp\n                    )\n            )\n\n            if (leading != null) {\n                Box(\n                    modifier = Modifier.layoutId(LeadingId).then(IconDefaultSizeModifier)\n                        .padding(start = HorizontalIconPadding),\n                    contentAlignment = Alignment.Center\n                ) {\n                    leading()\n                }\n            }\n            if (trailing != null) {\n                Box(\n                    modifier = Modifier.layoutId(TrailingId).then(IconDefaultSizeModifier)\n                        .padding(end = HorizontalIconPadding),\n                    contentAlignment = Alignment.Center\n                ) {\n                    trailing()\n                }\n            }\n            val padding = Modifier.padding(\n                start = HorizontalTextFieldPadding,\n                end = HorizontalTextFieldPadding\n            )\n            if (placeholder != null) {\n                placeholder(Modifier.layoutId(PlaceholderId).then(padding))\n            }\n\n            Box(\n                modifier = Modifier.layoutId(TextFieldId).then(padding),\n                propagateMinConstraints = true\n            ) {\n                textField()\n            }\n        }\n    ) { measurables, incomingConstraints ->\n        // used to calculate the constraints for measuring elements that will be placed in a row\n        var occupiedSpaceHorizontally = 0\n        val bottomPadding = VerticalTextFieldPadding.roundToPx()\n\n        // measure leading icon\n        val constraints =\n            incomingConstraints.copy(minWidth = 0, minHeight = 0)\n        val leadingPlaceable = measurables.find { it.layoutId == LeadingId }?.measure(constraints)\n        occupiedSpaceHorizontally += widthOrZero(\n            leadingPlaceable\n        )\n\n        // measure trailing icon\n        val trailingPlaceable = measurables.find { it.layoutId == TrailingId }\n            ?.measure(constraints.offset(horizontal = -occupiedSpaceHorizontally))\n        occupiedSpaceHorizontally += widthOrZero(\n            trailingPlaceable\n        )\n\n        // measure label\n        constraints.offset(\n            horizontal = -occupiedSpaceHorizontally,\n            vertical = -bottomPadding\n        )\n\n        // measure text field\n        // on top we offset either by default padding or by label's half height if its too big\n        // minWidth must not be set to 0 due to how foundation TextField treats zero minWidth\n        val topPadding = bottomPadding\n        val textConstraints = incomingConstraints.offset(\n            horizontal = -occupiedSpaceHorizontally,\n            vertical = -bottomPadding - topPadding\n        ).copy(minHeight = 0)\n        val textFieldPlaceable =\n            measurables.first { it.layoutId == TextFieldId }.measure(textConstraints)\n\n        // measure placeholder\n        val placeholderConstraints = textConstraints.copy(minWidth = 0)\n        val placeholderPlaceable =\n            measurables.find { it.layoutId == PlaceholderId }?.measure(placeholderConstraints)\n\n        val width =\n            calculateWidth(\n                leadingPlaceable,\n                trailingPlaceable,\n                textFieldPlaceable,\n                placeholderPlaceable,\n                incomingConstraints\n            )\n        val height =\n            calculateHeight(\n                leadingPlaceable,\n                trailingPlaceable,\n                textFieldPlaceable,\n                placeholderPlaceable,\n                incomingConstraints,\n                density\n            )\n\n        val borderPlaceable = measurables.first { it.layoutId == \"border\" }.measure(\n            Constraints(\n                minWidth = if (width != Constraints.Infinity) width else 0,\n                maxWidth = width,\n                minHeight = if (height != Constraints.Infinity) height else 0,\n                maxHeight = height\n            )\n        )\n        layout(width, height) {\n            place(\n                height,\n                width,\n                leadingPlaceable,\n                trailingPlaceable,\n                textFieldPlaceable,\n                placeholderPlaceable,\n                borderPlaceable,\n                singleLine,\n                density\n            )\n        }\n    }\n}\n\nprivate fun calculateWidth(\n    leadingPlaceable: Placeable?,\n    trailingPlaceable: Placeable?,\n    textFieldPlaceable: Placeable,\n    placeholderPlaceable: Placeable?,\n    constraints: Constraints,\n): Int {\n    val middleSection = maxOf(\n        textFieldPlaceable.width,\n        widthOrZero(placeholderPlaceable)\n    )\n    val wrappedWidth =\n        widthOrZero(leadingPlaceable) + middleSection + widthOrZero(\n            trailingPlaceable\n        )\n    return max(wrappedWidth, constraints.minWidth)\n}\n\nprivate fun calculateHeight(\n    leadingPlaceable: Placeable?,\n    trailingPlaceable: Placeable?,\n    textFieldPlaceable: Placeable,\n    placeholderPlaceable: Placeable?,\n    constraints: Constraints,\n    density: Float,\n): Int {\n    // middle section is defined as a height of the text field or placeholder ( whichever is\n    // taller) plus 16.dp or half height of the label if it is taller, given that the label\n    // is vertically centered to the top edge of the resulting text field's container\n    val inputFieldHeight = max(\n        textFieldPlaceable.height,\n        heightOrZero(placeholderPlaceable)\n    )\n    val topBottomPadding = VerticalTextFieldPadding.value * density\n    val middleSectionHeight = inputFieldHeight + topBottomPadding + topBottomPadding\n    return max(\n        constraints.minHeight,\n        maxOf(\n            heightOrZero(leadingPlaceable),\n            heightOrZero(trailingPlaceable),\n            middleSectionHeight.roundToInt()\n        )\n    )\n}\n\nprivate fun Placeable.PlacementScope.place(\n    height: Int,\n    width: Int,\n    leadingPlaceable: Placeable?,\n    trailingPlaceable: Placeable?,\n    textFieldPlaceable: Placeable,\n    placeholderPlaceable: Placeable?,\n    borderPlaceable: Placeable,\n    singleLine: Boolean,\n    density: Float,\n) {\n    val topBottomPadding = (VerticalTextFieldPadding.value * density).roundToInt()\n\n    // placed center vertically and to the start edge horizontally\n    leadingPlaceable?.placeRelative(\n        0,\n        Alignment.CenterVertically.align(leadingPlaceable.height, height)\n    )\n\n    // placed center vertically and to the end edge horizontally\n    trailingPlaceable?.placeRelative(\n        width - trailingPlaceable.width,\n        Alignment.CenterVertically.align(trailingPlaceable.height, height)\n    )\n\n    // placed center vertically and after the leading icon horizontally if single line text field\n    // placed to the top with padding for multi line text field\n    val textVerticalPosition = if (singleLine) {\n        Alignment.CenterVertically.align(textFieldPlaceable.height, height)\n    } else {\n        topBottomPadding\n    }\n    textFieldPlaceable.placeRelative(widthOrZero(leadingPlaceable), textVerticalPosition)\n\n    // placed similar to the input text above\n    placeholderPlaceable?.let {\n        val placeholderVerticalPosition = if (singleLine) {\n            Alignment.CenterVertically.align(it.height, height)\n        } else {\n            topBottomPadding\n        }\n        it.placeRelative(widthOrZero(leadingPlaceable), placeholderVerticalPosition)\n    }\n\n    // place border\n    borderPlaceable.place(IntOffset.Zero)\n}\n\n@Composable\ninternal fun Decoration(\n    contentColor: Color,\n    typography: TextStyle? = null,\n    contentAlpha: Float? = null,\n    content: @Composable () -> Unit,\n) {\n    val colorAndEmphasis: @Composable () -> Unit = @Composable {\n        CompositionLocalProvider(LocalContentColor provides contentColor) {\n            if (contentAlpha != null) {\n                CompositionLocalProvider(\n                    LocalContentAlpha provides contentAlpha,\n                    content = content\n                )\n            } else {\n                CompositionLocalProvider(\n                    LocalContentAlpha provides contentColor.alpha,\n                    content = content\n                )\n            }\n        }\n    }\n    if (typography != null) ProvideTextStyle(typography, colorAndEmphasis) else colorAndEmphasis()\n}\n\nobject TextFieldDefaults {\n    val MinHeight = 24.dp\n\n    val MinWidth = 64.dp\n\n    @Composable\n    fun textFieldStyle(\n        textColor: Color = JBTheme.textColors.default,\n        disabledTextColor: Color = JBTheme.textColors.disabled,\n        errorTextColor: Color = JBTheme.textColors.error,\n        backgroundColor: Color = JBTheme.fieldColors.bg,\n        disabledBackgroundColor: Color = JBTheme.fieldColors.bgDisabled,\n        placeholderColor: Color = JBTheme.textColors.infoInput,\n        disabledPlaceholderColor: Color = JBTheme.textColors.infoInput,\n        borderColor: Color = JBTheme.fieldColors.border,\n        disabledBorderColor: Color = JBTheme.fieldColors.borderDisabled,\n        errorBorderColor: Color = JBTheme.fieldColors.borderError,\n        focusedBorderColor: Color = JBTheme.fieldColors.borderFocused,\n        indicatorColor: Color = JBTheme.focusColors.default,\n        errorIndicatorColor: Color = JBTheme.focusColors.error,\n        cursorColor: Color = JBTheme.textColors.default,\n        errorCursorColor: Color = JBTheme.textColors.error,\n    ): TextFieldStyle = DefaultTextFieldStyle(\n        textColor,\n        disabledTextColor,\n        errorTextColor,\n        backgroundColor,\n        disabledBackgroundColor,\n        placeholderColor,\n        disabledPlaceholderColor,\n        borderColor,\n        disabledBorderColor,\n        errorBorderColor,\n        focusedBorderColor,\n        indicatorColor,\n        errorIndicatorColor,\n        cursorColor,\n        errorCursorColor\n    )\n}\n\ninternal fun widthOrZero(placeable: Placeable?) = placeable?.width ?: 0\ninternal fun heightOrZero(placeable: Placeable?) = placeable?.height ?: 0\n\ninternal val HorizontalTextFieldPadding = 6.dp\ninternal val VerticalTextFieldPadding = 3.dp\ninternal val HorizontalIconPadding = 6.dp\n\ninternal val IconDefaultSizeModifier = Modifier.defaultMinSize(16.dp, 16.dp)\n\nprivate const val PlaceholderId = \"Placeholder\"\nprivate const val TextFieldId = \"TextField\"\nprivate const val LeadingId = \"Leading\"\nprivate const val TrailingId = \"Trailing\"\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/icons/__JBIcons.kt",
    "content": "package io.kanro.compose.jetbrains.icons\n\ninternal object JBIcons\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/icons/jbicons/__Actions.kt",
    "content": "package io.kanro.compose.jetbrains.icons.jbicons\n\nimport io.kanro.compose.jetbrains.icons.JBIcons\n\ninternal object ActionsGroup\n\ninternal val JBIcons.Actions: ActionsGroup\n    get() = ActionsGroup\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/icons/jbicons/__General.kt",
    "content": "package io.kanro.compose.jetbrains.icons.jbicons\n\nimport io.kanro.compose.jetbrains.icons.JBIcons\n\ninternal object GeneralGroup\n\ninternal val JBIcons.General: GeneralGroup\n    get() = GeneralGroup\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/icons/jbicons/actions/ArrowExpand.kt",
    "content": "package io.kanro.compose.jetbrains.icons.jbicons.actions\n\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.PathFillType.Companion.NonZero\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.StrokeCap.Companion.Butt\nimport androidx.compose.ui.graphics.StrokeJoin.Companion.Miter\nimport androidx.compose.ui.graphics.vector.ImageVector\nimport androidx.compose.ui.graphics.vector.ImageVector.Builder\nimport androidx.compose.ui.graphics.vector.path\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.icons.jbicons.ActionsGroup\n\ninternal val ActionsGroup.ArrowExpand: ImageVector\n    get() {\n        if (_arrowExpand != null) {\n            return _arrowExpand!!\n        }\n        _arrowExpand = Builder(\n            name = \"ArrowExpand\", defaultWidth = 16.0.dp,\n            defaultHeight =\n            16.0.dp,\n            viewportWidth = 16.0f, viewportHeight = 16.0f\n        ).apply {\n            path(\n                fill = SolidColor(Color(0x00000000)), stroke = SolidColor(Color(0xFF6E6E6E)),\n                strokeLineWidth = 2.0f, strokeLineCap = Butt, strokeLineJoin = Miter,\n                strokeLineMiter = 4.0f, pathFillType = NonZero\n            ) {\n                moveTo(6.0f, 13.0f)\n                lineTo(11.0f, 8.0f)\n                lineTo(6.0f, 3.0f)\n            }\n        }\n            .build()\n        return _arrowExpand!!\n    }\n\nprivate var _arrowExpand: ImageVector? = null\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/icons/jbicons/actions/ArrowExpandDark.kt",
    "content": "package io.kanro.compose.jetbrains.icons.jbicons.actions\n\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.PathFillType.Companion.NonZero\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.StrokeCap.Companion.Butt\nimport androidx.compose.ui.graphics.StrokeJoin.Companion.Miter\nimport androidx.compose.ui.graphics.vector.ImageVector\nimport androidx.compose.ui.graphics.vector.ImageVector.Builder\nimport androidx.compose.ui.graphics.vector.path\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.icons.jbicons.ActionsGroup\n\ninternal val ActionsGroup.ArrowExpandDark: ImageVector\n    get() {\n        if (_arrowExpandDark != null) {\n            return _arrowExpandDark!!\n        }\n        _arrowExpandDark = Builder(\n            name = \"ArrowexpandDark\", defaultWidth = 16.0.dp,\n            defaultHeight =\n            16.0.dp,\n            viewportWidth = 16.0f, viewportHeight = 16.0f\n        ).apply {\n            path(\n                fill = SolidColor(Color(0x00000000)), stroke = SolidColor(Color(0xFFAFB1B3)),\n                strokeLineWidth = 2.0f, strokeLineCap = Butt, strokeLineJoin = Miter,\n                strokeLineMiter = 4.0f, pathFillType = NonZero\n            ) {\n                moveTo(6.0f, 13.0f)\n                lineTo(11.0f, 8.0f)\n                lineTo(6.0f, 3.0f)\n            }\n        }\n            .build()\n        return _arrowExpandDark!!\n    }\n\nprivate var _arrowExpandDark: ImageVector? = null\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/icons/jbicons/actions/Checkmark.kt",
    "content": "package io.kanro.compose.jetbrains.icons.jbicons.actions\n\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.PathFillType.Companion.EvenOdd\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.StrokeCap.Companion.Butt\nimport androidx.compose.ui.graphics.StrokeJoin.Companion.Miter\nimport androidx.compose.ui.graphics.vector.ImageVector\nimport androidx.compose.ui.graphics.vector.ImageVector.Builder\nimport androidx.compose.ui.graphics.vector.path\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.icons.jbicons.ActionsGroup\n\ninternal val ActionsGroup.Checkmark: ImageVector\n    get() {\n        if (_checkmark != null) {\n            return _checkmark!!\n        }\n        _checkmark = Builder(\n            name = \"Checkmark\", defaultWidth = 14.0.dp, defaultHeight = 14.0.dp,\n            viewportWidth = 14.0f, viewportHeight = 14.0f\n        ).apply {\n            path(\n                fill = SolidColor(Color(0xFFffffff)), stroke = null, strokeLineWidth = 0.0f,\n                strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f,\n                pathFillType = EvenOdd\n            ) {\n                moveTo(5.625f, 8.4267f)\n                lineTo(9.5566f, 2.9336f)\n                curveTo(9.5566f, 2.9336f, 10.1737f, 2.3242f, 10.8612f, 2.8242f)\n                curveTo(11.4433f, 3.3867f, 10.998f, 4.0938f, 10.998f, 4.0938f)\n                lineTo(6.3183f, 10.6445f)\n                curveTo(6.3183f, 10.6445f, 5.9941f, 11.0f, 5.5839f, 11.0f)\n                curveTo(5.1737f, 11.0f, 4.873f, 10.6445f, 4.873f, 10.6445f)\n                lineTo(2.9394f, 7.7461f)\n                curveTo(2.9394f, 7.7461f, 2.5683f, 6.9805f, 3.2558f, 6.4609f)\n                curveTo(4.0605f, 6.0781f, 4.5605f, 6.8394f, 4.5605f, 6.8394f)\n                lineTo(5.625f, 8.4267f)\n                close()\n            }\n        }\n            .build()\n        return _checkmark!!\n    }\n\nprivate var _checkmark: ImageVector? = null\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/icons/jbicons/actions/CheckmarkIndeterminate.kt",
    "content": "package io.kanro.compose.jetbrains.icons.jbicons.actions\n\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.PathFillType.Companion.NonZero\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.StrokeCap.Companion.Butt\nimport androidx.compose.ui.graphics.StrokeJoin.Companion.Miter\nimport androidx.compose.ui.graphics.vector.ImageVector\nimport androidx.compose.ui.graphics.vector.ImageVector.Builder\nimport androidx.compose.ui.graphics.vector.path\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.icons.jbicons.ActionsGroup\n\ninternal val ActionsGroup.CheckmarkIndeterminate: ImageVector\n    get() {\n        if (_checkmarkIndeterminate != null) {\n            return _checkmarkIndeterminate!!\n        }\n        _checkmarkIndeterminate = Builder(\n            name = \"CheckmarkIndeterminate\", defaultWidth = 14.0.dp,\n            defaultHeight = 14.0.dp, viewportWidth = 14.0f, viewportHeight = 14.0f\n        ).apply {\n            path(\n                fill = SolidColor(Color(0xFFffffff)), stroke = null, strokeLineWidth = 0.0f,\n                strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f,\n                pathFillType = NonZero\n            ) {\n                moveTo(3.7402f, 5.73f)\n                lineTo(10.1402f, 5.73f)\n                arcTo(1.0f, 1.0f, 0.0f, false, true, 11.1402f, 6.73f)\n                lineTo(11.1402f, 7.23f)\n                arcTo(1.0f, 1.0f, 0.0f, false, true, 10.1402f, 8.23f)\n                lineTo(3.7402f, 8.23f)\n                arcTo(1.0f, 1.0f, 0.0f, false, true, 2.7402f, 7.23f)\n                lineTo(2.7402f, 6.73f)\n                arcTo(1.0f, 1.0f, 0.0f, false, true, 3.7402f, 5.73f)\n                close()\n            }\n        }\n            .build()\n        return _checkmarkIndeterminate!!\n    }\n\nprivate var _checkmarkIndeterminate: ImageVector? = null\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/icons/jbicons/actions/Close.kt",
    "content": "package io.kanro.compose.jetbrains.icons.jbicons.actions\n\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.PathFillType.Companion.EvenOdd\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.StrokeCap.Companion.Butt\nimport androidx.compose.ui.graphics.StrokeJoin.Companion.Miter\nimport androidx.compose.ui.graphics.vector.ImageVector\nimport androidx.compose.ui.graphics.vector.ImageVector.Builder\nimport androidx.compose.ui.graphics.vector.path\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.icons.jbicons.ActionsGroup\n\ninternal val ActionsGroup.Close: ImageVector\n    get() {\n        if (_close != null) {\n            return _close!!\n        }\n        _close = Builder(\n            name = \"Close\", defaultWidth = 16.0.dp, defaultHeight = 16.0.dp,\n            viewportWidth = 16.0f, viewportHeight = 16.0f\n        ).apply {\n            path(\n                fill = SolidColor(Color(0xFF7F8B91)), stroke = null, fillAlpha = 0.5f,\n                strokeLineWidth = 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter,\n                strokeLineMiter = 4.0f, pathFillType = EvenOdd\n            ) {\n                moveTo(7.9949f, 8.7051f)\n                lineTo(4.8541f, 11.8541f)\n                lineTo(4.147f, 11.147f)\n                lineTo(7.2949f, 8.0051f)\n                lineTo(4.147f, 4.8571f)\n                lineTo(4.8541f, 4.15f)\n                lineTo(8.002f, 7.298f)\n                lineTo(11.144f, 4.15f)\n                lineTo(11.8511f, 4.8571f)\n                lineTo(8.702f, 7.998f)\n                lineTo(11.8511f, 11.147f)\n                lineTo(11.144f, 11.8541f)\n                lineTo(7.9949f, 8.7051f)\n                close()\n            }\n        }\n            .build()\n        return _close!!\n    }\n\nprivate var _close: ImageVector? = null\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/icons/jbicons/general/ButtonDropTriangle.kt",
    "content": "package io.kanro.compose.jetbrains.icons.jbicons.general\n\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.PathFillType.Companion.EvenOdd\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.StrokeCap.Companion.Butt\nimport androidx.compose.ui.graphics.StrokeJoin.Companion.Miter\nimport androidx.compose.ui.graphics.vector.ImageVector\nimport androidx.compose.ui.graphics.vector.ImageVector.Builder\nimport androidx.compose.ui.graphics.vector.path\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.icons.jbicons.GeneralGroup\n\ninternal val GeneralGroup.ButtonDropTriangle: ImageVector\n    get() {\n        if (_buttonDropTriangle != null) {\n            return _buttonDropTriangle!!\n        }\n        _buttonDropTriangle = Builder(\n            name = \"ButtonDropTriangle\", defaultWidth = 8.0.dp,\n            defaultHeight = 4.0.dp, viewportWidth = 8.0f, viewportHeight = 4.0f\n        ).apply {\n            path(\n                fill = SolidColor(Color(0xFF6E6E6E)), stroke = null, strokeLineWidth = 0.0f,\n                strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f,\n                pathFillType = EvenOdd\n            ) {\n                moveTo(4.0f, 4.0f)\n                lineToRelative(4.0f, -4.0f)\n                lineToRelative(-8.0f, -0.0f)\n                close()\n            }\n        }\n            .build()\n        return _buttonDropTriangle!!\n    }\n\nprivate var _buttonDropTriangle: ImageVector? = null\n"
  },
  {
    "path": "classic/src/main/kotlin/io/kanro/compose/jetbrains/icons/jbicons/general/ButtonDropTriangleDark.kt",
    "content": "package io.kanro.compose.jetbrains.icons.jbicons.general\n\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.PathFillType.Companion.EvenOdd\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.StrokeCap.Companion.Butt\nimport androidx.compose.ui.graphics.StrokeJoin.Companion.Miter\nimport androidx.compose.ui.graphics.vector.ImageVector\nimport androidx.compose.ui.graphics.vector.ImageVector.Builder\nimport androidx.compose.ui.graphics.vector.path\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.icons.jbicons.GeneralGroup\n\ninternal val GeneralGroup.ButtonDropTriangleDark: ImageVector\n    get() {\n        if (_buttonDropTriangleDark != null) {\n            return _buttonDropTriangleDark!!\n        }\n        _buttonDropTriangleDark = Builder(\n            name = \"ButtonDropTriangleDark\", defaultWidth = 8.0.dp,\n            defaultHeight = 4.0.dp, viewportWidth = 8.0f, viewportHeight = 4.0f\n        ).apply {\n            path(\n                fill = SolidColor(Color(0xFFAFB1B3)), stroke = null, strokeLineWidth = 0.0f,\n                strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f,\n                pathFillType = EvenOdd\n            ) {\n                moveTo(4.0f, 4.0f)\n                lineToRelative(4.0f, -4.0f)\n                lineToRelative(-8.0f, -0.0f)\n                close()\n            }\n        }\n            .build()\n        return _buttonDropTriangleDark!!\n    }\n\nprivate var _buttonDropTriangleDark: ImageVector? = null\n"
  },
  {
    "path": "expui/build.gradle.kts",
    "content": "plugins {\n    kotlin(\"jvm\")\n    id(\"com.netflix.nebula.maven-publish\")\n    id(\"com.netflix.nebula.source-jar\")\n    id(\"com.bybutter.sisyphus.project\")\n    id(\"org.jetbrains.compose\")\n    `java-library`\n}\n\ndescription = \"JetBrains ExpUI Kit for Compose Desktop\"\n\ndependencies {\n    implementation(kotlin(\"stdlib\"))\n    implementation(compose.desktop.common) {\n        exclude(\"org.jetbrains.compose.material\")\n    }\n}\n\ntasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>() {\n    kotlinOptions.jvmTarget = \"17\"\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/DesktopPlatform.kt",
    "content": "package io.kanro.compose.jetbrains.expui\n\nenum class DesktopPlatform {\n    Linux,\n    Windows,\n    MacOS,\n    Unknown;\n\n    companion object {\n        val Current: DesktopPlatform by lazy {\n            val name = System.getProperty(\"os.name\")\n            when {\n                name?.startsWith(\"Linux\") == true -> Linux\n                name?.startsWith(\"Win\") == true -> Windows\n                name == \"Mac OS X\" -> MacOS\n                else -> Unknown\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/ActionButton.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.Indication\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.BoxScope\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.DisabledAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.HoverAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalDisabledAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalHoverAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalPressedAreaColors\nimport io.kanro.compose.jetbrains.expui.style.PressedAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.areaBackground\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\n\nclass ActionButtonColors(\n    override val normalAreaColors: AreaColors,\n    override val hoverAreaColors: AreaColors,\n    override val pressedAreaColors: AreaColors,\n    override val disabledAreaColors: AreaColors,\n) : AreaProvider, HoverAreaProvider, PressedAreaProvider, DisabledAreaProvider {\n    @Composable\n    fun provideArea(enabled: Boolean, content: @Composable () -> Unit) {\n        CompositionLocalProvider(\n            LocalAreaColors provides if (enabled) normalAreaColors else disabledAreaColors,\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalDisabledAreaColors provides disabledAreaColors,\n            LocalHoverAreaColors provides hoverAreaColors,\n            LocalPressedAreaColors provides pressedAreaColors,\n            content = content\n        )\n    }\n}\n\nval LocalActionButtonColors = compositionLocalOf {\n    LightTheme.ActionButtonColors\n}\n\n@Composable\nfun ActionButton(\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    shape: Shape = RoundedCornerShape(6.dp),\n    indication: Indication? = HoverOrPressedIndication(shape),\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: ActionButtonColors = LocalActionButtonColors.current,\n    content: @Composable BoxScope.() -> Unit,\n) {\n    colors.provideArea(enabled) {\n        Box(\n            modifier.areaBackground(shape = shape).clickable(\n                interactionSource = interactionSource,\n                indication = indication,\n                enabled = enabled,\n                onClick = onClick,\n                role = Role.Button\n            ),\n            propagateMinConstraints = true\n        ) {\n            content()\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/Button.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.RowScope\nimport androidx.compose.foundation.layout.defaultMinSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.drawWithCache\nimport androidx.compose.ui.focus.onFocusEvent\nimport androidx.compose.ui.geometry.CornerRadius\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.geometry.Size\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.DisabledAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.FocusAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalDisabledAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalFocusAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\n\nclass ButtonColors(\n    override val normalAreaColors: AreaColors,\n    override val focusAreaColors: AreaColors,\n    override val disabledAreaColors: AreaColors,\n) : AreaProvider, FocusAreaProvider, DisabledAreaProvider {\n\n    @Composable\n    fun provideArea(enabled: Boolean, focused: Boolean, content: @Composable () -> Unit) {\n        val currentAreaColor = when {\n            !enabled -> disabledAreaColors\n            focused -> focusAreaColors\n            else -> normalAreaColors\n        }\n\n        CompositionLocalProvider(\n            LocalAreaColors provides currentAreaColor,\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalFocusAreaColors provides focusAreaColors,\n            LocalDisabledAreaColors provides disabledAreaColors,\n            content = content\n        )\n    }\n}\n\nval LocalPrimaryButtonColors = compositionLocalOf {\n    LightTheme.PrimaryButtonColors\n}\n\nval LocalOutlineButtonColors = compositionLocalOf {\n    LightTheme.OutlineButtonColors\n}\n\n@Composable\nfun OutlineButton(\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: ButtonColors = LocalOutlineButtonColors.current,\n    content: @Composable RowScope.() -> Unit,\n) {\n    ButtonImpl(onClick, modifier, enabled, interactionSource, colors, content)\n}\n\n@Composable\nfun PrimaryButton(\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: ButtonColors = LocalPrimaryButtonColors.current,\n    content: @Composable RowScope.() -> Unit,\n) {\n    ButtonImpl(onClick, modifier, enabled, interactionSource, colors, content)\n}\n\n@Composable\nprivate fun ButtonImpl(\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: ButtonColors,\n    content: @Composable RowScope.() -> Unit,\n) {\n    val isFocused = remember { mutableStateOf(false) }\n    colors.provideArea(enabled, isFocused.value) {\n        val areaColors = LocalAreaColors.current\n        Box(\n            Modifier.defaultMinSize(72.dp, 24.dp).drawWithCache {\n                onDrawBehind {\n                    if (isFocused.value) {\n                        drawRoundRect(\n                            areaColors.focusColor,\n                            size = Size(size.width + 4.dp.toPx(), size.height + 4.dp.toPx()),\n                            topLeft = Offset(-2.dp.toPx(), -2.dp.toPx()),\n                            cornerRadius = CornerRadius(5.dp.toPx())\n                        )\n                    }\n                    drawRoundRect(areaColors.startBorderColor, cornerRadius = CornerRadius(3.dp.toPx()))\n                    drawRoundRect(\n                        areaColors.startBackground,\n                        size = Size(size.width - 2.dp.toPx(), size.height - 2.dp.toPx()),\n                        topLeft = Offset(1.dp.toPx(), 1.dp.toPx()),\n                        cornerRadius = CornerRadius(2.dp.toPx())\n                    )\n                }\n            }.onFocusEvent {\n                isFocused.value = it.isFocused\n            }.clickable(\n                interactionSource = interactionSource,\n                indication = null,\n                enabled = enabled,\n                onClick = onClick,\n                role = Role.Button\n            ).then(modifier),\n            contentAlignment = Alignment.Center\n        ) {\n            Row(\n                modifier = Modifier.padding(14.dp, 3.dp),\n                horizontalArrangement = Arrangement.Center,\n                verticalAlignment = Alignment.CenterVertically\n            ) {\n                content()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/CheckBox.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.Canvas\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.requiredSize\nimport androidx.compose.foundation.layout.wrapContentSize\nimport androidx.compose.foundation.selection.triStateToggleable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.focus.onFocusEvent\nimport androidx.compose.ui.geometry.CornerRadius\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.geometry.Size\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.ColorFilter\nimport androidx.compose.ui.graphics.PathFillType\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.StrokeCap\nimport androidx.compose.ui.graphics.StrokeJoin\nimport androidx.compose.ui.graphics.vector.ImageVector\nimport androidx.compose.ui.graphics.vector.path\nimport androidx.compose.ui.graphics.vector.rememberVectorPainter\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.state.ToggleableState\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.DisabledAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.FocusAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalDisabledAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalFocusAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSelectionAreaColors\nimport io.kanro.compose.jetbrains.expui.style.SelectionAreaProvider\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\n\nclass CheckBoxColors(\n    override val normalAreaColors: AreaColors,\n    override val selectionAreaColors: AreaColors,\n    override val focusAreaColors: AreaColors,\n    override val disabledAreaColors: AreaColors,\n) : AreaProvider, DisabledAreaProvider, FocusAreaProvider, SelectionAreaProvider {\n    @Composable\n    fun provideArea(enabled: Boolean, focused: Boolean, selected: Boolean, content: @Composable () -> Unit) {\n        val currentColors = when {\n            !enabled -> disabledAreaColors\n            focused -> focusAreaColors\n            selected -> selectionAreaColors\n            else -> normalAreaColors\n        }\n\n        CompositionLocalProvider(\n            LocalAreaColors provides currentColors,\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalSelectionAreaColors provides selectionAreaColors,\n            LocalFocusAreaColors provides focusAreaColors,\n            LocalDisabledAreaColors provides disabledAreaColors,\n            content = content\n        )\n    }\n}\n\nval LocalCheckBoxColors = compositionLocalOf<CheckBoxColors> {\n    LightTheme.CheckBoxColors\n}\n\n@Composable\nfun Checkbox(\n    checked: Boolean,\n    onCheckedChange: (Boolean) -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: CheckBoxColors = LocalCheckBoxColors.current,\n) {\n    TriStateCheckbox(\n        state = ToggleableState(checked),\n        onClick = { onCheckedChange(!checked) },\n        interactionSource = interactionSource,\n        enabled = enabled,\n        modifier = modifier,\n        colors = colors\n    )\n}\n\n@Composable\nfun Checkbox(\n    checked: Boolean,\n    onCheckedChange: (Boolean) -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: CheckBoxColors = LocalCheckBoxColors.current,\n    content: @Composable () -> Unit,\n) {\n    TriStateCheckbox(\n        state = ToggleableState(checked),\n        onClick = { onCheckedChange(!checked) },\n        interactionSource = interactionSource,\n        enabled = enabled,\n        modifier = modifier,\n        colors = colors,\n        content = content\n    )\n}\n\n@Composable\nfun TriStateCheckbox(\n    state: ToggleableState,\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: CheckBoxColors = LocalCheckBoxColors.current,\n) {\n    val isFocused = remember { mutableStateOf(false) }\n    colors.provideArea(enabled, isFocused.value, state != ToggleableState.Off) {\n        CheckboxImpl(\n            isFocused = isFocused.value, value = state,\n            modifier = Modifier.onFocusEvent {\n                isFocused.value = it.isFocused\n            }.triStateToggleable(\n                state = state,\n                onClick = onClick,\n                enabled = enabled,\n                role = Role.Checkbox,\n                interactionSource = interactionSource,\n                indication = null\n            )\n        )\n    }\n}\n\n@Composable\nfun TriStateCheckbox(\n    state: ToggleableState,\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: CheckBoxColors = LocalCheckBoxColors.current,\n    content: @Composable () -> Unit,\n) {\n    val isFocused = remember { mutableStateOf(false) }\n    colors.provideArea(enabled, isFocused.value, state != ToggleableState.Off) {\n        Row(\n            modifier.onFocusEvent {\n                isFocused.value = it.isFocused\n            }.triStateToggleable(\n                state = state,\n                onClick = onClick,\n                enabled = enabled,\n                role = Role.Checkbox,\n                interactionSource = interactionSource,\n                indication = null\n            ),\n            verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp)\n        ) {\n            CheckboxImpl(isFocused = isFocused.value, value = state)\n            content()\n        }\n    }\n}\n\nprivate fun Checkmark() = ImageVector.Builder(\n    name = \"Checkmark\", defaultWidth = 14.0.dp, defaultHeight = 14.0.dp, viewportWidth = 14.0f, viewportHeight = 14.0f\n).apply {\n    path(\n        fill = SolidColor(Color(0xFFffffff)),\n        stroke = null,\n        strokeLineWidth = 0.0f,\n        strokeLineCap = StrokeCap.Butt,\n        strokeLineJoin = StrokeJoin.Miter,\n        strokeLineMiter = 4.0f,\n        pathFillType = PathFillType.EvenOdd\n    ) {\n        moveTo(5.625f, 8.4267f)\n        lineTo(9.5566f, 2.9336f)\n        curveTo(9.5566f, 2.9336f, 10.1737f, 2.3242f, 10.8612f, 2.8242f)\n        curveTo(11.4433f, 3.3867f, 10.998f, 4.0938f, 10.998f, 4.0938f)\n        lineTo(6.3183f, 10.6445f)\n        curveTo(6.3183f, 10.6445f, 5.9941f, 11.0f, 5.5839f, 11.0f)\n        curveTo(5.1737f, 11.0f, 4.873f, 10.6445f, 4.873f, 10.6445f)\n        lineTo(2.9394f, 7.7461f)\n        curveTo(2.9394f, 7.7461f, 2.5683f, 6.9805f, 3.2558f, 6.4609f)\n        curveTo(4.0605f, 6.0781f, 4.5605f, 6.8394f, 4.5605f, 6.8394f)\n        lineTo(5.625f, 8.4267f)\n        close()\n    }\n}.build()\n\nprivate fun CheckmarkIndeterminate() = ImageVector.Builder(\n    name = \"CheckmarkIndeterminate\",\n    defaultWidth = 14.0.dp,\n    defaultHeight = 14.0.dp,\n    viewportWidth = 14.0f,\n    viewportHeight = 14.0f\n).apply {\n    path(\n        fill = SolidColor(Color(0xFFffffff)),\n        stroke = null,\n        strokeLineWidth = 0.0f,\n        strokeLineCap = StrokeCap.Butt,\n        strokeLineJoin = StrokeJoin.Miter,\n        strokeLineMiter = 4.0f,\n        pathFillType = PathFillType.NonZero\n    ) {\n        moveTo(3.7402f, 5.73f)\n        lineTo(10.1402f, 5.73f)\n        arcTo(1.0f, 1.0f, 0.0f, false, true, 11.1402f, 6.73f)\n        lineTo(11.1402f, 7.23f)\n        arcTo(1.0f, 1.0f, 0.0f, false, true, 10.1402f, 8.23f)\n        lineTo(3.7402f, 8.23f)\n        arcTo(1.0f, 1.0f, 0.0f, false, true, 2.7402f, 7.23f)\n        lineTo(2.7402f, 6.73f)\n        arcTo(1.0f, 1.0f, 0.0f, false, true, 3.7402f, 5.73f)\n        close()\n    }\n}.build()\n\n@Composable\nprivate fun CheckboxImpl(\n    isFocused: Boolean,\n    value: ToggleableState,\n    modifier: Modifier = Modifier,\n) {\n    val icon = when (value) {\n        ToggleableState.On -> rememberVectorPainter(Checkmark())\n        ToggleableState.Indeterminate -> rememberVectorPainter(CheckmarkIndeterminate())\n        else -> null\n    }\n\n    val colors = LocalAreaColors.current\n    Canvas(modifier.wrapContentSize(Alignment.Center).requiredSize(14.dp)) {\n        if (isFocused) {\n            drawRoundRect(\n                colors.focusColor,\n                size = Size(18.dp.toPx(), 18.dp.toPx()),\n                topLeft = Offset(-2.dp.toPx(), -2.dp.toPx()),\n                cornerRadius = CornerRadius(4.dp.toPx())\n            )\n        }\n        drawRoundRect(colors.startBorderColor, cornerRadius = CornerRadius(2.dp.toPx()))\n        drawRoundRect(\n            colors.startBackground,\n            size = Size(12.dp.toPx(), 12.dp.toPx()),\n            topLeft = Offset(1.dp.toPx(), 1.dp.toPx()),\n            cornerRadius = CornerRadius(1.dp.toPx())\n        )\n        if (icon != null) {\n            with(icon) {\n                14.dp.toPx()\n                draw(Size(14.dp.toPx(), 14.dp.toPx()), colorFilter = ColorFilter.tint(colors.foreground))\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/ComboBox.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.defaultMinSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.drawWithCache\nimport androidx.compose.ui.focus.FocusRequester\nimport androidx.compose.ui.focus.focusRequester\nimport androidx.compose.ui.focus.onFocusEvent\nimport androidx.compose.ui.geometry.CornerRadius\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.geometry.Size\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.DisabledAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.FocusAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalDisabledAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalFocusAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\n\nclass ComboBoxColors(\n    override val normalAreaColors: AreaColors,\n    override val focusAreaColors: AreaColors,\n    override val disabledAreaColors: AreaColors,\n    val dropdownMenuColors: DropdownMenuColors,\n) : AreaProvider, FocusAreaProvider, DisabledAreaProvider {\n\n    @Composable\n    fun provideArea(enabled: Boolean, focused: Boolean, content: @Composable () -> Unit) {\n        val currentAreaColor = when {\n            !enabled -> disabledAreaColors\n            focused -> focusAreaColors\n            else -> normalAreaColors\n        }\n\n        CompositionLocalProvider(\n            LocalAreaColors provides currentAreaColor,\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalFocusAreaColors provides focusAreaColors,\n            LocalDisabledAreaColors provides disabledAreaColors,\n            LocalDropdownMenuColors provides dropdownMenuColors,\n            content = content\n        )\n    }\n}\n\nval LocalComboBoxColors = compositionLocalOf<ComboBoxColors> {\n    error(\"No ComboBoxColors provided\")\n}\n\n@Composable\nfun <T> ComboBox(\n    items: List<T>,\n    value: T,\n    onValueChange: ((T) -> Unit)? = null,\n    modifier: Modifier = Modifier,\n    menuModifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    valueRender: @Composable (T) -> Unit = { Label(\"$it\") },\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: ComboBoxColors = LocalComboBoxColors.current,\n) {\n    val isFocused = remember { mutableStateOf(false) }\n    var menuOpened by remember { mutableStateOf(false) }\n    colors.provideArea(enabled, isFocused.value) {\n        val areaColors = LocalAreaColors.current\n        Box {\n            Box(\n                Modifier.defaultMinSize(72.dp, 24.dp).drawWithCache {\n                    onDrawBehind {\n                        if (isFocused.value) {\n                            drawRoundRect(\n                                areaColors.focusColor,\n                                size = Size(size.width + 4.dp.toPx(), size.height + 4.dp.toPx()),\n                                topLeft = Offset(-2.dp.toPx(), -2.dp.toPx()),\n                                cornerRadius = CornerRadius(5.dp.toPx())\n                            )\n                        }\n                        drawRoundRect(areaColors.startBorderColor, cornerRadius = CornerRadius(3.dp.toPx()))\n                        drawRoundRect(\n                            areaColors.startBackground,\n                            size = Size(size.width - 2.dp.toPx(), size.height - 2.dp.toPx()),\n                            topLeft = Offset(1.dp.toPx(), 1.dp.toPx()),\n                            cornerRadius = CornerRadius(2.dp.toPx())\n                        )\n                    }\n                }.onFocusEvent {\n                    isFocused.value = it.isFocused\n                }.clickable(\n                    interactionSource = interactionSource, indication = null, enabled = enabled, onClick = {\n                        menuOpened = true\n                    }, role = Role.Button\n                ).padding(6.dp, 3.dp).then(modifier),\n                contentAlignment = Alignment.CenterStart\n            ) {\n                Row(\n                    horizontalArrangement = Arrangement.Start,\n                    verticalAlignment = Alignment.CenterVertically\n                ) {\n                    valueRender(value)\n                }\n\n                Icon(\"icons/buttonDropTriangle.svg\", modifier = Modifier.align(Alignment.CenterEnd))\n            }\n\n            DropdownMenu(menuOpened, { menuOpened = false }, modifier = menuModifier) {\n                items.forEach { item ->\n                    val focusRequester = remember { FocusRequester() }\n                    DropdownMenuItem(\n                        onClick = {\n                            if (value != item) {\n                                onValueChange?.invoke(item)\n                            }\n                            menuOpened = false\n                        },\n                        Modifier.focusRequester(focusRequester).onFocusEvent {\n                            if (it.isFocused && value != item) {\n                                onValueChange?.invoke(item)\n                            }\n                        }\n                    ) {\n                        valueRender(item)\n                    }\n                    LaunchedEffect(menuOpened) {\n                        if (menuOpened && value == item) {\n                            focusRequester.requestFocus()\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/ContextCompositionLocals.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.runtime.compositionLocalOf\n\nval LocalContentActivated = compositionLocalOf { true }\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/ContextMenu.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.ContextMenuItem\nimport androidx.compose.foundation.ContextMenuRepresentation\nimport androidx.compose.foundation.ContextMenuState\nimport androidx.compose.foundation.VerticalScrollbar\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.IntrinsicSize\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.RowScope\nimport androidx.compose.foundation.layout.defaultMinSize\nimport androidx.compose.foundation.layout.fillMaxHeight\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.sizeIn\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.rememberScrollbarAdapter\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.drawWithCache\nimport androidx.compose.ui.draw.shadow\nimport androidx.compose.ui.focus.FocusDirection\nimport androidx.compose.ui.focus.FocusManager\nimport androidx.compose.ui.focus.onFocusEvent\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.drawOutline\nimport androidx.compose.ui.input.InputMode\nimport androidx.compose.ui.input.InputModeManager\nimport androidx.compose.ui.input.key.KeyEventType\nimport androidx.compose.ui.input.key.key\nimport androidx.compose.ui.input.key.nativeKeyCode\nimport androidx.compose.ui.input.key.type\nimport androidx.compose.ui.platform.LocalFocusManager\nimport androidx.compose.ui.platform.LocalInputModeManager\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.window.Popup\nimport androidx.compose.ui.window.rememberCursorPositionProvider\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.FocusAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.HoverAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalFocusAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalHoverAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalPressedAreaColors\nimport io.kanro.compose.jetbrains.expui.style.PressedAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.areaBackground\nimport io.kanro.compose.jetbrains.expui.style.areaBorder\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\nimport java.awt.event.KeyEvent\n\nclass ContextMenuColors(\n    override val normalAreaColors: AreaColors,\n    override val hoverAreaColors: AreaColors,\n    override val pressedAreaColors: AreaColors,\n    override val focusAreaColors: AreaColors,\n) : AreaProvider, HoverAreaProvider, PressedAreaProvider, FocusAreaProvider {\n    @Composable\n    fun provideArea(content: @Composable () -> Unit) {\n        CompositionLocalProvider(\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalAreaColors provides normalAreaColors,\n            LocalHoverAreaColors provides hoverAreaColors,\n            LocalPressedAreaColors provides pressedAreaColors,\n            LocalFocusAreaColors provides focusAreaColors,\n            content = content\n        )\n    }\n}\n\nval LocalContextMenuColors = compositionLocalOf {\n    LightTheme.ContextMenuColors\n}\n\nclass JbContextMenuRepresentation(private val colors: ContextMenuColors) : ContextMenuRepresentation {\n    @Composable\n    override fun Representation(state: ContextMenuState, items: () -> List<ContextMenuItem>) {\n        val isOpen = state.status is ContextMenuState.Status.Open\n        ContextMenu(\n            isOpen = isOpen,\n            items = items,\n            onDismissRequest = { state.status = ContextMenuState.Status.Closed },\n            colors = colors,\n        )\n    }\n}\n\n@OptIn(ExperimentalComposeUiApi::class)\n@Composable\nfun ContextMenu(\n    isOpen: Boolean,\n    items: () -> List<ContextMenuItem>,\n    onDismissRequest: () -> Unit,\n    colors: ContextMenuColors = LocalContextMenuColors.current,\n) {\n    if (isOpen) {\n        var focusManager: FocusManager? by mutableStateOf(null)\n        var inputModeManager: InputModeManager? by mutableStateOf(null)\n        Popup(\n            focusable = true,\n            onDismissRequest = onDismissRequest,\n            popupPositionProvider = rememberCursorPositionProvider(),\n            onKeyEvent = {\n                if (it.type == KeyEventType.KeyDown) {\n                    when (it.key.nativeKeyCode) {\n                        KeyEvent.VK_ESCAPE -> {\n                            onDismissRequest()\n                            true\n                        }\n\n                        KeyEvent.VK_DOWN -> {\n                            inputModeManager!!.requestInputMode(InputMode.Keyboard)\n                            focusManager!!.moveFocus(FocusDirection.Next)\n                            true\n                        }\n\n                        KeyEvent.VK_UP -> {\n                            inputModeManager!!.requestInputMode(InputMode.Keyboard)\n                            focusManager!!.moveFocus(FocusDirection.Previous)\n                            true\n                        }\n\n                        else -> false\n                    }\n                } else {\n                    false\n                }\n            },\n        ) {\n            focusManager = LocalFocusManager.current\n            inputModeManager = LocalInputModeManager.current\n            colors.provideArea {\n                Box(\n                    modifier = Modifier.shadow(12.dp).areaBorder().areaBackground()\n                        .sizeIn(maxHeight = 600.dp, minWidth = 72.dp).padding(6.dp).width(IntrinsicSize.Max)\n                ) {\n                    val scrollState = rememberScrollState()\n                    Column(\n                        modifier = Modifier.verticalScroll(scrollState),\n                        verticalArrangement = Arrangement.spacedBy(4.dp)\n                    ) {\n                        items().forEach { item ->\n                            MenuItemContent(onClick = {\n                                onDismissRequest()\n                                item.onClick()\n                            }) {\n                                Label(text = item.label)\n                            }\n                        }\n                    }\n                    Box(modifier = Modifier.matchParentSize()) {\n                        VerticalScrollbar(\n                            rememberScrollbarAdapter(scrollState),\n                            modifier = Modifier.fillMaxHeight().align(Alignment.CenterEnd)\n                        )\n                    }\n                }\n            }\n        }\n    }\n}\n\n@Composable\nprivate fun MenuItemContent(\n    onClick: () -> Unit,\n    contentPadding: PaddingValues = PaddingValues(horizontal = 8.dp),\n    shape: Shape = RoundedCornerShape(3.dp),\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    content: @Composable RowScope.() -> Unit,\n) {\n    val focused = remember { mutableStateOf(false) }\n    val focusedColors = LocalFocusAreaColors.current\n    Row(\n        modifier = Modifier.drawWithCache {\n            onDrawBehind {\n                if (focused.value) {\n                    val outline = shape.createOutline(size, layoutDirection, this)\n                    drawOutline(outline, focusedColors.startBackground)\n                }\n            }\n        }.onFocusEvent {\n            focused.value = it.isFocused\n        }.clickable(\n            enabled = true,\n            onClick = onClick,\n            interactionSource = interactionSource,\n            indication = HoverOrPressedIndication(shape)\n        ).fillMaxWidth().padding(contentPadding).defaultMinSize(minHeight = 24.dp),\n        verticalAlignment = Alignment.CenterVertically\n    ) {\n        content()\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/DropdownMenu.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.animation.core.MutableTransitionState\nimport androidx.compose.foundation.VerticalScrollbar\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.ColumnScope\nimport androidx.compose.foundation.layout.IntrinsicSize\nimport androidx.compose.foundation.layout.PaddingValues\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.RowScope\nimport androidx.compose.foundation.layout.defaultMinSize\nimport androidx.compose.foundation.layout.fillMaxHeight\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.sizeIn\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.rememberScrollbarAdapter\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.Immutable\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.awt.awtEventOrNull\nimport androidx.compose.ui.draw.drawWithCache\nimport androidx.compose.ui.draw.shadow\nimport androidx.compose.ui.focus.FocusDirection\nimport androidx.compose.ui.focus.FocusManager\nimport androidx.compose.ui.focus.onFocusEvent\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.TransformOrigin\nimport androidx.compose.ui.graphics.drawOutline\nimport androidx.compose.ui.input.InputMode\nimport androidx.compose.ui.input.InputModeManager\nimport androidx.compose.ui.input.key.Key\nimport androidx.compose.ui.input.key.KeyEventType\nimport androidx.compose.ui.input.key.key\nimport androidx.compose.ui.input.key.type\nimport androidx.compose.ui.platform.LocalDensity\nimport androidx.compose.ui.platform.LocalFocusManager\nimport androidx.compose.ui.platform.LocalInputModeManager\nimport androidx.compose.ui.unit.Density\nimport androidx.compose.ui.unit.DpOffset\nimport androidx.compose.ui.unit.IntOffset\nimport androidx.compose.ui.unit.IntRect\nimport androidx.compose.ui.unit.IntSize\nimport androidx.compose.ui.unit.LayoutDirection\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.window.Popup\nimport androidx.compose.ui.window.PopupPositionProvider\nimport androidx.compose.ui.window.rememberCursorPositionProvider\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.FocusAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.HoverAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalFocusAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalHoverAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalPressedAreaColors\nimport io.kanro.compose.jetbrains.expui.style.PressedAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.areaBackground\nimport io.kanro.compose.jetbrains.expui.style.areaBorder\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\nimport java.awt.event.KeyEvent\nimport kotlin.math.max\nimport kotlin.math.min\n\nclass DropdownMenuColors(\n    override val normalAreaColors: AreaColors,\n    override val hoverAreaColors: AreaColors,\n    override val pressedAreaColors: AreaColors,\n    override val focusAreaColors: AreaColors,\n) : AreaProvider, HoverAreaProvider, PressedAreaProvider, FocusAreaProvider {\n    @Composable\n    fun provideArea(content: @Composable () -> Unit) {\n        CompositionLocalProvider(\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalAreaColors provides normalAreaColors,\n            LocalHoverAreaColors provides hoverAreaColors,\n            LocalPressedAreaColors provides pressedAreaColors,\n            LocalFocusAreaColors provides focusAreaColors,\n            content = content\n        )\n    }\n}\n\nval LocalDropdownMenuColors = compositionLocalOf {\n    LightTheme.DropdownMenuColors\n}\n\n@Composable\nfun DropdownMenu(\n    expanded: Boolean,\n    onDismissRequest: () -> Unit,\n    focusable: Boolean = true,\n    modifier: Modifier = Modifier,\n    offset: DpOffset = DpOffset(0.dp, 0.dp),\n    colors: DropdownMenuColors = LocalDropdownMenuColors.current,\n    content: @Composable ColumnScope.() -> Unit,\n) {\n    val expandedStates = remember { MutableTransitionState(false) }\n    expandedStates.targetState = expanded\n\n    if (expandedStates.currentState || expandedStates.targetState) {\n        val transformOriginState = remember { mutableStateOf(TransformOrigin.Center) }\n        val density = LocalDensity.current\n        // The original [DropdownMenuPositionProvider] is not yet suitable for large screen devices,\n        // so we need to make additional checks and adjust the position of the [DropdownMenu] to\n        // avoid content being cut off if the [DropdownMenu] contains too many items.\n        // See: https://github.com/JetBrains/compose-jb/issues/1388\n        val popupPositionProvider = DesktopDropdownMenuPositionProvider(\n            offset, density\n        ) { parentBounds, menuBounds ->\n            transformOriginState.value = calculateTransformOrigin(parentBounds, menuBounds)\n        }\n\n        var focusManager: FocusManager? by mutableStateOf(null)\n        var inputModeManager: InputModeManager? by mutableStateOf(null)\n        Popup(\n            focusable = focusable,\n            onDismissRequest = onDismissRequest,\n            popupPositionProvider = popupPositionProvider,\n            onKeyEvent = {\n                handlePopupOnKeyEvent(it, onDismissRequest, focusManager!!, inputModeManager!!)\n            },\n        ) {\n            focusManager = LocalFocusManager.current\n            inputModeManager = LocalInputModeManager.current\n\n            DropdownMenuContent(\n                modifier = modifier, colors = colors, content = content\n            )\n        }\n    }\n}\n\n@Composable\nfun DropdownMenuItem(\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    shape: Shape = RectangleShape,\n    contentPadding: PaddingValues = PaddingValues(horizontal = 8.dp),\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    content: @Composable RowScope.() -> Unit,\n) {\n    DropdownMenuItemContent(\n        onClick = onClick,\n        modifier = modifier,\n        enabled = enabled,\n        shape = shape,\n        contentPadding = contentPadding,\n        interactionSource = interactionSource,\n        content = content\n    )\n}\n\n@OptIn(ExperimentalComposeUiApi::class)\nprivate fun handlePopupOnKeyEvent(\n    keyEvent: androidx.compose.ui.input.key.KeyEvent,\n    onDismissRequest: () -> Unit,\n    focusManager: FocusManager,\n    inputModeManager: InputModeManager,\n): Boolean {\n    return if (keyEvent.type == KeyEventType.KeyDown && keyEvent.awtEventOrNull?.keyCode == KeyEvent.VK_ESCAPE) {\n        onDismissRequest()\n        true\n    } else if (keyEvent.type == KeyEventType.KeyDown) {\n        when (keyEvent.key) {\n            Key.DirectionDown -> {\n                inputModeManager.requestInputMode(InputMode.Keyboard)\n                focusManager.moveFocus(FocusDirection.Next)\n                true\n            }\n\n            Key.DirectionUp -> {\n                inputModeManager.requestInputMode(InputMode.Keyboard)\n                focusManager.moveFocus(FocusDirection.Previous)\n                true\n            }\n\n            else -> false\n        }\n    } else {\n        false\n    }\n}\n\n@Composable\nfun CursorDropdownMenu(\n    expanded: Boolean,\n    onDismissRequest: () -> Unit,\n    focusable: Boolean = true,\n    modifier: Modifier = Modifier,\n    colors: DropdownMenuColors = LocalDropdownMenuColors.current,\n    content: @Composable ColumnScope.() -> Unit,\n) {\n    val expandedStates = remember { MutableTransitionState(false) }\n    expandedStates.targetState = expanded\n\n    if (expandedStates.currentState || expandedStates.targetState) {\n        var focusManager: FocusManager? by mutableStateOf(null)\n        var inputModeManager: InputModeManager? by mutableStateOf(null)\n\n        Popup(\n            focusable = focusable,\n            onDismissRequest = onDismissRequest,\n            popupPositionProvider = rememberCursorPositionProvider(),\n            onKeyEvent = {\n                handlePopupOnKeyEvent(it, onDismissRequest, focusManager!!, inputModeManager!!)\n            },\n        ) {\n            focusManager = LocalFocusManager.current\n            inputModeManager = LocalInputModeManager.current\n\n            DropdownMenuContent(\n                modifier = modifier, colors = colors, content = content\n            )\n        }\n    }\n}\n\n@Immutable\ninternal data class DesktopDropdownMenuPositionProvider(\n    val contentOffset: DpOffset,\n    val density: Density,\n    val onPositionCalculated: (IntRect, IntRect) -> Unit = { _, _ -> },\n) : PopupPositionProvider {\n    override fun calculatePosition(\n        anchorBounds: IntRect,\n        windowSize: IntSize,\n        layoutDirection: LayoutDirection,\n        popupContentSize: IntSize,\n    ): IntOffset {\n        // The min margin above and below the menu, relative to the screen.\n        val verticalMargin = with(density) { MenuVerticalMargin.roundToPx() }\n        // The content offset specified using the dropdown offset parameter.\n        val contentOffsetX = with(density) { contentOffset.x.roundToPx() }\n        val contentOffsetY = with(density) { contentOffset.y.roundToPx() }\n\n        // Compute horizontal position.\n        val toRight = anchorBounds.left + contentOffsetX\n        val toLeft = anchorBounds.right - contentOffsetX - popupContentSize.width\n        val toDisplayRight = windowSize.width - popupContentSize.width\n        val toDisplayLeft = 0\n        val x = if (layoutDirection == LayoutDirection.Ltr) {\n            sequenceOf(toRight, toLeft, toDisplayRight)\n        } else {\n            sequenceOf(toLeft, toRight, toDisplayLeft)\n        }.firstOrNull {\n            it >= 0 && it + popupContentSize.width <= windowSize.width\n        } ?: toLeft\n\n        // Compute vertical position.\n        val toBottom = maxOf(anchorBounds.bottom + contentOffsetY, verticalMargin)\n        val toTop = anchorBounds.top - contentOffsetY - popupContentSize.height\n        val toCenter = anchorBounds.top - popupContentSize.height / 2\n        val toDisplayBottom = windowSize.height - popupContentSize.height - verticalMargin\n        var y = sequenceOf(toBottom, toTop, toCenter, toDisplayBottom).firstOrNull {\n            it >= verticalMargin && it + popupContentSize.height <= windowSize.height - verticalMargin\n        } ?: toTop\n\n        // Desktop specific vertical position checking\n        val aboveAnchor = anchorBounds.top + contentOffsetY\n        val belowAnchor = windowSize.height - anchorBounds.bottom - contentOffsetY\n\n        if (belowAnchor >= aboveAnchor) {\n            y = anchorBounds.bottom + contentOffsetY\n        }\n\n        if (y + popupContentSize.height > windowSize.height) {\n            y = windowSize.height - popupContentSize.height\n        }\n\n        y = y.coerceAtLeast(0)\n\n        onPositionCalculated(\n            anchorBounds, IntRect(x, y, x + popupContentSize.width, y + popupContentSize.height)\n        )\n        return IntOffset(x, y)\n    }\n}\n\n@Composable\ninternal fun DropdownMenuContent(\n    modifier: Modifier = Modifier,\n    colors: DropdownMenuColors = LocalDropdownMenuColors.current,\n    content: @Composable ColumnScope.() -> Unit,\n) {\n    colors.provideArea {\n        val scrollState = rememberScrollState()\n        Box(\n            modifier = modifier.shadow(12.dp)\n                .areaBorder()\n                .areaBackground()\n                .sizeIn(maxHeight = 600.dp, minWidth = 72.dp)\n                .width(IntrinsicSize.Max)\n        ) {\n            Column(\n                modifier = Modifier.verticalScroll(scrollState), content = content\n            )\n            Box(modifier = Modifier.matchParentSize()) {\n                VerticalScrollbar(\n                    rememberScrollbarAdapter(scrollState),\n                    modifier = Modifier.fillMaxHeight().align(Alignment.CenterEnd)\n                )\n            }\n        }\n    }\n}\n\n@Composable\ninternal fun DropdownMenuItemContent(\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    shape: Shape = RectangleShape,\n    contentPadding: PaddingValues = PaddingValues(horizontal = 8.dp),\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    content: @Composable RowScope.() -> Unit,\n) {\n    val focused = remember { mutableStateOf(false) }\n    val focusedColors = LocalFocusAreaColors.current\n    Row(\n        modifier = modifier.drawWithCache {\n            onDrawBehind {\n                if (focused.value) {\n                    val outline = shape.createOutline(size, layoutDirection, this)\n                    drawOutline(outline, focusedColors.startBackground)\n                }\n            }\n        }.onFocusEvent {\n            focused.value = it.isFocused\n        }.clickable(\n            enabled = enabled,\n            onClick = onClick,\n            interactionSource = interactionSource,\n            indication = HoverOrPressedIndication(shape)\n        ).fillMaxWidth().padding(contentPadding).defaultMinSize(minHeight = 24.dp),\n        verticalAlignment = Alignment.CenterVertically\n    ) {\n        content()\n    }\n}\n\ninternal fun calculateTransformOrigin(\n    parentBounds: IntRect,\n    menuBounds: IntRect,\n): TransformOrigin {\n    val pivotX = when {\n        menuBounds.left >= parentBounds.right -> 0f\n        menuBounds.right <= parentBounds.left -> 1f\n        menuBounds.width == 0 -> 0f\n        else -> {\n            val intersectionCenter =\n                (max(parentBounds.left, menuBounds.left) + min(parentBounds.right, menuBounds.right)) / 2\n            (intersectionCenter - menuBounds.left).toFloat() / menuBounds.width\n        }\n    }\n    val pivotY = when {\n        menuBounds.top >= parentBounds.bottom -> 0f\n        menuBounds.bottom <= parentBounds.top -> 1f\n        menuBounds.height == 0 -> 0f\n        else -> {\n            val intersectionCenter =\n                (max(parentBounds.top, menuBounds.top) + min(parentBounds.bottom, menuBounds.bottom)) / 2\n            (intersectionCenter - menuBounds.top).toFloat() / menuBounds.height\n        }\n    }\n    return TransformOrigin(pivotX, pivotY)\n}\n\ninternal val MenuVerticalMargin = 12.dp\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/Icon.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.geometry.Size\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.ColorFilter\nimport androidx.compose.ui.graphics.ImageBitmap\nimport androidx.compose.ui.graphics.isSpecified\nimport androidx.compose.ui.graphics.painter.BitmapPainter\nimport androidx.compose.ui.graphics.painter.Painter\nimport androidx.compose.ui.graphics.toolingGraphicsLayer\nimport androidx.compose.ui.graphics.vector.ImageVector\nimport androidx.compose.ui.graphics.vector.rememberVectorPainter\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.semantics.contentDescription\nimport androidx.compose.ui.semantics.role\nimport androidx.compose.ui.semantics.semantics\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.theme.LocalIsDarkTheme\n\n@Composable\nfun themedSvgResource(resource: String, isDark: Boolean = LocalIsDarkTheme.current): Painter {\n    var realResource = resource\n    if (isDark) {\n        if (!realResource.endsWith(\"_dark.svg\")) {\n            val dark = realResource.replace(\".svg\", \"_dark.svg\")\n            if (Thread.currentThread().contextClassLoader.getResource(dark) != null) {\n                realResource = dark\n            }\n        }\n    } else {\n        if (realResource.endsWith(\"_dark.svg\")) {\n            val light = realResource.replace(\"_dark.svg\", \".svg\")\n            if (Thread.currentThread().contextClassLoader.getResource(light) != null) {\n                realResource = light\n            }\n        }\n    }\n    return painterResource(realResource)\n}\n\nprivate fun Modifier.defaultSizeFor(painter: Painter) = this.then(\n    if (painter.intrinsicSize == Size.Unspecified || painter.intrinsicSize.isInfinite()) {\n        DefaultIconSizeModifier\n    } else {\n        Modifier\n    }\n)\n\nprivate fun Size.isInfinite() = width.isInfinite() && height.isInfinite()\n\nprivate val DefaultIconSizeModifier = Modifier.size(20.dp)\n\n@Composable\nfun Icon(\n    resource: String,\n    contentDescription: String? = null,\n    modifier: Modifier = Modifier,\n    colorFilter: ColorFilter? = null,\n    markerColor: Color = Color.Unspecified,\n) {\n    Icon(\n        themedSvgResource(resource), contentDescription, modifier,\n        colorFilter = colorFilter,\n        markerColor = markerColor,\n    )\n}\n\n@Composable\nfun Icon(\n    bitmap: ImageBitmap,\n    contentDescription: String? = null,\n    modifier: Modifier = Modifier,\n    colorFilter: ColorFilter? = null,\n    markerColor: Color = Color.Unspecified,\n) {\n    val painter = remember(bitmap) { BitmapPainter(bitmap) }\n    Icon(\n        painter = painter,\n        contentDescription = contentDescription,\n        modifier = modifier,\n        colorFilter = colorFilter,\n        markerColor = markerColor,\n    )\n}\n\n@Composable\nfun Icon(\n    imageVector: ImageVector,\n    contentDescription: String? = null,\n    modifier: Modifier = Modifier,\n    colorFilter: ColorFilter? = null,\n    markerColor: Color = Color.Unspecified,\n) {\n    Icon(\n        painter = rememberVectorPainter(imageVector),\n        contentDescription = contentDescription,\n        modifier = modifier,\n        colorFilter = colorFilter,\n        markerColor = markerColor,\n    )\n}\n\n@Composable\nfun Icon(\n    painter: Painter,\n    contentDescription: String? = null,\n    modifier: Modifier = Modifier,\n    colorFilter: ColorFilter? = null,\n    markerColor: Color = Color.Unspecified,\n) {\n    val semantics = if (contentDescription != null) {\n        Modifier.semantics {\n            this.contentDescription = contentDescription\n            this.role = Role.Image\n        }\n    } else {\n        Modifier\n    }\n    val filter = colorFilter ?: run {\n        val foreground = LocalAreaColors.current.foreground\n        if (foreground.isSpecified) {\n            ColorFilter.tint(foreground)\n        } else {\n            null\n        }\n    }\n    Box(\n        modifier.toolingGraphicsLayer()\n            .defaultSizeFor(painter)\n            .paintWithMarker(painter, contentScale = ContentScale.None, colorFilter = filter, markerColor = markerColor)\n            .then(semantics)\n    )\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/Indication.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.Indication\nimport androidx.compose.foundation.interaction.InteractionSource\nimport androidx.compose.foundation.interaction.collectIsHoveredAsState\nimport androidx.compose.foundation.interaction.collectIsPressedAsState\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.drawOutline\nimport androidx.compose.ui.graphics.drawscope.ContentDrawScope\nimport androidx.compose.ui.graphics.isSpecified\nimport io.kanro.compose.jetbrains.expui.style.LocalHoverAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalPressedAreaColors\n\nclass HoverOrPressedIndication(private val shape: Shape) : Indication {\n    private class IndicationInstance(\n        private val shape: Shape,\n        private val isHover: State<Boolean>,\n        private val isPressed: State<Boolean>,\n        private val hoverColor: Color,\n        private val pressedColor: Color,\n    ) : androidx.compose.foundation.IndicationInstance {\n        override fun ContentDrawScope.drawIndication() {\n            when {\n                isPressed.value -> {\n                    if (pressedColor.isSpecified) {\n                        val outline = shape.createOutline(size, layoutDirection, this)\n                        drawOutline(outline, pressedColor)\n                    }\n                }\n\n                isHover.value -> {\n                    if (hoverColor.isSpecified) {\n                        val outline = shape.createOutline(size, layoutDirection, this)\n                        drawOutline(outline, hoverColor)\n                    }\n                }\n            }\n            drawContent()\n        }\n    }\n\n    @Composable\n    override fun rememberUpdatedInstance(interactionSource: InteractionSource): androidx.compose.foundation.IndicationInstance {\n        val hoverColors = LocalHoverAreaColors.current\n        val pressedColors = LocalPressedAreaColors.current\n        val isPressed = interactionSource.collectIsPressedAsState()\n        val isHover = interactionSource.collectIsHoveredAsState()\n\n        return remember(hoverColors, pressedColors, interactionSource) {\n            IndicationInstance(\n                shape, isHover, isPressed, hoverColors.startBackground, pressedColors.startBackground\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/Label.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.text.BasicText\nimport androidx.compose.foundation.text.InlineTextContent\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.takeOrElse\nimport androidx.compose.ui.text.AnnotatedString\nimport androidx.compose.ui.text.TextLayoutResult\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.font.FontFamily\nimport androidx.compose.ui.text.font.FontStyle\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.text.style.TextDecoration\nimport androidx.compose.ui.text.style.TextOverflow\nimport androidx.compose.ui.unit.TextUnit\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalDefaultTextStyle\n\n@Composable\nfun Label(\n    text: String,\n    modifier: Modifier = Modifier,\n    color: Color = Color.Unspecified,\n    fontSize: TextUnit = TextUnit.Unspecified,\n    fontStyle: FontStyle? = null,\n    fontWeight: FontWeight? = null,\n    fontFamily: FontFamily? = null,\n    letterSpacing: TextUnit = TextUnit.Unspecified,\n    textDecoration: TextDecoration? = null,\n    textAlign: TextAlign? = null,\n    lineHeight: TextUnit = TextUnit.Unspecified,\n    overflow: TextOverflow = TextOverflow.Clip,\n    softWrap: Boolean = true,\n    maxLines: Int = Int.MAX_VALUE,\n    onTextLayout: (TextLayoutResult) -> Unit = {},\n    style: TextStyle = LocalDefaultTextStyle.current,\n) {\n    val textColor = color.takeOrElse {\n        style.color\n    }.takeOrElse {\n        LocalAreaColors.current.text\n    }\n    val mergedStyle = style.merge(\n        TextStyle(\n            color = textColor,\n            fontSize = fontSize,\n            fontWeight = fontWeight,\n            textAlign = textAlign,\n            lineHeight = lineHeight,\n            fontFamily = fontFamily,\n            textDecoration = textDecoration,\n            fontStyle = fontStyle,\n            letterSpacing = letterSpacing\n        )\n    )\n\n    BasicText(\n        text = text,\n        modifier = modifier,\n        style = mergedStyle,\n        onTextLayout = onTextLayout,\n        overflow = overflow,\n        softWrap = softWrap,\n        maxLines = maxLines,\n    )\n}\n\n@Composable\nfun Label(\n    text: AnnotatedString,\n    modifier: Modifier = Modifier,\n    color: Color = Color.Unspecified,\n    fontSize: TextUnit = TextUnit.Unspecified,\n    fontStyle: FontStyle? = null,\n    fontWeight: FontWeight? = null,\n    fontFamily: FontFamily? = null,\n    letterSpacing: TextUnit = TextUnit.Unspecified,\n    textDecoration: TextDecoration? = null,\n    textAlign: TextAlign? = null,\n    lineHeight: TextUnit = TextUnit.Unspecified,\n    overflow: TextOverflow = TextOverflow.Clip,\n    softWrap: Boolean = true,\n    maxLines: Int = Int.MAX_VALUE,\n    inlineContent: Map<String, InlineTextContent> = mapOf(),\n    onTextLayout: (TextLayoutResult) -> Unit = {},\n    style: TextStyle = LocalDefaultTextStyle.current,\n) {\n    val textColor = color.takeOrElse {\n        style.color\n    }.takeOrElse {\n        LocalAreaColors.current.text\n    }\n    val mergedStyle = style.merge(\n        TextStyle(\n            color = textColor,\n            fontSize = fontSize,\n            fontWeight = fontWeight,\n            textAlign = textAlign,\n            lineHeight = lineHeight,\n            fontFamily = fontFamily,\n            textDecoration = textDecoration,\n            fontStyle = fontStyle,\n            letterSpacing = letterSpacing\n        )\n    )\n\n    BasicText(\n        text = text,\n        modifier = modifier,\n        style = mergedStyle,\n        onTextLayout = onTextLayout,\n        overflow = overflow,\n        softWrap = softWrap,\n        maxLines = maxLines,\n        inlineContent = inlineContent\n    )\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/Link.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.Indication\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.focusable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.foundation.text.BasicText\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.composed\nimport androidx.compose.ui.draw.drawWithCache\nimport androidx.compose.ui.focus.focusProperties\nimport androidx.compose.ui.focus.onFocusEvent\nimport androidx.compose.ui.geometry.CornerRadius\nimport androidx.compose.ui.geometry.RoundRect\nimport androidx.compose.ui.graphics.Path\nimport androidx.compose.ui.graphics.PathFillType\nimport androidx.compose.ui.graphics.addOutline\nimport androidx.compose.ui.input.key.Key\nimport androidx.compose.ui.input.key.KeyEventType\nimport androidx.compose.ui.input.key.key\nimport androidx.compose.ui.input.key.onKeyEvent\nimport androidx.compose.ui.input.key.type\nimport androidx.compose.ui.input.pointer.PointerEventPass\nimport androidx.compose.ui.input.pointer.PointerEventType\nimport androidx.compose.ui.input.pointer.PointerIcon\nimport androidx.compose.ui.input.pointer.pointerHoverIcon\nimport androidx.compose.ui.input.pointer.pointerInput\nimport androidx.compose.ui.platform.LocalFocusManager\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.text.TextLayoutResult\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.font.FontFamily\nimport androidx.compose.ui.text.font.FontStyle\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.text.style.TextDecoration\nimport androidx.compose.ui.text.style.TextOverflow\nimport androidx.compose.ui.unit.TextUnit\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.DisabledAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.FocusAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.HoverAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalDefaultTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalDisabledAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalFocusAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalHoverAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalPressedAreaColors\nimport io.kanro.compose.jetbrains.expui.style.PressedAreaProvider\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\nimport java.awt.Cursor\n\nclass LinkColors(\n    override val normalAreaColors: AreaColors,\n    val visitedAreaColors: AreaColors,\n    override val focusAreaColors: AreaColors,\n    override val disabledAreaColors: AreaColors,\n    override val hoverAreaColors: AreaColors,\n    override val pressedAreaColors: AreaColors,\n) : AreaProvider, HoverAreaProvider, PressedAreaProvider, DisabledAreaProvider, FocusAreaProvider {\n    @Composable\n    fun provideArea(\n        enabled: Boolean,\n        visited: Boolean,\n        hover: Boolean,\n        pressed: Boolean,\n        content: @Composable () -> Unit,\n    ) {\n        val currentColors = when {\n            !enabled -> disabledAreaColors\n            pressed -> pressedAreaColors\n            hover -> hoverAreaColors\n            visited -> visitedAreaColors\n            else -> normalAreaColors\n        }\n        CompositionLocalProvider(\n            LocalAreaColors provides currentColors,\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalDisabledAreaColors provides disabledAreaColors,\n            LocalPressedAreaColors provides pressedAreaColors,\n            LocalHoverAreaColors provides hoverAreaColors,\n            LocalFocusAreaColors provides focusAreaColors,\n            content = content\n        )\n    }\n}\n\nval LocalLinkColors = compositionLocalOf {\n    LightTheme.LinkColors\n}\n\n@OptIn(ExperimentalComposeUiApi::class)\n@Composable\nfun Link(\n    text: String,\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    fontSize: TextUnit = TextUnit.Unspecified,\n    fontStyle: FontStyle? = null,\n    fontWeight: FontWeight? = null,\n    fontFamily: FontFamily? = null,\n    letterSpacing: TextUnit = TextUnit.Unspecified,\n    textAlign: TextAlign? = null,\n    lineHeight: TextUnit = TextUnit.Unspecified,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    indication: Indication? = null,\n    colors: LinkColors = LocalLinkColors.current,\n    onTextLayout: (TextLayoutResult) -> Unit = {},\n    style: TextStyle = LocalDefaultTextStyle.current,\n    trailerIcon: @Composable (() -> Unit)? = null,\n) {\n    val visited = remember { mutableStateOf(false) }\n    val hovered = remember { mutableStateOf(false) }\n    val pressed = remember { mutableStateOf(false) }\n\n    colors.provideArea(enabled, visited.value, hovered.value, pressed.value) {\n        val currentAreaColors = LocalAreaColors.current\n        val mergedStyle = style.merge(\n            TextStyle(\n                color = currentAreaColors.text,\n                fontSize = fontSize,\n                fontWeight = fontWeight,\n                textAlign = textAlign,\n                lineHeight = lineHeight,\n                fontFamily = fontFamily,\n                textDecoration = if (hovered.value) {\n                    TextDecoration.Underline\n                } else {\n                    TextDecoration.None\n                },\n                fontStyle = fontStyle,\n                letterSpacing = letterSpacing\n            )\n        )\n\n        val focus = remember { mutableStateOf(false) }\n        Box(\n            modifier = Modifier.onFocusEvent {\n                focus.value = it.isFocused\n            }.focusable(enabled, interactionSource).drawWithCache {\n                onDrawBehind {\n                    if (focus.value) {\n                        val controlOutline = RoundedCornerShape(2.dp).createOutline(size, layoutDirection, this)\n                        val highlightOutline =\n                            RoundRect(controlOutline.bounds.inflate(2.dp.toPx()), CornerRadius(4.dp.toPx()))\n                        val highlightPath = Path().apply {\n                            this.fillType = PathFillType.EvenOdd\n                            addRoundRect(highlightOutline)\n                            addOutline(controlOutline)\n                            close()\n                        }\n                        drawPath(highlightPath, currentAreaColors.focusColor)\n                    }\n                }\n            }.onKeyEvent {\n                if (it.type != KeyEventType.KeyUp) return@onKeyEvent false\n                if (!focus.value) return@onKeyEvent false\n                when (it.key) {\n                    Key.Enter, Key.NumPadEnter -> {\n                        visited.value = true\n                        onClick()\n                        return@onKeyEvent true\n                    }\n                }\n                false\n            }\n        ) {\n            val rowInteractionSource = remember { MutableInteractionSource() }\n            val focusManager = LocalFocusManager.current\n            Row(\n                modifier = modifier.focusProperties {\n                    this.canFocus = false\n                }.clickable(\n                    onClick = {\n                        visited.value = true\n                        if (!focus.value) {\n                            focusManager.clearFocus()\n                        }\n                        onClick()\n                    },\n                    enabled = enabled,\n                    role = Role.Button,\n                    indication = indication,\n                    interactionSource = rowInteractionSource,\n                ).pointerInput(Unit) {\n                    awaitPointerEventScope {\n                        while (true) {\n                            val event = awaitPointerEvent(PointerEventPass.Initial)\n                            if (!enabled) {\n                                return@awaitPointerEventScope\n                            }\n                            when (event.type) {\n                                PointerEventType.Enter -> hovered.value = true\n                                PointerEventType.Exit -> hovered.value = false\n                                PointerEventType.Press -> pressed.value = true\n                                PointerEventType.Release -> pressed.value = false\n                                else -> {}\n                            }\n                        }\n                    }\n                }.composed {\n                    if (enabled) {\n                        pointerHoverIcon(PointerIcon(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)))\n                    } else {\n                        this\n                    }\n                }\n            ) {\n                BasicText(\n                    text = text,\n                    style = mergedStyle,\n                    onTextLayout = onTextLayout,\n                    overflow = TextOverflow.Clip,\n                    softWrap = false,\n                    maxLines = 1,\n                )\n                trailerIcon?.invoke()\n            }\n        }\n    }\n}\n\n@Composable\nfun ExternalLink(\n    text: String,\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    fontSize: TextUnit = TextUnit.Unspecified,\n    fontStyle: FontStyle? = null,\n    fontWeight: FontWeight? = null,\n    fontFamily: FontFamily? = null,\n    letterSpacing: TextUnit = TextUnit.Unspecified,\n    textAlign: TextAlign? = null,\n    lineHeight: TextUnit = TextUnit.Unspecified,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    indication: Indication? = null,\n    colors: LinkColors = LocalLinkColors.current,\n    onTextLayout: (TextLayoutResult) -> Unit = {},\n    style: TextStyle = LocalDefaultTextStyle.current,\n) {\n    Link(\n        text = text,\n        onClick = onClick,\n        modifier = modifier,\n        enabled = enabled,\n        fontSize = fontSize,\n        fontStyle = fontStyle,\n        fontWeight = fontWeight,\n        fontFamily = fontFamily,\n        letterSpacing = letterSpacing,\n        textAlign = textAlign,\n        lineHeight = lineHeight,\n        interactionSource = interactionSource,\n        indication = indication,\n        colors = colors,\n        onTextLayout = onTextLayout,\n        style = style,\n    ) {\n        Icon(\"icons/external_link_arrow.svg\")\n    }\n}\n\n@Composable\nfun DropdownLink(\n    text: String,\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    fontSize: TextUnit = TextUnit.Unspecified,\n    fontStyle: FontStyle? = null,\n    fontWeight: FontWeight? = null,\n    fontFamily: FontFamily? = null,\n    letterSpacing: TextUnit = TextUnit.Unspecified,\n    textAlign: TextAlign? = null,\n    lineHeight: TextUnit = TextUnit.Unspecified,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    indication: Indication? = null,\n    colors: LinkColors = LocalLinkColors.current,\n    onTextLayout: (TextLayoutResult) -> Unit = {},\n    style: TextStyle = LocalDefaultTextStyle.current,\n) {\n    Link(\n        text = text,\n        onClick = onClick,\n        modifier = modifier,\n        enabled = enabled,\n        fontSize = fontSize,\n        fontStyle = fontStyle,\n        fontWeight = fontWeight,\n        fontFamily = fontFamily,\n        letterSpacing = letterSpacing,\n        textAlign = textAlign,\n        lineHeight = lineHeight,\n        interactionSource = interactionSource,\n        indication = indication,\n        colors = colors,\n        onTextLayout = onTextLayout,\n        style = style,\n    ) {\n        Icon(\"icons/linkDropTriangle.svg\")\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/Painter.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.DrawModifier\nimport androidx.compose.ui.draw.paint\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.geometry.Rect\nimport androidx.compose.ui.geometry.Size\nimport androidx.compose.ui.geometry.isSpecified\nimport androidx.compose.ui.graphics.BlendMode\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.ColorFilter\nimport androidx.compose.ui.graphics.DefaultAlpha\nimport androidx.compose.ui.graphics.Paint\nimport androidx.compose.ui.graphics.drawscope.ContentDrawScope\nimport androidx.compose.ui.graphics.drawscope.drawIntoCanvas\nimport androidx.compose.ui.graphics.drawscope.translate\nimport androidx.compose.ui.graphics.isSpecified\nimport androidx.compose.ui.graphics.painter.Painter\nimport androidx.compose.ui.graphics.withSaveLayer\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.layout.IntrinsicMeasurable\nimport androidx.compose.ui.layout.IntrinsicMeasureScope\nimport androidx.compose.ui.layout.LayoutModifier\nimport androidx.compose.ui.layout.Measurable\nimport androidx.compose.ui.layout.MeasureResult\nimport androidx.compose.ui.layout.MeasureScope\nimport androidx.compose.ui.layout.times\nimport androidx.compose.ui.platform.InspectorInfo\nimport androidx.compose.ui.platform.InspectorValueInfo\nimport androidx.compose.ui.platform.debugInspectorInfo\nimport androidx.compose.ui.unit.Constraints\nimport androidx.compose.ui.unit.IntSize\nimport androidx.compose.ui.unit.constrainHeight\nimport androidx.compose.ui.unit.constrainWidth\nimport androidx.compose.ui.unit.dp\nimport kotlin.math.max\nimport kotlin.math.roundToInt\n\nfun Modifier.paintWithMarker(\n    painter: Painter,\n    sizeToIntrinsics: Boolean = true,\n    alignment: Alignment = Alignment.Center,\n    contentScale: ContentScale = ContentScale.Inside,\n    alpha: Float = DefaultAlpha,\n    colorFilter: ColorFilter? = null,\n    markerColor: Color = Color.Unspecified,\n): Modifier {\n    return if (markerColor.isSpecified) {\n        this.then(\n            PainterWithMarkerModifier(\n                painter = painter,\n                sizeToIntrinsics = sizeToIntrinsics,\n                alignment = alignment,\n                contentScale = contentScale,\n                alpha = alpha,\n                colorFilter = colorFilter,\n                markerColor = markerColor,\n                inspectorInfo = debugInspectorInfo {\n                    name = \"paintWithMarker\"\n                    properties[\"painter\"] = painter\n                    properties[\"sizeToIntrinsics\"] = sizeToIntrinsics\n                    properties[\"alignment\"] = alignment\n                    properties[\"contentScale\"] = contentScale\n                    properties[\"alpha\"] = alpha\n                    properties[\"colorFilter\"] = colorFilter\n                    properties[\"markerColor\"] = markerColor\n                }\n            )\n        )\n    } else {\n        this.paint(painter, sizeToIntrinsics, alignment, contentScale, alpha, colorFilter)\n    }\n}\n\nprivate class PainterWithMarkerModifier(\n    val painter: Painter,\n    val sizeToIntrinsics: Boolean,\n    val alignment: Alignment = Alignment.Center,\n    val contentScale: ContentScale = ContentScale.Inside,\n    val alpha: Float = DefaultAlpha,\n    val colorFilter: ColorFilter? = null,\n    val markerColor: Color = Color.Unspecified,\n    inspectorInfo: InspectorInfo.() -> Unit,\n) : LayoutModifier, DrawModifier, InspectorValueInfo(inspectorInfo) {\n\n    /**\n     * Helper property to determine if we should size content to the intrinsic\n     * size of the Painter or not. This is only done if [sizeToIntrinsics] is true\n     * and the Painter has an intrinsic size\n     */\n    private val useIntrinsicSize: Boolean\n        get() = sizeToIntrinsics && painter.intrinsicSize.isSpecified\n\n    override fun MeasureScope.measure(\n        measurable: Measurable,\n        constraints: Constraints,\n    ): MeasureResult {\n        val placeable = measurable.measure(modifyConstraints(constraints))\n        return layout(placeable.width, placeable.height) {\n            placeable.placeRelative(0, 0)\n        }\n    }\n\n    override fun IntrinsicMeasureScope.minIntrinsicWidth(\n        measurable: IntrinsicMeasurable,\n        height: Int,\n    ): Int {\n        return if (useIntrinsicSize) {\n            val constraints = modifyConstraints(Constraints(maxHeight = height))\n            val layoutWidth = measurable.minIntrinsicWidth(height)\n            max(constraints.minWidth, layoutWidth)\n        } else {\n            measurable.minIntrinsicWidth(height)\n        }\n    }\n\n    override fun IntrinsicMeasureScope.maxIntrinsicWidth(\n        measurable: IntrinsicMeasurable,\n        height: Int,\n    ): Int {\n        return if (useIntrinsicSize) {\n            val constraints = modifyConstraints(Constraints(maxHeight = height))\n            val layoutWidth = measurable.maxIntrinsicWidth(height)\n            max(constraints.minWidth, layoutWidth)\n        } else {\n            measurable.maxIntrinsicWidth(height)\n        }\n    }\n\n    override fun IntrinsicMeasureScope.minIntrinsicHeight(\n        measurable: IntrinsicMeasurable,\n        width: Int,\n    ): Int {\n        return if (useIntrinsicSize) {\n            val constraints = modifyConstraints(Constraints(maxWidth = width))\n            val layoutHeight = measurable.minIntrinsicHeight(width)\n            max(constraints.minHeight, layoutHeight)\n        } else {\n            measurable.minIntrinsicHeight(width)\n        }\n    }\n\n    override fun IntrinsicMeasureScope.maxIntrinsicHeight(\n        measurable: IntrinsicMeasurable,\n        width: Int,\n    ): Int {\n        return if (useIntrinsicSize) {\n            val constraints = modifyConstraints(Constraints(maxWidth = width))\n            val layoutHeight = measurable.maxIntrinsicHeight(width)\n            max(constraints.minHeight, layoutHeight)\n        } else {\n            measurable.maxIntrinsicHeight(width)\n        }\n    }\n\n    private fun calculateScaledSize(dstSize: Size): Size {\n        return if (!useIntrinsicSize) {\n            dstSize\n        } else {\n            val srcWidth = if (!painter.intrinsicSize.hasSpecifiedAndFiniteWidth()) {\n                dstSize.width\n            } else {\n                painter.intrinsicSize.width\n            }\n\n            val srcHeight = if (!painter.intrinsicSize.hasSpecifiedAndFiniteHeight()) {\n                dstSize.height\n            } else {\n                painter.intrinsicSize.height\n            }\n\n            val srcSize = Size(srcWidth, srcHeight)\n            if (dstSize.width != 0f && dstSize.height != 0f) {\n                srcSize * contentScale.computeScaleFactor(srcSize, dstSize)\n            } else {\n                Size.Zero\n            }\n        }\n    }\n\n    private fun modifyConstraints(constraints: Constraints): Constraints {\n        val hasBoundedDimens = constraints.hasBoundedWidth && constraints.hasBoundedHeight\n        val hasFixedDimens = constraints.hasFixedWidth && constraints.hasFixedHeight\n        if ((!useIntrinsicSize && hasBoundedDimens) || hasFixedDimens) {\n            // If we have fixed constraints or we are not attempting to size the\n            // composable based on the size of the Painter, do not attempt to\n            // modify them. Otherwise rely on Alignment and ContentScale\n            // to determine how to position the drawing contents of the Painter within\n            // the provided bounds\n            return constraints.copy(\n                minWidth = constraints.maxWidth, minHeight = constraints.maxHeight\n            )\n        }\n\n        val intrinsicSize = painter.intrinsicSize\n        val intrinsicWidth = if (intrinsicSize.hasSpecifiedAndFiniteWidth()) {\n            intrinsicSize.width.roundToInt()\n        } else {\n            constraints.minWidth\n        }\n\n        val intrinsicHeight = if (intrinsicSize.hasSpecifiedAndFiniteHeight()) {\n            intrinsicSize.height.roundToInt()\n        } else {\n            constraints.minHeight\n        }\n\n        // Scale the width and height appropriately based on the given constraints\n        // and ContentScale\n        val constrainedWidth = constraints.constrainWidth(intrinsicWidth)\n        val constrainedHeight = constraints.constrainHeight(intrinsicHeight)\n        val scaledSize = calculateScaledSize(\n            Size(constrainedWidth.toFloat(), constrainedHeight.toFloat())\n        )\n\n        // For both width and height constraints, consume the minimum of the scaled width\n        // and the maximum constraint as some scale types can scale larger than the maximum\n        // available size (ex ContentScale.Crop)\n        // In this case the larger of the 2 dimensions is used and the aspect ratio is\n        // maintained. Even if the size of the composable is smaller, the painter will\n        // draw its content clipped\n        val minWidth = constraints.constrainWidth(scaledSize.width.roundToInt())\n        val minHeight = constraints.constrainHeight(scaledSize.height.roundToInt())\n        return constraints.copy(minWidth = minWidth, minHeight = minHeight)\n    }\n\n    private var layerPaint: Paint? = null\n\n    private fun obtainPaint(): Paint {\n        var target = layerPaint\n        if (target == null) {\n            target = Paint()\n            layerPaint = target\n        }\n        return target\n    }\n\n    override fun ContentDrawScope.draw() {\n        val intrinsicSize = painter.intrinsicSize\n        val srcWidth = if (intrinsicSize.hasSpecifiedAndFiniteWidth()) {\n            intrinsicSize.width\n        } else {\n            size.width\n        }\n\n        val srcHeight = if (intrinsicSize.hasSpecifiedAndFiniteHeight()) {\n            intrinsicSize.height\n        } else {\n            size.height\n        }\n\n        val srcSize = Size(srcWidth, srcHeight)\n\n        // Compute the offset to translate the content based on the given alignment\n        // and size to draw based on the ContentScale parameter\n        val scaledSize = if (size.width != 0f && size.height != 0f) {\n            srcSize * contentScale.computeScaleFactor(srcSize, size)\n        } else {\n            Size.Zero\n        }\n\n        val alignedPosition = alignment.align(\n            IntSize(scaledSize.width.roundToInt(), scaledSize.height.roundToInt()),\n            IntSize(size.width.roundToInt(), size.height.roundToInt()),\n            layoutDirection\n        )\n\n        val dx = alignedPosition.x.toFloat()\n        val dy = alignedPosition.y.toFloat()\n\n        // Only translate the current drawing position while delegating the Painter to draw\n        // with scaled size.\n        // Individual Painter implementations should be responsible for scaling their drawing\n        // content accordingly to fit within the drawing area.\n        translate(dx, dy) {\n            if (markerColor.isSpecified) {\n                drawIntoCanvas {\n                    val layerRect = Rect(Offset.Zero, scaledSize)\n                    val markerOffset = Offset(scaledSize.width / 2 + 6.dp.toPx(), scaledSize.height / 2 - 8.dp.toPx())\n\n                    it.withSaveLayer(layerRect, obtainPaint()) {\n                        with(painter) {\n                            draw(size = scaledSize, alpha = alpha, colorFilter = colorFilter)\n                        }\n                        drawCircle(\n                            Color.White, 4.5.dp.toPx(), markerOffset, blendMode = BlendMode.Clear\n                        )\n                        drawCircle(\n                            markerColor,\n                            3.5.dp.toPx(),\n                            markerOffset,\n                        )\n                    }\n                }\n            } else {\n                with(painter) {\n                    draw(size = scaledSize, alpha = alpha, colorFilter = colorFilter)\n                }\n            }\n        }\n\n        // Maintain the same pattern as Modifier.drawBehind to allow chaining of DrawModifiers\n        drawContent()\n    }\n\n    private fun Size.hasSpecifiedAndFiniteWidth() = this != Size.Unspecified && width.isFinite()\n    private fun Size.hasSpecifiedAndFiniteHeight() = this != Size.Unspecified && height.isFinite()\n\n    override fun hashCode(): Int {\n        var result = painter.hashCode()\n        result = 31 * result + sizeToIntrinsics.hashCode()\n        result = 31 * result + alignment.hashCode()\n        result = 31 * result + contentScale.hashCode()\n        result = 31 * result + alpha.hashCode()\n        result = 31 * result + (colorFilter?.hashCode() ?: 0)\n        return result\n    }\n\n    override fun equals(other: Any?): Boolean {\n        val otherModifier = other as? PainterWithMarkerModifier ?: return false\n        return painter == otherModifier.painter && sizeToIntrinsics == otherModifier.sizeToIntrinsics && alignment == otherModifier.alignment && contentScale == otherModifier.contentScale && alpha == otherModifier.alpha && colorFilter == otherModifier.colorFilter\n    }\n\n    override fun toString(): String =\n        \"PainterWithMarkerModifier(painter=$painter, sizeToIntrinsics=$sizeToIntrinsics, alignment=$alignment, alpha=$alpha, colorFilter=$colorFilter, markerColor=$markerColor)\"\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/PointerInput.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.pointer.PointerEventType\nimport androidx.compose.ui.input.pointer.pointerInput\n\nfun Modifier.onHover(onHover: (Boolean) -> Unit): Modifier = this.pointerInput(Unit) {\n    awaitPointerEventScope {\n        while (true) {\n            val event = awaitPointerEvent()\n            when (event.type) {\n                PointerEventType.Enter -> onHover(true)\n                PointerEventType.Exit -> onHover(false)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/ProgressBar.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.animation.core.animateFloat\nimport androidx.compose.animation.core.infiniteRepeatable\nimport androidx.compose.animation.core.keyframes\nimport androidx.compose.animation.core.rememberInfiniteTransition\nimport androidx.compose.foundation.Canvas\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.progressSemantics\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.graphics.Brush\nimport androidx.compose.ui.graphics.StrokeCap\nimport androidx.compose.ui.graphics.TileMode\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\n\nclass ProgressBarColors(\n    override val normalAreaColors: AreaColors,\n    val indeterminateAreaColors: AreaColors,\n) : AreaProvider\n\nval LocalProgressBarColors = compositionLocalOf {\n    LightTheme.ProgressBarColors\n}\n\n@Composable\nfun ProgressBar(\n    progress: Float,\n    modifier: Modifier = Modifier,\n    colors: ProgressBarColors = LocalProgressBarColors.current,\n) {\n    val currentColors = colors.normalAreaColors\n    Canvas(\n        modifier.progressSemantics(progress).size(200.dp, 4.dp)\n    ) {\n        val strokeWidth = size.height\n        val length = size.width\n\n        drawLine(\n            currentColors.startBackground,\n            Offset(0f, strokeWidth / 2f),\n            Offset(length, strokeWidth / 2f),\n            strokeWidth,\n            cap = StrokeCap.Round\n        )\n        drawLine(\n            currentColors.foreground,\n            Offset(0f, strokeWidth / 2f),\n            Offset(length * progress, strokeWidth / 2f),\n            strokeWidth,\n            cap = StrokeCap.Round\n        )\n    }\n}\n\n@Composable\nfun ProgressBar(\n    modifier: Modifier = Modifier,\n    colors: ProgressBarColors = LocalProgressBarColors.current,\n) {\n    val transition = rememberInfiniteTransition()\n    val currentOffset by transition.animateFloat(\n        0f, 1f,\n        infiniteRepeatable(\n            animation = keyframes {\n                durationMillis = 1000\n            }\n        )\n    )\n    val currentColors = colors.indeterminateAreaColors\n    Canvas(\n        modifier.progressSemantics().size(200.dp, 4.dp)\n    ) {\n        val strokeWidth = size.height\n        val length = size.width\n        val offset = currentOffset * length\n        val brush = Brush.linearGradient(\n            listOf(currentColors.startBackground, currentColors.endBackground, currentColors.startBackground),\n            start = Offset(offset, 0f),\n            end = Offset(offset + length, 0f),\n            tileMode = TileMode.Repeated\n        )\n        drawLine(\n            brush, Offset(0f, strokeWidth / 2f), Offset(length, strokeWidth / 2f), strokeWidth, cap = StrokeCap.Round\n        )\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/RadioButton.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.Canvas\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.RowScope\nimport androidx.compose.foundation.layout.requiredSize\nimport androidx.compose.foundation.layout.wrapContentSize\nimport androidx.compose.foundation.selection.selectable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.focus.onFocusEvent\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.DisabledAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.FocusAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalDisabledAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalFocusAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSelectionAreaColors\nimport io.kanro.compose.jetbrains.expui.style.SelectionAreaProvider\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\n\nclass RadioButtonColors(\n    override val normalAreaColors: AreaColors,\n    override val selectionAreaColors: AreaColors,\n    override val focusAreaColors: AreaColors,\n    override val disabledAreaColors: AreaColors,\n) : AreaProvider, SelectionAreaProvider, FocusAreaProvider, DisabledAreaProvider {\n    @Composable\n    fun provideArea(enabled: Boolean, focused: Boolean, selected: Boolean, content: @Composable () -> Unit) {\n        val currentColors = when {\n            !enabled -> disabledAreaColors\n            focused -> focusAreaColors\n            selected -> selectionAreaColors\n            else -> normalAreaColors\n        }\n\n        CompositionLocalProvider(\n            LocalAreaColors provides currentColors,\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalSelectionAreaColors provides selectionAreaColors,\n            LocalFocusAreaColors provides focusAreaColors,\n            LocalDisabledAreaColors provides disabledAreaColors,\n            content = content\n        )\n    }\n}\n\nval LocalRadioButtonColors = compositionLocalOf {\n    LightTheme.RadioButtonColors\n}\n\n@Composable\nfun RadioButton(\n    selected: Boolean,\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: RadioButtonColors = LocalRadioButtonColors.current,\n) {\n    val isFocused = remember { mutableStateOf(false) }\n    colors.provideArea(enabled, isFocused.value, selected) {\n        RadioButtonImpl(\n            isFocused.value, selected,\n            modifier = modifier.onFocusEvent {\n                isFocused.value = it.isFocused\n            }.selectable(\n                selected = selected,\n                enabled = enabled,\n                onClick = onClick,\n                interactionSource = interactionSource,\n                indication = null,\n                role = Role.RadioButton\n            )\n        )\n    }\n}\n\n@Composable\nfun RadioButton(\n    selected: Boolean,\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: RadioButtonColors = LocalRadioButtonColors.current,\n    content: @Composable RowScope.() -> Unit = {},\n) {\n    val isFocused = remember { mutableStateOf(false) }\n    colors.provideArea(enabled, isFocused.value, selected) {\n        Row(\n            modifier = modifier.onFocusEvent {\n                isFocused.value = it.isFocused\n            }.selectable(\n                selected = selected,\n                enabled = enabled,\n                onClick = onClick,\n                interactionSource = interactionSource,\n                indication = null,\n                role = Role.RadioButton\n            ),\n            verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp)\n        ) {\n            RadioButtonImpl(isFocused.value, selected)\n            content()\n        }\n    }\n}\n\n@Composable\nprivate fun RadioButtonImpl(\n    isFocused: Boolean,\n    selected: Boolean,\n    modifier: Modifier = Modifier,\n) {\n    val colors = LocalAreaColors.current\n    Canvas(modifier.wrapContentSize(Alignment.Center).requiredSize(15.dp)) {\n        if (isFocused) {\n            drawCircle(\n                colors.focusColor,\n                radius = 9.5.dp.toPx(),\n            )\n        }\n        drawCircle(\n            colors.startBorderColor,\n            radius = 7.5.dp.toPx(),\n        )\n        drawCircle(\n            colors.startBackground,\n            radius = 6.5.dp.toPx(),\n        )\n        if (selected) {\n            drawCircle(\n                colors.foreground,\n                radius = 2.5.dp.toPx(),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/SegmentedButton.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.focusable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.interaction.collectIsFocusedAsState\nimport androidx.compose.foundation.interaction.collectIsHoveredAsState\nimport androidx.compose.foundation.interaction.collectIsPressedAsState\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.BoxScope\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.selection.selectable\nimport androidx.compose.foundation.selection.selectableGroup\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.drawWithCache\nimport androidx.compose.ui.focus.FocusRequester\nimport androidx.compose.ui.focus.focusProperties\nimport androidx.compose.ui.focus.focusRequester\nimport androidx.compose.ui.geometry.CornerRadius\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.geometry.Size\nimport androidx.compose.ui.input.key.Key\nimport androidx.compose.ui.input.key.KeyEventType\nimport androidx.compose.ui.input.key.key\nimport androidx.compose.ui.input.key.onKeyEvent\nimport androidx.compose.ui.input.key.type\nimport androidx.compose.ui.platform.LocalFocusManager\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.FocusAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalFocusAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalHoverAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalPressedAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSelectionAreaColors\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\n\nclass SegmentedButtonColors(\n    override val normalAreaColors: AreaColors,\n    override val focusAreaColors: AreaColors,\n    val itemNormalAreaColors: AreaColors,\n    val itemHoverAreaColors: AreaColors,\n    val itemPressedAreaColors: AreaColors,\n    val itemSelectionAreaColors: AreaColors,\n    val itemSelectedFocusAreaColors: AreaColors,\n) : AreaProvider, FocusAreaProvider {\n    @Composable\n    fun provideArea(focused: Boolean, content: @Composable () -> Unit) {\n        CompositionLocalProvider(\n            LocalAreaColors provides if (focused) focusAreaColors else normalAreaColors,\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalFocusAreaColors provides focusAreaColors,\n            content = content\n        )\n    }\n\n    @Composable\n    fun provideItemArea(\n        selected: Boolean,\n        focused: Boolean,\n        hover: Boolean,\n        pressed: Boolean,\n        content: @Composable () -> Unit,\n    ) {\n        val currentColors = when {\n            selected -> if (focused) itemSelectedFocusAreaColors else itemSelectionAreaColors\n            pressed -> itemPressedAreaColors\n            hover -> itemHoverAreaColors\n            else -> itemNormalAreaColors\n        }\n\n        CompositionLocalProvider(\n            LocalAreaColors provides currentColors,\n            LocalNormalAreaColors provides itemNormalAreaColors,\n            LocalFocusAreaColors provides itemSelectedFocusAreaColors,\n            LocalHoverAreaColors provides itemHoverAreaColors,\n            LocalPressedAreaColors provides itemPressedAreaColors,\n            LocalSelectionAreaColors provides itemSelectionAreaColors,\n            content = content\n        )\n    }\n}\n\nval LocalSegmentedButtonColors = compositionLocalOf {\n    LightTheme.SegmentedButtonColors\n}\n\n@OptIn(ExperimentalComposeUiApi::class)\n@Composable\nfun SegmentedButton(\n    itemCount: Int,\n    selectedIndex: Int,\n    onValueChange: ((Int) -> Unit)? = null,\n    modifier: Modifier = Modifier,\n    colors: SegmentedButtonColors = LocalSegmentedButtonColors.current,\n    valueRender: @Composable BoxScope.(Int) -> Unit,\n) {\n    val interactionSource = remember { MutableInteractionSource() }\n    val isFocused = interactionSource.collectIsFocusedAsState()\n    val parentFocusRequester = remember { FocusRequester() }\n\n    colors.provideArea(isFocused.value) {\n        val areaColors = LocalAreaColors.current\n        Row(\n            modifier.selectableGroup().drawWithCache {\n                onDrawBehind {\n                    if (isFocused.value) {\n                        drawRoundRect(\n                            areaColors.focusColor,\n                            size = Size(size.width + 4.dp.toPx(), size.height + 4.dp.toPx()),\n                            topLeft = Offset(-2.dp.toPx(), -2.dp.toPx()),\n                            cornerRadius = CornerRadius(5.dp.toPx())\n                        )\n                    }\n                    drawRoundRect(areaColors.startBorderColor, cornerRadius = CornerRadius(3.dp.toPx()))\n                    drawRoundRect(\n                        areaColors.startBackground,\n                        size = Size(size.width - 2.dp.toPx(), size.height - 2.dp.toPx()),\n                        topLeft = Offset(1.dp.toPx(), 1.dp.toPx()),\n                        cornerRadius = CornerRadius(2.dp.toPx())\n                    )\n                }\n            }.onKeyEvent {\n                if (it.type != KeyEventType.KeyUp) return@onKeyEvent false\n                if (!isFocused.value) return@onKeyEvent false\n                when (it.key) {\n                    Key.DirectionLeft -> {\n                        val target = selectedIndex - 1\n                        if (target in 0 until itemCount) {\n                            onValueChange?.invoke(target)\n                        }\n                        return@onKeyEvent true\n                    }\n\n                    Key.DirectionRight -> {\n                        val target = selectedIndex + 1\n                        if (target in 0 until itemCount) {\n                            onValueChange?.invoke(target)\n                        }\n                        return@onKeyEvent true\n                    }\n                }\n                false\n            }.focusRequester(parentFocusRequester).focusable(true, interactionSource = interactionSource),\n            horizontalArrangement = Arrangement.spacedBy((-1).dp)\n        ) {\n            repeat(itemCount) {\n                val itemInteractionSource = remember(it) { MutableInteractionSource() }\n                val hover = itemInteractionSource.collectIsHoveredAsState()\n                val pressed = itemInteractionSource.collectIsPressedAsState()\n\n                colors.provideItemArea(selectedIndex == it, isFocused.value, hover.value, pressed.value) {\n                    val current = LocalAreaColors.current\n                    val focusManager = LocalFocusManager.current\n\n                    Box(\n                        modifier = Modifier.drawWithCache {\n                            onDrawBehind {\n                                drawRoundRect(current.startBorderColor, cornerRadius = CornerRadius(3.dp.toPx()))\n                                drawRoundRect(\n                                    current.startBackground,\n                                    size = Size(size.width - 2.dp.toPx(), size.height - 2.dp.toPx()),\n                                    topLeft = Offset(1.dp.toPx(), 1.dp.toPx()),\n                                    cornerRadius = CornerRadius(2.dp.toPx())\n                                )\n                            }\n                        }.focusProperties {\n                            this.canFocus = false\n                        }.selectable(selectedIndex == it, onClick = {\n                            onValueChange?.invoke(it)\n                            if (!isFocused.value) {\n                                focusManager.clearFocus()\n                            }\n                        }, interactionSource = itemInteractionSource, indication = null, role = Role.RadioButton)\n                    ) {\n                        Box(modifier = Modifier.padding(13.dp, 4.dp)) {\n                            valueRender(it)\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/Tab.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.RowScope\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.selection.selectable\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.drawWithCache\nimport androidx.compose.ui.focus.focusProperties\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.graphics.StrokeCap\nimport androidx.compose.ui.graphics.graphicsLayer\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.HoverAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.InactiveSelectionAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalHoverAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalInactiveAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalPressedAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSelectionAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSelectionInactiveAreaColors\nimport io.kanro.compose.jetbrains.expui.style.PressedAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.areaBackground\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\n\nclass TabColors(\n    override val normalAreaColors: AreaColors,\n    override val selectionAreaColors: AreaColors,\n    override val hoverAreaColors: AreaColors,\n    override val pressedAreaColors: AreaColors,\n    override val inactiveAreaColors: AreaColors,\n    override val inactiveSelectionAreaColors: AreaColors,\n) : AreaProvider, HoverAreaProvider, PressedAreaProvider, InactiveSelectionAreaProvider {\n    @Composable\n    fun provideArea(selected: Boolean, content: @Composable () -> Unit) {\n        val activated = LocalContentActivated.current\n        val currentColors = when {\n            selected -> if (activated) selectionAreaColors else inactiveSelectionAreaColors\n            !activated -> inactiveAreaColors\n            else -> normalAreaColors\n        }\n        CompositionLocalProvider(\n            LocalAreaColors provides currentColors,\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalHoverAreaColors provides hoverAreaColors,\n            LocalPressedAreaColors provides pressedAreaColors,\n            LocalSelectionInactiveAreaColors provides inactiveSelectionAreaColors,\n            LocalInactiveAreaColors provides inactiveAreaColors,\n            LocalSelectionAreaColors provides selectionAreaColors,\n            content = content\n        )\n    }\n}\n\nval LocalTabColors = compositionLocalOf {\n    LightTheme.TabColors\n}\n\nval LocalCloseableTabColors = compositionLocalOf {\n    LightTheme.CloseableTabColors\n}\n\n@Composable\nfun Tab(\n    selected: Boolean,\n    onSelected: () -> Unit,\n    modifier: Modifier = Modifier,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: TabColors = LocalTabColors.current,\n    content: @Composable RowScope.() -> Unit,\n) {\n    colors.provideArea(selected) {\n        val currentColors = LocalAreaColors.current\n        Box(\n            modifier.areaBackground().drawWithCache {\n                onDrawWithContent {\n                    drawContent()\n                    if (selected) {\n                        val strokeWidth = 3.dp.toPx()\n                        val start = Offset(strokeWidth / 2f, size.height - (strokeWidth / 2f))\n                        val end = start.copy(x = size.width - strokeWidth / 2f)\n                        drawLine(currentColors.focusColor, start, end, strokeWidth, cap = StrokeCap.Round)\n                    }\n                }\n            }.focusProperties {\n                canFocus = false\n            }.selectable(\n                selected = selected,\n                enabled = true,\n                onClick = onSelected,\n                role = Role.Tab,\n                interactionSource = interactionSource,\n                indication = HoverOrPressedIndication(RectangleShape),\n            ).padding(horizontal = 12.dp)\n        ) {\n            Row(modifier = Modifier.align(Alignment.Center), content = content)\n        }\n    }\n}\n\n@Composable\nfun CloseableTab(\n    selected: Boolean,\n    onSelected: () -> Unit,\n    onClosed: () -> Unit,\n    modifier: Modifier = Modifier,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: TabColors = LocalCloseableTabColors.current,\n    content: @Composable RowScope.() -> Unit,\n) {\n    colors.provideArea(selected) {\n        val currentColors = LocalAreaColors.current\n        var hover by remember { mutableStateOf(false) }\n        Box(\n            modifier.areaBackground().drawWithCache {\n                onDrawWithContent {\n                    drawContent()\n                    if (selected) {\n                        val strokeWidth = 3.dp.toPx()\n                        val start = Offset(strokeWidth / 2f, size.height - (strokeWidth / 2f))\n                        val end = start.copy(x = size.width - strokeWidth / 2f)\n                        drawLine(currentColors.focusColor, start, end, strokeWidth, cap = StrokeCap.Round)\n                    }\n                }\n            }.focusProperties {\n                canFocus = false\n            }.selectable(\n                selected = selected,\n                enabled = true,\n                onClick = onSelected,\n                role = Role.Tab,\n                interactionSource = interactionSource,\n                indication = HoverOrPressedIndication(RectangleShape),\n            ).onHover {\n                hover = it\n            }.padding(horizontal = 12.dp)\n        ) {\n            Row(\n                modifier = Modifier.align(Alignment.Center).graphicsLayer(alpha = if (hover || selected) 1f else 0.7f),\n                horizontalArrangement = Arrangement.spacedBy(8.dp)\n            ) {\n                content()\n                CloseButton(hover || selected, onClosed)\n            }\n        }\n    }\n}\n\n@Composable\nprivate fun CloseButton(\n    shown: Boolean,\n    onClosed: () -> Unit,\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n) {\n    var hover by remember { mutableStateOf(false) }\n    Box(\n        modifier = Modifier.size(16.dp).areaBackground().focusProperties {\n            canFocus = false\n        }.clickable(\n            enabled = shown,\n            onClick = onClosed,\n            role = Role.Button,\n            interactionSource = interactionSource,\n            indication = null,\n        ).onHover {\n            hover = it\n        }\n    ) {\n        if (shown) {\n            Icon(\n                if (hover) \"icons/closeSmallHovered.svg\" else \"icons/closeSmall.svg\", contentDescription = \"Close\"\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/TextArea.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.interaction.collectIsFocusedAsState\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.defaultMinSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.text.BasicTextField\nimport androidx.compose.foundation.text.KeyboardActions\nimport androidx.compose.foundation.text.KeyboardOptions\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.takeOrElse\nimport androidx.compose.ui.layout.Layout\nimport androidx.compose.ui.layout.Placeable\nimport androidx.compose.ui.layout.layoutId\nimport androidx.compose.ui.text.TextLayoutResult\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.input.VisualTransformation\nimport androidx.compose.ui.unit.Constraints\nimport androidx.compose.ui.unit.Density\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.offset\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalDefaultTextStyle\nimport io.kanro.compose.jetbrains.expui.style.areaBackground\nimport io.kanro.compose.jetbrains.expui.style.areaBorder\nimport io.kanro.compose.jetbrains.expui.style.areaFocusBorder\nimport kotlin.math.max\n\n@Composable\nfun TextArea(\n    value: String,\n    onValueChange: (String) -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    readOnly: Boolean = false,\n    textStyle: TextStyle = LocalDefaultTextStyle.current,\n    placeholder: @Composable (() -> Unit)? = null,\n    footer: @Composable (() -> Unit)? = null,\n    isError: Boolean = false,\n    visualTransformation: VisualTransformation = VisualTransformation.None,\n    keyboardOptions: KeyboardOptions = KeyboardOptions.Default,\n    keyboardActions: KeyboardActions = KeyboardActions(),\n    maxLines: Int = Int.MAX_VALUE,\n    onTextLayout: (TextLayoutResult) -> Unit = {},\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    shape: Shape = RectangleShape,\n    colors: TextFieldColors = LocalTextFieldColors.current,\n) {\n    val focused = interactionSource.collectIsFocusedAsState()\n    colors.provideArea(enabled, focused.value, isError) {\n        val currentColors = LocalAreaColors.current\n\n        val textColor = textStyle.color.takeOrElse {\n            currentColors.text\n        }\n        val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))\n\n        BasicTextField(\n            value = value,\n            onValueChange = onValueChange,\n            modifier = modifier.defaultMinSize(minWidth = 270.dp, minHeight = 55.dp),\n            enabled = enabled,\n            readOnly = readOnly,\n            textStyle = mergedTextStyle,\n            keyboardOptions = keyboardOptions,\n            keyboardActions = keyboardActions,\n            singleLine = false,\n            maxLines = maxLines,\n            visualTransformation = visualTransformation,\n            onTextLayout = onTextLayout,\n            interactionSource = interactionSource,\n            cursorBrush = SolidColor(currentColors.text),\n        ) {\n            TextAreaDecorationBox(\n                focused = focused.value,\n                shape = shape,\n                innerTextField = it,\n                placeholder = if (value.isEmpty()) placeholder else null,\n                footer = footer\n            )\n        }\n    }\n}\n\n@Composable\nprivate fun TextAreaDecorationBox(\n    focused: Boolean,\n    shape: Shape,\n    innerTextField: @Composable () -> Unit,\n    placeholder: @Composable (() -> Unit)? = null,\n    footer: @Composable (() -> Unit)? = null,\n) {\n    Layout(\n        modifier = Modifier.areaBackground(shape = shape).areaFocusBorder(focused, shape = shape)\n            .areaBorder(shape = shape),\n        content = {\n            if (footer != null) {\n                Row(modifier = Modifier.layoutId(FooterId), horizontalArrangement = Arrangement.Start) {\n                    Box(modifier = Modifier.padding(horizontal = 6.dp)) {\n                        footer()\n                    }\n                }\n            }\n            if (placeholder != null) {\n                Box(modifier = Modifier.layoutId(PlaceholderId), contentAlignment = Alignment.Center) {\n                    placeholder()\n                }\n            }\n\n            Box(modifier = Modifier.layoutId(TextFieldId), propagateMinConstraints = true) {\n                innerTextField()\n            }\n        }\n    ) { measurables, incomingConstraints ->\n        // used to calculate the constraints for measuring elements that will be placed in a row\n        var occupiedSpaceVertically = 0\n\n        val constraintsWithoutPadding = incomingConstraints.offset(\n            horizontal = -2 * TextAreaPadding.roundToPx(), vertical = -2 * TextAreaPadding.roundToPx()\n        )\n\n        val footerConstraints = constraintsWithoutPadding.copy(minWidth = 0, minHeight = 0)\n        val footerPlaceable = measurables.find { it.layoutId == FooterId }?.measure(footerConstraints)\n        occupiedSpaceVertically += footerPlaceable?.height ?: 0\n\n        val textConstraints = constraintsWithoutPadding.offset(\n            vertical = -occupiedSpaceVertically\n        ).copy(minWidth = 0)\n        val textFieldPlaceable = measurables.first { it.layoutId == TextFieldId }.measure(textConstraints)\n\n        // measure placeholder\n        val placeholderConstraints = textConstraints.copy(minHeight = 0)\n        val placeholderPlaceable = measurables.find { it.layoutId == PlaceholderId }?.measure(placeholderConstraints)\n\n        val width = calculateWidth(\n            footerPlaceable, textFieldPlaceable, placeholderPlaceable, incomingConstraints\n        ) + 2 * TextAreaPadding.roundToPx()\n        val height = calculateHeight(\n            footerPlaceable, textFieldPlaceable, placeholderPlaceable, incomingConstraints\n        ) + 2 * TextAreaPadding.roundToPx()\n\n        layout(width, height) {\n            place(\n                height, width, footerPlaceable, textFieldPlaceable, placeholderPlaceable, this@Layout\n            )\n        }\n    }\n}\n\nprivate fun calculateWidth(\n    footerPlaceable: Placeable?,\n    textFieldPlaceable: Placeable,\n    placeholderPlaceable: Placeable?,\n    constraints: Constraints,\n): Int {\n    return maxOf(\n        footerPlaceable?.width ?: 0, textFieldPlaceable.width, placeholderPlaceable?.width ?: 0, constraints.minWidth\n    )\n}\n\nprivate fun calculateHeight(\n    footerPlaceable: Placeable?,\n    textFieldPlaceable: Placeable,\n    placeholderPlaceable: Placeable?,\n    constraints: Constraints,\n): Int {\n    val middleSection = maxOf(\n        textFieldPlaceable.height, placeholderPlaceable?.height ?: 0\n    )\n    val wrappedHeight = (footerPlaceable?.height ?: 0) + middleSection\n    return max(wrappedHeight, constraints.minHeight)\n}\n\nprivate fun Placeable.PlacementScope.place(\n    height: Int,\n    width: Int,\n    footerPlaceable: Placeable?,\n    textFieldPlaceable: Placeable,\n    placeholderPlaceable: Placeable?,\n    density: Density,\n) = with(density) {\n    val padding = TextAreaPadding.roundToPx()\n\n    // placed center vertically and to the start edge horizontally\n    footerPlaceable?.placeRelative(\n        0, height - footerPlaceable.height\n    )\n\n    // placed center vertically and after the leading icon horizontally if single line text field\n    // placed to the top with padding for multi line text field\n    textFieldPlaceable.placeRelative(padding, padding)\n\n    // placed similar to the input text above\n    placeholderPlaceable?.placeRelative(padding, padding)\n}\n\nprivate const val PlaceholderId = \"Placeholder\"\nprivate const val TextFieldId = \"TextField\"\nprivate const val FooterId = \"Footer\"\n\nprivate val TextAreaPadding = 6.dp\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/TextField.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.interaction.collectIsFocusedAsState\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.defaultMinSize\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.foundation.text.BasicTextField\nimport androidx.compose.foundation.text.KeyboardActions\nimport androidx.compose.foundation.text.KeyboardOptions\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.takeOrElse\nimport androidx.compose.ui.layout.Layout\nimport androidx.compose.ui.layout.Placeable\nimport androidx.compose.ui.layout.layoutId\nimport androidx.compose.ui.text.TextLayoutResult\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.input.TextFieldValue\nimport androidx.compose.ui.text.input.VisualTransformation\nimport androidx.compose.ui.unit.Constraints\nimport androidx.compose.ui.unit.Density\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.offset\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.DisabledAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.ErrorFocusAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalDefaultTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalDisabledAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalErrorAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalFocusAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.areaBackground\nimport io.kanro.compose.jetbrains.expui.style.areaBorder\nimport io.kanro.compose.jetbrains.expui.style.areaFocusBorder\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\nimport kotlin.math.max\n\ndata class TextFieldColors(\n    override val normalAreaColors: AreaColors,\n    override val errorAreaColors: AreaColors,\n    override val disabledAreaColors: AreaColors,\n    override val errorFocusAreaColors: AreaColors,\n    override val focusAreaColors: AreaColors,\n) : AreaProvider, DisabledAreaProvider, ErrorFocusAreaProvider {\n\n    @Composable\n    fun provideArea(enabled: Boolean, focused: Boolean, isError: Boolean, content: @Composable () -> Unit) {\n        val currentColors = when {\n            !enabled -> disabledAreaColors\n            isError -> if (focused) errorFocusAreaColors else errorAreaColors\n            focused -> focusAreaColors\n            else -> normalAreaColors\n        }\n\n        CompositionLocalProvider(\n            LocalAreaColors provides currentColors,\n            LocalDisabledAreaColors provides disabledAreaColors,\n            LocalErrorAreaColors provides errorAreaColors,\n            LocalFocusAreaColors provides focusAreaColors,\n            LocalErrorAreaColors provides errorAreaColors,\n            LocalNormalAreaColors provides normalAreaColors,\n            content = content\n        )\n    }\n}\n\nval LocalTextFieldColors = compositionLocalOf<TextFieldColors> {\n    LightTheme.TextFieldColors\n}\n\n@Composable\nfun TextField(\n    value: String,\n    onValueChange: (String) -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    readOnly: Boolean = false,\n    textStyle: TextStyle = LocalDefaultTextStyle.current,\n    placeholder: @Composable (() -> Unit)? = null,\n    leadingIcon: @Composable (() -> Unit)? = null,\n    trailingIcon: @Composable (() -> Unit)? = null,\n    isError: Boolean = false,\n    visualTransformation: VisualTransformation = VisualTransformation.None,\n    keyboardOptions: KeyboardOptions = KeyboardOptions.Default,\n    keyboardActions: KeyboardActions = KeyboardActions(),\n    onTextLayout: (TextLayoutResult) -> Unit = {},\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    shape: Shape = RoundedCornerShape(3.dp),\n    colors: TextFieldColors = LocalTextFieldColors.current,\n) {\n    val focused = interactionSource.collectIsFocusedAsState()\n    colors.provideArea(enabled, focused.value, isError) {\n        val currentColors = LocalAreaColors.current\n\n        val textColor = textStyle.color.takeOrElse {\n            currentColors.text\n        }\n        val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))\n\n        BasicTextField(\n            value = value,\n            onValueChange = onValueChange,\n            modifier = modifier.defaultMinSize(minWidth = 64.dp),\n            enabled = enabled,\n            readOnly = readOnly,\n            textStyle = mergedTextStyle,\n            keyboardOptions = keyboardOptions,\n            keyboardActions = keyboardActions,\n            singleLine = true,\n            maxLines = 1,\n            visualTransformation = visualTransformation,\n            onTextLayout = onTextLayout,\n            interactionSource = interactionSource,\n            cursorBrush = SolidColor(currentColors.text),\n        ) {\n            TextFieldDecorationBox(\n                focused = focused.value,\n                shape = shape,\n                innerTextField = it,\n                placeholder = if (value.isEmpty()) placeholder else null,\n                leadingIcon = leadingIcon,\n                trailingIcon = trailingIcon,\n            )\n        }\n    }\n}\n\n@Composable\nfun TextField(\n    value: TextFieldValue,\n    onValueChange: (TextFieldValue) -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    readOnly: Boolean = false,\n    textStyle: TextStyle = LocalDefaultTextStyle.current,\n    placeholder: @Composable (() -> Unit)? = null,\n    leadingIcon: @Composable (() -> Unit)? = null,\n    trailingIcon: @Composable (() -> Unit)? = null,\n    isError: Boolean = false,\n    visualTransformation: VisualTransformation = VisualTransformation.None,\n    keyboardOptions: KeyboardOptions = KeyboardOptions.Default,\n    keyboardActions: KeyboardActions = KeyboardActions(),\n    onTextLayout: (TextLayoutResult) -> Unit = {},\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    shape: Shape = RoundedCornerShape(3.dp),\n    colors: TextFieldColors = LocalTextFieldColors.current,\n) {\n    val focused = interactionSource.collectIsFocusedAsState()\n    colors.provideArea(enabled, focused.value, isError) {\n        val currentColors = LocalAreaColors.current\n\n        val textColor = textStyle.color.takeOrElse {\n            currentColors.text\n        }\n        val mergedTextStyle = textStyle.merge(TextStyle(color = textColor))\n\n        BasicTextField(\n            value = value,\n            onValueChange = onValueChange,\n            modifier = modifier.defaultMinSize(minWidth = 64.dp),\n            enabled = enabled,\n            readOnly = readOnly,\n            textStyle = mergedTextStyle,\n            keyboardOptions = keyboardOptions,\n            keyboardActions = keyboardActions,\n            singleLine = true,\n            maxLines = 1,\n            visualTransformation = visualTransformation,\n            onTextLayout = onTextLayout,\n            interactionSource = interactionSource,\n            cursorBrush = SolidColor(currentColors.text),\n        ) {\n            TextFieldDecorationBox(\n                focused = focused.value,\n                shape = shape,\n                innerTextField = it,\n                placeholder = if (value.text.isEmpty()) placeholder else null,\n                leadingIcon = leadingIcon,\n                trailingIcon = trailingIcon,\n            )\n        }\n    }\n}\n\n@Composable\nprivate fun TextFieldDecorationBox(\n    focused: Boolean,\n    shape: Shape,\n    innerTextField: @Composable () -> Unit,\n    placeholder: @Composable (() -> Unit)? = null,\n    leadingIcon: @Composable (() -> Unit)? = null,\n    trailingIcon: @Composable (() -> Unit)? = null,\n) {\n    Layout(\n        modifier = Modifier.areaBackground(shape = shape).areaFocusBorder(focused, shape = shape)\n            .areaBorder(shape = shape),\n        content = {\n            if (leadingIcon != null) {\n                Box(modifier = Modifier.layoutId(LeadingId), contentAlignment = Alignment.Center) {\n                    leadingIcon()\n                }\n            }\n            if (trailingIcon != null) {\n                Box(modifier = Modifier.layoutId(TrailingId), contentAlignment = Alignment.Center) {\n                    trailingIcon()\n                }\n            }\n            if (placeholder != null) {\n                Box(modifier = Modifier.layoutId(PlaceholderId), contentAlignment = Alignment.Center) {\n                    placeholder()\n                }\n            }\n\n            Box(modifier = Modifier.layoutId(TextFieldId), propagateMinConstraints = true) {\n                innerTextField()\n            }\n        }\n    ) { measurables, incomingConstraints ->\n        // used to calculate the constraints for measuring elements that will be placed in a row\n        var occupiedSpaceHorizontally = 0\n\n        val constraintsWithoutPadding = incomingConstraints.offset(\n            horizontal = -2 * HorizontalTextFieldPadding.roundToPx(),\n            vertical = -2 * VerticalTextFieldPadding.roundToPx()\n        )\n\n        val iconsConstraints = constraintsWithoutPadding.copy(minWidth = 0, minHeight = 0)\n\n        // measure leading icon\n        val leadingPlaceable = measurables.find { it.layoutId == LeadingId }?.measure(iconsConstraints)\n        occupiedSpaceHorizontally += leadingPlaceable?.width ?: 0\n\n        // measure trailing icon\n        val trailingPlaceable = measurables.find { it.layoutId == TrailingId }\n            ?.measure(iconsConstraints.offset(horizontal = -occupiedSpaceHorizontally))\n        occupiedSpaceHorizontally += trailingPlaceable?.width ?: 0\n\n        val textConstraints = constraintsWithoutPadding.offset(\n            horizontal = -occupiedSpaceHorizontally\n        ).copy(minHeight = 0)\n        val textFieldPlaceable = measurables.first { it.layoutId == TextFieldId }.measure(textConstraints)\n\n        // measure placeholder\n        val placeholderConstraints = textConstraints.copy(minWidth = 0)\n        val placeholderPlaceable = measurables.find { it.layoutId == PlaceholderId }?.measure(placeholderConstraints)\n\n        val width = calculateWidth(\n            leadingPlaceable, trailingPlaceable, textFieldPlaceable, placeholderPlaceable, incomingConstraints\n        ) + 2 * HorizontalTextFieldPadding.roundToPx()\n        val height = calculateHeight(\n            leadingPlaceable, trailingPlaceable, textFieldPlaceable, placeholderPlaceable, incomingConstraints\n        ) + 2 * VerticalTextFieldPadding.roundToPx()\n\n        layout(width, height) {\n            place(\n                height,\n                width,\n                leadingPlaceable,\n                trailingPlaceable,\n                textFieldPlaceable,\n                placeholderPlaceable,\n                this@Layout\n            )\n        }\n    }\n}\n\nprivate fun calculateWidth(\n    leadingPlaceable: Placeable?,\n    trailingPlaceable: Placeable?,\n    textFieldPlaceable: Placeable,\n    placeholderPlaceable: Placeable?,\n    constraints: Constraints,\n): Int {\n    val middleSection = maxOf(\n        textFieldPlaceable.width, placeholderPlaceable?.width ?: 0\n    )\n    val wrappedWidth = (leadingPlaceable?.width ?: 0) + middleSection + (trailingPlaceable?.width ?: 0)\n    return max(wrappedWidth, constraints.minWidth)\n}\n\nprivate fun calculateHeight(\n    leadingPlaceable: Placeable?,\n    trailingPlaceable: Placeable?,\n    textFieldPlaceable: Placeable,\n    placeholderPlaceable: Placeable?,\n    constraints: Constraints,\n): Int {\n    return maxOf(\n        leadingPlaceable?.height ?: 0,\n        textFieldPlaceable.height,\n        placeholderPlaceable?.height ?: 0,\n        trailingPlaceable?.height ?: 0,\n        constraints.minHeight\n    )\n}\n\nprivate fun Placeable.PlacementScope.place(\n    height: Int,\n    width: Int,\n    leadingPlaceable: Placeable?,\n    trailingPlaceable: Placeable?,\n    textFieldPlaceable: Placeable,\n    placeholderPlaceable: Placeable?,\n    density: Density,\n) = with(density) {\n    val horizontalPadding = HorizontalTextFieldPadding.roundToPx()\n\n    // placed center vertically and to the start edge horizontally\n    leadingPlaceable?.placeRelative(\n        horizontalPadding, Alignment.CenterVertically.align(leadingPlaceable.height, height)\n    )\n\n    // placed center vertically and to the end edge horizontally\n    trailingPlaceable?.placeRelative(\n        width - trailingPlaceable.width - horizontalPadding,\n        Alignment.CenterVertically.align(trailingPlaceable.height, height)\n    )\n\n    // placed center vertically and after the leading icon horizontally if single line text field\n    // placed to the top with padding for multi line text field\n    textFieldPlaceable.placeRelative(\n        horizontalPadding + (leadingPlaceable?.width ?: 0),\n        Alignment.CenterVertically.align(textFieldPlaceable.height, height)\n    )\n\n    // placed similar to the input text above\n    placeholderPlaceable?.let {\n        it.placeRelative(\n            horizontalPadding + (leadingPlaceable?.width ?: 0), Alignment.CenterVertically.align(it.height, height)\n        )\n    }\n}\n\nprivate const val PlaceholderId = \"Placeholder\"\nprivate const val TextFieldId = \"TextField\"\nprivate const val LeadingId = \"Leading\"\nprivate const val TrailingId = \"Trailing\"\n\nprivate val HorizontalTextFieldPadding = 6.dp\nprivate val VerticalTextFieldPadding = 3.dp\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/ToolBar.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.Indication\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.interaction.MutableInteractionSource\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.BoxScope\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.semantics.Role\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.DisabledAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.HoverAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.InactiveSelectionAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalDisabledAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalHoverAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalInactiveAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalPressedAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSelectionAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSelectionInactiveAreaColors\nimport io.kanro.compose.jetbrains.expui.style.PressedAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.areaBackground\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\n\nclass ToolBarActionButtonColors(\n    override val normalAreaColors: AreaColors,\n    override val hoverAreaColors: AreaColors,\n    override val pressedAreaColors: AreaColors,\n    override val disabledAreaColors: AreaColors,\n    override val selectionAreaColors: AreaColors,\n    override val inactiveAreaColors: AreaColors,\n    override val inactiveSelectionAreaColors: AreaColors,\n) : AreaProvider, HoverAreaProvider, PressedAreaProvider, DisabledAreaProvider, InactiveSelectionAreaProvider {\n    @Composable\n    fun provideArea(enabled: Boolean, selected: Boolean, content: @Composable () -> Unit) {\n        val activated = LocalContentActivated.current\n        val currentColors = when {\n            !enabled -> disabledAreaColors\n            selected -> if (activated) selectionAreaColors else inactiveSelectionAreaColors\n            !activated -> inactiveAreaColors\n            else -> normalAreaColors\n        }\n        CompositionLocalProvider(\n            LocalAreaColors provides currentColors,\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalDisabledAreaColors provides disabledAreaColors,\n            LocalHoverAreaColors provides hoverAreaColors,\n            LocalPressedAreaColors provides pressedAreaColors,\n            LocalSelectionInactiveAreaColors provides inactiveSelectionAreaColors,\n            LocalInactiveAreaColors provides inactiveAreaColors,\n            LocalSelectionAreaColors provides selectionAreaColors,\n            content = content\n        )\n    }\n}\n\nval LocalToolBarActionButtonColors = compositionLocalOf {\n    LightTheme.ToolBarActionButtonColors\n}\n\n@Composable\nfun ToolBarActionButton(\n    selected: Boolean = false,\n    onClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    enabled: Boolean = true,\n    shape: Shape = RoundedCornerShape(6.dp),\n    indication: Indication? = HoverOrPressedIndication(shape),\n    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },\n    colors: ToolBarActionButtonColors = LocalToolBarActionButtonColors.current,\n    content: @Composable BoxScope.() -> Unit,\n) {\n    colors.provideArea(enabled, selected) {\n        Box(\n            modifier.clickable(\n                interactionSource = interactionSource,\n                indication = indication,\n                enabled = enabled,\n                onClick = onClick,\n                role = Role.Button\n            ).areaBackground(shape = shape),\n            propagateMinConstraints = true\n        ) {\n            content()\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/control/Tooltip.kt",
    "content": "package io.kanro.compose.jetbrains.expui.control\n\nimport androidx.compose.foundation.ExperimentalFoundationApi\nimport androidx.compose.foundation.TooltipArea\nimport androidx.compose.foundation.TooltipPlacement\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.shadow\nimport androidx.compose.ui.unit.DpOffset\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.areaBackground\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\nimport io.kanro.compose.jetbrains.expui.theme.LocalIsDarkTheme\n\nclass ToolTipColors(\n    val isDark: Boolean,\n    override val normalAreaColors: AreaColors,\n) : AreaProvider {\n    @Composable\n    fun provideArea(content: @Composable () -> Unit) {\n        CompositionLocalProvider(\n            LocalAreaColors provides normalAreaColors,\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalIsDarkTheme provides isDark,\n            content = content\n        )\n    }\n}\n\nval LocalToolTipColors = compositionLocalOf {\n    LightTheme.ToolTipColors\n}\n\n@Composable\n@OptIn(ExperimentalFoundationApi::class)\nfun Tooltip(\n    tooltip: @Composable () -> Unit,\n    modifier: Modifier = Modifier,\n    delayMillis: Int = 500,\n    tooltipPlacement: TooltipPlacement = TooltipPlacement.CursorPoint(\n        offset = DpOffset(0.dp, 32.dp)\n    ),\n    colors: ToolTipColors = LocalToolTipColors.current,\n    content: @Composable () -> Unit,\n) {\n    TooltipArea(\n        {\n            colors.provideArea {\n                Box(\n                    modifier = Modifier.shadow(8.dp).areaBackground()\n                        .border(1.dp, LocalAreaColors.current.startBorderColor),\n                    contentAlignment = Alignment.Center\n                ) {\n                    Box(\n                        modifier = Modifier.padding(16.dp),\n                    ) {\n                        tooltip()\n                    }\n                }\n            }\n        }, modifier, delayMillis, tooltipPlacement, content\n    )\n}\n\n@Composable\n@OptIn(ExperimentalFoundationApi::class)\nfun Tooltip(\n    tooltip: String,\n    modifier: Modifier = Modifier,\n    delayMillis: Int = 500,\n    tooltipPlacement: TooltipPlacement = TooltipPlacement.CursorPoint(\n        offset = DpOffset(0.dp, 32.dp)\n    ),\n    colors: ToolTipColors = LocalToolTipColors.current,\n    content: @Composable () -> Unit,\n) {\n    Tooltip({\n        Label(tooltip)\n    }, modifier, delayMillis, tooltipPlacement, colors, content)\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/style/AreaColors.kt",
    "content": "package io.kanro.compose.jetbrains.expui.style\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.border\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Brush\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.isUnspecified\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.dp\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\n\n/**\n * Color definition for an area which has background and foreground.\n */\ndata class AreaColors(\n    /**\n     * Text foreground color.\n     */\n    val text: Color,\n    /**\n     * Overriding the foreground colour for some components that have their own colour like [Icon][io.kanro.compose.jetbrains.expui.control.Icon].\n     */\n    val foreground: Color,\n    val startBackground: Color,\n    val endBackground: Color,\n    val startBorderColor: Color,\n    val endBorderColor: Color,\n    val focusColor: Color,\n)\n\n@Composable\nfun Modifier.areaBackground(areaColors: AreaColors = LocalAreaColors.current, shape: Shape = RectangleShape): Modifier {\n    return background(areaColors, shape)\n}\n\nfun Modifier.background(areaColors: AreaColors, shape: Shape = RectangleShape): Modifier {\n    if (areaColors.startBackground.isUnspecified) {\n        return this\n    }\n    if (areaColors.endBackground.isUnspecified || areaColors.startBackground == areaColors.endBackground) {\n        return this.background(areaColors.startBackground, shape)\n    }\n    return this.background(Brush.linearGradient(listOf(areaColors.startBackground, areaColors.endBackground)), shape)\n}\n\n@Composable\nfun Modifier.areaBorder(\n    areaColors: AreaColors = LocalAreaColors.current,\n    width: Dp = 1.dp,\n    shape: Shape = RectangleShape,\n): Modifier {\n    return border(areaColors, width, shape)\n}\n\nfun Modifier.border(areaColors: AreaColors, width: Dp = 1.dp, shape: Shape = RectangleShape): Modifier {\n    if (areaColors.startBorderColor.isUnspecified) {\n        return this\n    }\n    if (areaColors.endBorderColor.isUnspecified || areaColors.startBorderColor == areaColors.endBorderColor) {\n        return this.border(width, areaColors.startBorderColor, shape)\n    }\n    return this.border(width, Brush.linearGradient(listOf(areaColors.startBackground, areaColors.endBackground)), shape)\n}\n\n@Composable\nfun Modifier.areaFocusBorder(\n    focused: Boolean,\n    areaColors: AreaColors = LocalAreaColors.current,\n    width: Dp = 2.dp,\n    shape: Shape = RectangleShape,\n): Modifier {\n    return focusBorder(focused, areaColors, width, shape)\n}\n\nfun Modifier.focusBorder(\n    focused: Boolean,\n    areaColors: AreaColors,\n    width: Dp = 2.dp,\n    shape: Shape = RectangleShape,\n): Modifier {\n    if (!focused) return this\n    if (areaColors.focusColor.isUnspecified) {\n        return this\n    }\n    return this.outerBorder(width, areaColors.focusColor, shape)\n}\n\nval LocalAreaColors = compositionLocalOf {\n    LightTheme.NormalAreaColors\n}\n\nval LocalNormalAreaColors = compositionLocalOf {\n    LightTheme.NormalAreaColors\n}\n\nval LocalInactiveAreaColors = compositionLocalOf {\n    LightTheme.InactiveAreaColors\n}\n\nval LocalErrorAreaColors = compositionLocalOf {\n    LightTheme.ErrorAreaColors\n}\n\nval LocalErrorInactiveAreaColors = compositionLocalOf {\n    LightTheme.ErrorInactiveAreaColors\n}\n\nval LocalDisabledAreaColors = compositionLocalOf {\n    LightTheme.DisabledAreaColors\n}\n\nval LocalHoverAreaColors = compositionLocalOf {\n    LightTheme.HoverAreaColors\n}\n\nval LocalPressedAreaColors = compositionLocalOf {\n    LightTheme.PressedAreaColors\n}\n\nval LocalFocusAreaColors = compositionLocalOf {\n    LightTheme.FocusAreaColors\n}\n\nval LocalSelectionAreaColors = compositionLocalOf {\n    LightTheme.SelectionAreaColors\n}\n\nval LocalSelectionInactiveAreaColors = compositionLocalOf {\n    LightTheme.SelectionInactiveAreaColors\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/style/AreaProvider.kt",
    "content": "package io.kanro.compose.jetbrains.expui.style\n\ninterface AreaProvider {\n    val normalAreaColors: AreaColors\n}\n\ninterface ErrorAreProvider : AreaProvider {\n    val errorAreaColors: AreaColors\n}\n\ninterface ErrorFocusAreaProvider : ErrorAreProvider, FocusAreaProvider {\n    val errorFocusAreaColors: AreaColors\n}\n\ninterface SelectionAreaProvider : AreaProvider {\n    val selectionAreaColors: AreaColors\n}\n\ninterface FocusAreaProvider : AreaProvider {\n    val focusAreaColors: AreaColors\n}\n\ninterface DisabledAreaProvider : AreaProvider {\n    val disabledAreaColors: AreaColors\n}\n\ninterface HoverAreaProvider : AreaProvider {\n    val hoverAreaColors: AreaColors\n}\n\ninterface PressedAreaProvider : AreaProvider {\n    val pressedAreaColors: AreaColors\n}\n\ninterface InactiveAreaProvider : AreaProvider {\n    val inactiveAreaColors: AreaColors\n}\n\ninterface InactiveErrorAreaProvider : ErrorAreProvider, InactiveAreaProvider {\n    val inactiveErrorAreaColors: AreaColors\n}\n\ninterface InactiveSelectionAreaProvider : SelectionAreaProvider, InactiveAreaProvider {\n    val inactiveSelectionAreaColors: AreaColors\n}\n\ninterface InactiveFocusAreaProvider : FocusAreaProvider, InactiveAreaProvider {\n    val inactiveFocusAreaColors: AreaColors\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/style/Border.kt",
    "content": "package io.kanro.compose.jetbrains.expui.style\n\nimport androidx.compose.foundation.BorderStroke\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.composed\nimport androidx.compose.ui.draw.CacheDrawScope\nimport androidx.compose.ui.draw.DrawResult\nimport androidx.compose.ui.draw.drawWithCache\nimport androidx.compose.ui.geometry.CornerRadius\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.geometry.RoundRect\nimport androidx.compose.ui.geometry.Size\nimport androidx.compose.ui.geometry.isSimple\nimport androidx.compose.ui.graphics.BlendMode\nimport androidx.compose.ui.graphics.Brush\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.graphics.ImageBitmap\nimport androidx.compose.ui.graphics.ImageBitmapConfig\nimport androidx.compose.ui.graphics.Outline\nimport androidx.compose.ui.graphics.Path\nimport androidx.compose.ui.graphics.PathOperation\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.graphics.Shape\nimport androidx.compose.ui.graphics.SolidColor\nimport androidx.compose.ui.graphics.drawscope.CanvasDrawScope\nimport androidx.compose.ui.graphics.drawscope.DrawScope\nimport androidx.compose.ui.graphics.drawscope.Stroke\nimport androidx.compose.ui.node.Ref\nimport androidx.compose.ui.platform.debugInspectorInfo\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.IntSize\nimport androidx.compose.ui.unit.toSize\nimport kotlin.math.ceil\n\nfun Modifier.outerBorder(border: BorderStroke, shape: Shape = RectangleShape) =\n    outerBorder(width = border.width, brush = border.brush, shape = shape)\n\nfun Modifier.outerBorder(width: Dp, color: Color, shape: Shape = RectangleShape) =\n    outerBorder(width, SolidColor(color), shape)\n\nfun Modifier.outerBorder(width: Dp, brush: Brush, shape: Shape): Modifier = composed(\n    factory = {\n        // BorderCache object that is lazily allocated depending on the type of shape\n        // This object is only used for generic shapes and rounded rectangles with different corner\n        // radius sizes.\n        val borderCacheRef = remember { Ref<BorderCache>() }\n        this.then(\n            Modifier.drawWithCache {\n                val hasValidBorderParams = width.toPx() >= 0f && size.minDimension > 0f\n                if (!hasValidBorderParams) {\n                    drawContentWithoutBorder()\n                } else {\n                    val strokeWidthPx = if (width == Dp.Hairline) 1f else ceil(width.toPx())\n                    val halfStroke = strokeWidthPx / 2\n                    val topLeft = Offset(-halfStroke, -halfStroke)\n                    val borderSize = Size(\n                        size.width + strokeWidthPx, size.height + strokeWidthPx\n                    )\n                    when (val outline = shape.createOutline(size, layoutDirection, this)) {\n                        is Outline.Generic -> TODO(\"Not support for generic outline\")\n\n                        is Outline.Rounded -> drawRoundRectBorder(\n                            borderCacheRef, brush, outline, topLeft, borderSize, strokeWidthPx\n                        )\n\n                        is Outline.Rectangle -> drawRectBorder(\n                            brush, topLeft, borderSize, strokeWidthPx\n                        )\n                    }\n                }\n            }\n        )\n    },\n    inspectorInfo = debugInspectorInfo {\n        name = \"outerBorder\"\n        properties[\"width\"] = width\n        if (brush is SolidColor) {\n            properties[\"color\"] = brush.value\n            value = brush.value\n        } else {\n            properties[\"brush\"] = brush\n        }\n        properties[\"shape\"] = shape\n    }\n)\n\nprivate fun Ref<BorderCache>.obtain(): BorderCache = this.value ?: BorderCache().also { value = it }\n\nprivate data class BorderCache(\n    private var imageBitmap: ImageBitmap? = null,\n    private var canvas: androidx.compose.ui.graphics.Canvas? = null,\n    private var canvasDrawScope: CanvasDrawScope? = null,\n    private var borderPath: Path? = null,\n) {\n    inline fun CacheDrawScope.drawBorderCache(\n        borderSize: IntSize,\n        config: ImageBitmapConfig,\n        block: DrawScope.() -> Unit,\n    ): ImageBitmap {\n\n        var targetImageBitmap = imageBitmap\n        var targetCanvas = canvas\n        // If we previously had allocated a full Argb888 ImageBitmap but are only requiring\n        // an alpha mask, just re-use the same ImageBitmap instead of allocating a new one\n        val compatibleConfig =\n            targetImageBitmap?.config == ImageBitmapConfig.Argb8888 || config == targetImageBitmap?.config\n        if (targetImageBitmap == null || targetCanvas == null || size.width > targetImageBitmap.width || size.height > targetImageBitmap.height || !compatibleConfig) {\n            targetImageBitmap = ImageBitmap(\n                borderSize.width, borderSize.height, config = config\n            ).also {\n                imageBitmap = it\n            }\n            targetCanvas = androidx.compose.ui.graphics.Canvas(targetImageBitmap).also {\n                canvas = it\n            }\n        }\n\n        val targetDrawScope = canvasDrawScope ?: CanvasDrawScope().also { canvasDrawScope = it }\n        val drawSize = borderSize.toSize()\n        targetDrawScope.draw(\n            this, layoutDirection, targetCanvas, drawSize\n        ) {\n            // Clear the previously rendered portion within this ImageBitmap as we could\n            // be re-using it\n            drawRect(\n                color = Color.Black, size = drawSize, blendMode = BlendMode.Clear\n            )\n            block()\n        }\n        targetImageBitmap.prepareToDraw()\n        return targetImageBitmap\n    }\n\n    fun obtainPath(): Path = borderPath ?: Path().also { borderPath = it }\n}\n\n/**\n * Border implementation for invalid parameters that just draws the content\n * as the given border parameters are infeasible (ex. negative border width)\n */\nprivate fun CacheDrawScope.drawContentWithoutBorder(): DrawResult = onDrawWithContent {\n    drawContent()\n}\n\n/**\n * Border implementation for simple rounded rects and those with different corner\n * radii\n */\nprivate fun CacheDrawScope.drawRoundRectBorder(\n    borderCacheRef: Ref<BorderCache>,\n    brush: Brush,\n    outline: Outline.Rounded,\n    topLeft: Offset,\n    borderSize: Size,\n    strokeWidth: Float,\n): DrawResult {\n    return if (outline.roundRect.isSimple) {\n        val cornerRadius = outline.roundRect.topLeftCornerRadius\n        val halfStroke = strokeWidth / 2\n        val borderStroke = Stroke(strokeWidth)\n        onDrawWithContent {\n            drawContent()\n            // Otherwise draw a stroked rounded rect with the corner radius\n            // shrunk by half of the stroke width. This will ensure that the\n            // outer curvature of the rounded rectangle will have the desired\n            // corner radius.\n            drawRoundRect(\n                brush = brush,\n                topLeft = topLeft,\n                size = borderSize,\n                cornerRadius = cornerRadius.expand(halfStroke),\n                style = borderStroke\n            )\n        }\n    } else {\n        val path = borderCacheRef.obtain().obtainPath()\n        val roundedRectPath = createRoundRectPath(path, outline.roundRect, strokeWidth)\n        onDrawWithContent {\n            drawContent()\n            drawPath(roundedRectPath, brush = brush)\n        }\n    }\n}\n\n/**\n * Border implementation for rectangular borders\n */\nprivate fun CacheDrawScope.drawRectBorder(\n    brush: Brush,\n    topLeft: Offset,\n    borderSize: Size,\n    strokeWidthPx: Float,\n): DrawResult {\n    // If we are drawing a rectangular stroke, just offset it by half the stroke\n    // width as strokes are always drawn centered on their geometry.\n    // If the border is larger than the drawing area, just fill the area with a\n    // solid rectangle\n    val style = Stroke(strokeWidthPx)\n    return onDrawWithContent {\n        drawContent()\n        drawRoundRect(\n            brush = brush,\n            topLeft = topLeft,\n            size = borderSize,\n            cornerRadius = CornerRadius(strokeWidthPx),\n            style = style\n        )\n    }\n}\n\nprivate fun createRoundRectPath(\n    targetPath: Path,\n    roundedRect: RoundRect,\n    strokeWidth: Float,\n): Path = targetPath.apply {\n    reset()\n    addRoundRect(roundedRect)\n    val insetPath = Path().apply {\n        addRoundRect(createInsetRoundedRect(strokeWidth, roundedRect))\n    }\n    op(this, insetPath, PathOperation.Difference)\n}\n\nprivate fun createInsetRoundedRect(\n    widthPx: Float,\n    roundedRect: RoundRect,\n) = RoundRect(\n    left = -widthPx,\n    top = -widthPx,\n    right = roundedRect.width + widthPx,\n    bottom = roundedRect.height + widthPx,\n    topLeftCornerRadius = roundedRect.topLeftCornerRadius.expand(widthPx),\n    topRightCornerRadius = roundedRect.topRightCornerRadius.expand(widthPx),\n    bottomLeftCornerRadius = roundedRect.bottomLeftCornerRadius.expand(widthPx),\n    bottomRightCornerRadius = roundedRect.bottomRightCornerRadius.expand(widthPx)\n)\n\nprivate fun CornerRadius.expand(value: Float): CornerRadius = CornerRadius(this.x + value, this.y + value)\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/style/TextStyle.kt",
    "content": "package io.kanro.compose.jetbrains.expui.style\n\nimport androidx.compose.runtime.compositionLocalOf\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\n\nval LocalDefaultTextStyle = compositionLocalOf {\n    LightTheme.DefaultTextStyle\n}\n\nval LocalDefaultBoldTextStyle = compositionLocalOf {\n    LightTheme.DefaultBoldTextStyle\n}\n\nval LocalParagraphTextStyle = compositionLocalOf {\n    LightTheme.ParagraphTextStyle\n}\n\nval LocalMediumTextStyle = compositionLocalOf {\n    LightTheme.MediumTextStyle\n}\n\nval LocalMediumBoldTextStyle = compositionLocalOf {\n    LightTheme.MediumBoldTextStyle\n}\n\nval LocalSmallTextStyle = compositionLocalOf {\n    LightTheme.SmallTextStyle\n}\n\nval LocalH0TextStyle = compositionLocalOf {\n    LightTheme.H0TextStyle\n}\n\nval LocalH1TextStyle = compositionLocalOf {\n    LightTheme.H1TextStyle\n}\n\nval LocalH2TextStyle = compositionLocalOf {\n    LightTheme.H2TextStyle\n}\n\nval LocalH2BoldTextStyle = compositionLocalOf {\n    LightTheme.H2BoldTextStyle\n}\n\nval LocalH3TextStyle = compositionLocalOf {\n    LightTheme.H3TextStyle\n}\n\nval LocalH3BoldTextStyle = compositionLocalOf {\n    LightTheme.H3BoldTextStyle\n}"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/theme/DarkTheme.kt",
    "content": "package io.kanro.compose.jetbrains.expui.theme\n\nimport androidx.compose.foundation.LocalContextMenuRepresentation\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ProvidedValue\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.sp\nimport io.kanro.compose.jetbrains.expui.control.ActionButtonColors\nimport io.kanro.compose.jetbrains.expui.control.ButtonColors\nimport io.kanro.compose.jetbrains.expui.control.CheckBoxColors\nimport io.kanro.compose.jetbrains.expui.control.ComboBoxColors\nimport io.kanro.compose.jetbrains.expui.control.ContextMenuColors\nimport io.kanro.compose.jetbrains.expui.control.DropdownMenuColors\nimport io.kanro.compose.jetbrains.expui.control.JbContextMenuRepresentation\nimport io.kanro.compose.jetbrains.expui.control.LinkColors\nimport io.kanro.compose.jetbrains.expui.control.LocalActionButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalCheckBoxColors\nimport io.kanro.compose.jetbrains.expui.control.LocalCloseableTabColors\nimport io.kanro.compose.jetbrains.expui.control.LocalComboBoxColors\nimport io.kanro.compose.jetbrains.expui.control.LocalContextMenuColors\nimport io.kanro.compose.jetbrains.expui.control.LocalDropdownMenuColors\nimport io.kanro.compose.jetbrains.expui.control.LocalLinkColors\nimport io.kanro.compose.jetbrains.expui.control.LocalOutlineButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalPrimaryButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalProgressBarColors\nimport io.kanro.compose.jetbrains.expui.control.LocalRadioButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalSegmentedButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalTabColors\nimport io.kanro.compose.jetbrains.expui.control.LocalTextFieldColors\nimport io.kanro.compose.jetbrains.expui.control.LocalToolBarActionButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalToolTipColors\nimport io.kanro.compose.jetbrains.expui.control.ProgressBarColors\nimport io.kanro.compose.jetbrains.expui.control.RadioButtonColors\nimport io.kanro.compose.jetbrains.expui.control.SegmentedButtonColors\nimport io.kanro.compose.jetbrains.expui.control.TabColors\nimport io.kanro.compose.jetbrains.expui.control.TextFieldColors\nimport io.kanro.compose.jetbrains.expui.control.ToolBarActionButtonColors\nimport io.kanro.compose.jetbrains.expui.control.ToolTipColors\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalDefaultBoldTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalDefaultTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalDisabledAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalErrorAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalErrorInactiveAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalFocusAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalH0TextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalH1TextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalH2BoldTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalH2TextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalH3BoldTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalH3TextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalHoverAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalInactiveAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalMediumBoldTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalMediumTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalParagraphTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalPressedAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSelectionAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSelectionInactiveAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSmallTextStyle\nimport io.kanro.compose.jetbrains.expui.window.LocalMainToolBarColors\nimport io.kanro.compose.jetbrains.expui.window.LocalWindowsCloseWindowButtonColors\nimport io.kanro.compose.jetbrains.expui.window.MainToolBarColors\n\nobject DarkTheme : Theme {\n    val Grey1 = Color(0xFF1E1F22)\n    val Grey2 = Color(0xFF2B2D30)\n    val Grey3 = Color(0xFF393B40)\n    val Grey4 = Color(0xFF43454A)\n    val Grey5 = Color(0xFF4E5157)\n    val Grey6 = Color(0xFF5A5D63)\n    val Grey7 = Color(0xFF6F737A)\n    val Grey8 = Color(0xFF868A91)\n    val Grey9 = Color(0xFF9DA0A8)\n    val Grey10 = Color(0xFFB4B8BF)\n    val Grey11 = Color(0xFFCED0D6)\n    val Grey12 = Color(0xFFDFE1E5)\n    val Grey13 = Color(0xFFF0F1F2)\n    val Grey14 = Color(0xFFFFFFFF)\n\n    val Blue1 = Color(0xFF25324D)\n    val Blue2 = Color(0xFF2E436E)\n    val Blue3 = Color(0xFF35538F)\n    val Blue4 = Color(0xFF375FAD)\n    val Blue5 = Color(0xFF366ACE)\n    val Blue6 = Color(0xFF3573F0)\n    val Blue7 = Color(0xFF467FF2)\n    val Blue8 = Color(0xFF548AF7)\n    val Blue9 = Color(0xFF6B9BFA)\n    val Blue10 = Color(0xFF83ACFC)\n    val Blue11 = Color(0xFF99BBFF)\n\n    val Green1 = Color(0xFF253627)\n    val Green2 = Color(0xFF375239)\n    val Green3 = Color(0xFF436946)\n    val Green4 = Color(0xFF4E8052)\n    val Green5 = Color(0xFF57965C)\n    val Green6 = Color(0xFF5FAD65)\n    val Green7 = Color(0xFF73BD79)\n    val Green8 = Color(0xFF89CC8E)\n    val Green9 = Color(0xFFA0DBA5)\n    val Green10 = Color(0xFFB9EBBD)\n    val Green11 = Color(0xFFD4FAD7)\n\n    val Yellow1 = Color(0xFF3D3223)\n    val Yellow2 = Color(0xFF5E4D33)\n    val Yellow3 = Color(0xFF826A41)\n    val Yellow4 = Color(0xFF9E814A)\n    val Yellow5 = Color(0xFFBA9752)\n    val Yellow6 = Color(0xFFD6AE58)\n    val Yellow7 = Color(0xFFF2C55C)\n    val Yellow8 = Color(0xFFF5D273)\n    val Yellow9 = Color(0xFFF7DE8B)\n    val Yellow10 = Color(0xFFFCEBA4)\n    val Yellow11 = Color(0xFFFFF6BD)\n\n    val Red1 = Color(0xFF402929)\n    val Red2 = Color(0xFF5E3838)\n    val Red3 = Color(0xFF7A4343)\n    val Red4 = Color(0xFF9C4E4E)\n    val Red5 = Color(0xFFBD5757)\n    val Red6 = Color(0xFFDB5C5C)\n    val Red7 = Color(0xFFE37774)\n    val Red8 = Color(0xFFEB938D)\n    val Red9 = Color(0xFFF2B1AA)\n    val Red10 = Color(0xFFF7CCC6)\n    val Red11 = Color(0xFFFAE3DE)\n\n    val Orange1 = Color(0xFF45322B)\n    val Orange2 = Color(0xFF614438)\n    val Orange3 = Color(0xFF825845)\n    val Orange4 = Color(0xFFA36B4E)\n    val Orange5 = Color(0xFFC27A53)\n    val Orange6 = Color(0xFFE08855)\n    val Orange7 = Color(0xFFE5986C)\n    val Orange8 = Color(0xFFF0AC81)\n    val Orange9 = Color(0xFFF5BD98)\n    val Orange10 = Color(0xFFFACEAF)\n    val Orange11 = Color(0xFFFFDFC7)\n\n    override val isDark: Boolean = true\n\n    val NormalAreaColors = AreaColors(\n        text = Grey12,\n        foreground = Color.Unspecified,\n        startBackground = Grey2,\n        endBackground = Grey2,\n        startBorderColor = Grey1,\n        endBorderColor = Grey1,\n        focusColor = Blue6,\n    )\n\n    val InactiveAreaColors = NormalAreaColors.copy(\n        text = Grey6\n    )\n\n    val ErrorAreaColors = NormalAreaColors.copy(\n        text = Red6\n    )\n\n    val ErrorInactiveAreaColors = ErrorAreaColors\n\n    val DisabledAreaColors = NormalAreaColors.copy(\n        text = Grey6,\n        foreground = Grey6,\n        startBackground = Grey2,\n        endBackground = Grey2,\n        startBorderColor = Grey4,\n        endBorderColor = Grey4\n    )\n\n    val HoverAreaColors = NormalAreaColors.copy(\n        startBackground = Grey3,\n        endBackground = Grey3,\n    )\n\n    val PressedAreaColors = NormalAreaColors.copy(\n        startBackground = Grey5,\n        endBackground = Grey5,\n    )\n\n    val FocusAreaColors = NormalAreaColors.copy()\n\n    val SelectionAreaColors = NormalAreaColors.copy(\n        startBackground = Blue2,\n        endBackground = Blue2,\n    )\n\n    val SelectionInactiveAreaColors = NormalAreaColors.copy(\n        startBackground = Grey4,\n        endBackground = Grey4,\n    )\n\n    val MainToolBarColors = MainToolBarColors(\n        isDark = true,\n        normalAreaColors = AreaColors(\n            text = Grey13,\n            foreground = Color.Unspecified,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey1,\n            endBorderColor = Grey1,\n            focusColor = Blue6,\n        ),\n        inactiveAreaColors = AreaColors(\n            text = Grey13,\n            foreground = Color.Unspecified,\n            startBackground = Grey3,\n            endBackground = Grey3,\n            startBorderColor = Grey1,\n            endBorderColor = Grey1,\n            focusColor = Blue6,\n        ),\n        actionButtonColors = ActionButtonColors(\n            normalAreaColors = AreaColors(\n                text = Grey13,\n                foreground = Color.Unspecified,\n                startBackground = Color.Unspecified,\n                endBackground = Color.Unspecified,\n                startBorderColor = Color.Unspecified,\n                endBorderColor = Color.Unspecified,\n                focusColor = Blue6,\n            ),\n            hoverAreaColors = AreaColors(\n                text = Grey13,\n                foreground = Color.Unspecified,\n                startBackground = Grey3,\n                endBackground = Grey3,\n                startBorderColor = Color.Unspecified,\n                endBorderColor = Color.Unspecified,\n                focusColor = Blue6,\n            ),\n            pressedAreaColors = AreaColors(\n                text = Grey13,\n                foreground = Color.Unspecified,\n                startBackground = Grey3,\n                endBackground = Grey3,\n                startBorderColor = Color.Unspecified,\n                endBorderColor = Color.Unspecified,\n                focusColor = Blue6,\n            ),\n            disabledAreaColors = AreaColors(\n                text = Grey13,\n                foreground = Grey6,\n                startBackground = Color.Unspecified,\n                endBackground = Color.Unspecified,\n                startBorderColor = Color.Unspecified,\n                endBorderColor = Color.Unspecified,\n                focusColor = Blue6,\n            ),\n        )\n    )\n\n    val WindowsCloseWindowButtonColors = ActionButtonColors(\n        normalAreaColors = AreaColors(\n            text = Grey13,\n            foreground = Color.Unspecified,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n            focusColor = Blue6,\n        ),\n        hoverAreaColors = AreaColors(\n            text = Grey13,\n            foreground = Color.Unspecified,\n            startBackground = Red6,\n            endBackground = Red6,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n            focusColor = Red6,\n        ),\n        pressedAreaColors = AreaColors(\n            text = Grey13,\n            foreground = Color.Unspecified,\n            startBackground = Red6,\n            endBackground = Red6,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n            focusColor = Red6,\n        ),\n        disabledAreaColors = AreaColors(\n            text = Grey13,\n            foreground = Grey6,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n            focusColor = Blue6,\n        ),\n    )\n\n    val ActionButtonColors = ActionButtonColors(\n        normalAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ),\n        hoverAreaColors = HoverAreaColors.copy(\n            startBackground = Grey3,\n            endBackground = Grey3,\n        ),\n        pressedAreaColors = PressedAreaColors.copy(\n            startBackground = Grey5,\n            endBackground = Grey5,\n        ),\n        disabledAreaColors = DisabledAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        )\n    )\n\n    val CheckBoxColors = CheckBoxColors(\n        normalAreaColors = NormalAreaColors.copy(\n            foreground = Grey14,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey5,\n            endBorderColor = Grey5,\n        ),\n        selectionAreaColors = SelectionAreaColors.copy(\n            foreground = Grey14,\n            startBackground = Blue6,\n            endBackground = Blue6,\n            startBorderColor = Blue6,\n            endBorderColor = Blue6,\n        ),\n        focusAreaColors = FocusAreaColors.copy(\n            foreground = Grey14,\n            startBackground = Blue6,\n            endBackground = Blue6,\n            startBorderColor = Color(0xFF101012),\n            endBorderColor = Color(0xFF101012),\n        ),\n        disabledAreaColors = DisabledAreaColors.copy(\n            foreground = Grey5,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey3,\n            endBorderColor = Grey3,\n        )\n    )\n\n    val RadioButtonColors = RadioButtonColors(\n        normalAreaColors = NormalAreaColors.copy(\n            foreground = Grey14,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey5,\n            endBorderColor = Grey5,\n        ),\n        selectionAreaColors = SelectionAreaColors.copy(\n            foreground = Grey14,\n            startBackground = Blue6,\n            endBackground = Blue6,\n            startBorderColor = Blue6,\n            endBorderColor = Blue6,\n        ),\n        focusAreaColors = FocusAreaColors.copy(\n            foreground = Grey14,\n            startBackground = Blue6,\n            endBackground = Blue6,\n            startBorderColor = Color(0xFF101012),\n            endBorderColor = Color(0xFF101012),\n        ),\n        disabledAreaColors = DisabledAreaColors.copy(\n            foreground = Grey5,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey3,\n            endBorderColor = Grey3,\n        )\n    )\n\n    val PrimaryButtonColors = ButtonColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey14,\n            startBackground = Blue6,\n            endBackground = Blue6,\n            startBorderColor = Blue6,\n            endBorderColor = Blue6,\n        ),\n        focusAreaColors = FocusAreaColors.copy(\n            text = Grey14,\n            startBackground = Blue6,\n            endBackground = Blue6,\n            startBorderColor = Grey1,\n            endBorderColor = Grey1,\n        ),\n        disabledAreaColors = DisabledAreaColors.copy(\n            text = Grey5,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey3,\n            endBorderColor = Grey3,\n        )\n    )\n\n    val OutlineButtonColors = ButtonColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey5,\n            endBorderColor = Grey5,\n        ),\n        focusAreaColors = FocusAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey5,\n            endBorderColor = Grey5,\n        ),\n        disabledAreaColors = DisabledAreaColors.copy(\n            text = Grey5,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey3,\n            endBorderColor = Grey3,\n        )\n    )\n\n    val LinkColors = LinkColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Blue8,\n        ),\n        hoverAreaColors = HoverAreaColors.copy(\n            text = Blue8,\n        ),\n        pressedAreaColors = PressedAreaColors.copy(\n            text = Blue8,\n        ),\n        focusAreaColors = FocusAreaColors.copy(\n            text = Blue8,\n        ),\n        disabledAreaColors = NormalAreaColors.copy(\n            text = Grey5,\n        ),\n        visitedAreaColors = NormalAreaColors.copy(\n            text = Blue4,\n        )\n    )\n\n    val SegmentedButtonColors = SegmentedButtonColors(\n\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey5,\n            endBorderColor = Grey5,\n        ),\n        focusAreaColors = FocusAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey3,\n            endBorderColor = Grey3,\n        ),\n        itemNormalAreaColors = NormalAreaColors.copy(\n            text = Grey13,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n        ),\n        itemHoverAreaColors = HoverAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey3,\n            endBackground = Grey3,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n        ),\n        itemPressedAreaColors = PressedAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey3,\n            endBackground = Grey3,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n        ),\n        itemSelectionAreaColors = SelectionAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey3,\n            endBackground = Grey3,\n            startBorderColor = Grey5,\n            endBorderColor = Grey5,\n        ),\n        itemSelectedFocusAreaColors = SelectionAreaColors.copy(\n            text = Grey13,\n            startBackground = Blue3,\n            endBackground = Blue3,\n            startBorderColor = Grey3,\n            endBorderColor = Grey3,\n        )\n    )\n\n    val ToolTipColors = ToolTipColors(\n        isDark = true,\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey3,\n            endBackground = Grey3,\n            startBorderColor = Grey4,\n            endBorderColor = Grey4,\n        )\n    )\n\n    val TextFieldColors = TextFieldColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey5,\n            endBorderColor = Grey5,\n        ),\n        focusAreaColors = FocusAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey2,\n            endBorderColor = Grey2,\n        ),\n        disabledAreaColors = DisabledAreaColors.copy(\n            text = Grey5,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey3,\n            endBorderColor = Grey3,\n        ),\n        errorAreaColors = ErrorAreaColors.copy(\n            text = Red6,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Red6,\n            endBorderColor = Red6,\n            focusColor = Red6,\n        ),\n        errorFocusAreaColors = ErrorAreaColors.copy(\n            text = Red6,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey2,\n            endBorderColor = Grey2,\n            focusColor = Red6,\n        )\n    )\n\n    val DropdownMenuColors = DropdownMenuColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey4,\n            endBorderColor = Grey4,\n        ),\n        hoverAreaColors = HoverAreaColors.copy(\n            text = Grey13,\n            startBackground = Blue2,\n            endBackground = Blue2,\n            startBorderColor = Blue2,\n            endBorderColor = Blue2,\n        ),\n        pressedAreaColors = PressedAreaColors.copy(\n            text = Grey13,\n            startBackground = Blue2,\n            endBackground = Blue2,\n            startBorderColor = Blue2,\n            endBorderColor = Blue2,\n        ),\n        focusAreaColors = FocusAreaColors.copy(\n            text = Grey13,\n            startBackground = Blue2,\n            endBackground = Blue2,\n            startBorderColor = Blue2,\n            endBorderColor = Blue2,\n        ),\n    )\n\n    val ComboBoxColors = ComboBoxColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey5,\n            endBorderColor = Grey5,\n        ),\n        focusAreaColors = FocusAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey5,\n            endBorderColor = Grey5,\n        ),\n        disabledAreaColors = DisabledAreaColors.copy(\n            text = Grey5,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey3,\n            endBorderColor = Grey3,\n        ),\n        dropdownMenuColors = DropdownMenuColors\n    )\n\n    val ContextMenuColors = ContextMenuColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey4,\n            endBorderColor = Grey4,\n        ),\n        hoverAreaColors = HoverAreaColors.copy(\n            text = Grey13,\n            startBackground = Blue2,\n            endBackground = Blue2,\n            startBorderColor = Blue2,\n            endBorderColor = Blue2,\n        ),\n        pressedAreaColors = PressedAreaColors.copy(\n            text = Grey13,\n            startBackground = Blue2,\n            endBackground = Blue2,\n            startBorderColor = Blue2,\n            endBorderColor = Blue2,\n        ),\n        focusAreaColors = FocusAreaColors.copy(\n            text = Grey13,\n            startBackground = Blue2,\n            endBackground = Blue2,\n            startBorderColor = Blue2,\n            endBorderColor = Blue2,\n        ),\n    )\n\n    val ToolBarActionButtonColors = ToolBarActionButtonColors(\n        normalAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ),\n        hoverAreaColors = HoverAreaColors.copy(\n            startBackground = Grey4,\n            endBackground = Grey4,\n        ),\n        pressedAreaColors = PressedAreaColors.copy(\n            startBackground = Grey4,\n            endBackground = Grey4,\n        ),\n        disabledAreaColors = DisabledAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ),\n        inactiveAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ),\n        selectionAreaColors = SelectionAreaColors.copy(\n            foreground = Grey13,\n            startBackground = Blue6,\n            endBackground = Blue6,\n        ),\n        inactiveSelectionAreaColors = SelectionInactiveAreaColors.copy(\n            startBackground = Grey4,\n            endBackground = Grey4,\n        )\n    )\n    val ProgressBarColors = ProgressBarColors(\n        normalAreaColors = NormalAreaColors.copy(\n            foreground = Blue7,\n            startBackground = Grey4,\n            endBackground = Grey4,\n        ),\n        indeterminateAreaColors = NormalAreaColors.copy(\n            foreground = Blue9,\n            startBackground = Blue9,\n            endBackground = Blue5,\n        ),\n    )\n\n    val TabColors = TabColors(\n        normalAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ),\n        hoverAreaColors = HoverAreaColors.copy(\n            startBackground = Grey4,\n            endBackground = Grey4,\n        ),\n        pressedAreaColors = PressedAreaColors.copy(\n            startBackground = Grey4,\n            endBackground = Grey4,\n        ),\n        inactiveAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ),\n        selectionAreaColors = SelectionAreaColors.copy(\n            focusColor = Blue7,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ),\n        inactiveSelectionAreaColors = SelectionInactiveAreaColors.copy(\n            focusColor = Grey6,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        )\n    )\n\n    val CloseableTabColors = TabColors(\n        normalAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ),\n        hoverAreaColors = HoverAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ),\n        pressedAreaColors = PressedAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ),\n        inactiveAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ),\n        selectionAreaColors = SelectionAreaColors.copy(\n            focusColor = Blue7,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ),\n        inactiveSelectionAreaColors = SelectionInactiveAreaColors.copy(\n            focusColor = Grey6,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        )\n    )\n\n    val DefaultTextStyle = TextStyle(\n        fontFamily = Fonts.Inter, fontSize = 13.sp, fontWeight = FontWeight.Normal, color = Color.Unspecified\n    )\n\n    val DefaultBoldTextStyle = DefaultTextStyle.copy(fontWeight = FontWeight.Bold)\n\n    val ParagraphTextStyle = DefaultTextStyle.copy(fontSize = 13.sp, fontWeight = FontWeight.Normal, lineHeight = 19.sp)\n\n    val MediumTextStyle = DefaultTextStyle.copy(fontSize = 12.sp, fontWeight = FontWeight.Normal, lineHeight = 15.sp)\n\n    val MediumBoldTextStyle = MediumTextStyle.copy(fontWeight = FontWeight.Bold)\n\n    val SmallTextStyle = DefaultTextStyle.copy(fontSize = 11.sp, fontWeight = FontWeight.Normal, lineHeight = 14.sp)\n\n    val H0TextStyle = DefaultTextStyle.copy(fontSize = 25.sp, fontWeight = FontWeight.Medium)\n\n    val H1TextStyle = DefaultTextStyle.copy(fontSize = 22.sp, fontWeight = FontWeight.Medium)\n\n    val H2TextStyle = DefaultTextStyle.copy(fontSize = 18.sp, fontWeight = FontWeight.Normal)\n\n    val H2BoldTextStyle = H2TextStyle.copy(fontWeight = FontWeight.Bold)\n\n    val H3TextStyle = DefaultTextStyle.copy(fontSize = 16.sp, fontWeight = FontWeight.Normal, lineHeight = 20.sp)\n\n    val H3BoldTextStyle = H3TextStyle.copy(fontWeight = FontWeight.Bold)\n\n    override fun provideValues(): Array<ProvidedValue<*>> {\n        return arrayOf(\n            LocalIsDarkTheme provides isDark,\n            LocalAreaColors provides NormalAreaColors,\n            LocalInactiveAreaColors provides InactiveAreaColors,\n            LocalErrorAreaColors provides ErrorAreaColors,\n            LocalErrorInactiveAreaColors provides ErrorInactiveAreaColors,\n            LocalDisabledAreaColors provides DisabledAreaColors,\n            LocalHoverAreaColors provides HoverAreaColors,\n            LocalPressedAreaColors provides PressedAreaColors,\n            LocalFocusAreaColors provides FocusAreaColors,\n            LocalSelectionAreaColors provides SelectionAreaColors,\n            LocalSelectionInactiveAreaColors provides SelectionInactiveAreaColors,\n            LocalMainToolBarColors provides MainToolBarColors,\n            LocalActionButtonColors provides ActionButtonColors,\n            LocalCheckBoxColors provides CheckBoxColors,\n            LocalRadioButtonColors provides RadioButtonColors,\n            LocalPrimaryButtonColors provides PrimaryButtonColors,\n            LocalOutlineButtonColors provides OutlineButtonColors,\n            LocalLinkColors provides LinkColors,\n            LocalSegmentedButtonColors provides SegmentedButtonColors,\n            LocalToolTipColors provides ToolTipColors,\n            LocalTextFieldColors provides TextFieldColors,\n            LocalDropdownMenuColors provides DropdownMenuColors,\n            LocalComboBoxColors provides ComboBoxColors,\n            LocalContextMenuColors provides ContextMenuColors,\n            LocalToolBarActionButtonColors provides ToolBarActionButtonColors,\n            LocalProgressBarColors provides ProgressBarColors,\n            LocalTabColors provides TabColors,\n            LocalCloseableTabColors provides CloseableTabColors,\n            LocalWindowsCloseWindowButtonColors provides WindowsCloseWindowButtonColors,\n            LocalContextMenuRepresentation provides JbContextMenuRepresentation(ContextMenuColors),\n            LocalDefaultTextStyle provides DefaultTextStyle,\n            LocalDefaultBoldTextStyle provides DefaultBoldTextStyle,\n            LocalParagraphTextStyle provides ParagraphTextStyle,\n            LocalMediumTextStyle provides MediumTextStyle,\n            LocalMediumBoldTextStyle provides MediumBoldTextStyle,\n            LocalSmallTextStyle provides SmallTextStyle,\n            LocalH0TextStyle provides H0TextStyle,\n            LocalH1TextStyle provides H1TextStyle,\n            LocalH2TextStyle provides H2TextStyle,\n            LocalH2BoldTextStyle provides H2BoldTextStyle,\n            LocalH3TextStyle provides H3TextStyle,\n            LocalH3BoldTextStyle provides H3BoldTextStyle,\n        )\n    }\n}\n\n@Composable\nfun DarkTheme(content: @Composable () -> Unit) {\n    DarkTheme.provide(content)\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/theme/Fonts.kt",
    "content": "package io.kanro.compose.jetbrains.expui.theme\n\nimport androidx.compose.ui.text.font.FontFamily\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.platform.Font\n\nobject Fonts {\n    val InterRegular = Font(resource = \"/fonts/Inter-Regular.ttf\", weight = FontWeight.Normal)\n\n    val InterBold = Font(resource = \"/fonts/Inter-Bold.ttf\", weight = FontWeight.Bold)\n\n    val InterMedium = Font(resource = \"/fonts/Inter-Medium.ttf\", weight = FontWeight.Medium)\n\n    val InterSemiBold = Font(resource = \"/fonts/Inter-SemiBold.ttf\", weight = FontWeight.SemiBold)\n\n    val InterLight = Font(resource = \"/fonts/Inter-Light.ttf\", weight = FontWeight.Light)\n\n    val InterThin = Font(resource = \"/fonts/Inter-Thin.ttf\", weight = FontWeight.Thin)\n\n    val InterExtraLight = Font(resource = \"/fonts/Inter-ExtraLight.ttf\", weight = FontWeight.ExtraLight)\n\n    val InterExtraBold = Font(resource = \"/fonts/Inter-ExtraBold.ttf\", weight = FontWeight.ExtraBold)\n\n    val InterBlack = Font(resource = \"/fonts/Inter-Black.ttf\", weight = FontWeight.Black)\n\n    val Inter = FontFamily(\n        InterRegular,\n        InterBold,\n        InterMedium,\n        InterSemiBold,\n        InterLight,\n        InterThin,\n        InterExtraLight,\n        InterExtraBold\n    )\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/theme/LightTheme.kt",
    "content": "package io.kanro.compose.jetbrains.expui.theme\n\nimport androidx.compose.foundation.LocalContextMenuRepresentation\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.ProvidedValue\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.sp\nimport io.kanro.compose.jetbrains.expui.control.ActionButtonColors\nimport io.kanro.compose.jetbrains.expui.control.ButtonColors\nimport io.kanro.compose.jetbrains.expui.control.CheckBoxColors\nimport io.kanro.compose.jetbrains.expui.control.ComboBoxColors\nimport io.kanro.compose.jetbrains.expui.control.ContextMenuColors\nimport io.kanro.compose.jetbrains.expui.control.DropdownMenuColors\nimport io.kanro.compose.jetbrains.expui.control.JbContextMenuRepresentation\nimport io.kanro.compose.jetbrains.expui.control.LinkColors\nimport io.kanro.compose.jetbrains.expui.control.LocalActionButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalCheckBoxColors\nimport io.kanro.compose.jetbrains.expui.control.LocalCloseableTabColors\nimport io.kanro.compose.jetbrains.expui.control.LocalComboBoxColors\nimport io.kanro.compose.jetbrains.expui.control.LocalContextMenuColors\nimport io.kanro.compose.jetbrains.expui.control.LocalDropdownMenuColors\nimport io.kanro.compose.jetbrains.expui.control.LocalLinkColors\nimport io.kanro.compose.jetbrains.expui.control.LocalOutlineButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalPrimaryButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalProgressBarColors\nimport io.kanro.compose.jetbrains.expui.control.LocalRadioButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalSegmentedButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalTabColors\nimport io.kanro.compose.jetbrains.expui.control.LocalTextFieldColors\nimport io.kanro.compose.jetbrains.expui.control.LocalToolBarActionButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalToolTipColors\nimport io.kanro.compose.jetbrains.expui.control.ProgressBarColors\nimport io.kanro.compose.jetbrains.expui.control.RadioButtonColors\nimport io.kanro.compose.jetbrains.expui.control.SegmentedButtonColors\nimport io.kanro.compose.jetbrains.expui.control.TabColors\nimport io.kanro.compose.jetbrains.expui.control.TextFieldColors\nimport io.kanro.compose.jetbrains.expui.control.ToolBarActionButtonColors\nimport io.kanro.compose.jetbrains.expui.control.ToolTipColors\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalDefaultBoldTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalDefaultTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalDisabledAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalErrorAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalErrorInactiveAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalFocusAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalH0TextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalH1TextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalH2BoldTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalH2TextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalH3BoldTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalH3TextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalHoverAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalInactiveAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalMediumBoldTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalMediumTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalParagraphTextStyle\nimport io.kanro.compose.jetbrains.expui.style.LocalPressedAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSelectionAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSelectionInactiveAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalSmallTextStyle\nimport io.kanro.compose.jetbrains.expui.window.LocalMainToolBarColors\nimport io.kanro.compose.jetbrains.expui.window.LocalWindowsCloseWindowButtonColors\nimport io.kanro.compose.jetbrains.expui.window.MainToolBarColors\n\nobject LightTheme : Theme {\n    val Grey1 = Color(0xFF000000)\n    val Grey2 = Color(0xFF27282E)\n    val Grey3 = Color(0xFF383A42)\n    val Grey4 = Color(0xFF494B57)\n    val Grey5 = Color(0xFF5A5D6B)\n    val Grey6 = Color(0xFF6C707E)\n    val Grey7 = Color(0xFF818594)\n    val Grey8 = Color(0xFFA8ADBD)\n    val Grey9 = Color(0xFFC9CCD6)\n    val Grey10 = Color(0xFFDFE1E5)\n    val Grey11 = Color(0xFFEBECF0)\n    val Grey12 = Color(0xFFF7F8FA)\n    val Grey13 = Color(0xFFFFFFFF)\n\n    val Blue1 = Color(0xFF243D70)\n    val Blue2 = Color(0xFF29498A)\n    val Blue3 = Color(0xFF2E55A3)\n    val Blue4 = Color(0xFF315FBD)\n    val Blue5 = Color(0xFF3369D6)\n    val Blue6 = Color(0xFF3573F0)\n    val Blue7 = Color(0xFF407BF2)\n    val Blue8 = Color(0xFF588CF3)\n    val Blue9 = Color(0xFF709CF5)\n    val Blue10 = Color(0xFF88ADF7)\n    val Blue11 = Color(0xFFA0BDF8)\n    val Blue12 = Color(0xFFB7CEFA)\n    val Blue13 = Color(0xFFCFDEFC)\n    val Blue14 = Color(0xFFE7EFFD)\n    val Blue15 = Color(0xFFF5F8FE)\n\n    val Green1 = Color(0xFF283829)\n    val Green2 = Color(0xFF375239)\n    val Green3 = Color(0xFF456B47)\n    val Green4 = Color(0xFF508453)\n    val Green5 = Color(0xFF599E5E)\n    val Green6 = Color(0xFF5FB865)\n    val Green7 = Color(0xFF7FC784)\n    val Green8 = Color(0xFFA5D9A8)\n    val Green9 = Color(0xFFC1E5C3)\n    val Green10 = Color(0xFFDFF2E0)\n    val Green11 = Color(0xFFF2FCF3)\n\n    val Yellow1 = Color(0xFF7D5020)\n    val Yellow2 = Color(0xFF96662A)\n    val Yellow3 = Color(0xFFB07D35)\n    val Yellow4 = Color(0xFFC99540)\n    val Yellow5 = Color(0xFFE3AE4D)\n    val Yellow6 = Color(0xFFFCC75B)\n    val Yellow7 = Color(0xFFFACE70)\n    val Yellow8 = Color(0xFFFCDB8D)\n    val Yellow9 = Color(0xFFFFE7AB)\n    val Yellow10 = Color(0xFFFFF0C7)\n    val Yellow11 = Color(0xFFFFF8E3)\n\n    val Red1 = Color(0xFF633333)\n    val Red2 = Color(0xFF7D3C3C)\n    val Red3 = Color(0xFF964444)\n    val Red4 = Color(0xFFB04A4A)\n    val Red5 = Color(0xFFC94F4F)\n    val Red6 = Color(0xFFE35252)\n    val Red7 = Color(0xFFEB7171)\n    val Red8 = Color(0xFFF29191)\n    val Red9 = Color(0xFFFAB4B4)\n    val Red10 = Color(0xFFFCDBD4)\n    val Red11 = Color(0xFFE8E8E8)\n    val Red12 = Color(0xFFF5F5F5)\n    val ErrorForeground = Color(0XFFD92B2B)\n\n    val Orange1 = Color(0xFF7A4627)\n    val Orange2 = Color(0xFF96572D)\n    val Orange3 = Color(0xFFAD6531)\n    val Orange4 = Color(0xFFC47233)\n    val Orange5 = Color(0xFFDB8035)\n    val Orange6 = Color(0xFFF28C35)\n    val Orange7 = Color(0xFFFAA058)\n    val Orange8 = Color(0xFFF7B47C)\n    val Orange9 = Color(0xFFFACEAA)\n    val Orange10 = Color(0xFFFCEDD4)\n    val Orange11 = Color(0xFFFFF4EB)\n\n    override val isDark: Boolean = false\n\n    val NormalAreaColors = AreaColors(\n        text = Grey1,\n        foreground = Color.Unspecified,\n        startBackground = Grey12,\n        endBackground = Grey12,\n        startBorderColor = Grey11,\n        endBorderColor = Grey11,\n        focusColor = Blue6,\n    )\n\n    val InactiveAreaColors = NormalAreaColors.copy(\n        text = Grey8\n    )\n\n    val ErrorAreaColors = NormalAreaColors.copy(\n        text = ErrorForeground\n    )\n\n    val ErrorInactiveAreaColors = ErrorAreaColors\n\n    val DisabledAreaColors = NormalAreaColors.copy(\n        text = Grey8,\n        foreground = Grey8,\n        startBackground = Grey13,\n        endBackground = Grey13,\n        startBorderColor = Grey10,\n        endBorderColor = Grey10\n    )\n\n    val HoverAreaColors = NormalAreaColors.copy(\n        startBackground = Blue14,\n        endBackground = Blue14,\n    )\n\n    val PressedAreaColors = NormalAreaColors.copy(\n        startBackground = Grey10,\n        endBackground = Grey10,\n    )\n\n    val FocusAreaColors = NormalAreaColors.copy()\n\n    val SelectionAreaColors = NormalAreaColors.copy(\n        startBackground = Blue13,\n        endBackground = Blue13,\n    )\n\n    val SelectionInactiveAreaColors = NormalAreaColors.copy(\n        startBackground = Grey10,\n        endBackground = Grey10,\n    )\n\n    val MainToolBarColors = MainToolBarColors(\n        isDark = true, normalAreaColors = AreaColors(\n            text = Grey13,\n            foreground = Color.Unspecified,\n            startBackground = Grey2,\n            endBackground = Grey2,\n            startBorderColor = Grey1,\n            endBorderColor = Grey1,\n            focusColor = Blue6,\n        ), inactiveAreaColors = AreaColors(\n            text = Grey13,\n            foreground = Color.Unspecified,\n            startBackground = Grey3,\n            endBackground = Grey3,\n            startBorderColor = Grey1,\n            endBorderColor = Grey1,\n            focusColor = Blue6,\n        ), actionButtonColors = ActionButtonColors(\n            normalAreaColors = AreaColors(\n                text = Grey13,\n                foreground = Color.Unspecified,\n                startBackground = Color.Unspecified,\n                endBackground = Color.Unspecified,\n                startBorderColor = Color.Unspecified,\n                endBorderColor = Color.Unspecified,\n                focusColor = Blue6,\n            ),\n            hoverAreaColors = AreaColors(\n                text = Grey13,\n                foreground = Color.Unspecified,\n                startBackground = Grey1,\n                endBackground = Grey1,\n                startBorderColor = Color.Unspecified,\n                endBorderColor = Color.Unspecified,\n                focusColor = Blue6,\n            ),\n            pressedAreaColors = AreaColors(\n                text = Grey13,\n                foreground = Color.Unspecified,\n                startBackground = Grey1,\n                endBackground = Grey1,\n                startBorderColor = Color.Unspecified,\n                endBorderColor = Color.Unspecified,\n                focusColor = Blue6,\n            ),\n            disabledAreaColors = AreaColors(\n                text = Grey13,\n                foreground = Grey6,\n                startBackground = Color.Unspecified,\n                endBackground = Color.Unspecified,\n                startBorderColor = Color.Unspecified,\n                endBorderColor = Color.Unspecified,\n                focusColor = Blue6,\n            ),\n        )\n    )\n\n    val WindowsCloseWindowButtonColors = ActionButtonColors(\n        normalAreaColors = AreaColors(\n            text = Grey13,\n            foreground = Color.Unspecified,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n            focusColor = Blue6,\n        ),\n        hoverAreaColors = AreaColors(\n            text = Grey13,\n            foreground = Color.Unspecified,\n            startBackground = Red6,\n            endBackground = Red6,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n            focusColor = Red6,\n        ),\n        pressedAreaColors = AreaColors(\n            text = Grey13,\n            foreground = Color.Unspecified,\n            startBackground = Red6,\n            endBackground = Red6,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n            focusColor = Red6,\n        ),\n        disabledAreaColors = AreaColors(\n            text = Grey13,\n            foreground = Grey6,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n            focusColor = Blue6,\n        ),\n    )\n\n    val ActionButtonColors = ActionButtonColors(\n        normalAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ), hoverAreaColors = HoverAreaColors.copy(\n            startBackground = Grey11,\n            endBackground = Grey11,\n        ), pressedAreaColors = PressedAreaColors.copy(\n            startBackground = Grey10,\n            endBackground = Grey10,\n        ), disabledAreaColors = DisabledAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        )\n    )\n\n    val CheckBoxColors = CheckBoxColors(\n        normalAreaColors = NormalAreaColors.copy(\n            foreground = Grey13,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Grey8,\n            endBorderColor = Grey8,\n        ), selectionAreaColors = SelectionAreaColors.copy(\n            foreground = Grey13,\n            startBackground = Blue6,\n            endBackground = Blue6,\n            startBorderColor = Blue6,\n            endBorderColor = Blue6,\n        ), focusAreaColors = FocusAreaColors.copy(\n            foreground = Grey13,\n            startBackground = Blue6,\n            endBackground = Blue6,\n            startBorderColor = Grey13,\n            endBorderColor = Grey13,\n        ), disabledAreaColors = DisabledAreaColors.copy(\n            foreground = Grey8,\n            startBackground = Grey12,\n            endBackground = Grey12,\n            startBorderColor = Grey10,\n            endBorderColor = Grey10,\n        )\n    )\n\n    val RadioButtonColors = RadioButtonColors(\n        normalAreaColors = NormalAreaColors.copy(\n            foreground = Grey13,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Grey8,\n            endBorderColor = Grey8,\n        ), selectionAreaColors = SelectionAreaColors.copy(\n            foreground = Grey13,\n            startBackground = Blue6,\n            endBackground = Blue6,\n            startBorderColor = Blue6,\n            endBorderColor = Blue6,\n        ), focusAreaColors = FocusAreaColors.copy(\n            foreground = Grey13,\n            startBackground = Blue6,\n            endBackground = Blue6,\n            startBorderColor = Grey13,\n            endBorderColor = Grey13,\n        ), disabledAreaColors = DisabledAreaColors.copy(\n            foreground = Grey8,\n            startBackground = Grey12,\n            endBackground = Grey12,\n            startBorderColor = Grey10,\n            endBorderColor = Grey10,\n        )\n    )\n\n    val PrimaryButtonColors = ButtonColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey13,\n            startBackground = Blue6,\n            endBackground = Blue6,\n            startBorderColor = Blue6,\n            endBorderColor = Blue6,\n        ), focusAreaColors = FocusAreaColors.copy(\n            text = Grey13,\n            startBackground = Blue6,\n            endBackground = Blue6,\n            startBorderColor = Grey13,\n            endBorderColor = Grey13,\n        ), disabledAreaColors = DisabledAreaColors.copy(\n            text = Grey8,\n            startBackground = Grey12,\n            endBackground = Grey12,\n            startBorderColor = Grey10,\n            endBorderColor = Grey10,\n        )\n    )\n\n    val OutlineButtonColors = ButtonColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Grey8,\n            endBorderColor = Grey8,\n        ), focusAreaColors = FocusAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Grey13,\n            endBorderColor = Grey13,\n        ), disabledAreaColors = DisabledAreaColors.copy(\n            text = Grey8,\n            startBackground = Grey12,\n            endBackground = Grey12,\n            startBorderColor = Grey10,\n            endBorderColor = Grey10,\n        )\n    )\n\n    val LinkColors = LinkColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Blue4,\n        ), hoverAreaColors = HoverAreaColors.copy(\n            text = Blue4,\n        ), pressedAreaColors = PressedAreaColors.copy(\n            text = Blue4,\n        ), focusAreaColors = FocusAreaColors.copy(\n            text = Blue4,\n        ), disabledAreaColors = NormalAreaColors.copy(\n            text = Grey8,\n        ), visitedAreaColors = NormalAreaColors.copy(\n            text = Blue2,\n        )\n    )\n\n    val SegmentedButtonColors = SegmentedButtonColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey12,\n            endBackground = Grey12,\n            startBorderColor = Grey8,\n            endBorderColor = Grey8,\n        ), focusAreaColors = FocusAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey12,\n            endBackground = Grey12,\n            startBorderColor = Grey13,\n            endBorderColor = Grey13,\n        ), itemNormalAreaColors = NormalAreaColors.copy(\n            text = Grey1,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n        ), itemHoverAreaColors = HoverAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey11,\n            endBackground = Grey11,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n        ), itemPressedAreaColors = PressedAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Color.Unspecified,\n            endBorderColor = Color.Unspecified,\n        ), itemSelectionAreaColors = SelectionAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Grey8,\n            endBorderColor = Grey8,\n        ), itemSelectedFocusAreaColors = SelectionAreaColors.copy(\n            text = Grey1,\n            startBackground = Blue13,\n            endBackground = Blue13,\n            startBorderColor = Grey13,\n            endBorderColor = Grey13,\n        )\n    )\n\n    val ToolTipColors = ToolTipColors(\n        isDark = true, normalAreaColors = NormalAreaColors.copy(\n            text = Grey13,\n            startBackground = Grey1,\n            endBackground = Grey1,\n            startBorderColor = Grey1,\n            endBorderColor = Grey1,\n        )\n    )\n\n    val TextFieldColors = TextFieldColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Grey8,\n            endBorderColor = Grey8,\n        ), focusAreaColors = FocusAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Grey13,\n            endBorderColor = Grey13,\n        ), disabledAreaColors = DisabledAreaColors.copy(\n            text = Grey8,\n            startBackground = Grey12,\n            endBackground = Grey12,\n            startBorderColor = Grey10,\n            endBorderColor = Grey10,\n        ), errorAreaColors = ErrorAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Red6,\n            endBorderColor = Red6,\n            focusColor = Red6,\n        ), errorFocusAreaColors = ErrorAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Grey13,\n            endBorderColor = Grey13,\n            focusColor = Red6,\n        )\n    )\n\n    val DropdownMenuColors = DropdownMenuColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Grey8,\n            endBorderColor = Grey8,\n        ),\n        hoverAreaColors = HoverAreaColors.copy(\n            text = Grey1,\n            startBackground = Blue13,\n            endBackground = Blue13,\n            startBorderColor = Blue13,\n            endBorderColor = Blue13,\n        ),\n        pressedAreaColors = PressedAreaColors.copy(\n            text = Grey1,\n            startBackground = Blue13,\n            endBackground = Blue13,\n            startBorderColor = Blue13,\n            endBorderColor = Blue13,\n        ),\n        focusAreaColors = FocusAreaColors.copy(\n            text = Grey1,\n            startBackground = Blue13,\n            endBackground = Blue13,\n            startBorderColor = Blue13,\n            endBorderColor = Blue13,\n        ),\n    )\n\n    val ComboBoxColors = ComboBoxColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Grey8,\n            endBorderColor = Grey8,\n        ), focusAreaColors = FocusAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Grey13,\n            endBorderColor = Grey13,\n        ), disabledAreaColors = DisabledAreaColors.copy(\n            text = Grey8,\n            startBackground = Grey12,\n            endBackground = Grey12,\n            startBorderColor = Grey10,\n            endBorderColor = Grey10,\n        ), dropdownMenuColors = DropdownMenuColors\n    )\n\n    val ContextMenuColors = ContextMenuColors(\n        normalAreaColors = NormalAreaColors.copy(\n            text = Grey1,\n            startBackground = Grey13,\n            endBackground = Grey13,\n            startBorderColor = Grey8,\n            endBorderColor = Grey8,\n        ),\n        hoverAreaColors = HoverAreaColors.copy(\n            text = Grey1,\n            startBackground = Blue13,\n            endBackground = Blue13,\n            startBorderColor = Blue13,\n            endBorderColor = Blue13,\n        ),\n        pressedAreaColors = PressedAreaColors.copy(\n            text = Grey1,\n            startBackground = Blue13,\n            endBackground = Blue13,\n            startBorderColor = Blue13,\n            endBorderColor = Blue13,\n        ),\n        focusAreaColors = FocusAreaColors.copy(\n            text = Grey1,\n            startBackground = Blue13,\n            endBackground = Blue13,\n            startBorderColor = Blue13,\n            endBorderColor = Blue13,\n        ),\n    )\n\n    val ToolBarActionButtonColors = ToolBarActionButtonColors(\n        normalAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ), hoverAreaColors = HoverAreaColors.copy(\n            startBackground = Grey10,\n            endBackground = Grey10,\n        ), pressedAreaColors = PressedAreaColors.copy(\n            startBackground = Grey10,\n            endBackground = Grey10,\n        ), disabledAreaColors = DisabledAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ), inactiveAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ), selectionAreaColors = SelectionAreaColors.copy(\n            foreground = Grey13,\n            startBackground = Blue6,\n            endBackground = Blue6,\n        ), inactiveSelectionAreaColors = SelectionInactiveAreaColors.copy(\n            startBackground = Grey10,\n            endBackground = Grey10,\n        )\n    )\n\n    val ProgressBarColors = ProgressBarColors(\n        normalAreaColors = NormalAreaColors.copy(\n            foreground = Blue6,\n            startBackground = Grey10,\n            endBackground = Grey10,\n        ),\n        indeterminateAreaColors = NormalAreaColors.copy(\n            foreground = Blue6,\n            startBackground = Blue6,\n            endBackground = Blue11,\n        ),\n    )\n\n    val TabColors = TabColors(\n        normalAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ), hoverAreaColors = HoverAreaColors.copy(\n            startBackground = Grey11,\n            endBackground = Grey11,\n        ), pressedAreaColors = PressedAreaColors.copy(\n            startBackground = Grey11,\n            endBackground = Grey11,\n        ), inactiveAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ), selectionAreaColors = SelectionAreaColors.copy(\n            focusColor = Blue8,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ), inactiveSelectionAreaColors = SelectionInactiveAreaColors.copy(\n            focusColor = Grey8,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        )\n    )\n\n    val CloseableTabColors = TabColors(\n        normalAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ), hoverAreaColors = HoverAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ), pressedAreaColors = PressedAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ), inactiveAreaColors = NormalAreaColors.copy(\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ), selectionAreaColors = SelectionAreaColors.copy(\n            focusColor = Blue8,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        ), inactiveSelectionAreaColors = SelectionInactiveAreaColors.copy(\n            focusColor = Grey8,\n            startBackground = Color.Unspecified,\n            endBackground = Color.Unspecified,\n        )\n    )\n\n    val DefaultTextStyle = TextStyle(\n        fontFamily = Fonts.Inter, fontSize = 13.sp, fontWeight = FontWeight.Normal, color = Color.Unspecified\n    )\n\n    val DefaultBoldTextStyle = DefaultTextStyle.copy(fontWeight = FontWeight.Bold)\n\n    val ParagraphTextStyle = DefaultTextStyle.copy(fontSize = 13.sp, fontWeight = FontWeight.Normal, lineHeight = 19.sp)\n\n    val MediumTextStyle = DefaultTextStyle.copy(fontSize = 12.sp, fontWeight = FontWeight.Normal, lineHeight = 15.sp)\n\n    val MediumBoldTextStyle = MediumTextStyle.copy(fontWeight = FontWeight.Bold)\n\n    val SmallTextStyle = DefaultTextStyle.copy(fontSize = 11.sp, fontWeight = FontWeight.Normal, lineHeight = 14.sp)\n\n    val H0TextStyle = DefaultTextStyle.copy(fontSize = 25.sp, fontWeight = FontWeight.Medium)\n\n    val H1TextStyle = DefaultTextStyle.copy(fontSize = 22.sp, fontWeight = FontWeight.Medium)\n\n    val H2TextStyle = DefaultTextStyle.copy(fontSize = 18.sp, fontWeight = FontWeight.Normal)\n\n    val H2BoldTextStyle = H2TextStyle.copy(fontWeight = FontWeight.Bold)\n\n    val H3TextStyle = DefaultTextStyle.copy(fontSize = 16.sp, fontWeight = FontWeight.Normal, lineHeight = 20.sp)\n\n    val H3BoldTextStyle = H3TextStyle.copy(fontWeight = FontWeight.Bold)\n\n    override fun provideValues(): Array<ProvidedValue<*>> {\n        return arrayOf(\n            LocalIsDarkTheme provides isDark,\n            LocalAreaColors provides NormalAreaColors,\n            LocalInactiveAreaColors provides InactiveAreaColors,\n            LocalErrorAreaColors provides ErrorAreaColors,\n            LocalErrorInactiveAreaColors provides ErrorInactiveAreaColors,\n            LocalDisabledAreaColors provides DisabledAreaColors,\n            LocalHoverAreaColors provides HoverAreaColors,\n            LocalPressedAreaColors provides PressedAreaColors,\n            LocalFocusAreaColors provides FocusAreaColors,\n            LocalSelectionAreaColors provides SelectionAreaColors,\n            LocalSelectionInactiveAreaColors provides SelectionInactiveAreaColors,\n            LocalMainToolBarColors provides MainToolBarColors,\n            LocalActionButtonColors provides ActionButtonColors,\n            LocalCheckBoxColors provides CheckBoxColors,\n            LocalRadioButtonColors provides RadioButtonColors,\n            LocalPrimaryButtonColors provides PrimaryButtonColors,\n            LocalOutlineButtonColors provides OutlineButtonColors,\n            LocalLinkColors provides LinkColors,\n            LocalSegmentedButtonColors provides SegmentedButtonColors,\n            LocalToolTipColors provides ToolTipColors,\n            LocalTextFieldColors provides TextFieldColors,\n            LocalDropdownMenuColors provides DropdownMenuColors,\n            LocalComboBoxColors provides ComboBoxColors,\n            LocalContextMenuColors provides ContextMenuColors,\n            LocalToolBarActionButtonColors provides ToolBarActionButtonColors,\n            LocalProgressBarColors provides ProgressBarColors,\n            LocalTabColors provides TabColors,\n            LocalCloseableTabColors provides CloseableTabColors,\n            LocalWindowsCloseWindowButtonColors provides WindowsCloseWindowButtonColors,\n            LocalContextMenuRepresentation provides JbContextMenuRepresentation(ContextMenuColors),\n            LocalDefaultTextStyle provides DefaultTextStyle,\n            LocalDefaultBoldTextStyle provides DefaultBoldTextStyle,\n            LocalParagraphTextStyle provides ParagraphTextStyle,\n            LocalMediumTextStyle provides MediumTextStyle,\n            LocalMediumBoldTextStyle provides MediumBoldTextStyle,\n            LocalSmallTextStyle provides SmallTextStyle,\n            LocalH0TextStyle provides H0TextStyle,\n            LocalH1TextStyle provides H1TextStyle,\n            LocalH2TextStyle provides H2TextStyle,\n            LocalH2BoldTextStyle provides H2BoldTextStyle,\n            LocalH3TextStyle provides H3TextStyle,\n            LocalH3BoldTextStyle provides H3BoldTextStyle,\n        )\n    }\n}\n\n@Composable\nfun LightTheme(content: @Composable () -> Unit) {\n    LightTheme.provide(content)\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/theme/Theme.kt",
    "content": "package io.kanro.compose.jetbrains.expui.theme\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.ProvidedValue\nimport androidx.compose.runtime.compositionLocalOf\n\nval LocalIsDarkTheme = compositionLocalOf { false }\n\ninterface Theme {\n    val isDark: Boolean\n\n    @Composable\n    fun provide(content: @Composable () -> Unit) {\n        CompositionLocalProvider(\n            *provideValues(),\n            content = content,\n        )\n    }\n\n    fun provideValues(): Array<ProvidedValue<*>>\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/util/CustomWindowDecorationAccessing.kt",
    "content": "package io.kanro.compose.jetbrains.expui.util\n\nimport java.awt.Shape\nimport java.awt.Window\nimport java.lang.reflect.Method\n\ninternal object CustomWindowDecorationAccessing {\n    init {\n        UnsafeAccessing.assignAccessibility(\n            UnsafeAccessing.desktopModule,\n            listOf(\n                \"java.awt\"\n            )\n        )\n    }\n\n    private val customWindowDecorationInstance: Any? = try {\n        val customWindowDecoration = Class.forName(\"java.awt.Window\\$CustomWindowDecoration\")\n        val constructor = customWindowDecoration.declaredConstructors.first()\n        constructor.isAccessible = true\n        constructor.newInstance()\n    } catch (e: Exception) {\n        null\n    }\n\n    private val setCustomDecorationEnabledMethod: Method? =\n        getMethod(\"setCustomDecorationEnabled\", Window::class.java, Boolean::class.java)\n\n    private val setCustomDecorationTitleBarHeightMethod: Method? =\n        getMethod(\"setCustomDecorationTitleBarHeight\", Window::class.java, Int::class.java)\n\n    private val setCustomDecorationHitTestSpotsMethod: Method? =\n        getMethod(\"setCustomDecorationHitTestSpots\", Window::class.java, MutableList::class.java)\n\n    private fun getMethod(name: String, vararg params: Class<*>): Method? {\n        return try {\n            val clazz = Class.forName(\"java.awt.Window\\$CustomWindowDecoration\")\n            val method = clazz.getDeclaredMethod(\n                name, *params\n            )\n            method.isAccessible = true\n            method\n        } catch (e: Exception) {\n            null\n        }\n    }\n\n    fun setCustomDecorationEnabled(window: Window, enabled: Boolean) {\n        val instance = customWindowDecorationInstance ?: return\n        val method = setCustomDecorationEnabledMethod ?: return\n        method.invoke(instance, window, enabled)\n    }\n\n    fun setCustomDecorationTitleBarHeight(window: Window, height: Int) {\n        val instance = customWindowDecorationInstance ?: return\n        val method = setCustomDecorationTitleBarHeightMethod ?: return\n        method.invoke(instance, window, height)\n    }\n\n    fun setCustomDecorationHitTestSpotsMethod(window: Window, spots: Map<Shape, Int>) {\n        val instance = customWindowDecorationInstance ?: return\n        val method = setCustomDecorationHitTestSpotsMethod ?: return\n        method.invoke(instance, window, spots.entries.toMutableList())\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/util/UnsafeAccessing.kt",
    "content": "package io.kanro.compose.jetbrains.expui.util\n\nimport sun.misc.Unsafe\nimport java.lang.reflect.AccessibleObject\n\ninternal object UnsafeAccessing {\n    private val unsafe: Any? by lazy {\n        try {\n            val theUnsafe = Unsafe::class.java.getDeclaredField(\"theUnsafe\")\n            theUnsafe.isAccessible = true\n            theUnsafe.get(null) as Unsafe\n        } catch (e: Throwable) {\n            null\n        }\n    }\n\n    val desktopModule by lazy {\n        ModuleLayer.boot().findModule(\"java.desktop\").get()\n    }\n\n    val ownerModule by lazy {\n        this.javaClass.module\n    }\n\n    private val isAccessibleFieldOffset: Long? by lazy {\n        try {\n            (unsafe as? Unsafe)?.objectFieldOffset(Parent::class.java.getDeclaredField(\"first\"))\n        } catch (e: Throwable) {\n            null\n        }\n    }\n\n    private val implAddOpens by lazy {\n        try {\n            Module::class.java.getDeclaredMethod(\n                \"implAddOpens\", String::class.java, Module::class.java\n            ).accessible()\n        } catch (e: Throwable) {\n            null\n        }\n    }\n\n    fun assignAccessibility(obj: AccessibleObject) {\n        try {\n            val theUnsafe = unsafe as? Unsafe ?: return\n            val offset = isAccessibleFieldOffset ?: return\n            theUnsafe.putBooleanVolatile(obj, offset, true)\n        } catch (e: Throwable) {\n            // ignore\n        }\n    }\n\n    fun assignAccessibility(module: Module, packages: List<String>) {\n        try {\n            packages.forEach {\n                implAddOpens?.invoke(module, it, ownerModule)\n            }\n        } catch (e: Throwable) {\n            // ignore\n        }\n    }\n\n    private class Parent {\n        var first = false\n\n        @Volatile\n        var second: Any? = null\n    }\n}\n\ninternal fun <T : AccessibleObject> T.accessible(): T {\n    return apply {\n        UnsafeAccessing.assignAccessibility(this)\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/window/JBWindow.Linux.kt",
    "content": "package io.kanro.compose.jetbrains.expui.window\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.key.KeyEvent\nimport androidx.compose.ui.platform.LocalWindowInfo\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.window.FrameWindowScope\nimport androidx.compose.ui.window.Window\nimport androidx.compose.ui.window.WindowState\nimport androidx.compose.ui.window.rememberWindowState\nimport io.kanro.compose.jetbrains.expui.control.LocalContentActivated\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.areaBackground\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\nimport io.kanro.compose.jetbrains.expui.theme.Theme\n\n@Composable\ninternal fun JBWindowOnLinux(\n    onCloseRequest: () -> Unit,\n    state: WindowState = rememberWindowState(),\n    visible: Boolean = true,\n    title: String = \"\",\n    theme: Theme = LightTheme,\n    resizable: Boolean = true,\n    enabled: Boolean = true,\n    focusable: Boolean = true,\n    alwaysOnTop: Boolean = false,\n    onPreviewKeyEvent: (KeyEvent) -> Boolean = { false },\n    onKeyEvent: (KeyEvent) -> Boolean = { false },\n    mainToolBar: (@Composable MainToolBarScope.() -> Unit)?,\n    content: @Composable FrameWindowScope.() -> Unit,\n) {\n    Window(\n        onCloseRequest,\n        state,\n        visible,\n        title,\n        null,\n        false,\n        false,\n        resizable,\n        enabled,\n        focusable,\n        alwaysOnTop,\n        onPreviewKeyEvent,\n        onKeyEvent\n    ) {\n        CompositionLocalProvider(\n            LocalWindow provides window,\n            LocalContentActivated provides LocalWindowInfo.current.isWindowFocused,\n            *theme.provideValues()\n        ) {\n            Column(Modifier.fillMaxSize()) {\n                MainToolBarOnLinux(content = mainToolBar)\n                Spacer(Modifier.fillMaxWidth().height(1.dp).background(LocalAreaColors.current.startBorderColor))\n                Box(Modifier.fillMaxSize().areaBackground()) {\n                    content()\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/window/JBWindow.MacOS.kt",
    "content": "package io.kanro.compose.jetbrains.expui.window\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.DisposableEffect\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.State\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.key.KeyEvent\nimport androidx.compose.ui.platform.LocalWindowInfo\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.window.FrameWindowScope\nimport androidx.compose.ui.window.Window\nimport androidx.compose.ui.window.WindowPlacement\nimport androidx.compose.ui.window.WindowState\nimport androidx.compose.ui.window.rememberWindowState\nimport io.kanro.compose.jetbrains.expui.control.LocalContentActivated\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.areaBackground\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\nimport io.kanro.compose.jetbrains.expui.theme.Theme\nimport java.awt.event.ComponentEvent\nimport java.awt.event.ComponentListener\n\n@Composable\ninternal fun JBWindowOnMacOS(\n    onCloseRequest: () -> Unit,\n    state: WindowState = rememberWindowState(),\n    visible: Boolean = true,\n    title: String = \"\",\n    showTitle: Boolean = true,\n    theme: Theme = LightTheme,\n    resizable: Boolean = true,\n    enabled: Boolean = true,\n    focusable: Boolean = true,\n    alwaysOnTop: Boolean = false,\n    onPreviewKeyEvent: (KeyEvent) -> Boolean = { false },\n    onKeyEvent: (KeyEvent) -> Boolean = { false },\n    mainToolBar: (@Composable MainToolBarScope.() -> Unit)?,\n    content: @Composable FrameWindowScope.() -> Unit,\n) {\n    Window(\n        onCloseRequest,\n        state,\n        visible,\n        title,\n        null,\n        false,\n        false,\n        resizable,\n        enabled,\n        focusable,\n        alwaysOnTop,\n        onPreviewKeyEvent,\n        onKeyEvent\n    ) {\n        LaunchedEffect(Unit, theme) {\n            val rootPane = window.rootPane\n            rootPane.putClientProperty(\n                \"apple.awt.windowAppearance\",\n                if (theme.isDark) \"NSAppearanceNameVibrantDark\" else \"NSAppearanceNameVibrantLight\"\n            )\n        }\n        CompositionLocalProvider(\n            LocalWindow provides window,\n            LocalContentActivated provides LocalWindowInfo.current.isWindowFocused,\n            *theme.provideValues()\n        ) {\n            Column(Modifier.fillMaxSize()) {\n                val isFullscreen by rememberWindowIsFullscreen()\n                MainToolBarOnMacOS(title, showTitle, isFullscreen, content = mainToolBar)\n                Spacer(Modifier.fillMaxWidth().height(1.dp).background(LocalAreaColors.current.startBorderColor))\n                Box(Modifier.fillMaxSize().areaBackground()) {\n                    content()\n                }\n            }\n        }\n    }\n}\n\n@Composable\nfun FrameWindowScope.rememberWindowIsFullscreen(): State<Boolean> {\n    val isFullscreen = remember {\n        mutableStateOf(window.placement == WindowPlacement.Fullscreen)\n    }\n    DisposableEffect(window) {\n        val listener = object : ComponentListener {\n            override fun componentResized(e: ComponentEvent?) {\n                isFullscreen.value = window.placement == WindowPlacement.Fullscreen\n            }\n\n            override fun componentMoved(e: ComponentEvent?) {}\n\n            override fun componentShown(e: ComponentEvent?) {}\n\n            override fun componentHidden(e: ComponentEvent?) {}\n        }\n        window.addComponentListener(listener)\n        onDispose {\n            window.removeComponentListener(listener)\n        }\n    }\n    return isFullscreen\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/window/JBWindow.Windows.kt",
    "content": "package io.kanro.compose.jetbrains.expui.window\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.painter.Painter\nimport androidx.compose.ui.input.key.KeyEvent\nimport androidx.compose.ui.platform.LocalWindowInfo\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.window.FrameWindowScope\nimport androidx.compose.ui.window.Window\nimport androidx.compose.ui.window.WindowState\nimport androidx.compose.ui.window.rememberWindowState\nimport io.kanro.compose.jetbrains.expui.control.LocalContentActivated\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.areaBackground\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\nimport io.kanro.compose.jetbrains.expui.theme.Theme\n\n@Composable\ninternal fun JBWindowOnWindows(\n    onCloseRequest: () -> Unit,\n    state: WindowState = rememberWindowState(),\n    visible: Boolean = true,\n    title: String = \"\",\n    showTitle: Boolean = true,\n    theme: Theme = LightTheme,\n    icon: Painter? = null,\n    resizable: Boolean = true,\n    enabled: Boolean = true,\n    focusable: Boolean = true,\n    alwaysOnTop: Boolean = false,\n    onPreviewKeyEvent: (KeyEvent) -> Boolean = { false },\n    onKeyEvent: (KeyEvent) -> Boolean = { false },\n    mainToolBar: (@Composable MainToolBarScope.() -> Unit)?,\n    content: @Composable FrameWindowScope.() -> Unit,\n) {\n    Window(\n        onCloseRequest,\n        state,\n        visible,\n        title,\n        icon,\n        false,\n        false,\n        resizable,\n        enabled,\n        focusable,\n        alwaysOnTop,\n        onPreviewKeyEvent,\n        onKeyEvent\n    ) {\n        CompositionLocalProvider(\n            LocalWindow provides window,\n            LocalContentActivated provides LocalWindowInfo.current.isWindowFocused,\n            *theme.provideValues()\n        ) {\n            Column(Modifier.fillMaxSize()) {\n                MainToolBarOnWindows(icon, state, onCloseRequest, title, showTitle, resizable, content = mainToolBar)\n                Spacer(Modifier.fillMaxWidth().height(1.dp).background(LocalAreaColors.current.startBorderColor))\n                Box(Modifier.fillMaxSize().areaBackground()) {\n                    content()\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/window/JBWindow.kt",
    "content": "package io.kanro.compose.jetbrains.expui.window\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.ui.graphics.painter.Painter\nimport androidx.compose.ui.input.key.KeyEvent\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.window.FrameWindowScope\nimport androidx.compose.ui.window.WindowState\nimport androidx.compose.ui.window.rememberWindowState\nimport io.kanro.compose.jetbrains.expui.DesktopPlatform\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\nimport io.kanro.compose.jetbrains.expui.theme.Theme\nimport javax.swing.JFrame\n\nval LocalWindow = compositionLocalOf<JFrame> {\n    error(\"CompositionLocal LocalWindow not provided\")\n}\n\n@Composable\nfun JBWindow(\n    onCloseRequest: () -> Unit,\n    state: WindowState = rememberWindowState(),\n    visible: Boolean = true,\n    title: String = \"\",\n    showTitle: Boolean = true,\n    theme: Theme = LightTheme,\n    icon: Painter? = painterResource(\"icons/compose.svg\"),\n    resizable: Boolean = true,\n    enabled: Boolean = true,\n    focusable: Boolean = true,\n    alwaysOnTop: Boolean = false,\n    onPreviewKeyEvent: (KeyEvent) -> Boolean = { false },\n    onKeyEvent: (KeyEvent) -> Boolean = { false },\n    mainToolBar: (@Composable MainToolBarScope.() -> Unit)? = null,\n    content: @Composable FrameWindowScope.() -> Unit,\n) {\n    when (DesktopPlatform.Current) {\n        DesktopPlatform.Linux -> JBWindowOnLinux(\n            onCloseRequest,\n            state,\n            visible,\n            title,\n            theme,\n            resizable,\n            enabled,\n            focusable,\n            alwaysOnTop,\n            onPreviewKeyEvent,\n            onKeyEvent,\n            mainToolBar,\n            content\n        )\n\n        DesktopPlatform.Windows -> JBWindowOnWindows(\n            onCloseRequest,\n            state,\n            visible,\n            title,\n            showTitle,\n            theme,\n            icon,\n            resizable,\n            enabled,\n            focusable,\n            alwaysOnTop,\n            onPreviewKeyEvent,\n            onKeyEvent,\n            mainToolBar,\n            content\n        )\n\n        DesktopPlatform.MacOS -> JBWindowOnMacOS(\n            onCloseRequest,\n            state,\n            visible,\n            title,\n            showTitle,\n            theme,\n            resizable,\n            enabled,\n            focusable,\n            alwaysOnTop,\n            onPreviewKeyEvent,\n            onKeyEvent,\n            mainToolBar,\n            content\n        )\n\n        DesktopPlatform.Unknown -> TODO()\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/window/MainToolBar.Basic.kt",
    "content": "package io.kanro.compose.jetbrains.expui.window\n\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.layout.Layout\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.window.FrameWindowScope\nimport io.kanro.compose.jetbrains.expui.control.LocalContentActivated\nimport io.kanro.compose.jetbrains.expui.style.areaBackground\n\n@Composable\nfun FrameWindowScope.BasicMainToolBar(\n    colors: MainToolBarColors = LocalMainToolBarColors.current,\n    content: (@Composable MainToolBarScope.() -> Unit)?,\n) {\n    colors.provideArea(LocalContentActivated.current) {\n        Layout(\n            content = {\n                with(MainToolBarScopeInstance) {\n                    content?.invoke(this)\n                }\n            },\n            modifier = Modifier.fillMaxWidth().height(40.dp).areaBackground(),\n            measurePolicy = rememberMainToolBarMeasurePolicy(window)\n        )\n    }\n}"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/window/MainToolBar.Linux.kt",
    "content": "package io.kanro.compose.jetbrains.expui.window\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.window.FrameWindowScope\n\n@Composable\ninternal fun FrameWindowScope.MainToolBarOnLinux(\n    colors: MainToolBarColors = LocalMainToolBarColors.current,\n    content: (@Composable MainToolBarScope.() -> Unit)?,\n) {\n    BasicMainToolBar(colors, content)\n}"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/window/MainToolBar.MacOS.kt",
    "content": "package io.kanro.compose.jetbrains.expui.window\n\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.window.FrameWindowScope\n\n@Composable\ninternal fun FrameWindowScope.MainToolBarOnMacOS(\n    title: String,\n    showTitle: Boolean,\n    isFullScreen: Boolean,\n    colors: MainToolBarColors = LocalMainToolBarColors.current,\n    content: (@Composable MainToolBarScope.() -> Unit)?,\n) {\n    BasicMainToolBar(colors) {\n        if (isFullScreen) {\n            Spacer(Modifier.width(80.dp).mainToolBarItem(Alignment.Start, true))\n        }\n        if (showTitle) {\n            MainToolBarTitle(title)\n        }\n        content?.invoke(this)\n    }\n\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/window/MainToolBar.Windows.kt",
    "content": "package io.kanro.compose.jetbrains.expui.window\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.focus.focusProperties\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.graphics.painter.Painter\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.window.FrameWindowScope\nimport androidx.compose.ui.window.WindowPlacement\nimport androidx.compose.ui.window.WindowState\nimport io.kanro.compose.jetbrains.expui.control.ActionButton\nimport io.kanro.compose.jetbrains.expui.control.Icon\nimport io.kanro.compose.jetbrains.expui.control.LocalActionButtonColors\nimport io.kanro.compose.jetbrains.expui.control.LocalContentActivated\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\n\n@Composable\ninternal fun FrameWindowScope.MainToolBarOnWindows(\n    icon: Painter?,\n    windowState: WindowState,\n    onCloseRequest: () -> Unit,\n    title: String,\n    showTitle: Boolean,\n    resizeable: Boolean,\n    colors: MainToolBarColors = LocalMainToolBarColors.current,\n    content: (@Composable MainToolBarScope.() -> Unit)?,\n) {\n    BasicMainToolBar(colors) {\n        if (icon != null) {\n            Box(\n                modifier = Modifier.size(40.dp).mainToolBarItem(Alignment.Start, true),\n                contentAlignment = Alignment.Center\n            ) {\n                Icon(icon)\n            }\n        }\n        WindowsSystemButtons(windowState, resizeable, onCloseRequest)\n        if (showTitle) {\n            MainToolBarTitle(title)\n        }\n        content?.invoke(this)\n    }\n}\n\nval LocalWindowsCloseWindowButtonColors = compositionLocalOf {\n    LightTheme.WindowsCloseWindowButtonColors\n}\n\n@Composable\nprivate fun MainToolBarScope.WindowsSystemButtons(\n    windowState: WindowState,\n    resizeable: Boolean,\n    onCloseRequest: () -> Unit,\n) {\n    val active = LocalContentActivated.current\n    CompositionLocalProvider(\n        LocalActionButtonColors provides LocalWindowsCloseWindowButtonColors.current\n    ) {\n        ActionButton(\n            { onCloseRequest() },\n            Modifier.focusProperties { canFocus = false }.size(40.dp).mainToolBarItem(Alignment.End),\n            shape = RectangleShape\n        ) {\n            if (active) {\n                Icon(\"icons/windows/closeActive.svg\")\n            } else {\n                Icon(\"icons/windows/closeInactive.svg\")\n            }\n        }\n    }\n    ActionButton(\n        {\n            windowState.placement = when (windowState.placement) {\n                WindowPlacement.Floating -> WindowPlacement.Maximized\n                WindowPlacement.Maximized -> WindowPlacement.Floating\n                WindowPlacement.Fullscreen -> WindowPlacement.Fullscreen\n            }\n        },\n        Modifier.focusProperties { canFocus = false }.size(40.dp).mainToolBarItem(Alignment.End),\n        enabled = resizeable,\n        shape = RectangleShape\n    ) {\n        if (windowState.placement == WindowPlacement.Floating) {\n            if (active) {\n                Icon(\"icons/windows/maximize.svg\")\n            } else {\n                Icon(\"icons/windows/maximizeInactive.svg\")\n            }\n        } else {\n            if (active) {\n                Icon(\"icons/windows/restore.svg\")\n            } else {\n                Icon(\"icons/windows/restoreInactive.svg\")\n            }\n        }\n    }\n    ActionButton(\n        { windowState.isMinimized = true },\n        Modifier.focusProperties { canFocus = false }.size(40.dp).mainToolBarItem(Alignment.End),\n        shape = RectangleShape\n    ) {\n        if (active) {\n            Icon(\"icons/windows/minimize.svg\")\n        } else {\n            Icon(\"icons/windows/minimizeInactive.svg\")\n        }\n    }\n}\n"
  },
  {
    "path": "expui/src/main/kotlin/io/kanro/compose/jetbrains/expui/window/MainToolBar.kt",
    "content": "package io.kanro.compose.jetbrains.expui.window\n\nimport androidx.compose.foundation.layout.LayoutScopeMarker\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.Immutable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.layout.Measurable\nimport androidx.compose.ui.layout.MeasurePolicy\nimport androidx.compose.ui.layout.MeasureResult\nimport androidx.compose.ui.layout.MeasureScope\nimport androidx.compose.ui.layout.ParentDataModifier\nimport androidx.compose.ui.layout.Placeable\nimport androidx.compose.ui.platform.InspectorInfo\nimport androidx.compose.ui.platform.InspectorValueInfo\nimport androidx.compose.ui.platform.NoInspectorInfo\nimport androidx.compose.ui.platform.debugInspectorInfo\nimport androidx.compose.ui.unit.Constraints\nimport androidx.compose.ui.unit.Density\nimport androidx.compose.ui.unit.offset\nimport io.kanro.compose.jetbrains.expui.control.ActionButtonColors\nimport io.kanro.compose.jetbrains.expui.control.Label\nimport io.kanro.compose.jetbrains.expui.control.LocalActionButtonColors\nimport io.kanro.compose.jetbrains.expui.style.AreaColors\nimport io.kanro.compose.jetbrains.expui.style.AreaProvider\nimport io.kanro.compose.jetbrains.expui.style.InactiveAreaProvider\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalInactiveAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalNormalAreaColors\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\nimport io.kanro.compose.jetbrains.expui.theme.LocalIsDarkTheme\nimport io.kanro.compose.jetbrains.expui.util.CustomWindowDecorationAccessing\nimport java.awt.Rectangle\nimport java.awt.Shape\nimport java.awt.Window\nimport kotlin.math.max\n\ndata class MainToolBarColors(\n    val isDark: Boolean,\n    override val normalAreaColors: AreaColors,\n    override val inactiveAreaColors: AreaColors,\n    val actionButtonColors: ActionButtonColors,\n) : AreaProvider, InactiveAreaProvider {\n    @Composable\n    fun provideArea(isActive: Boolean, content: @Composable () -> Unit) {\n        val currentColors = if (isActive) normalAreaColors else inactiveAreaColors\n        CompositionLocalProvider(\n            LocalAreaColors provides currentColors,\n            LocalNormalAreaColors provides normalAreaColors,\n            LocalInactiveAreaColors provides inactiveAreaColors,\n            LocalActionButtonColors provides actionButtonColors,\n            LocalIsDarkTheme provides isDark,\n            content = content\n        )\n    }\n}\n\nval LocalMainToolBarColors = compositionLocalOf {\n    LightTheme.MainToolBarColors\n}\n\n@LayoutScopeMarker\n@Immutable\ninterface MainToolBarScope {\n    @Stable\n    fun Modifier.mainToolBarItem(\n        alignment: Alignment.Horizontal,\n        draggableArea: Boolean = false,\n    ): Modifier\n}\n\ninternal object MainToolBarScopeInstance : MainToolBarScope {\n    override fun Modifier.mainToolBarItem(alignment: Alignment.Horizontal, draggableArea: Boolean): Modifier {\n        return this.then(\n            MainToolBarChildData(\n                horizontalAlignment = alignment,\n                draggableArea = draggableArea,\n                inspectorInfo = debugInspectorInfo {\n                    name = \"mainToolBarItem\"\n                    properties[\"alignment\"] = alignment\n                    properties[\"draggableArea\"] = draggableArea\n                }\n            )\n        )\n    }\n}\n\ninternal class MainToolBarChildData(\n    var horizontalAlignment: Alignment.Horizontal,\n    var draggableArea: Boolean,\n    inspectorInfo: InspectorInfo.() -> Unit = NoInspectorInfo,\n) : ParentDataModifier, InspectorValueInfo(inspectorInfo) {\n    override fun Density.modifyParentData(parentData: Any?): Any {\n        return this@MainToolBarChildData\n    }\n\n    fun spotRule(): Int {\n        return if (draggableArea) 0 else 1\n    }\n}\n\ninternal class MainToolBarMeasurePolicy(private val window: Window) : MeasurePolicy {\n    override fun MeasureScope.measure(measurables: List<Measurable>, constraints: Constraints): MeasureResult {\n        if (measurables.isEmpty()) {\n            return layout(\n                constraints.minWidth, constraints.minHeight\n            ) {\n                CustomWindowDecorationAccessing.setCustomDecorationEnabled(window, true)\n                CustomWindowDecorationAccessing.setCustomDecorationTitleBarHeight(\n                    window,\n                    constraints.minHeight.toDp().value.toInt()\n                )\n            }\n        }\n\n        var occupiedSpaceHorizontally = 0\n        var maxSpaceVertically = constraints.minHeight\n        val contentConstraints = constraints.copy(minWidth = 0, minHeight = 0)\n        val measuredPlaceable = mutableListOf<Pair<Measurable, Placeable>>()\n\n        for (it in measurables) {\n            val placeable = it.measure(contentConstraints.offset(horizontal = -occupiedSpaceHorizontally))\n            if (constraints.maxWidth < occupiedSpaceHorizontally + placeable.width) {\n                break\n            }\n            occupiedSpaceHorizontally += placeable.width\n            maxSpaceVertically = max(maxSpaceVertically, placeable.height)\n            measuredPlaceable += it to placeable\n        }\n\n        val boxWidth = maxOf(constraints.minWidth, occupiedSpaceHorizontally)\n        val boxHeight = maxSpaceVertically\n\n        return layout(boxWidth, boxHeight) {\n            val placeableGroups = measuredPlaceable.groupBy { (measurable, _) ->\n                (measurable.parentData as? MainToolBarChildData)?.horizontalAlignment ?: Alignment.CenterHorizontally\n            }\n            val spots = mutableMapOf<Shape, Int>()\n\n            var headUsedSpace = 0\n            var trailerUsedSpace = 0\n\n            placeableGroups[Alignment.Start]?.forEach { (measurable, placeable) ->\n                val spotRule = (measurable.parentData as? MainToolBarChildData)?.spotRule() ?: 1\n                val x = headUsedSpace\n                val y = Alignment.CenterVertically.align(placeable.height, boxHeight)\n                placeable.placeRelative(x, y)\n                headUsedSpace += placeable.width\n                spots[PxToDpRectangle(x, y, placeable.width, placeable.height)] = spotRule\n            }\n            placeableGroups[Alignment.End]?.forEach { (measurable, placeable) ->\n                val spotRule = (measurable.parentData as? MainToolBarChildData)?.spotRule() ?: 1\n                val x = boxWidth - placeable.width - trailerUsedSpace\n                val y = Alignment.CenterVertically.align(placeable.height, boxHeight)\n                placeable.placeRelative(x, y)\n                trailerUsedSpace += placeable.width\n                spots[PxToDpRectangle(x, y, placeable.width, placeable.height)] = spotRule\n            }\n\n            val centerPlaceable = placeableGroups[Alignment.CenterHorizontally] ?: listOf()\n\n            val requiredCenterSpace = centerPlaceable.sumOf { it.second.width }\n            val minX = headUsedSpace\n            val maxX = boxWidth - trailerUsedSpace - requiredCenterSpace\n            var centerX = (boxWidth - requiredCenterSpace) / 2\n\n            if (minX <= maxX) {\n                if (centerX > maxX) {\n                    centerX = maxX\n                }\n                if (centerX < minX) {\n                    centerX = minX\n                }\n\n                centerPlaceable.forEach { (measurable, placeable) ->\n                    val spotRule = (measurable.parentData as? MainToolBarChildData)?.spotRule() ?: 1\n                    val x = centerX\n                    val y = Alignment.CenterVertically.align(placeable.height, boxHeight)\n                    placeable.placeRelative(x, y)\n                    centerX += placeable.width\n                    spots[PxToDpRectangle(x, y, placeable.width, placeable.height)] = spotRule\n                }\n            }\n\n            CustomWindowDecorationAccessing.setCustomDecorationEnabled(window, true)\n            CustomWindowDecorationAccessing.setCustomDecorationTitleBarHeight(window, boxHeight.toDp().value.toInt())\n            CustomWindowDecorationAccessing.setCustomDecorationHitTestSpotsMethod(window, spots)\n        }\n    }\n}\n\ninternal fun Density.PxToDpRectangle(x: Int, y: Int, width: Int, height: Int): Rectangle {\n    return Rectangle(\n        x.toDp().value.toInt(), y.toDp().value.toInt(), width.toDp().value.toInt(), height.toDp().value.toInt()\n    )\n}\n\n@Composable\ninternal fun rememberMainToolBarMeasurePolicy(window: Window): MeasurePolicy {\n    return remember(window) { MainToolBarMeasurePolicy(window) }\n}\n\n@Composable\nfun MainToolBarScope.MainToolBarTitle(title: String) {\n    Label(title, Modifier.mainToolBarItem(Alignment.CenterHorizontally, true), maxLines = 1)\n}\n"
  },
  {
    "path": "expui-gallery/build.gradle.kts",
    "content": "plugins {\n    kotlin(\"jvm\")\n    id(\"org.jetbrains.compose\")\n}\n\ndependencies {\n    implementation(\"org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4\")\n    implementation(project(\":compose-jetbrains-expui-theme\"))\n    implementation(compose.desktop.currentOs) {\n        exclude(\"org.jetbrains.compose.material\")\n    }\n    implementation(compose.uiTooling)\n}\n\ncompose.desktop {\n    application {\n        mainClass = \"MainKt\"\n        nativeDistributions {\n            packageName = \"JetBrains ExpUI Gallery\"\n            packageVersion = project.version.toString()\n            copyright = \"Beijing Muke Technology Co., Ltd.\"\n            modules(\"jdk.unsupported\")\n        }\n    }\n}\n"
  },
  {
    "path": "expui-gallery/src/main/kotlin/Main.kt",
    "content": "import androidx.compose.animation.core.animateFloat\nimport androidx.compose.animation.core.infiniteRepeatable\nimport androidx.compose.animation.core.keyframes\nimport androidx.compose.animation.core.rememberInfiniteTransition\nimport androidx.compose.foundation.ExperimentalFoundationApi\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxHeight\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.selection.selectableGroup\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.RectangleShape\nimport androidx.compose.ui.state.ToggleableState\nimport androidx.compose.ui.unit.DpSize\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.window.application\nimport androidx.compose.ui.window.rememberWindowState\nimport io.kanro.compose.jetbrains.expui.control.ActionButton\nimport io.kanro.compose.jetbrains.expui.control.CloseableTab\nimport io.kanro.compose.jetbrains.expui.control.ComboBox\nimport io.kanro.compose.jetbrains.expui.control.DropdownLink\nimport io.kanro.compose.jetbrains.expui.control.DropdownMenu\nimport io.kanro.compose.jetbrains.expui.control.DropdownMenuItem\nimport io.kanro.compose.jetbrains.expui.control.ExternalLink\nimport io.kanro.compose.jetbrains.expui.control.Icon\nimport io.kanro.compose.jetbrains.expui.control.Label\nimport io.kanro.compose.jetbrains.expui.control.Link\nimport io.kanro.compose.jetbrains.expui.control.OutlineButton\nimport io.kanro.compose.jetbrains.expui.control.PrimaryButton\nimport io.kanro.compose.jetbrains.expui.control.ProgressBar\nimport io.kanro.compose.jetbrains.expui.control.RadioButton\nimport io.kanro.compose.jetbrains.expui.control.SegmentedButton\nimport io.kanro.compose.jetbrains.expui.control.Tab\nimport io.kanro.compose.jetbrains.expui.control.TextArea\nimport io.kanro.compose.jetbrains.expui.control.TextField\nimport io.kanro.compose.jetbrains.expui.control.ToolBarActionButton\nimport io.kanro.compose.jetbrains.expui.control.Tooltip\nimport io.kanro.compose.jetbrains.expui.control.TriStateCheckbox\nimport io.kanro.compose.jetbrains.expui.style.LocalAreaColors\nimport io.kanro.compose.jetbrains.expui.style.LocalErrorAreaColors\nimport io.kanro.compose.jetbrains.expui.theme.DarkTheme\nimport io.kanro.compose.jetbrains.expui.theme.LightTheme\nimport io.kanro.compose.jetbrains.expui.window.JBWindow\nimport java.awt.Desktop\nimport java.net.URI\nimport kotlin.system.exitProcess\n\n@OptIn(ExperimentalFoundationApi::class)\nfun main() {\n    application {\n        var isDark by remember { mutableStateOf(false) }\n        val theme = if (isDark) {\n            DarkTheme\n        } else {\n            LightTheme\n        }\n\n        JBWindow(\n            title = \"JetBrains ExpUI Gallery\",\n            theme = theme,\n            state = rememberWindowState(size = DpSize(900.dp, 700.dp)),\n            onCloseRequest = {\n                exitApplication()\n                exitProcess(0)\n            },\n            mainToolBar = {\n                Row(Modifier.mainToolBarItem(Alignment.End)) {\n                    Tooltip(\"Open GitHub link in browser\") {\n                        ActionButton(\n                            {\n                                Desktop.getDesktop()\n                                    .browse(URI.create(\"https://github.com/ButterCam/compose-jetbrains-theme\"))\n                            }, Modifier.size(40.dp), shape = RectangleShape\n                        ) {\n                            Icon(\"icons/github.svg\")\n                        }\n                    }\n                    Tooltip(\"Switch between dark and light mode,\\ncurrently is ${if (isDark) \"dark\" else \"light\"} mode\") {\n                        ActionButton(\n                            { isDark = !isDark }, Modifier.size(40.dp), shape = RectangleShape\n                        ) {\n                            if (isDark) {\n                                Icon(\"icons/darkTheme.svg\")\n                            } else {\n                                Icon(\"icons/lightTheme.svg\")\n                            }\n                        }\n                    }\n                }\n            }) {\n            Row(\n                Modifier.fillMaxSize()\n            ) {\n                Column(\n                    Modifier.fillMaxHeight().width(40.dp).padding(vertical = 4.dp),\n                    verticalArrangement = Arrangement.spacedBy(10.dp),\n                    horizontalAlignment = Alignment.CenterHorizontally\n                ) {\n                    var selected by remember { mutableStateOf(0) }\n                    ToolBarActionButton(\n                        selected == 0, { selected = 0 }, modifier = Modifier.size(30.dp)\n                    ) {\n                        Icon(\"icons/generic.svg\", markerColor = LocalErrorAreaColors.current.text)\n                    }\n                    ToolBarActionButton(\n                        selected == 1, { selected = 1 }, modifier = Modifier.size(30.dp)\n                    ) {\n                        Icon(\"icons/text.svg\")\n                    }\n                }\n                Spacer(Modifier.background(LocalAreaColors.current.startBorderColor).width(1.dp).fillMaxHeight())\n                Column(\n                    Modifier.fillMaxSize(),\n                    verticalArrangement = Arrangement.spacedBy(10.dp, Alignment.CenterVertically),\n                    horizontalAlignment = Alignment.CenterHorizontally\n                ) {\n                    Row(\n                        horizontalArrangement = Arrangement.spacedBy(10.dp),\n                        verticalAlignment = Alignment.CenterVertically\n                    ) {\n                        var state by remember { mutableStateOf(ToggleableState.Indeterminate) }\n                        Tooltip(\"An action button\") {\n                            ActionButton({}, Modifier.size(30.dp)) {\n                                Icon(\"icons/settings.svg\")\n                            }\n                        }\n                        Tooltip(\"An interactive tri-state checkbox\") {\n                            TriStateCheckbox(state, {\n                                state = when (state) {\n                                    ToggleableState.Off -> ToggleableState.On\n                                    ToggleableState.On -> ToggleableState.Off\n                                    ToggleableState.Indeterminate -> ToggleableState.On\n                                }\n                            })\n                        }\n                        Tooltip(\"A non-interactive tri-state checkbox, always is off\") {\n                            TriStateCheckbox(ToggleableState.Off, {}) {\n                                Label(\"Off\")\n                            }\n                        }\n\n                        Tooltip(\"A non-interactive tri-state checkbox, always is on\") {\n                            TriStateCheckbox(ToggleableState.On, {}) {\n                                Label(\"On\")\n                            }\n                        }\n\n                        Tooltip(\"A disabled tri-state checkbox, always is indeterminate\") {\n                            TriStateCheckbox(ToggleableState.Indeterminate, {}, enabled = false) {\n                                Label(\"Indeterminate\")\n                            }\n                        }\n\n                        Tooltip(\"A disabled tri-state checkbox, always is off\") {\n                            TriStateCheckbox(ToggleableState.Off, {}, enabled = false) {\n                                Label(\"Disabled\")\n                            }\n                        }\n\n                        Tooltip(\"A disabled tri-state checkbox, always is on\") {\n                            TriStateCheckbox(ToggleableState.On, {}, enabled = false) {\n                                Label(\"Disabled\")\n                            }\n                        }\n                    }\n                    Row(\n                        horizontalArrangement = Arrangement.spacedBy(10.dp),\n                        verticalAlignment = Alignment.CenterVertically\n                    ) {\n                        Tooltip(\"An outline style button\") {\n                            OutlineButton({}, modifier = Modifier.width(90.dp)) {\n                                Label(\"Outline\")\n                            }\n                        }\n\n                        Tooltip(\"An disabled button\") {\n                            PrimaryButton({}, modifier = Modifier.width(90.dp), enabled = false) {\n                                Label(\"Disabled\")\n                            }\n                        }\n\n                        Tooltip(\"A primary style button\") {\n                            PrimaryButton({}, modifier = Modifier.width(90.dp)) {\n                                Label(\"Primary\")\n                            }\n                        }\n                    }\n                    Row(\n                        horizontalArrangement = Arrangement.spacedBy(10.dp),\n                        verticalAlignment = Alignment.CenterVertically\n                    ) {\n                        Tooltip(\"Just some text\") {\n                            Label(\"Label\")\n                        }\n                        Tooltip(\"A clickable text\") {\n                            Link(\"Link\", {})\n                        }\n                        Tooltip(\"It can not be clicked anymore\") {\n                            Link(\"Disabled Link\", {}, enabled = false)\n                        }\n                        Tooltip(\"Link to external website\") {\n                            ExternalLink(\"External Link\", {})\n                        }\n                        Tooltip(\"Link that can open a dropdown list\") {\n                            var menuOpen by remember { mutableStateOf(false) }\n                            DropdownLink(\"Dropdown Link\", { menuOpen = true })\n                            DropdownMenu(menuOpen, { menuOpen = false }) {\n                                DropdownMenuItem({ menuOpen = false }) {\n                                    Label(\"Item 1\")\n                                }\n                                DropdownMenuItem({ menuOpen = false }) {\n                                    Label(\"Item 2\")\n                                }\n                                DropdownMenuItem({ menuOpen = false }) {\n                                    Label(\"Item 3\")\n                                }\n                            }\n                        }\n                    }\n\n                    Tooltip(\"A segmented button, or radio button group\") {\n                        var selectedIndex by remember { mutableStateOf(0) }\n                        SegmentedButton(3, selectedIndex, {\n                            selectedIndex = it\n                        }) {\n                            when (it) {\n                                0 -> Label(\"First\")\n                                1 -> Label(\"Second\")\n                                2 -> Label(\"Third\")\n                                else -> Label(\"Unknown\")\n                            }\n                        }\n                    }\n\n                    Row(\n                        modifier = Modifier.selectableGroup(),\n                        horizontalArrangement = Arrangement.spacedBy(10.dp),\n                        verticalAlignment = Alignment.CenterVertically\n                    ) {\n                        var selectedIndex by remember { mutableStateOf(0) }\n                        RadioButton(selectedIndex == 0, {\n                            selectedIndex = 0\n                        }) {\n                            Label(\"First\")\n                        }\n                        RadioButton(selectedIndex == 1, {\n                            selectedIndex = 1\n                        }, enabled = false) {\n                            Label(\"Second\")\n                        }\n                        RadioButton(selectedIndex == 2, {\n                            selectedIndex = 2\n                        }) {\n                            Label(\"Third\")\n                        }\n                        RadioButton(selectedIndex == 3, {\n                            selectedIndex = 3\n                        }) {\n                            Label(\"Fourth\")\n                        }\n                    }\n\n                    TextField(\"TextField\", {})\n\n                    TextField(\"Rect\", {}, shape = RectangleShape)\n\n                    TextArea(\"This is a text area\\nIt can be multiline\", {})\n\n                    val comboBoxItems = remember {\n                        (0..100).map { \"Item $it\" }\n                    }\n                    var comboBoxSelection by remember {\n                        mutableStateOf(comboBoxItems.first())\n                    }\n\n                    ComboBox(comboBoxItems, comboBoxSelection, {\n                        comboBoxSelection = it\n                    }, modifier = Modifier.width(150.dp), menuModifier = Modifier.width(150.dp))\n\n                    InfiniteProgressBar()\n\n                    ProgressBar()\n\n                    Row(Modifier.height(40.dp).selectableGroup()) {\n                        var selected by remember { mutableStateOf(0) }\n                        Tab(selected == 0, {\n                            selected = 0\n                        }, modifier = Modifier.fillMaxHeight()) {\n                            Label(\"First\")\n                        }\n                        Tab(selected == 1, {\n                            selected = 1\n                        }, modifier = Modifier.fillMaxHeight()) {\n                            Label(\"Second\")\n                        }\n                        Tab(selected == 2, {\n                            selected = 2\n                        }, modifier = Modifier.fillMaxHeight()) {\n                            Label(\"Third\")\n                        }\n                    }\n\n                    Row(Modifier.height(40.dp).selectableGroup()) {\n                        var selected by remember { mutableStateOf(0) }\n                        CloseableTab(selected == 0, {\n                            selected = 0\n                        }, {}, modifier = Modifier.fillMaxHeight()) {\n                            Icon(\"icons/kotlin.svg\")\n                            Label(\"First.kt\")\n                        }\n                        CloseableTab(selected == 1, {\n                            selected = 1\n                        }, {}, modifier = Modifier.fillMaxHeight()) {\n                            Icon(\"icons/kotlin.svg\")\n                            Label(\"Second.kt\")\n                        }\n                        CloseableTab(selected == 2, {\n                            selected = 2\n                        }, {}, modifier = Modifier.fillMaxHeight()) {\n                            Icon(\"icons/kotlin.svg\")\n                            Label(\"Third.kt\")\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n\n@Composable\nfun InfiniteProgressBar() {\n    val transition = rememberInfiniteTransition()\n    val currentOffset by transition.animateFloat(0f, 1f, infiniteRepeatable(animation = keyframes {\n        durationMillis = 1000\n    }))\n\n    ProgressBar(currentOffset)\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.4-all.zip\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "kotlin.code.style=official"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n#\n# Copyright 2015 the original author or authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MSYS* | MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif [ \"$cygwin\" = \"true\" -o \"$msys\" = \"true\" ] ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=`expr $i + 1`\n    done\n    case $i in\n        0) set -- ;;\n        1) set -- \"$args0\" ;;\n        2) set -- \"$args0\" \"$args1\" ;;\n        3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=`save \"$@\"`\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\n@rem Copyright 2015 the original author or authors.\n@rem\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\n@rem you may not use this file except in compliance with the License.\n@rem You may obtain a copy of the License at\n@rem\n@rem      https://www.apache.org/licenses/LICENSE-2.0\n@rem\n@rem Unless required by applicable law or agreed to in writing, software\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n@rem See the License for the specific language governing permissions and\n@rem limitations under the License.\n@rem\n\n@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto execute\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto execute\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "settings.gradle.kts",
    "content": "pluginManagement {\n    repositories {\n        mavenLocal()\n        gradlePluginPortal()\n        maven(\"https://maven.pkg.jetbrains.space/public/p/compose/dev\")\n    }\n}\n\ninclude(\"classic\")\ninclude(\"expui\")\ninclude(\"expui-gallery\")\n\nproject(\":classic\").name = \"compose-jetbrains-theme\"\nproject(\":expui\").name = \"compose-jetbrains-expui-theme\"\nproject(\":expui-gallery\").name = \"compose-jetbrains-expui-gallery\"\n\n"
  }
]