library UI + reader mode
This commit is contained in:
commit
8f8b466e89
81 files changed
+7502
No files matched your search
@@ -0,0 +1,58 @@
|
||||
package net.sergeych.toread
|
||||
|
||||
import androidx.compose.ui.graphics.ImageBitmap
|
||||
import kotlinx.browser.window
|
||||
import net.sergeych.toread.fb2.Fb2Binary
|
||||
import org.w3c.dom.events.Event
|
||||
|
||||
actual fun loadDefaultBookBytes(): ByteArray? = null
|
||||
|
||||
actual fun decodeBookImage(binary: Fb2Binary): ImageBitmap? = null
|
||||
|
||||
actual fun decodeImageBytes(bytes: ByteArray): ImageBitmap? = null
|
||||
|
||||
actual fun defaultLibraryScanPath(): String? = null
|
||||
|
||||
actual suspend fun loadPlatformOpenBookRequest(): PlatformOpenBookRequest? = null
|
||||
|
||||
actual suspend fun chooseLibraryScanDirectory(): String? = null
|
||||
|
||||
actual suspend fun loadLibraryItems(): List<LibraryItem> = emptyList()
|
||||
|
||||
actual suspend fun scanLibrarySubtree(
|
||||
path: String,
|
||||
onProgress: (LibraryScanProgress) -> Unit,
|
||||
): LibraryScanReport =
|
||||
LibraryScanReport(scannedFiles = 0, importedFiles = 0, skippedFiles = 0, failedFiles = 1)
|
||||
|
||||
actual suspend fun openLibraryBook(fileId: String): ByteArray? = null
|
||||
|
||||
actual suspend fun deleteLibraryItem(fileId: String): Boolean = false
|
||||
|
||||
actual suspend fun loadLibraryReadingPosition(fileId: String): ReadingPosition? = null
|
||||
|
||||
actual suspend fun saveLibraryReadingPosition(fileId: String, position: ReadingPosition) = Unit
|
||||
|
||||
actual suspend fun loadBookInfoExtras(fileId: String): BookInfoExtras = BookInfoExtras()
|
||||
|
||||
actual suspend fun loadActiveReadingFileId(): String? = null
|
||||
|
||||
actual suspend fun saveActiveReadingFileId(fileId: String?) = Unit
|
||||
|
||||
actual suspend fun loadThemeMode(): ThemeMode = ThemeMode.SYSTEM
|
||||
|
||||
actual suspend fun saveThemeMode(mode: ThemeMode) = Unit
|
||||
|
||||
actual fun isPlatformDarkTheme(): Boolean =
|
||||
window.matchMedia("(prefers-color-scheme: dark)").matches
|
||||
|
||||
actual fun watchPlatformDarkTheme(onChange: (Boolean) -> Unit): () -> Unit {
|
||||
val query = window.matchMedia("(prefers-color-scheme: dark)")
|
||||
val listener: (Event) -> Unit = {
|
||||
onChange(query.matches)
|
||||
}
|
||||
query.addEventListener("change", listener)
|
||||
return { query.removeEventListener("change", listener) }
|
||||
}
|
||||
|
||||
actual fun libraryLogPath(): String? = null
|
||||
@@ -0,0 +1,11 @@
|
||||
package net.sergeych.toread
|
||||
|
||||
import androidx.compose.ui.ExperimentalComposeUiApi
|
||||
import androidx.compose.ui.window.ComposeViewport
|
||||
|
||||
@OptIn(ExperimentalComposeUiApi::class)
|
||||
fun main() {
|
||||
ComposeViewport {
|
||||
App()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>toread</title>
|
||||
<link type="text/css" rel="stylesheet" href="styles.css">
|
||||
</head>
|
||||
<body style="text-align: center; align-content: center">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 50 50" role="presentation">
|
||||
<circle cx="25" cy="25" r="20" stroke="#ccc" stroke-width="4" fill="none"/>
|
||||
<circle cx="25" cy="25" r="20" stroke="#333" stroke-width="4" fill="none" stroke-linecap="round"
|
||||
stroke-dasharray="90 125">
|
||||
<animateTransform attributeName="transform" type="rotate" from="0 25 25" to="360 25 25" dur="1s"
|
||||
repeatCount="indefinite"/>
|
||||
</circle>
|
||||
</svg>
|
||||
<script type="application/javascript" src="composeApp.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,7 @@
|
||||
html, body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
Reference in new issue
Block a user