{"id":13658220,"url":"https://github.com/oleksandrbalan/pagecurl","last_synced_at":"2025-04-24T08:31:41.369Z","repository":{"id":57620979,"uuid":"477774744","full_name":"oleksandrbalan/pagecurl","owner":"oleksandrbalan","description":"This library allows to create an effect of turning pages, which can be used in book reader applications, custom on-boarding screens or elsewhere.","archived":false,"fork":false,"pushed_at":"2024-02-09T07:47:01.000Z","size":1170,"stargazers_count":349,"open_issues_count":4,"forks_count":33,"subscribers_count":7,"default_branch":"main","last_synced_at":"2024-11-10T11:39:38.112Z","etag":null,"topics":["android","compose","kotlin"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oleksandrbalan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-04T16:04:51.000Z","updated_at":"2024-11-07T13:19:57.000Z","dependencies_parsed_at":"2024-08-02T05:04:07.569Z","dependency_job_id":"ae28d6c0-b557-4e63-881c-6d74235ab73f","html_url":"https://github.com/oleksandrbalan/pagecurl","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oleksandrbalan%2Fpagecurl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oleksandrbalan%2Fpagecurl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oleksandrbalan%2Fpagecurl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oleksandrbalan%2Fpagecurl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oleksandrbalan","download_url":"https://codeload.github.com/oleksandrbalan/pagecurl/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250592044,"owners_count":21455487,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","compose","kotlin"],"created_at":"2024-08-02T05:00:57.693Z","updated_at":"2025-04-24T08:31:40.418Z","avatar_url":"https://github.com/oleksandrbalan.png","language":"Kotlin","funding_links":[],"categories":["Multiplatform"],"sub_categories":["Android samples"],"readme":"[![Maven Central](https://img.shields.io/maven-central/v/io.github.oleksandrbalan/pagecurl.svg?label=Maven%20Central)](https://mvnrepository.com/artifact/io.github.oleksandrbalan/pagecurl)\n\n\u003cimg align=\"right\" src=\"https://user-images.githubusercontent.com/20944869/200791917-a2436c9a-d062-4c14-9c71-c94fe8703061.png\"\u003e\n\n# Page Curl\n\nPage Curl library for Jetpack Compose.\n\n## Motivation\n\nThis library allows to create an effect of turning pages, which can be used in book reader applications, custom on-boarding screens or elsewhere.\n\n## Usage\n\n### Get a dependency\n\n**Step 1.** Add the MavenCentral repository to your build file.\nAdd it in your root `build.gradle.kts` at the end of repositories:\n```kotlin\nallprojects {\n    repositories {\n        ...\n        mavenCentral()\n    }\n}\n```\n\nOr in `settings.gradle.kts`:\n```kotlin\ndependencyResolutionManagement {\n    repositories {\n        ...\n        mavenCentral()\n    }\n}\n```\n\n**Step 2.** Add the dependency.\nCheck latest version on the [releases page](https://github.com/oleksandrbalan/pagecurl/releases).\n```kotlin\ndependencies {\n    implementation(\"io.github.oleksandrbalan:pagecurl:$version\")\n}\n```\n\n### Use in Composable\n\nThe `PageCurl` has 2 mandatory arguments:\n* **count** - The count of pages.\n* **content** - The content lambda to provide the page composable. Receives the page number.\n\n```\nval pages = listOf(\"One\", \"Two\", \"Three\")\nPageCurl(count = pages.size) { index -\u003e\n    Box(\n        contentAlignment = Alignment.Center,\n        modifier = Modifier\n            .background(MaterialTheme.colors.background)\n            .fillMaxSize()\n    ) {\n        Text(\n            text = pages[index],\n            style = MaterialTheme.typography.h1,\n        )\n    }\n}\n```\n\nOptionally `state` could be provided to observe and manage PageCurl state.\n* **state** - The state of the PageCurl. Use it to programmatically change the current page or observe changes, and to configure shadow, back-page and interactions.\n```\nColumn {\n    val scope = rememberCoroutineScope()\n    val state = rememberPageCurlState()\n    Button(onClick = { scope.launch { state.next() } }) {\n        Text(text = \"Next\")\n    }\n\n    val pages = listOf(\"One\", \"Two\", \"Three\")\n    PageCurl(\n        count = pages.size,\n        state = state,\n    ) { index -\u003e\n        Box(\n            contentAlignment = Alignment.Center,\n            modifier = Modifier\n                .background(MaterialTheme.colors.background)\n                .fillMaxSize()\n        ) {\n            Text(\n                text = pages[index],\n                style = MaterialTheme.typography.h1,\n            )\n        }\n    }\n}\n```\n\nOptionally `key` lambda could be provided with stable key for each item. PageCurl with keys for each page will correctly preserve a current position when items are added or removed.\n* **key** - The lambda to provide stable key for each item. Useful when adding and removing items before current page.\n```\nColumn {\n    var pages by remember { mutableStateOf(listOf(\"Four\", \"Five\", \"Six\")) }\n    Button(onClick = { pages = listOf(\"One\", \"Two\", \"Three\") + pages }) {\n        Text(text = \"Prepend new pages\")\n    }\n\n    PageCurl(\n        count = pages.size,\n        key = { pages[it].hashCode() },\n    ) { index -\u003e\n        Box(\n            contentAlignment = Alignment.Center,\n            modifier = Modifier\n                .background(MaterialTheme.colors.background)\n                .fillMaxSize()\n        ) {\n            Text(\n                text = pages[index],\n                style = MaterialTheme.typography.h1,\n            )\n        }\n    }\n}\n```\n\nSee Demo application and [examples](demo/src/main/kotlin/eu/wewox/pagecurl/screens) for more usage examples.\n\nhttps://user-images.githubusercontent.com/20944869/185782671-2861c2ed-c033-4318-bf12-1d8db74fc8b5.mp4\n\nhttps://user-images.githubusercontent.com/20944869/185782668-b52da2b9-be8d-49db-8729-88b6f9a8ee48.mp4\n\nhttps://user-images.githubusercontent.com/20944869/185782663-4bd97a57-1a46-408d-a07b-34c193f01aba.mp4\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foleksandrbalan%2Fpagecurl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foleksandrbalan%2Fpagecurl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foleksandrbalan%2Fpagecurl/lists"}