1+ import androidx.compose.runtime.LaunchedEffect
2+ import androidx.compose.runtime.mutableStateOf
3+ import androidx.compose.runtime.remember
4+ import androidx.compose.ui.ExperimentalComposeUiApi
5+ import androidx.compose.ui.platform.LocalFontFamilyResolver
6+ import androidx.compose.ui.text.font.FontFamily
7+ import androidx.compose.ui.text.platform.Font
8+ import androidx.compose.ui.window.ComposeViewport
9+ import kotlinx.browser.window
10+ import kotlinx.coroutines.await
11+ import org.jetbrains.skiko.wasm.onWasmReady
12+ import org.khronos.webgl.ArrayBuffer
13+ import org.khronos.webgl.Int8Array
14+
15+ private const val MiSanVF = " ./MiSans VF.woff2"
16+
17+ @OptIn(ExperimentalComposeUiApi ::class )
18+ fun main () {
19+ onWasmReady {
20+ ComposeViewport (
21+ viewportContainerId = " composeApplication"
22+ ) {
23+ val fontFamilyResolver = LocalFontFamilyResolver .current
24+ val fontsLoaded = remember { mutableStateOf(false ) }
25+
26+ if (fontsLoaded.value) {
27+ hideLoading()
28+ App ()
29+ }
30+
31+ LaunchedEffect (Unit ) {
32+ val miSanVFBytes = loadRes(MiSanVF ).toByteArray()
33+ val fontFamily = FontFamily (Font (" MiSans VF" , miSanVFBytes))
34+ fontFamilyResolver.preload(fontFamily)
35+ fontsLoaded.value = true
36+ }
37+ }
38+ }
39+ }
40+
41+
42+ suspend fun loadRes (url : String ): ArrayBuffer {
43+ return window.fetch(url).await().arrayBuffer().await()
44+ }
45+
46+ fun ArrayBuffer.toByteArray (): ByteArray {
47+ val source = Int8Array (this , 0 , byteLength)
48+ return jsInt8ArrayToKotlinByteArray(source)
49+ }
50+
51+ external fun hideLoading ()
52+
53+ external fun jsInt8ArrayToKotlinByteArray (x : Int8Array ): ByteArray
0 commit comments